Aus Linux-Magazin 07/2023

Erste praktische Schritte mit der Low-Code-Anwendung Node-RED

© Oleksandr Rozdobudko / 123rf.com

Fertige Code-Bausteine nach dem Legoprinzip zusammenstecken, das ist das Grundprinzip von Node-RED. So entstehen einfache, aber auch komplexe Programme, f�r die wenig bis kein Code niederzuschreiben ist.

Stellen Sie sich vor, Sie kommen nach Hause, im Wohnzimmer fahren die Jalousien herunter, dezente Beleuchtung schaltet sich ein, Alexa begr��t Sie, und die Kaffeemaschine bereitet eine Tasse Mokka zu. All das passiert automatisch, und sie selbst haben daf�r gesorgt. Allerdings ohne n�chtelang Code einzutippen, ja, Sie sind nicht einmal ein klassischer Programmierer: Den ganzen Zauber konnten Sie im Wesentlichen mit der Maus arrangieren – dank der Low Code-Plattform NodeRED. Den Ablauf steuern wenige Elemente, von denen jedes f�r einen ganzen Anweisungsblock steht, der bei herk�mmlicher Programmierung eine gr��ere Anzahl Codezeilen erfordern w�rde (Abbildung 1).

Abbildung 1: Dieser Node-RED-Flow steuert das Szenario bei der Heimkehr des Bewohners.

Abbildung 1: Dieser Node-RED-Flow steuert das Szenario bei der Heimkehr des Bewohners.

Das Prinzip der Programmierung ist dabei immer identisch. Zun�chst braucht es einen Ausl�ser. Im Beispiel ist es die Auswertung eines Ping-Signals an ein Mobiltelefon. Sollen stattdessen lieber Geodaten die Aktionen ausl�sen? Auch kein Problem: Die Ping-Auswertung l�sst sich leicht gegen ein Geofencing-Element austauschen. In jedem Fall l�st das Ereignis die Verarbeitung von Daten aus, was Abfragen beinhaltet und die Modellierung von Daten oder etwa das Setzen einer Dashboard-Anzeige einschlie�t. All das l�sst sich visuell arrangieren, und es geschieht –anders als bei vielen anderen Heimautomatisierungssystemen – unter einer einheitlichen Benutzeroberfl�che.

Open Source von Anfang an

Node-RED [1] galt in der Maker-Szene lange als Geheimtipp. Seit einiger Zeit ist es jedoch ein gern genutztes und weitverbreitetes Tool, wenn es darum geht, auf einfache Weise Programme zu schreiben und komplexe Anwendungen wie Smart-Home-Systeme aufzusetzen. Oder auch nur zeitsparend etwas auszuprobieren. Node-RED ist noch relativ jung. Es wurde urspr�nglich Ende 2013 von Nick O’Leary und Dave Conway-Jones, beides Wissenschaftler der IBM Engineering Technologies Group, als Open-Source-Projekt f�r eigene Zwecke entwickelt. Ziel war es, auf einfache Weise eine schnelle Verbindung von Ger�ten mit Webdiensten und Programmierschnittstellen zu schaffen. Node-RED basiert auf der Programmiersprache Node.js. Deshalb findet sich das Wort Node auch im Namen wieder. Der Zusatz RED hat wohl keine tiefere Bedeutung. Dave Conway-Jones hat ihn vorgeschlagen, weil er sich wie Code Red anh�rt, was wiederum ein Alarm-Code sein kann und auch eine Familie von Computerw�rmern bezeichnet. Node-RED hat binnen kurzer Zeit an Popularit�t gewonnen und ist heute ein weitverbreitetes Werkzeug f�r das Internet der Dinge (Internet of Things, IoT) sowie im Prototyping industrieller Anwendungen.

Das Grundprinzip

