EINFÜHRUNG IN NODE-RED: FUNCTION-NODES
In der Home-Automation bzw. im Smart Home gibt es mittlerweile viele verschiedene Möglichkeiten seine Geräte zentral, von unterschiedlichen Herstellern über unterschiedliche Kommunikationswegen (Funk, ZigBee, WLAN,…), zu verbinden. Ich habe für meine Projekte auf einen Raspberry Pi die Software Node-Red verwendet und bin mit den Möglichkeiten und den Funktionsumfang positiv überrascht worden. Ich konnte bisher für alle meine Projekte eine Losung über Node-Red finden.
In diesem Beitrag werde ich nur die Punkte extrahieren, die für meine Projekte relevant sind. Wer es noch detaillierter braucht, der könnte enttäuscht werden.
NACHRICHTEN -AUSTAUSCH
Über die Nodes, die ein In- bzw. Output Interface besitzen, werden Nachrichten ausgetauscht. Die verwendete Programmiersprache ist hierbei das objektorientierte JavaScript. Für die Browserdarstellung wird HTML verwendet.
IBM, der Entwickler von Node-Red, empfiehlt nach Möglichkeit alles mit Nodes zu lösen und so wenig wie möglich Functions-Nodes bzw. JavaScript zu verwenden. Es widerspricht etwas der visuellen Programmierung.
Die grundlegende Syntax in JavaScript würde so aussehen:
var auto = {marke: "WV", farbe: "grau"};
Hier werden die Eigenschaften vom Objekt „auto“ deklariert.
Für den Zugriff auf die Eigenschaften eines Objektes wird diese Syntax/Notation verwendet:
Objekt.Eigenschaft
In unserem Beispiel würde es dann so aussehen:
var brand = auto.marke; var color = auto.farbe;
In Node-Red gibt es ein Nachrichtenobjekt msg. Diese Eigenschaften hat das Objekt:
var msg = {payload: "Daten", topic "Header", _msgid: "323xxx"};
Wozu braucht man diese Eigenschaften?
payload: es werden die Nutzdaten gespeichert in unterschiedlichen Formen.
topic: für die Klassifizierung einer Nachricht, um das übergeordnete Thema weiter einzugrenzen.
_msgid: für die interne Kennzeichnung einer Nachricht über die entsprechende ID.
Im Debugfenster wird der Inhalt ausgegeben. Diese Zahlen beinhalten das aktuelle Datum und die Uhrzeit. Es ist für den Computer lesbar, aber für den Menschen eher ungeeignet. Wir brauen eine function-Node („Datum“) ein und konvertieren das Datum.
Der Inhalt der Function-Node „Datum“ sieht wie folgt aus:
// Es wird ein Datum-Objekt über die eingehende msg.payload erstellt var datum = new Date(msg.payload); // Der Payload wird in einen String umgewandelt msg.payload = datum.toString(); // Rückgabe des Payloads return msg;
Die anderen beiden Nodes „Timestamp“ und „msg.payload“ habe ich in der Default-Einstellung gelassen.
Um noch detaillierter die Informationen im Debug-Fenster zu erhalten, muss man im Debug-Node eine kleine Umstellung vornehmen:
Weitere Beispiele
In String (bzw. neue Information) umwandeln:
msg.payload = "neuer String"; return msg;
Berechnungen:
Eingehenden String ergänzen:
Mehrere Outputs:
Der JavaScript-Code von der Function „Convert“:
var topic=msg.topic; if (topic=="Test1"){ return [msg,null]; } if (topic=="Test2"){ return [null,msg]; } if (topic=="Test3"){ return [null, null, msg]; // 3st output }