NodeRED: Titelbild: Subflow für die Umwandlung nach bool

NodeRED: Ausgaben mit einem Subflow nach Bool wandeln

In einigen Nodes kann man als Payload nicht den Ausgabetypen einstellen. Meist unterstützen diese dann nur Zeichenketten (Strings). Benötigst Du den Wert als booleschen Wert (wahr/unwahr), so muss man diesen umwandeln. Dazu eignen sich mindestens die zwei Node-Typen: Function-Node und Change-Node.

Beim Change-Node musst Du immer konkret angeben, welcher Wert in welchen Zielwert gewandelt werden soll – einen „sonst/else“-Zweig gibt es nicht. Das ist nachteilig, wenn beim Neustart noch kein Eingangswert gesetzt ist. Dieser ist dann meist undefiniert oder NULL.

Benutzt Du den Function-Node, so kopierst Du womöglich immer das selbe Code-Fragment und passt es so an, wie Du es gerade benötigst.

Verwendung von Subflows

Was ist ein Subflow?

Abhilfe kannst Du mit SubFlows schaffen. Dabei wird mindestens ein Node als separater Flow angelegt, der dann wie andere Nodes verwendet werden kann.

Damit hast Du nur noch eine Stelle für Änderungen/Verbesserungen und musst nicht alle Instanzen Deiner Function-Nodes anpassen.

Bool-Wandlung mittels Function-Node

Der Subflow besteht im Wesentlichen nur aus einem Function-Node. Dieser wandelt verschiedene Eingaben in das Wertepaar true und false um. Die Groß-/Kleinschreibung des Eingabewerts spielt dabei keine Rolle. Entspricht die Eingabe keinem bekannten Wert, so ist der Ausgabewert false.

Beispiele

EingabewertAusgabewert Anmerkung
„On“true„on“-Zweig
„on“true„on“-Zweig
„true“true„true“-Zweig
1truewird bspw. bei HmIP-Fenstergriffsensoren verwendet
2truewird bspw. bei HmIP-Fenstergriffsensoren verwendet
offfalse„Sonst“-Zweig
0false„Sonst“-Zweig

 

Node-RED-Code

Die nachfolgende Funktion ist auch im Beispiel auf github enthalten und soll hier als Veranschaulichung dienen.

var payload = msg.payload || 0;
msg.payload = false;

switch (typeof payload) {
    case 'number':
        switch (payload) {
            case 1:
            case 2:
                msg.payload = true;
                break;
        }
        break;
    case 'string':
        switch (payload.toLowerCase()) {
            case "on":
            case "true":
                msg.payload = true;
                break;
        }
        break;
    default: msg.payload = payload;
}

return {payload: msg.payload};

Updates

  • 23.09.2021: Code aktualisiert
  • 24.03.2021: Verschieben des NodeRED-Flows zu github
  • 17.02.2021: Bugfix für Number-Werte
Hilf durch Deine Bewertung mit, dass andere den Artikel in den Suchergebnissen besser finden! Hat er Dir nicht gefallen? Was kann ich besser machen?
Abonnieren
Benachrichtige mich bei
0 Kommentare
Inline Feedbacks
Alle Kommentare