Node-RED ist eine Plattform mit einer best�ndig wachsenden Nutzerbasis und einer aktiven Entwicklergemeinschaft, die laufend neue Nodes beisteuert. Das Anwendungsspektrum von Node-RED ist breit und w�chst immer weiter. So lassen sich inzwischen Social-Media-Kan�le (Twitter, E-Mail) genauso bedienen wie Datenbanken (MariaDB oder InfluxDB) anbinden. Neben einfachen Aufgaben (Ad-hoc-Auswertungen, Prototyping) lassen sich mit Node-RED auch komplexe Probleme elegant l�sen. Allerdings sind nicht alle Aufgaben f�r Node-RED gleicherma�en gut geeignet. So tut sich Node-RED zum Beispiel mit Schleifen schwer, zudem l�sst sich die Verarbeitung umfangreicher Tabellen mitunter in traditionellen Programmiersprachen besser abbilden.

Der Grundgedanke von Node-RED ist es, vordefinierte Codebl�cke f�r die Ausf�hrung von Aufgaben bereitzustellen. Diese Codebl�cke werden als Nodes bezeichnet. Nodes lassen sich verbinden und miteinander vernetzen. Ausgangspunkt einer Datenverarbeitung sind Eingabe-Nodes, auf die Verarbeitungs-Nodes und Ausgabe-Nodes folgen. Das komplette Gebilde daraus nennt sich Flow.

Flow-basierte Programmierung beruht auf einer Idee von J. Paul Morrison. Er betrachtete bereits in den fr�hen 1970er-Jahren eine Anwendung nicht nur als einen einzelnen, sequenziellen Prozess mit einem Start, einer Vielzahl von Bearbeitungsschritten und einem Ende nach Abarbeitung der Aufgaben. Stattdessen ging es ihm um ein Netzwerk von asynchronen Prozessen, die �ber Str�me strukturierter Datenbl�cke (Information Packets, IPs) kommunizieren.

Die Installation

Node-RED l�sst sich unter allen g�ngigen Betriebssystem oder sogar Cloud-basiert hosten. Beliebt ist im Hinblick auf den sparsamen Energieverbrauch der Raspberry Pi, den wir hier als Beispiel verwenden. �ffnen Sie ein Terminal, und bringen Sie das System mit »sudo apt-get update« auf den neuesten Stand. F�r die Installation sowie f�r ein sp�teres Update auf einem Raspberry Pi stellt Node-RED ein Skript bereit. Starten Sie das Skript mit Listing 1:

Listing 1

Skript starten

��nonumber
bash <(curl -sL https://raw.githubusercontent.com/node-red/��
linux-installers/master/deb/update-nodejs-and-nodered)

Es installiert Node.js, npm und Node-RED. Das Skript arbeitet auf allen Debian basierten Linux-System wie Ubuntu. Allerdings kann es dabei vorkommen, dass die momentan aktuelle Node-RED-Version 3.0.2 ein neueres Node.js verlangt, als es beispielsweise die letzte Ubuntu-LTS-Version 22.04 mitbringt. In diesem Fall bieten sich verschiedene Auswege an: Entweder man installiert ein hinreichend neues Node.js aus den Quellen, oder man l�dt das Installer-Skript herunter und gibt ihm beim Aufruf vor, ein �lteres Node-RED zu installieren, oder man installiert die Snap-Version, oder man weicht auf Docker aus. Auf jeden Fall ist sicherzustellen, dass alle notwendigen Pakete vorhanden sind: »sudo apt install build-essential git curl«. Nach der Installation l�sst sich Node-RED �blicherweise entweder �ber das Terminal starten (»node-red-start«) oder als Systemprozess beim Booten (»sudo systemctl enable nodered.service«).

Wichtige Dateien

Alle wichtigen Node-RED-Dateien finden sich in »~/.node-red«, einem versteckten Ordner in Ihrem Home-Verzeichnis. Die wichtigsten Dateien sind dort der Ordner “node_modules”, in dem die installierten Nodes liegen. Die Datei “flows.json” enth�lt alle Flows im JSON-Format. Ein Backup dieser Datei sichert s�mtliche Flows. Der Inhalt von “settings.js” bestimmt die Konfiguration von Node-RED. Sie ist zentrale Anlaufstelle, um so wichtige Dinge wie Passwortabsicherung und Merkmale einer verschl�sselten Verbindung (HTTPS) festzulegen. Auch lassen sich hier etwa die L�nge von Debug-Ausgaben (Standard 1000 Zeichen) oder der Umfang des Loggings definieren.

