Read the statement by Michael Teeuw here.
Snowbound on node.js
-
Got it launching with spawn, the code without snowboy works well (have an issue with getting status messages passed, but I’ll fix that later)
The version using the snowboy listener works until the snowboy decoder call. Then it stalls, doesn’t crash just freezes. Like the code is running but not communicating back to the python script.
Couldn’t find anything on exec, this is the spawn version.
node_helper.js
const NodeHelper = require("node_helper"); const spawn = require("child_process").spawn; var pythonStarted = false module.exports = NodeHelper.create({ socketNotificationReceived: function(notification, payload) { if (notification === "MMM-PIRadio-NOTIFICATION_TEST") { console.log("Working notification system. Notification:", notification, "payload: ", payload); this.sendNotificationTest(this.anotherFunction()); //Is possible send objects :) } if (notification === "CONFIG") { console.log("Got a request to start Python:", notification, "payload: ", payload); if(!pythonStarted) { pythonStarted = true; this.python_start(); } } }, sendNotificationTest: function(payload) { this.sendSocketNotification("MMM-PIRadio-NOTIFICATION_TEST", payload); }, sendData: function(payload) { this.sendSocketNotification("PiRadiodata", payload); }, extraRoutes: function() { var self = this; this.expressApp.get("/MMM-PIRadio/extra_route", function(req, res) { // call another function values = self.anotherFunction(); res.send(values); }); }, python_start: function () { const self = this const callPy = spawn("/usr/bin/python3.5",["./modules/MMM-PIRadio/PiRadioSnow.py"]); callPy.stdout.on('message', function (message) { if (message.hasOwnProperty('status')){ console.log("[" + self.name + "]" + message.status); } if (message.hasOwnProperty('data')){ console.log("[" + self.name + "]" + message.data.PlrStat + " : " + message.data.Station + " : " + message.data.Said + " : " + message.data.volume); self.sendData({"PlrStat": message.data.PlrStat, "TrkNxt":message.data.TrkNext, "Station": message.data.Station, "Said": message.data.Said, "volume": message.data.volume}); } }); }, });
What am I doing wrong? Sorry about the formatting.
-
@grantc66 don’t see anything obvious. But there is also an on.error() callback for spawn you should use. If the running script has a problem
-
There is already snowboy integrated module. (MMM-Hotword). I suggest not to re-invent wheels twice.
You can emit notifications from MMM-Hotword to your module when your snowboy hotwords are detected. I think that is easier. -
@sean said in Snowbound on node.js:
MMM-Hotword
Tried that, it works but its very slow to respond. With the python script, you can say the hotword and give it instructions seamlessly, passing notifications to seems to take forever to respond.
What I’m trying to get to is understanding what node is doing with the python that stops external modules working & hopefully find away around it. Bit more of a learning exercise, if I can crack this it’ll open up my ability to expand the functionality.
-
@sdetweil Thanks, had it in there for the pythonshell forgot about it on this version.
Any pointers on trying exec, my googlefoo is failing to find any help.
-
@grantc66
Of course, Choice is yours. I fully cheer for your trials to skill up.By the way, these things I want to point out;
- Generally NodeJS is dozens of times faster than Python 3
- Snowboy detection engine is somekind of compiled-binaries from C(C++?) The each language is using its own wrapper, but that is the only difference among them.
I modified code to measure the time for catching sound, distinguishing hotword, then sending Notification to other modules.
I executed 10 times. Range was 15ms ~ 100ms, Average was around 40ms. This might be not the exact and professional measuring. But I think this is hard to say “VERY SLOW” for real usage.Anyway, I wish you good luck. Leave the result of this approach, I have an interest also.
-
@sean Looks like I’ll be learning how to program in Java script :)
Thanks for the tips.
BTW: I found the issue with the python not running, seems the call from node changes the name of the script so main () had a different name to the import. Didn’t cure the snowboy issue (at least it got called, didn’t respond to wake word though 🤔, I’ll ask on the snowboy forum why that might be), but everything else worked.