Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:node-red

Dies ist eine alte Version des Dokuments!


Node-RED

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 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 englischen Originalanleitung.

sudo apt-get install build-essential python-rpi.gpio sense-hat
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

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

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.

Push-Server

Für Echtzeitdaten eignet sich zum Beispiel der 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.

Der Push-Server muss, wie in der 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
volkszaehler.conf.php
$config['push']['routes']['websocket'] = array('/socket'); 

Danach den Push-Server neu starten:

sudo systemctl stop push-server
sudo systemctl start push-Server

empfangen

Zum Empfang der Daten wird in Node-RED ein websocket-Eingang angelegt.

flow
[
    {
        "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"
    }
]

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.

json message
{"data":[{"uuid":"2e56fe60-e265-11e6-8bbc-a77e71764858","tuples":[[1493509724073, 5]]}]}

Port und URL entsprechen der Standard-Konfiguration.

http://raspberrypi:5582

flow
[
    {
        "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

Die Echtzeitdaten des vzloggers können auch direkt an Node-RED übergeben werden. Es werden für alle channel (auch api: „none“) die Rohdaten (Zählerstände, Impulse) ausgegeben.
parllelbetrieb PS?

Dazu die vzlogger.conf erweitern:

sudo nano /ect/vzlogger.conf
vzlogger.conf
"push": [
  {
    "url": "http://127.0.0.1:1880/vzpush"
  }
],

In Node-RED wird ein http-Input mit http-Response angelegt:

flow
[
    {
        "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": []
    }
]

VZ-API

POST data

Um Messwerte / Daten von Node-RED an die Middleware zu übermitteln muss die URL entprechend (siehe reference) aufgebaut werden.

http://raspberrypi/middleware.php/data/{{uuid}}.json?ts={{timestamp}}&value={{payload}}

flow
[
    {
        "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"
            ]
        ]
    }
]

Beispielanwendungen

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.

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.

InfluxDB per MQTT

howto/node-red.1494671065.txt.gz · Zuletzt geändert: 2017/05/13 12:24 von jau