Der Node-RED-Editor

Im Zentrum der Entwicklung mit Node-RED steht der Editor. Seine St�rken liegen im visuellen Programmieren. Das beinhaltet auch einen leistungsf�higen Debugger und einen Linter – ein Tool zur �berpr�fung des Codes auf Probleme. Daneben lassen sich im Editor einige Funktionen zur Verwaltung des Systems aufrufen. Die Entwickler von Node-RED haben in den vergangenen Jahren viele neue Features implementiert und so das Programmieren mit Node-RED noch eing�ngiger und intuitiver gestaltet.

Der Node-RED-Editor l�uft in einem Browser (Abbildung 2). Bei einer lokalen Installation lauscht der Node-RED-Server standardm��ig auf Port 1880. In einem Browser, der auf dem gleichen Host l�uft wie der Node-RED-Server (etwa Chromium auf dem Raspberry Pi), lautet die URL http://localhost:1880/. Aber Achtung: Der Installationsprozess von Node-RED hinterl�sst ein ungesch�tztes System! Eine Absicherung des Zugangs mit Benutzernamen und Passwort ist deshalb dringend anzuraten. Ebenso n�tig w�re eine abgesicherte HTTPS-Verbindung, wenn ein Zugriff von au�erhalb des lokalen Netzes m�glich sein soll.

Abbildung 2: Der Node-RED-Editor in einem Browserfenster.

Abbildung 2: Der Node-RED-Editor in einem Browserfenster.

Das Browserfenster des Node-RED-Editors gliedert sich in verschiedene Bereiche:

  • Die Kopfleiste. Zentrales Element der Kopfleiste isteine Schaltfl�che, mit der Flows aktiviert werden. Hinter dem Menu-Icon verbirgt sich der Zugang zu verschiedene Systemeinstellungen sowie einigen hilfreichen Funktionen, die �ber das reine Editieren hinausgehen, beispielsweise das Importieren oder Exportieren von Flows.
  • Die Palette der Nodes (die linke Spalte). Die Palette beherbergt die einsetzbaren Nodes. Die Nodes sind thematisch geordnet. Einzelne Themenbereiche lassen sich ein- und ausklappen.
  • Der Arbeitsbereich (die mittlere Spalte). Der Arbeitsbereich ist der Ort der Flow-Entwicklung. Er enth�lt eine Verwaltungsleiste f�r die Flows, den Flow-Design-Bereich und eine Fu�leiste.
  • Die rechte Seitenleiste (die rechte Spalte). �ber die rechte Seitenleiste sind n�tzliche Informationen (zum Beispiel Hilfe, Debug) sowie Administrationsm�glichkeiten erreichbar (beispielsweise Konfigurations-Nodes, das sind Nodes f�r sachbezogene Einstellungen wie Benutzerdaten eines E-Mail-Kontos). Diese sind thematisch in Rubriken gegliedert und �ber Icons aufzubl�ttern.

Das Message-Konzept

Zum Einstieg in die Programmierung mit einer bestimmten Programmiersprache dient h�ufig ein simples Hallo-Welt-Programm, anhand dessen sich Datenstrukturen, Sprachelemente und Zusammenh�nge erkl�ren lassen. Bei Node-RED ist das nicht anders, der Hallo-Welt-Flow besteht aus einem Inject-Node, der einen Programmablauf ausl�st, und aus einem Debug-Node der das Ergebnis anzeigt (Abbildung 3).

Abbildung 3: Ein einfacher Hallo-Welt-Flow im Node-RED-Editor.

Abbildung 3: Ein einfacher Hallo-Welt-Flow im Node-RED-Editor.

Die Flows lassen sich erzeugen, indem man Nodes aus der Node-Palette in den Flow-Design-Bereich zieht. Jeder Node verf�gt zumindest �ber einen Ein- oder einen Ausgabeport, symbolisiert durch die kleinen grauen Quadrate. Manche Nodes haben auch mehrere Ausgabeports, etwa einen f�r die normale Datenausgabe und einen weiteren f�r Fehlermeldungen. Mehr als einen Eingabeport gibt es jedoch nicht. Einzelne Nodes werden durch sogenannte Dr�hte verbunden, die durch Ziehen einer Verbindung von Port zu Port mit gedr�ckter linker Maustaste entstehen.

