NEWS
Node red für Anfänger/ NOOBs (wie mich) / Sammlung der Funktionen für nodes
-
Hi an Alle,
Hier will ich eine Sammlung der funktionen /Nodes starten (fertige Flows sollen bitte extra vorgestellt werden).
@Admin: wenn nicht gewünscht bitte einfach löschen! Danke!
wie man die flows importiert sieht Ihr auf dem bild im Anhang
1.auf Import clicken
2. es geht ein fenster auf
3. code hinein kopieren
4. auf ok clicken
5. auf dem Sheet positionieren Fertig!
933_2016-01-10_14_31_55-.jpg -
in der node red instanz habe folgende "erweiterungen" mit installiert:
node-red-contrib-under-query, node-red-contrib-splitter, node-red-contrib-collector, node-red-contrib-mqtt-env, node-red-node-smooth, node-red-contrib-primitives, node-red-contrib-batcher
einfach hier (Siehe Bild) hineinkopieren, beim nächsten Start wird es mit gestartet!
933_2016-01-10_14_38_09-.jpg -
Collector:
sammelt Daten die reinkommen und sendet sie GESAMMELT in einem Datenpaket "Payload" an das nächste Node.
d.h.
1. es kommt eine Nachricht mit Wert "
-127.00
" mit dem Topic/Thema "````
mqtt/0/DOino<>MQTT/0/20/1/0/0****Collector sendet**** als Payload raus```` { "mqtt/0/DOino<>MQTT/0/20/1/0/0": "-127.00" }
das sendet er bei jeder aktualisierung des wertes aus dem topic````
mqtt/0/DOino<>MQTT/0/20/1/0/02\. jetzt kommt ein Weiterer Wert dazu/wert wird im ioBroker aktualisiert, mit Wert "```` 41.06 ````" mit dem Topic/Thema "```` mqtt/0/DOino<>MQTT/0/58/1/0/0 ````" ****Collector sendet**** als Payload den alten Wert raus```` { "mqtt/0/DOino<>MQTT/0/20/1/0/0": "-127.00" } ````von vorhin und hängt das neue an```` "mqtt/0/DOino<>MQTT/0/58/1/0/0": "41.06"
also kommt dann als Payload aus dem COLLECTOR ein OBJECT raus````
{ "mqtt/0/DOino<>MQTT/0/20/1/0/0": "-127.00", "mqtt/0/DOino<>MQTT/0/58/1/0/0": "41.06" }Vorteile sehe ich darin, dass die werte aus 2 inputs ZUSAMMEN im nächsten (nach collector) NODE ankommen werden und somit beide werte verarbeitet werden können! [933_2016-01-10_14_51_23-.jpg](/assets/uploads/files/933_2016-01-10_14_51_23-.jpg) [933_2016-01-10_15_02_09-.jpg](/assets/uploads/files/933_2016-01-10_15_02_09-.jpg)
-
Jetzt haben wir als AUsgang aus dem Colector ein OBJECT und können die Werte daraus nicht direkt vergleichen /Verarbeiten…
also brauchn wir eine konvertierung vom OBJECT zu "normalen Werten die wie aus de Mathe kennen" also 2+2= 4
dafür brauchen wir eine Funktion, also benötigen wir einen FUNKTIONS-node.
Sie können den Code hier rauskopieren und wie im 1ten Beitrag einfügen, dann haben Sie sofort das node mit der Funktion drin im Node Red:
[{"id":"87e6a031.7ae0d","type":"function","name":"object to Array","func":"var arr = [];\nfor (var k in msg.payload) {arr.push([k]); arr.push(msg.payload[k]);}\n//wen string to Zahl gleichzeitig konvertiert werden soll dann +k siehe unten\n//for (var k in msg.payload) arr.push([+k, msg.payload[k]]); \nvar msg={payload: arr}\nreturn msg;","outputs":1,"noerr":0,"x":718.77783203125,"y":728.6666870117188,"z":"562b45ba.b7c0fc","wires":[["ddfb6229.dffa08"]]}]
und das ist die Funktion dazu,
@PROFIS/Admins: BITTE BERICHTIGEN ODER BESSEREN VORSCHALG MACHEN!!!! DANKE!
var arr = []; for (var k in msg.payload) {arr.push([k]); arr.push(msg.payload[k]);} //wen string to Zahl gleichzeitig konvertiert werden soll dann +k siehe unten //for (var k in msg.payload) arr.push([+k, msg.payload[k]]); var msg={payload: arr} return msg;
933_2016-01-10_15_41_29-.jpg
9054_stream.jpg
9054_stream-2.jpg -
so …
jetzt müssen wir aus einem Array die werte rausziehen.
Mann kann Sich Array wie ein Flur mit vielen Zellen vorstellen. Jede Zelle hat eine Nummer von 0 bis …Halt so gross wie man es definiert hat.
also in unserem oberen Beispiel ein Array aus 4 Zellen (0,1,2,3)
Zelle 0:Jetzt wissen wir ja, dass in der Zelle 0 Topic sitzt,
Zelle 1:in der Zelle 1 der dazu gehöriger Wert,
Zelle 2:n der Zelle 2 wieder ein Topic, aber der zweite
Zelle 3: in der zelle 3, der dazu (zum Topic2) gehöriger Wert 2
Jetzt können wir einfach die Zelle 1 und 3 in Float (Zahl mit nachkommastellen) umwandeln und dann mit den Zahlen machen was wir wollen…
also hier ist beispiel (wieder im node red importieren)
[{"id":"a7837144.e14ba8","type":"function","name":"parse float","func":"if (msg.payload[0]==\"mqtt/0/DOino<>MQTT/0/20/1/0/0\")\n{\nvar val20 = parseFloat(msg.payload[1]);\nvar msg20 = {payload: val20};\n}\nif(msg.payload[2]= \"mqtt/0/DOino<>MQTT/0/58/1/0/0\")\n{\nvar val58 = parseFloat(msg.payload[3]);\nvar msg58 = {payload: val58};\n}\nif (val58>val20)\n\n {var msgOUT={payload: \"VAL58 bigger as VAL20\"};}\n\n\nreturn [msg20,msg58,msgOUT];","outputs":"3","noerr":0,"x":508,"y":1034,"z":"562b45ba.b7c0fc","wires":[["434d0174.5baec"],["104708c4.57b32f"],["a288195c.ad3c8"]]}]
oder die Funktion:
@ Admin: da muss noch was KLEVER angepasst werden, damit es egal ist, welche Wertepaar als erste kommt und welche als zweite:
D:\2016-01-10 16_08_10-.jpg
-
so… jetzt stellen wir uns mal vor wir bekommen den Flur mit Zellen =(Array) und benötigen eine oder die andere zelle nicht... Dann wird Flur (array) auch kleiner....
aus unserem oberen Beispiel:
[ [ "mqtt/0/DOino<>MQTT/0/58/1/0/0" ], "42.27", [ "mqtt/0/DOino<>MQTT/0/20/1/0/0" ], "-127.00" ]
Zelle 0 :"mqtt/0/DOino<>MQTT/0/58/1/0/0"
Zelle 1 :"42.27"
Zelle 2 : "mqtt/0/DOino<>MQTT/0/20/1/0/0"
Zelle 3 :"-127.00"
und wollen z.B. alle Zellen mit dem Inhalt````
"mqtt/0/DOino<>MQTT/0/58/1/0/0"dafür wird ein Funktionsnode Benötigt mit folgenden code:
var outputMsgs = msg.payload;
var i;
while ((i = outputMsgs.indexOf("mqtt/0/DOino<>MQTT/0/58/1/0/0")) != -1)
{
outputMsgs.splice(i, 1);
}var msgNEWarray={payload: outputMsgs}
return [msgNEWarray];mit indexOf wird die Zelle gesucht, und wenn wir die Adresse der Zelle kennen, diese Zelle entfernt! hier noch ein beispiel mit entfernen von zellen mit "," oder "}"
[{"id":"5bb24327.748f4c","type":"function","name":"clean array","func":"var outputMsgs = msg.payload;\n var i;\n while ((i = outputMsgs.indexOf(":")) != -1) \n {\n outputMsgs.splice(i, 1);\n }\n while ((i = outputMsgs.indexOf(",")) != -1) \n {\n outputMsgs.splice(i, 1);\n }\n while ((i = outputMsgs.indexOf("{")) != -1) \n {\n outputMsgs.splice(i, 1);\n }\n while ((i = outputMsgs.indexOf("}")) != -1) \n {\n outputMsgs.splice(i, 1);\n }\nvar msgNEWarray={payload: outputMsgs}\nreturn [msgNEWarray];","outputs":"1","noerr":0,"x":252,"y":494,"z":"bc3e7d10.9bc388","wires":[[]]}]
[933_2016-01-10_16_39_57-.jpg](/assets/uploads/files/933_2016-01-10_16_39_57-.jpg)