Will Flotilla once shipped include Node-RED nodes as indicated in a stretch goal ?
Proper Node-Red support wont be ready when Flotilla ships- we’re busy focusing on the Flotilla Dock software, the Serial to Web Sockets daemon, Rockpool and the Python API ( if you could call working on 5 different projects in 5 different languages focusing! ), which leaves little time to explore Node-Red.
However, I have explored Node-Red and found that, as a side effect of the Flotilla Daemon being a web-sockets server, you can quite easily talk directly to it in Node-Red and digest the Flotilla-speak into something useful using custom functions.
Here’s an example custom function which takes a Flotilla message and splits out update, connect and disconnect events into different outputs:
switch(msg.payload[0]){
case 'u': // Flotilla Update
var d, c, m, details;
d = msg.payload.trim().split(' ');
d.shift()
details = d.shift().split('/');
c = details[0];
m = details[1];
node.send([
{payload:{'event':'update','channel':c, 'module':m, 'values':d}},
null,
null
]);
break;
case 'd': // Flotilla Disconnect
return null;
case 'c': // Flotilla Connect
return null;
default:
return null;
}
And if you wanted to look at the update events and filter out the value of a Dial, on Channel 2 you could stack up another custom function like so:
if( msg.payload.module == 'dial' && msg.payload.channel == '2'){
msg.payload = msg.payload.values[0];
return msg;
}
return null;
The payload.values would be an array of update values- in this case we’re talking about a Dial value from 0 to 1023 which only has one value, so we pick index 0.
The result? A number from 0-1023 which you can then pipe wherever you like.
As for updating Flotilla modules with new instructions, you simply need to construct the right command in Node-Red which is extraordinarily simple and educational with custom functions. Here’s an example of a motor being driven from the Dial we just read:
var speed = 100 * ((msg.payload/1023.0) - 0.5);
msg.payload = 's 0 ' + speed; // Send speed value to Channel 0
return msg;
There will be more complete coverage of Flotilla-speak in the documentation, but basically to send a command to any device you address it by channel number ( there can only be one device per channel ) followed by space, then a comma-separated list of values. Updating a motor on Channel 0 is as simple as:
s 0 -50
Or
s 0 50
Node-Red rocks at all this stuff already, so you wont be high-and-dry from the get-go, but we plan on releasing a set of modules that make this easier and much less dependent on spaghetti custom function code.