Oberhalb der Nodes geben Symbole Hinweise zum Bearbeitungsstand. Ein blauer Punkt signalisiert, dass �nderungen noch nicht �bernommen worden oder ein rotes Dreieck, dass noch Konfigurationen offen sind. Auch unterhalb des Nodes in der Node-Decoration k�nnen Informationen auftauchen, zum Beispiel wird dort der Status eines Switch-Nodes angezeigt. Meistens muss der Programmautor die eingesetzten Nodes noch anpassen. Das geschieht mithilfe der Node-Eigenschaften, die mit einem Doppelklick auf den Node zu erreichen sind (Abbildung 4).

Abbildung 4: Nach Doppelklick erreichbar: die Node-Eigenschaften.

Abbildung 4: Nach Doppelklick erreichbar: die Node-Eigenschaften.

Das Fenster mit den Node-Eigenschaften ist bei allen Nodes in etwa gleich, der Unterschied liegt in den spezifischen Eigenschaften. Im Einzelfall k�nnen diese umfangreich sein. Im Beispiel soll der Inject-Node eine Nachricht mit »msg.payload« gleich “Hallo Welt” und »msg.topic« “erster Flow” einspeisen. Nach der �bernahme der �nderungen (»deploy«, rechtes Feld in der Editorkopfleiste) setzt ein Klick auf das gr��ere graue Quadrat links vom Inject-Nodes den Flow in Gang: Er sendet eine Nachricht an den Debug-Node. Die Debug-Ausgabe zeigt hier das gesamten Nachrichtenobjekt (Abbildung 5).

Abbildung 5: So sieht die Debug-Ausgabe des Nachrichtenobjekts aus.

Abbildung 5: So sieht die Debug-Ausgabe des Nachrichtenobjekts aus.

Klar zu erkennen ist das Nachrichtenformat, es handelt sich um ein JSON-Objekt. JSON erf�llt besonders gut die modernen Anforderungen der objektorientierten Programmierung mit Blick auf den Datenaustausch zwischen einem oder mehreren Systemen. Pushbullet, Telegram, aber auch das Hue-Beleuchtungssystem und viele andere Programme nutzen es. JSON baut auf der Struktur eines Name-Wert-Paares auf (»”topic”: “erster Flo”«) sowie auf einer geordneten Liste (Tabelle) von Werten (»”farben”: [“blau”, “rot”, “gelb”]«.

Jede Nachricht besteht aus mindestens einer Message-ID (»_msgid«) und dem Nachrichtenk�rper (Payload). Die Message-ID bleibt �ber den gesamten Verarbeitungsprozess der Nachricht gleich, selbst wenn sich der Nachrichtenfluss verzweigen sollte. Der Nachrichtenk�rper enth�lt den Nachrichtentext wiederum im JSON-Format. Dabei sind tiefe Verschachtelungen keine Seltenheit. Die Debug-Ausgabe hilft aber, die �bersicht zu behalten, indem einzelne Bestandteile des Objekts ein- oder ausgeklappt werden k�nnen. Hinzu k�nnen auf der ersten Objektebene der Nachricht weitere Objekte wie hier »”topic”« kommen – dies h�ngt dann von den jeweiligen Gegebenheiten ab.

�brigens findet sich das JSON-Format auch in der Konfigurations-Datei “settings.js” und als Format f�r die Speicherung von Flows, wie Listing 2 des Hallo-Welt-Beispiels zeigt.

Listing 2

Im JSON-Format gespeicherter Flow

��nonumber
[
    {
        "id": "b4d449fdd05e5ebd",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "4ef230ee3cdeb12d",
        "type": "inject",
        "z": "b4d449fdd05e5ebd",
        "name": "Hallo Welt",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "erster Flow",
        "payload": "Hallo Welt",
        "payloadType": "str",
        "x": 100,
        "y": 40,
        "wires": [
            [
                "1aba6a2edc504015"
            ]
        ]
    },
    {
        "id": "1aba6a2edc504015",
        "type": "debug",
        "z": "b4d449fdd05e5ebd",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 300,
        "y": 40,
        "wires": []
    }
]

Daten verarbeiten

Der simple Hallo-Welt-Flow sollte in die Welt von Node-RED einf�hren. Das folgende Beispiel will exemplarisch zeigen, wie einfach und m�chtig Node-RED die Programmierung unterst�tzt. Es ist nicht allzu komplex. Das ausl�sende Element ist beliebig austauschbar. Im nun folgenden Beispiel sind es Daten eines Bodenfeuchtesensors, die �ber USB in Node-RED eingespeist werden. An anderer Stelle m�gen es eingehende E-Mails, Telegram-Nachrichten oder TCP-Anfragen sein. Das Gleiche gilt auch f�r das Ergebnis der Datenverarbeitung (Debug-Ausgabe, Monitoring in einem Dashboard, Datenspeicherung in einer Datei oder Datenbank). Das Prinzip ist immer identisch.

Ausgangspunkt und erster Schritt ist an dieser Stelle also das Messen der Bodenfeuchtigkeit mit einem kapazitiven Bodenfeuchtesensor (Abbildung 6). Ein Arduino Nano wandelt den analogen Messwert (Spannung) in einen Zahlenwert um und gibt diesen alle 10 Sekunden �ber die serielle Schnittstelle aus.

Abbildung 6: Mithilfe eines Arduino Mikrocontrollers misst ein Kapazitiver Sensor die Bodenfeuchtigkeit.

Abbildung 6: Mithilfe eines Arduino Mikrocontrollers misst ein Kapazitiver Sensor die Bodenfeuchtigkeit.

Der Arduino-Code besteht nur aus wenigen Zeilen (Listing 3).

Listing 3

Arduino-Code

��nonumber
void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.println (map(analogRead(4), 0, 1023, 0, 100));
  delay(5000);
}

