Read the statement by Michael Teeuw here.
How to use the 'node_helper', 'serialport'
-
const NodeHelper = require('node_helper') const Serialport = require("serialport"); module.exports = NodeHelper.create({ start: function () { }, socketNotificationReceived: function (notification, payload) { const self = this if (notification === 'CONFIG') { self.config = payload var serialport = new Serialport('/dev/ttyACM0', { baudRate: 9600 }); var led = 0; serialport.open(function () { console.log('connect...'); serialport.on('data', function(data) { // 아두이노로부터 전달된 데이터 console.log('data received: ' + data); }); setInterval( function() { // 2초마다 아두이노에게 문자열을 전송하는 예 led = !led; serialport.write(led==true ? "1" : "0", function(err, result){ if(err){ console.log(err); } }); }, 5000); }); } }, })
this is node_helper
Module.register('MMM-Serial-Notifications', { defaults: { }, getScripts: function() { return ["modules/MMM-Serial-Notifications/js/jquery.js"]; }, getStyles: function() { return ["mm-MMM-Serial-Notifications-style.css"]; }, start: function () { Log.info("Starting module: " + this.name); this.sendSocketNotification('CONFIG', this.config) }, socketNotificationReceived: function (notification, payload) { this.sendNotification(notification, payload) }, getDom: function() { var wrapper = document.createElement("div"); var button = document.createElement("div"); var text = document.createElement("span"); var overlay = document.createElement("div"); var hidden = true; overlay.className = "paint-it-black"; button.className = "hide-toggle"; button.appendChild(text); text.innerHTML = "ON"; var led = 0; wrapper.appendChild(button); wrapper.appendChild(overlay);$(button).on("click", function(){ if(hidden){ $(overlay).fadeIn(1000); $(button).fadeTo(1000, 0.3); $(text).html('OFF'); hidden = false; serialport.write('0'); }else{ $(overlay).fadeOut(1000); $(button).fadeTo(1000, 1); $(text).html('ON'); hidden = true; serialport.write('1'); } }); return wrapper; } });
this is module
I want to send ‘1’, ‘0’ to Arduino by pressing the button
Now the node_helper is communicating in setInterval
but, can not use serialport.write in a module
How do I use the serialport in the module?
Or, how do I create a button event in the node_helper?
I am a very beginner. Please let me know. :disappointed_but_relieved_face:
-
@nhpunch u cannot talk to hardware in module, you do that in node_helper.
if you split the mirror into two parts server and client… node_helper runs on the server,
module runs in the client browser…(even in the same machine)here is a package u can install to enable code to talk to serial port in node helper
https://www.npmjs.com/package/serialport
button would be in the module. you can use an html button, or more advanced div and span
then when u get the button action in the module, you sendSocketNotification() a message to the node_helper… then node_helper then talks serial port to your arduino. -
Thank you very much for your reply.
You said that hardware and modules did not communicate, but communication is possible.
serialport.open(function () { console.log('connect...'); serialport.on('data', function(data) { // 아두이노로부터 전달된 데이터 console.log('data received: ' + data); }); setInterval( function() { // 2초마다 아두이노에게 문자열을 전송하는 예 led = !led; serialport.write(led==true ? "1" : "0", function(err, result){ if(err){ console.log(err); } }); }, 5000); });
In this code, it is possible to send a string to Arduino
What I’m wondering is how to do sendSocketNotification ().
I referenced
https://github.com/MichMich/MagicMirror/tree/master/modules
but did not understandPlease let me know how to send it. Then I will be very thankful:folded_hands_light_skin_tone:
-
@nhpunch there are two parts of a MagicMirror module
- node_helper, runs on server, can use require(…some other library…)
- module_name.js, runs in browser, manages data presented on screen, cannot use require(…)
so, the two parts can talk to each other by sending socket messages, using the supplied function
sendSocketNotification(some_id_string, some_data_packet)the receiver of the message gets called at the function socketNotificationReceived(some_id_string, some_data_packet)
get my sample module that has both parts, and uses timer,
https://github.com/sdetweil/SampleModule
also see the developers doc here
https://github.com/MichMich/MagicMirror/tree/master/modules
my sample implements all the functions so you can see them…
not all are needed… so u can comment out the ones u don’t need to useconfig for my sample, to add to config.js is
{ module: "SampleModule", position: "center", config: { message: "this is a test from config entry" } },
-
I was really grateful and ran the sample code.
But I do not know what to send as a module to do what I want.
Can you help me with my module and node_helper?
-
@nhpunch sorry, i don’t understand
-
@sdetweil you make up your own messages…
so, you have a push button on the screen (done by module_name,js)… when push button,
send button name and 1 to node helper… when it gets 1, it uses serial port to send to arduino.when u let up on button , you send 0…
write out what you WANT the system to do… (design)
then implement THAT design
-
I’m doing what you said, but I do not know how to send it to the node_helper when the button is pressed.
I’m so sorry.
-
@nhpunch this.sendSocketNotification(…,…)
from the doc
this.sendSocketNotification(notification, payload)
notification String - The notification identifier.
payload AnyType - Optional. A notification payload.If you want to send a notification to the node_helper, use the sendSocketNotification(notification, payload). Only the node_helper of this module will receive the socket notification.
Example:
this.sendSocketNotification('SET_CONFIG', this.config);
you’ll see in the sample that this is used twice… once by the module_name.js to send the config over to the node_helper and once by the node_helper to send a new text string to the module_name.js to display
its also used in your module, from the first post above
start: function () { Log.info("Starting module: " + this.name); this.sendSocketNotification('CONFIG', this.config) },
-