Node-RED

Die Kommunikation zwischen verschiedenen Smart Home Systemen wird mit Node-RED realisiert. Die grundlegende Einrichtung von Node-RED wird im folgenden Beitrag erklärt.

Node-RED ist ein Werkzeug für das Internet der Dinge. Node-RED wurde von IBM unter dem Aspekt der einfachen Erstellung von Prototypen entwickelt. Es verfügt über einen visuellen Editor zur Verbindung verschiedener Module (nodes). Im Grunde spricht man hierbei von einer datenflussorientierten visuellen Programmierung. Node-RED basiert auf NodeJS und übernimmt somit sämtliche zuvor genannten Vorteile, wie z.B. die nicht blockierende I/O Architektur. Der grafische Editor ist browserbasiert und kann somit mit jedem aktuellen Webbrowser verwendet werden. Die Grundinstallation von Node-RED beinhaltet bereits
einige nodes zur Eingabe, Verarbeitung und Ausgabe. Die Kommunikation zwischen den sogenannten nodes erfolgt via standardisierten JSON Nachrichten. Alle Nodes besitzen somit eindeutig definierte Schnittstellen zur Ein-/Ausgabe. Eine Verkettung mehrerer Nodes zu einer Funktion wird als Flow bezeichnet. Aufgrund der stetig wachsenden Community kann auf eine große Anzahl fertiger Nodes zugegriffen werden. Mittels Java-Script lassen sich unter Einhaltung der Schnittstellen eigene Nodes erstellen.

Installation von Node-RED auf einem Raspberry Pi 3

Node-RED ist in einer meist veralteten Version bereits Bestandteil üblicher Raspian Images für den Raspberry Pi 3. Da in diesem Beispiel die minimale Version (Lite-Version) des Betriebssystems Raspbian verwendet wird, ist Node-RED nicht vorinstalliert und muss manuell installiert werden. Hierfür bietet der Entwickler ein einfaches Installationsskript an, welches, sofern benötigt, auch ein Update der NodeJS Installation vornimmt. Um das Installationsskript zu verwenden, muss folgende Zeile nach erfolgreicher SSH Verbindung mittels PuTTY in der Konsole eingegeben werden:

$ sudo bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

Die Ausführung des Installationsskripts dauert auf einem Raspberry Pi 3 ca. 5 Minuten. Da die Installation der aktuellsten NodeJS Version bereits in dem vorherigen Abschnitt durchgeführt wurde, wurde dieser Abschnitt in dem Installationsskript automatisch übersprungen. Nach einer erfolgreichen Ausführung sollte folgende Ausgabe auf der Konsole erscheinen.

Ausgabe des Installationsskripts

Node-RED wurde nun erfolgreich in der Version (0.16.2) installiert und kann nun verwendet werden.

Erster Start der Node-RED Weboberfläche

Um Node-RED verwenden zu können, muss zunächst der zugehörige Service auf dem Raspberry Pi 3 gestartet werden. Hierfür bietet die Node-RED Installation ein Start-Script, welches mittels folgendem Befehl ausgeführt werden kann:

$ node-red-start

Analog zu dem Start-Script existieren Befehle zum Stoppen und Neustarten des Node-RED Service:

$ node-red-stop
$ node-red-restart