Node-RED kennt f�r den Datenempfang von einer lokalen seriellen Schnittstelle einen speziellen Node, den Serial-in-Node aus dem Abschnitt Netzwerk der Node-Palette. Er ersetzt den Inject-Node des Hallo-Welt-Beispiels. Das rote Dreieck �ber dem Serial-in-Node (Abbildung 7) weist darauf hin, dass neben den Node-Eigenschaften auch noch generelle Konfigurationseinstellungen vorzunehmen sind. Ein Doppelklick �ffnet das Fenster mit den Node-Eigenschaften. Bei der seriellen Schnittstelle ist die Angabe des Ports n�tig. �ber das Lupensymbol erleichtert Node-RED das Auffinden verf�gbarer Ports und die syntaktisch korrekte Parameterangabe. Die Auswahl der richtigen Baud-Rate (hier 9600) erfolgt �ber eine Drop-down-Liste (Abbildung 8).

Nach der �bernahme des Flows lassen sich bei der Debug-Ausgabe die empfangenen Werte entnehmen. Das gesamte Nachrichtenobjekt hat drei Name-Wert-Paare: »payload, port« und »_msgid«. Der Inhalt von »payload« umfasst neben dem Zahlenwert das Carriage- Return-Line-Feed-Zeichen (»\n«). Es dient qua Einstellung dazu, den �ber die serielle Schnittstelle empfangenen Datenstrom aufzuteilen. Andere Aufteilungskategorien sind eine feste L�nge oder ein Zeitablauf.

Abbildung 7: Ein serieller Port ist hier mit einem Debug-Node verbunden.

Abbildung 7: Ein serieller Port ist hier mit einem Debug-Node verbunden.

Abbildung 8: Beim seriellen Port sind Eigenschaften wie die Baudrate einzustellen.

Abbildung 8: Beim seriellen Port sind Eigenschaften wie die Baudrate einzustellen.

Das Dashboard

