====== Node-RED ====== [[https://nodered.org/|Node-RED]] ist ein Programmiertool dessen Editor per Browser aufgerufen werden kann. Er bietet eine einfache Möglichkeit über Knotenpunkte (nodes) Datenflüsse (flows) zu erstellen.\\ Seine schlanke Runtime-Umgebung, basierend auf [[https://de.wikipedia.org/wiki/Node.js|Node.js]], läuft auch auf kleiner Hardware (Rpi) wunderbar. ===== Installation ===== Node-RED ist auf dem VZ-RaspberryPi-Image nicht vorinstalliert. Die folgende Beschreibung orientiert sich an der [[https://nodered.org/docs/hardware/raspberrypi|englischen Originalanleitung]]. sudo apt-get install build-essential python-rpi.gpio sense-hat bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) ==== Hintergrunddienst ==== Um Node-RED als Hintergrunddienst einzurichten folgende Befehle nacheinander ausführen: sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop sudo chmod +x /usr/bin/node-red-st* sudo systemctl daemon-reload Man kann Node-RED nun an der Kommandozeile mit node-red-start aufrufen und mit node-red-stop beenden. Um den Dienst beim Boot automatisch zu starten: sudo systemctl enable nodered.service ==== Volkszaehler nodes ==== Es gibt ein paar vorgefertigte nodes für komplexere Abfragen. Zu finden bei [[https://flows.nodered.org/node/node-red-contrib-volkszaehler|Node-Red in der Library]] und [[http://github.com/andig/node-red-contrib-volkszaehler|github]]. Um sie in Node-RED einzubinden sind nacheinander folgende Befehle an der Konsole einzugeben: npm install node-red-contrib-volkszaehler node-red-stop node-red-start ===== Editor ===== Um Node-RED zu programmieren wird über einen Browser der Editor aufgerufen. Es muss die IP-Adresse des RaspberryPi eingefügt werden: http://IP_des_Rpi:1880/ Einen Flow importiert man indem man den gewünschten Code in der Zwischenablage kopiert. Dann im Editor oben rechts das Menu (3 Querbalken) öffnen, Import, Clipboard. Den Code ins Fenster einfügen und darunter auswählen ob man die nodes im aktuell offenen oder in einen neuen flow einfügen möchte. Mit Import abschließen.\\ Um die Änderung zu übernehmen die, nun rote, Schaltfläche Deploy betätigen. ---- ===== Anbindung ===== Es gibt diverse Möglichkeiten ein- und ausgehende Daten zwischen Volkszähler und Node-RED auszutauschen. * [[howto:node-red#push-server_empfangen|vzlogger -> Push-Server -> NodeRED]] * [[howto:node-red#push-server_senden|NodeRED -> Push-Server]] * [[howto:node-red#vzlogger_empfangen|vzlogger -> NodeRED]] * [[howto:node-red#apipost_data|NodeRED -> Middleware]] * [[howto:node-red#apiget_data|Middleware -> NodeRED]] ==== Push-Server einrichten ==== Für Echtzeitdaten eignet sich zum Beispiel der [[software/middleware/push-server|Push-Server]] als Datenquelle. Zählerstände und Impulseingänge werden in Leistung umgerechnet. Es werden nur Kanäle ausgeliefert die in der Middleware angelegt sind. Parallelbetrieb mit Push fürs Frontend ist möglich. Seit Version 2.0 ist der Push-Server ab Haus aktiviert. In älteren Versionen muss er, wie in der [[software/middleware/push-server#konfiguration|Anleitung]] beschrieben, in Betrieb genommen werden. Die zusätzliche websocket-Ausgabe aktiviert man indem die vorhandene Zeile in der volkszaehler.conf.php geändert wird: sudo nano /var/www/volkszaehler.org/etc/volkszaehler.conf.php $config['push']['routes']['websocket'] = array('/socket'); Danach den Push-Server neu starten: sudo systemctl restart push-server Und die Konfiguration des [[https://wiki.volkszaehler.org/software/middleware/push-server#vzlogger|vzlogger]] prüfen, ggf. nachbessern. ==== Push-Server empfangen ==== Zum Empfang der Daten wird der PS [[howto/node-red#push-server_einrichten|wie oben beschrieben]] eingerichtet und in Node-RED ein websocket-Eingang angelegt. {{ :howto:node-red_pushserver.jpg?500|}} [ { "id": "31759474.59a6dc", "type": "tab", "label": "VZ Push-Server" }, { "id": "43923f89.899bf", "type": "websocket in", "z": "31759474.59a6dc", "name": "", "server": "", "client": "aa8ae771.f85958", "x": 170, "y": 68, "wires": [ [ "cf50a51e.ba8148" ] ] }, { "id": "cf50a51e.ba8148", "type": "debug", "z": "31759474.59a6dc", "name": "", "active": true, "console": "false", "complete": "false", "x": 448.88888888888886, "y": 66.66666666666667, "wires": [] }, { "id": "aa8ae771.f85958", "type": "websocket-client", "z": "", "path": "ws://127.0.0.1:8082/socket", "wholemsg": "false" } ] ==== Push-Server senden ==== Man kann auch Messwerte / Daten von Node-RED an den Push-Server übermitteln, dazu muss im flow eine json message aufgebaut und versendet werden. [[howto/node-red#push-server_einrichten|Den PS wie oben beschrieben einrichten.]] {"data":[{"uuid":"2e56fe60-e265-11e6-8bbc-a77e71764858","tuples":[[1493509724073, 5]]}]} Port und URL entsprechen der Standard-Konfiguration. http://raspberrypi:5582 {{ :howto:vz_push_data_api.png?500|}} [ { "id": "a52bdd79.748458", "type": "tab", "label": "VZ PUSH API" }, { "id": "a2f3574c.06053", "type": "inject", "z": "a52bdd79.748458", "name": "inject payload", "topic": "", "payload": "5", "payloadType": "str", "repeat": "", "crontab": "", "once": false, "x": 130, "y": 60, "wires": [ [ "45bf027.c2e227c" ] ] }, { "id": "dc5ea65a.931598", "type": "http request", "z": "a52bdd79.748458", "name": "volkszaehler push", "method": "POST", "ret": "obj", "url": "http://raspberrypi:5582", "tls": "", "x": 250, "y": 180, "wires": [ [ "22152e74.71cf62" ] ] }, { "id": "22152e74.71cf62", "type": "debug", "z": "a52bdd79.748458", "name": "", "active": true, "console": "false", "complete": "true", "x": 410, "y": 180, "wires": [] }, { "id": "f576d4aa.c8506", "type": "json", "z": "a52bdd79.748458", "name": "", "x": 310, "y": 120, "wires": [ [ "dc5ea65a.931598" ] ] }, { "id": "45bf027.c2e227c", "type": "change", "z": "a52bdd79.748458", "name": "set uuid / timestamp", "rules": [ { "t": "set", "p": "uuid", "pt": "msg", "to": "2e56fe60-e265-11e6-8bbc-a77e71764858", "tot": "str" }, { "t": "set", "p": "timestamp", "pt": "msg", "to": "", "tot": "date" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 340, "y": 60, "wires": [ [ "27e38142.be7c6e" ] ] }, { "id": "27e38142.be7c6e", "type": "template", "z": "a52bdd79.748458", "name": "push data", "field": "payload", "fieldType": "msg", "format": "json", "syntax": "mustache", "template": "{\"data\":[{\"uuid\":\"{{uuid}}\",\"tuples\":[[{{timestamp}}, {{payload}}]]}]}", "x": 180, "y": 120, "wires": [ [ "f576d4aa.c8506" ] ] } ] ==== vzlogger empfangen ==== {{ :howto:node-red_vzlogger.jpg?500|}} Die Echtzeitdaten des [[software/controller/vzlogger|vzloggers]] können auch direkt an Node-RED übergeben werden. Es werden für alle //channel// (auch //"api": "null"//) die Rohdaten (Zählerstände, Impulse) ausgegeben.\\ Dazu die vzlogger.conf erweitern: sudo nano /etc/vzlogger.conf "push": [ { "url": "http://127.0.0.1:1880/vzpush" } ], In Node-RED wird ein http-Input mit http-Response angelegt: [ { "id": "501f06e2.822648", "type": "http in", "z": "b4a68325.c47d9", "name": "", "url": "/vzpush", "method": "post", "swaggerDoc": "", "x": 125, "y": 132, "wires": [ [ "aca936f6.646be8", "72ead14f.819f1" ] ] }, { "id": "aca936f6.646be8", "type": "debug", "z": "b4a68325.c47d9", "name": "", "active": false, "console": "false", "complete": "true", "x": 323, "y": 192, "wires": [] }, { "id": "72ead14f.819f1", "type": "http response", "z": "b4a68325.c47d9", "name": "", "x": 322, "y": 133, "wires": [] } ] ==== API: POST data ==== Um Messwerte / Daten von Node-RED an die Middleware zu übermitteln muss die URL entprechend (siehe [[/development/api/reference]]) aufgebaut werden. http://raspberrypi/middleware.php/data/{{uuid}}.json?ts={{timestamp}}&value={{payload}} {{ :howto:vz_post_data_api.png?500|}} [ { "id": "21388036.bc1008", "type": "tab", "label": "VZ POST DATA API" }, { "id": "79f9406a.27692", "type": "http request", "z": "21388036.bc1008", "name": "volkszaehler post", "method": "POST", "ret": "obj", "url": "", "tls": "", "x": 290, "y": 180, "wires": [ [ "e53a25c.9e06ed8" ] ] }, { "id": "d2b54935.931dc8", "type": "template", "z": "21388036.bc1008", "name": "post data url", "field": "url", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "http://raspberrypi/middleware.php/data/{{uuid}}.json?ts={{timestamp}}&value={{payload}}", "x": 190, "y": 120, "wires": [ [ "1b77eb63.f8877d" ] ] }, { "id": "849e6d1b.13cc6", "type": "json", "z": "21388036.bc1008", "name": "", "x": 530, "y": 120, "wires": [ [ "79f9406a.27692" ] ] }, { "id": "e53a25c.9e06ed8", "type": "debug", "z": "21388036.bc1008", "name": "post response", "active": false, "console": "false", "complete": "true", "x": 480, "y": 180, "wires": [] }, { "id": "1b77eb63.f8877d", "type": "change", "z": "21388036.bc1008", "name": "", "rules": [ { "t": "delete", "p": "payload", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 370, "y": 120, "wires": [ [ "849e6d1b.13cc6" ] ] }, { "id": "1bb3941d.e36834", "type": "inject", "z": "21388036.bc1008", "name": "inject payload", "topic": "", "payload": "6", "payloadType": "str", "repeat": "", "crontab": "", "once": false, "x": 130, "y": 60, "wires": [ [ "9546ba4c.706278" ] ] }, { "id": "9546ba4c.706278", "type": "change", "z": "21388036.bc1008", "name": "set uuid / timestamp", "rules": [ { "t": "set", "p": "uuid", "pt": "msg", "to": "2e56fe60-e265-11e6-8bbc-a77e71764858", "tot": "str" }, { "t": "set", "p": "timestamp", "pt": "msg", "to": "", "tot": "date" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 340, "y": 60, "wires": [ [ "d2b54935.931dc8" ] ] } ] ==== API: GET data ==== Um Parameter / Daten aus Node-RED von der Middleware zu erhalten können wir auf die [[/howto/node-red#volkszaehler_nodes|fertigen VZ-nodes]] zurück greifen. {{ :howto:node-red_get_api.jpg?500|}} [ { "id": "de7c28c5.414368", "type": "uri", "z": "815188ba.c35718", "name": "", "middleware": "792445ef.949aec", "context": "data", "format": "json", "x": 158, "y": 171, "wires": [ [ "4af40d51.a7c234" ] ] }, { "id": "8911848d.d34a38", "type": "inject", "z": "815188ba.c35718", "name": "", "topic": "", "payload": "true", "payloadType": "bool", "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "x": 104, "y": 78, "wires": [ [ "e6c60ef.b5cfdf" ] ] }, { "id": "e6c60ef.b5cfdf", "type": "template", "z": "815188ba.c35718", "name": "UUID", "field": "uuid", "fieldType": "msg", "format": "handlebars", "syntax": "plain", "template": "c673b290-fdac-11e0-a470-1d9351203a00", "output": "str", "x": 247, "y": 79, "wires": [ [ "de7c28c5.414368" ] ] }, { "id": "4af40d51.a7c234", "type": "http request", "z": "815188ba.c35718", "name": "", "method": "GET", "ret": "txt", "url": "", "x": 340, "y": 172, "wires": [ [ "69c762a4.50c69c" ] ] }, { "id": "69c762a4.50c69c", "type": "debug", "z": "815188ba.c35718", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "x": 305, "y": 255, "wires": [] }, { "id": "792445ef.949aec", "type": "middleware", "z": "", "middleware": "https://demo.volkszaehler.org/middleware.php" } ] ---- ===== Beispielanwendungen ===== ==== TP-Link HS110 ==== Die [[https://www.tp-link.com/de/home-networking/smart-plug/hs110/|HS110 von TP-Link]] ist eine Funksteckdose mit WLAN, Schaltaktor und Leistungsmessung. Man kann sie wowohl steuern als auch auslesen.\\ Zur Konfiguration ist leider die Kasa-App nötig, man kommt aber auch [[https://www.tp-link.com/de/support/faq/2437/|ohne die Cloud]] zurecht.\\ [[https://www.photovoltaikforum.com/thread/173831-shelly-plus-1pm-mit-volkszähler-verbinden/?postID=2618376#post2618376]] ==== Heizungssystem über eBus auslesen ==== EBus ist ein serieller Bus der beispielsweise von Vaillant verwendet wird. Er kann mit passender Hardware gelesen werden um z.B. Temperaturwerte einer Therme zu loggen. * Hardware als [[https://wiki.fhem.de/wiki/EBUS|Bausatz]] oder [[https://www.eservice-online.de/shop/ebus/135/1-wire-hub-platine|Fertiglösung]] * [[https://github.com/john30/ebusd|eBUS daemon]] zum Auswerten des Protokolls. * [[https://github.com/john30/ebusd/issues/58|Konfiguration und Beispiel]] für Node-RED. * Das Zusatpaket [[https://flows.nodered.org/node/node-red-contrib-ui|node-red-contrib-ui]] ist erforderlich. ==== Temperatur / Lufteuchtigkeit mit ESP8266 per MQTT ==== Verschiedene Temperatur / Luftfeuchte Sensoren können am ESP8266 angeschlossen werden. Die Messwerte werden per MQTT verteilt. Node-RED empfängt die Messwerte und sendet diese an den Volkszaehler. * [[https://github.com/nuccleon/homie-dht|ESP8266 Sensor Node]] (Arduno Sketch) * [[https://gist.github.com/nuccleon/108d9656ee4375fc95cfc0e9cd1eab0b|Node-RED Beispiel]] ==== InfluxDB per MQTT ==== Daten vom [[software/middleware/push-Server|Push-Server]] im [[https://de.wikipedia.org/wiki/MQTT|MQTT-Protokoll]] an [[https://en.wikipedia.org/wiki/InfluxDB|InfluxDB]] weiterleiten:\\ [[http://flows.nodered.org/flow/dc9754a796fac49c918ab5a94f0af58a|Node-RED Library: Push Volkszaehler Readings to Influxdb via MQTT]] ==== Stromzähler per Modbus ==== Beispiel für [[/hardware/channels/meters/power/eastron_sdm630_modbus|Eastron SDM630]]:\\ [[https://flows.nodered.org/flow/eb051b360f09c315ac961f85b94a0c05|Node-RED Library: SDM630 Modbus Gateway - Starter Kit]] ==== Messwerte von Schaltaktor per MQTT ==== Messwerte von Modulwechselrichtern an [[https://shelly.cloud/shelly-25-wifi-smart-relay-roller-shutter-home-automation/|Shelly 2.5]] Funkaktoren erfasst und per [[https://de.wikipedia.org/wiki/MQTT|MQTT]] an Volkszähler weitergereicht:\\ [[https://www.photovoltaikforum.com/thread/142674-shelly-mqtt-integrieren/]]