Nach erfolgreicher Ausführung des Start-Scripts kann die Node-RED Weboberfläche mittels der IP-Adresse des Raspberry Pi 3 auf Port 1880 geöffnet werden. (http://192.168.1.80:1880) Nach Eingabe der URL sollte sich folgende Oberfläche in dem verwendeten Webbrowser öffnen:

Node-Red Weboberfläche

Die Abbildung zeigt die leere Node-RED Weboberfläche. Auf dieser Weboberfläche können nun entsprechende Flows (1) entwickelt werden. Hierfür kann für jeden Flow ein extra Tab angelegt werden. Am linken Bildschirmrand findet man die bereits vorinstallierten Nodes (2). Diese sind nach Kategorien sortiert. 

In der vorliegenden Beispielinstallation sind Nodes der folgenden Kategorien vorinstalliert:
input Beinhaltet standard Input Nodes zur Eingabe von Daten / Nachrichten in den entsprechenden Flow
output Beinhaltet standard Output Nodes zur Ausgabe von Daten / Nachrichten aus dem entsprechenden Flow
function Beinhaltet Funktionen zur Verarbeitung der Nachrichten innerhalb eines Flows
social Beinhaltet Social-Media Nodes als Schnittstelle zu Twitter oder zur Versendung von E-Mails
storage Beinhaltet Nodes für Zugriffe auf das dem Node-Red Server zugrundeliegenden Dateisystems
advanced Beinhaltet Nodes zur Überwachung bestimmter Dateien des Dateisystems oder zum Ausführen von Befehlen aus dem Host-System
Raspberry Pi Beinhaltet Raspberry Pi spezifische Nodes zur Ansteuerung der GPIOs.
network Beinhaltet Standard-Netzwerkfunktionen (Ping)

Aus diesen Nodes kann nun mittels Drag&Drop ein Flow zusammengestellt werden. Es gilt zu beachten, dass jeder Flow sinnvollerweise ein oder mehrere Inputs sowie entsprechende Outputs aufweisen muss. Einige Nodes können / müssen nach der Positionierung in dem entsprechenden Flow konfiguriert werden. Dies erfolgt durch einen Doppelklick auf den entsprechenden Node. Die Positionierung der Nodes in dem jeweiligen Flow hat keinen Einfluss auf die Funktion. Lediglich die Verbindungen bestimmen den Datenfluss. Nach der Zusammenstellung des gewünschten Flows muss mittels Klick auf die Schaltfläche Deploy(3) die Änderung bestätigt werden. Die Schaltfläche Deploy muss nach jeder Änderung / Anpassung des Flows betätigt werden und führt zu einem Neustart der bisher entwickelten Flows. Mittels einer Debug Node lassen sich Ausgaben direkt auf der Weboberfläche in einer Konsole anzeigen, um etwaige Fehler schnell lokalisieren zu können.

Node-RED Beispiel TCP Echo Server

Anhand des folgenden Beispiels eines TCP Echo Servers soll die Erstellung eines Flows unter Verwendung der standardmäßig installierten Nodes gezeigt werden. Es soll ein TCP Server entwickelt werden, der auf Port 1337 auf die Texteingabe „Hallo“ wartet und anschließend mit der Textzeile „Hallo fleissiger Leser!“ antwortet. Für diesen Anwendungsfall werden insgesamt 4 verschiedene Nodes benötigt. Zur Erstellung eines TCP Servers wird aus der Kategorie input zunächst der tcp Node ausgewählt und mittels Drag&Drop dem Flow hinzugefügt. Nach dem Hinzufügen des tcp Nodes kann dieser mittels Doppelklick konfiguriert werden.

Konfiguration TCP Input Node

Der TCP Input Node wird so konfiguriert, dass er auf Port 1337 lauscht(1), einen String als Payload ausgiebt(2) und eine abgeschlossene Eingabe an einem Carriage-Return erkennt(3). Als nächstes wird zur Erkennung des Schlüsselwortes „Hallo“ aus der Kategorie function eine switch Node ausgewählt. Die switch Node ist in ihrer Funktion mit der Switch Funktion
gängiger Programmiersprachen zu vergleichen. Mittels Doppelklick wird die Switch Node in ihrer Konfiguration angepasst.

Konfiguration switch Node

Das Feld Property definiert das Feld der eingehenden Nachricht, mit dessen Inhalt verglichen werden soll. In diesem Falle soll das Payload Feld (1) auf das Vorkommen des Wortes „Hallo“(2) überprüft werden. Zur besseren Übersicht innerhalb des Flow Editors wird der Node ein Name vergeben (3). Dieser Name hat keinen Einfluss auf die Funktion. Wenn nun eine Nachricht am Eingang der switch Node ankommt, deren Payload das Wort „Hallo“ enthält, wird diese Nachricht an Ausgang 1 der switch Node ausgegeben. Sollte kein „Hallo“ in dem Payload der Nachricht vorhanden sein, wird die Nachricht verworfen.

Als nächstes wird eine change Node aus der Kategorie function verwendet, um den Payload Teil der eingehenden Nachricht durch einen neuen Payload zu ersetzen. Es soll also der Payload jeder eingehenden Nachricht durch den Text „Hallo fleissiger Leser!“ ersetzt werden.

Konfiguration change Node

Analog zu den vorherigen Node Konfigurationen wird in Feld (1) das betroffene Feld (Payload) bestimmt und in Feld (2) der einzusetzende Wert/Text eingetragen. In Feld (3) kann ein Name vergeben werden.

Zur Ausgabe des veränderten Payloads via TCP wird nun ein tcp Node aus der Kategorie output benötigt.

Konfiguration TCP Output Node

In der Konfiguration der TCP Output Node wird festgelegt, dass der Output als Antwort auf den vorhergehenden TCP Input erfolgen soll (1).

Nun werden alle Nodes logisch miteinander verknüpft. Die  Verbindungsstellen der Nodes werden visuell durch kleine graue Verbindungspunkte dargestellt. Zwischen den Verbindungs-Ausgängen und Verbindungs-Eingängen kann mittels Klicken und Ziehen mit der linken Maustaste eine Verbindung hergestellt werden. Das Beispielprogramm soll jede eingehende TCP Nachricht auf das Wort „Hallo“ überprüfen. Die tcp input Node sendet zunächst jede eingehende Nachricht an die switch Node. Alle Nachrichten, welche das Wort „Hallo“ beinhalten, sollen an die change Node weitergegeben werden. Innerhalb der change Node wird der Inhalt (Payload) durch den neuen Text „Hallo fleissiger Leser!“ ersetzt und an die tcp output Node weitergegeben.

Nachdem alle Verbindungen sinngemäß hergestellt wurden, sollte das Ergebnis in etwa folgendermaßen aussehen:

Beispiel ECHO Server

Nach einem Klick auf Deploy wird der Flow gestartet und kann mittels Putty auf Funktion überprüft werden.

Konfiguration von Putty als Test des Echo Servers
Test des Echo Servers

Beispiel Flow zum Importieren in Node-RED

Zur Nachvollziehbarkeit kann der zuvor beschriebene Flow direkt in Node-RED importiert werden.

 [{"id":"53212438.6f328c","type":"tcp in","z":"ee6fc44a.a07e68","name":"","server":"server","host":"","port":"1337","datamode":"stream","datatype":"utf8","newline":"\\n","topic":"","base64":false,"x":83,"y":351,"wires":[["fcd99741.4a78b8"]]},{"id":"fcd99741.4a78b8","type":"switch","z":"ee6fc44a.a07e68","name":"Wenn Payload == Hallo","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"Hallo","vt":"str"}],"checkall":"true","outputs":1,"x":276,"y":351,"wires":[["9c016360.cbb72"]]},{"id":"d8b64976.f8cde8","type":"tcp out","z":"ee6fc44a.a07e68","host":"","port":"","beserver":"reply","base64":false,"end":false,"name":"","x":813,"y":351,"wires":[]},{"id":"9c016360.cbb72","type":"change","z":"ee6fc44a.a07e68","name":"Setze Payload auf Hallo fleissiger Leser!","rules":[{"t":"set","p":"payload","pt":"msg","to":"Hallo fleissiger Leser!","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":568,"y":351,"wires":[["d8b64976.f8cde8"]]}]

15 Gedanken zu “Node-RED

  1. Hallo,
    versuche gerade deine Anleitung zu befolgen; allerdings erhalte ich beim ersten Befehl folgenden Hinweis:
    “bash: /dev/fd/63: No such file or directory”

    Ich habe hier ein Pi3 mit aktuellem Lite Raspbian Image.

    Hast du einen Tip für mich?

  2. Hallo,
    bin ein gutes Stück weiter.
    https://jmp.sh/p4dorX3
    Bei 1 und 2 kann ich schon manuell korrekt ausführen.

    In der Loxconfig habe ich einen einfachen Schalter genommen und diesen bei controlin ausgewählt.

    Da passiert allerdings nichts, wenn ich den Schalter betätige.
    Wie gehe ich denn hier am Besten auf Fehlersuche bzw. ist das überhaupt richtig, wie ich das mache?

    Danke und Gruß

    1. Hallo Thomas,
      Ich habe das in dem Beispiel mit dem Lichtbaustein gelöst und reagiere in der Switch Node auf die entsprechende Szene. Das passt dann für einen normalen Schalter so nicht direkt.
      Häng am besten mal eine “Debug Node” an deinen Control ist und schau was aus der Node bei der Schalter Betätigung raus kommt. Also eine Debug Node aus der Palette nehmen und direkt mit der Control in Node Verbinden. Dann kannst du oben rechts auf den Debug Tab gehen und schauen was dort “rauskommt” das einfach mal posten 🙂

      1. Hallo,
        hab es mit deinem Wink alleine geschafft.
        Geliefert wird hier eine „0“ und eine „1“.
        Somit startet bei uns der TV gleich mit der App Waipu.TV was einem „echtem“ TV-Feeling deutlich näher kommt.

        Vielen Dank für den Artikel (gerne mehr davon ;-)) und deine Unterstützung.

        https://jmp.sh/6wn1uLt

          1. Abo läuft schon.
            Allerdings war ich wohl etwas voreilig; alle paar Minuten startet jetzt Waipu; auch wenn eine andere App läuft. 🙁
            Kann es sein; dass das was mit dem reconnect von 5 min zu tun hat?

  3. Du kannst ja den 5 Minuten Timer Mal rausnehmen. Dürfte aber laut deinem Bild nicht passieren. Prüf doch Mal mit der Debug Node ob vom Loxone Control in mehrfach ein Signal kommt und nicht nur beim Drücken des Tasters. Beim MiniServer Neustart kann das auch passieren. Falls das der Fall sein sollte, setz zwischen Control in und Switch Node noch eine RBE Node (müsste in der Standard-Installation vorhanden sein) und stell diese so ein dass sie Werte nur durchlässt wenn sie sich ändern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.