F�r einen dauerhaften Betrieb ist die Visualisierung der Messwerte in einem Debug-Node wenig benutzerfreundlich. Zum Einsatz kommen f�r diesen Zweck grafische Benutzeroberfl�chen. Auch Node-RED bietet derartige Pakete an. Eine Suche mit dem Palettenmanager (»Hauptmenu | Palette verwalten | Installation«) nach “Dashboard” ergibt mehr als 40 Treffer. Kein Paket hat aktuell die Finesse von Grafana, aber f�r die meisten Anwendungsf�lle ist das Leistungsspektrum mehr als ausreichend. Und mit “Uibuilder” gibt es ein Paket, das die dynamische Erstellung von Webschnittstellen unterst�tzt. Exemplarisch kommt dazu das Paket Node-RED-Dashboard zum Einsatz. Es umfasst Nodes f�r die gebr�uchlichsten Anwendungsf�lle, ist am weitesten verbreitet, solide und ausgereift.

Mit den Elementen dieses Pakets l�sst sich ein durchaus vielf�ltiges Dashboard gestalten. Es kann mehrere Reiter (Tabs) haben, um Ausgaben thematisch zu gliedern. Ein Reiter beherbergt eine oder mehrere senkrechte Spalten (Gruppen), die die Widgets aufnehmen. Die Spaltenbreite betr�gt per Voreinstellung sechs Rasterk�stchen, und ein Rasterk�stchen hat per Voreinstellung eine Gr��e von 48×48 Pixeln. All dies l�sst sich wie auch das Dashboard-Theme �ndern. �bertragen auf das Bodenfeuchtesensorbeispiel k�nnte die Darstellung der Messdaten in Form eines Liniendiagramms oder als Zeigermessger�t �hnlich einem Tachometer (Gauge) erfolgen. Entsprechende Nodes treten dann an die Stelle des debug-Nodes (Abbildung 9).

Abbildung 9: Die &iuml;&iquest;&frac12;ber den seriellen Port eingehenden Messwerte werden zur gradischen Darstellung weitergereicht.

Abbildung 9: Die �ber den seriellen Port eingehenden Messwerte werden zur gradischen Darstellung weitergereicht.

Die roten Dreiecke kennzeichnen wieder, dass neben der Festlegung der Node-Eigenschaften noch Konfigurationsarbeiten (Zuordnung des Widgets zu einem gegebenenfalls noch zu erstellenden Reiter beziehungsweise einer Gruppe) erforderlich sind. Abbildung 10 zeigt exemplarisch und ohne von den weitreichenden Einstellungsm�glichkeiten des Chart- beziehungsweise Gauge-Nodes Gebrauch zu machen, die Darstellung empfangener Messwerte.

Abbildung 10: Hier werden Chart- und Gauge-Node in einem Dashboard verwendet.

Abbildung 10: Hier werden Chart- und Gauge-Node in einem Dashboard verwendet.

Abl�ufe erstellen

Auch programmgesteuerte Abl�ufe lassen sich mit Node-RED gestalten. �blicherweise bedeutet zu programmieren, einen mehr oder weniger umfangreichen Code zu verfassen, der ohne eine gewisse Selbstdisziplin oft un�bersichtlich wird. Dabei sind je nach verwendeter Sprache vertiefte Programmierkenntnisse n�tig. Wer den Code testen will, muss ihn wiederholt �bersetzen und zu einem ablauff�higen Modul binden. Das bedingt unter Umst�nden einen st�ndigen Wechsel zwischen verschiedenen Fenstern (Editor, Terminal). Node-RED vereinfacht dieses Vorgehen.

Aufgabenstellung in einem weiteren Beispiel ist, dass bei einem zu trockenen Boden �ber einen Schalter (hier ein Shelly-Relais) ein Bew�sserungssystem aktiviert werden soll. Daraus ergeben sich im Programmablaufs verschiedene Bl�cke:

o Empfang der Messwerte

o Abfrage eines Schwellenwerts, der f�r die Entscheidung herangezogen wird, ob der Boden zu trocken ist

o Ausl�sen der Bew�sserung (Einschalten)

o Ausschalten der Bew�sserung nach einer gewissen Zeit

Im Prinzip l�st Node-RED das Problem mit gerade einmal vier Nodes. Der abschlie�ende Debug-Node dient nur der Kontrolle und hat mit der Kernaufgabe nichts zu tun (Abbildung 11). Die Messwerte gelangen wie gehabt �ber die USB-Schnittstelle in das System. Ein Switch-Node �bernimmt die �berpr�fung, ob ein definierter Schwellenwert (hier willk�rlich »400«) �berschritten wird. Er wirkt also wie eine If-Abfrage.

