Einführung in Node-Red: Function-Nodes

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.

Über einen Inject-Node („timestamp“) gebe ich den Inhalt an eine Debug-Node (msg.payload) weiter. Rechts im Fenster wird es ausgegeben.

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:

In der Praxis könnte man auch einen Change-Node verwenden.
msg.payload = "neuer String";

return msg;

Berechnungen:

Eingehenden String ergänzen:

Mehrere Outputs:

Abhängig, welcher Inject-Node ausgeführt wurde, werden in der Function-Node die Daten weitergeleitet an den nächsten Node (im Beispiel an das Debug-Node „msg“)

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
}

 

einen Kommentar senden...

Die E-Mail-Adresse wird nicht veröffentlicht.