Abbildung 11: Vier Nodes bilden die komplette Bew&iuml;&iquest;&frac12;sserungssteuerung.

Abbildung 11: Vier Nodes bilden die komplette Bew�sserungssteuerung.

In den allermeisten F�llen bezieht sich die Abfrage auf ein Nachrichten-Objekt, das eine Zahl oder eine Zeichenkette als Vergleichswert liefert. In dem vorliegenden Beispiel funktioniert das jedoch nicht, weil »msg.payload« neben dem Messwert auch die CR-LF-Zeichen enth�lt. Dies wird ben�tigt, um die �bertragenen Datenpakete einzeln zu identifizieren. Ergo muss das zu vergleichende Objekt angepasst werden. Hier �bernimmt das ein JSONata-Ausdruck (Abbildung 12). Das ist eine leichtgewichtige Abfrage- und Transformationssprache f�r JSON-Daten, mit der sich einfache Funktionen direkt auf Werte anwenden lassen. Zum Einsatz kommt die Funktion »$substring«, die aus »msg.payload« beginnend ab der ersten Position alle Ziffern extrahiert. Die Anzahl der Ziffern ergibt sich aus der L�nge von »msg.payload« abz�glich der zwei Zeichen f�r »CR« und »LF«. Der Trigger-Node �bernimmt das Ein- und auch das Ausschalten der Bew�sserung

Abbildung 12: &iuml;&iquest;&frac12;ber eine Substr-Funktion wird der zahlenm&iuml;&iquest;&frac12;&iuml;&iquest;&frac12;ige Messwert extrahiert.

Abbildung 12: �ber eine Substr-Funktion wird der zahlenm��ige Messwert extrahiert.

Bei Eingang einer Nachricht (Schwellenwert unterschritten) sendet der Node eine JSON-Nachricht zum Einschalten der Bew�sserung. Er wartet dann 15 Sekunden – also etwas l�nger als die Zeitspanne bis zum Empfang des n�chsten Messwerts – und setzt dann die Nachricht zum Ausschalten ab. Der Clou ist, dass bei Eingang weiterer Nachrichten die Ausgabe des Off-Befehls zur�ckgehalten wird. Die Bew�sserung l�uft also so lange, bis der Boden gen�gend Feuchtigkeit aufweist (Abbildung 13).

Abbildung 13: Die Eigenschaften des Trigger-Nodes legen die Bew&iuml;&iquest;&frac12;sserungszeit fest.

Abbildung 13: Die Eigenschaften des Trigger-Nodes legen die Bew�sserungszeit fest.

Shelly-Ger�te lassen sich gut �ber HTTP-Befehle steuern. Die Aufgabe �bernimmt an dieser Stelle ein HTTP-Request-Node. Die Methode »GET« des HTTP-Request-Modes bezieht sich auf den URL, unter dem das Shelly-Ger�t im lokalen Netz erreichbar ist. Die Aktion ergibt sich aus dem »msg.payload«-Objekt. Der HTTP-Request-Node baut dieses Objekt um und f�gt das Ergebnis als Query-String-Parameter dem URL hinzu. Die Abbildung 14 zeigt die Debug-Ausgabe nach einem Einschaltvorgang.

Abbildung 14: Die Debug-Ausgabe im Anschluss an den HTTP-Request-Node zeigt, wie die Bew&iuml;&iquest;&frac12;sserung eingeschaltet wird.

Abbildung 14: Die Debug-Ausgabe im Anschluss an den HTTP-Request-Node zeigt, wie die Bew�sserung eingeschaltet wird.

Insgesamt ist also die Aufgabenstellung mit Node-RED schnell und kompakt zu l�sen.

Funktionen programmieren

Node-RED verf�gt �ber eine weite Palette vielseitig einsetzbarer Nodes, die einen Gro�teil der Anforderungen abdecken. Und dennoch k�nnen sich Situationen ergeben, in denen die Standard-Nodes nicht ausreichen. Dann ist der Function-Node h�ufig das Mittel der Wahl. Der Function-Node nutzt JavaScript, um Nachrichten zu verarbeiten. JavaScript ist eine m�chtige Programmiersprache und kann tief in das System eingreifen. Aus diesem Grund sollte man Node-RED auch unbedingt absichern, sp�testens, wenn Zugriffe von au�erhalb des lokalen Netzes erlaubt sind.

Der Charakter als echter Allrounder dr�ckt sich bereits in den Node-Eigenschaften aus. So besteht jeweils getrennt die M�glichkeit:

  • im SETUP die Anzahl der Ausgangsports festzulegen,
  • unter START den Code zu programmieren, der bei einem Deployment des Nodes ausgef�hrt wird,
  • unter FUNKTION den Code f�r jeden Nachrichteneingang abzuspeichern,
  • unter STOPP den Code abzulegen, der bei einem Stopp von Node-RED oder vor einem erneuten Deployment des Nodes ausgef�hrt wird.

Nur um das Prinzip zu demonstrieren, soll in unserem Beispiel min�tlich eine Sprachausgabe (Abbildung 15) �ber den Stand der Bodenfeuchtigkeit informieren. Der Function-Node hat die Aufgabe, die Ansage aufzubereiten.

Abbildung 15: Ein Function-Node &iuml;&iquest;&frac12;bernimmt hier die Steuerung einer Sprachausgabe.

Abbildung 15: Ein Function-Node �bernimmt hier die Steuerung einer Sprachausgabe.

Den Code, der f�r diese Aufgabe im Function-Node zu hinterlegen ist, zeigt Listing 4.

Listing 4

Function-Node steuert Sprachausgabe

��nonumber
let wert = msg.payload
let jetzt = new Date();
let sek = jetzt.getSeconds();
msg.payload = 'Die Bodenfeuchte hat einen Wert von ' + wert
if (wert < '400') {
  msg.payload = msg.payload + "  Dringend bew�ssern";
} else {
  msg.payload = msg.payload + "  Alles in Ordnung";
}
if (sek < 10) {
  return msg;
}

Die Variable »wert« speichert den Inhalt von »msg.payload«, also den Messwert. Anschlie�end wird »msg.payload« neu aufgebaut. Dabei richtet sich der Inhalt nach dem Messwert (hier willk�rlich gesetzt). Die Variable »sek« enth�lt den Sekundenteil der aktuellen Zeit. Da nur alle 10 Sekunden ein neuer Wert eintrifft, richtet sich die Aktion der Weiterleitung der neu erstellten Nachricht nach einem Zeitraum und nicht nach einem genauen Sekundenwert. Der Play-Audio-Node, den es im �brigen auch f�r das Dashboard gibt, schlie�t mit einer Sprachausgabe den Flow ab. Eigentlich erwartet er, dass »msg.payload« einen Buffer mit einer WAV-Datei enth�lt. Wenn der Browser jedoch native Unterst�tzung f�r Text-to-Speech bietet, darf in »msg.payload« – wie hier – auch eine Zeichenfolge gespeichert sein, die laut vorgelesen werden soll. F�r den deutschen Sprachraum stehen drei verschiedene weibliche und m�nnliche Stimmen zur Auswahl.

Fazit

Node-RED ist bei Weitem kein blo�es Klick-dich-gl�cklich-Tool, sondern kann auch komplexe und vielschichtige Aufgabenstellungen selbst im industriellen Sektor elegant l�sen. Es �berzeugt durch die Vielfalt der zur Verf�gung stehenden Bausteine (Nodes), die klare (visuelle) Darstellung des Programmablaufs und die intuitive Bedienoberfl�che. Von gro�em Wert ist auch der professionelle Hintergrund.

Der Autor

Udo Brandes war als Programmierer und Inhouse Consultant bei verschiedenen �ffentlichen Dienstleistern t�tig. Heute arbeitet er als Autor mit dem Themenschwerpunkt Internet of Things/Mikrocontroller. Aus seiner Feder stammt das Buche Node RED – das umfassende Handbuch. Es ist im Rheinwerk-Verlag erschienen und behandelt detailliert und anhand zahlreicher praktischer Beispiele die mannigfaltigen M�glichkeiten von Node RED.

Infos

  1. NodeRED: https://nodered.org
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben