msg.payload werte extrahieren

Antworten
okifet96
starter
Beiträge: 19
Registriert: 17.05.2017, 22:01

msg.payload werte extrahieren

Beitrag von okifet96 » 12.03.2018, 20:53

Hallo,
folgendes Problem:
Ich habe 2 Sensoren DSB1820 am Raspi hängen, ich bekommen über das "DS18B20 Node" folgende Daten übermittelt:

Code: Alles auswählen

12.3.2018, 20:34:11node: 7d1736a7.4602f8
msg.payload : array[2]
array[2]
0: object
family: "28"
id: "FF58F6011502"
dir: "w1_bus_master1"
file: "28-021501f658ff"
temp: 22.5
1: object
family: "28"
id: "FF5701031503"
dir: "w1_bus_master1"
file: "28-0315030157ff"
temp: 22.562
Bildschirmfoto 2018-03-12 um 20.50.05.png
Bildschirmfoto 2018-03-12 um 20.50.05.png (88.36 KiB) 497 mal betrachtet
Bildschirmfoto 2018-03-12 um 20.48.35.png
Bildschirmfoto 2018-03-12 um 20.48.35.png (27.32 KiB) 497 mal betrachtet
Ich möchte die beiden Temperaturwerte extrahieren um diese an einer Anzeige auf der Weboberfläche zu zeigen.
Habe leider keine Ahnung von Javascript denke aber das es nicht schwierig sein kann, das zu bewerkstelligen.
Meine Recherchen zeigten das entweder das Function Node oder das Split Node an mein Ziel führen könnten.

Kann mir hier jemand helfen?

Garf
professional
Beiträge: 143
Registriert: 28.09.2017, 19:42

Re: msg.payload werte extrahieren

Beitrag von Garf » 12.03.2018, 21:16

okifet96 hat geschrieben:Ich möchte die beiden Temperaturwerte extrahieren um diese an einer Anzeige auf der Weboberfläche zu zeigen.
Ist absolut kein Problem. Die Werte bzw. die Variable läßt sich kopieren und an das gauge-Node übergeben. Du gehst auf >_ und kopierst dir die Variable (Path copied), z.B. payload[0]. Setzt Du noch ein msg. davor, dann kannst Du den Inhalt einer beliebigen Variablen zuordnen und weiterverarbeiten. Das machst Du am besten in einem function-Node.

okifet96
starter
Beiträge: 19
Registriert: 17.05.2017, 22:01

Re: msg.payload werte extrahieren

Beitrag von okifet96 » 12.03.2018, 21:33

Hey Garf, danke für die rasche Antwort,
leider hab ichs nicht zustande gebracht.

Ich habe im Debug Fenster die 1. und 2. Temp. kopiert:
payload[0].temp
payload[1].temp

waren die Daten,

hab dann das im Function Node eingefügt und 2 Ausgänge gemacht:
Bildschirmfoto 2018-03-12 um 21.29.33.png
Bildschirmfoto 2018-03-12 um 21.29.33.png (102.68 KiB) 491 mal betrachtet
hab diese dann jeweils an eine Gauge verbunden jedoch kamen keine Werte an und im Debug Fenster
kam auch wieder nicht das gewünschte an:
Bildschirmfoto 2018-03-12 um 21.31.55.png
Bildschirmfoto 2018-03-12 um 21.31.55.png (93.25 KiB) 491 mal betrachtet
Wo ist mein Denkfehler?

Garf
professional
Beiträge: 143
Registriert: 28.09.2017, 19:42

Re: msg.payload werte extrahieren

Beitrag von Garf » 13.03.2018, 04:34

okifet96 hat geschrieben:Wo ist mein Denkfehler?
Schon nicht schlecht für den Anfang. Ich würde noch zwei Kleinigkeiten ändern. Ob man es noch vereinfachen könnte, dass schauen wir dann später mal.

Du brauchst zwei Function-Nodes mit je einem Ausgang und folgendem Inhalt:

msg.payload=msg.payload[0].temp;
global.set("temp1",msg.payload[0]); //schreibt den Wert in eine globale Variable
return msg;

Function-Node 2:

msg.payload=msg.payload[0].temp;
global.set("temp2",msg.payload[1]);
return msg;

Das Setzen der globalen Variablen kannst Du natürlich auch weglassen. Ich möchte damit nur zeigen, dass Du die Messwerte als globale Variable in allen Flows und Nodes von Node-Red zur Verfügung stellen kannst. Den Wert der globalen Variablen kannst Du dir im contextbrowser ansehen.

Die Function-Nodes werden mit dem rpi-ds Node und dem jeweiligen gauge-Node verbunden. Zur Kontrolle schließt Du dann noch ein debug-Node an. Bei Fragen, fragen.

okifet96
starter
Beiträge: 19
Registriert: 17.05.2017, 22:01

Re: msg.payload werte extrahieren

Beitrag von okifet96 » 13.03.2018, 15:02

ich habe gestern Nacht noch sehr lange rumprobiert und bin dann auf diese Lösung gekommen:

Mittels 2 "Change Nodes" konnte ich die Werte separieren:
Bildschirmfoto 2018-03-13 um 14.56.50.png
Bildschirmfoto 2018-03-13 um 14.56.50.png (61.03 KiB) 456 mal betrachtet
Habe nun deine Lösung ausprobiert und sie funktioniert auch prima,
Wie könnte ich die Globale Variable woanders wieder aufrufen?
Ich würde dann quasi keine direkte Verbindung mit den Nodes benötigen sonder nur die Variable einbauen?

Garf
professional
Beiträge: 143
Registriert: 28.09.2017, 19:42

Re: msg.payload werte extrahieren

Beitrag von Garf » 13.03.2018, 17:28

okifet96 hat geschrieben: Mittels 2 "Change Nodes" konnte ich die Werte separieren:

Wie könnte ich die Globale Variable woanders wieder aufrufen?
Ich würde dann quasi keine direkte Verbindung mit den Nodes benötigen sonder nur die Variable einbauen?
Change Node geht natürlich auch.

Die globale Variable kannst Du im Function Node über global.get("temp") wieder einer beliebigen Variablen zuordnen.

Beispiel: var temp = global.get("temp");

In verschiedenen Nodes (z.B. dem inject-Node) lassen sich die globalen Variablen als Inputwert weiterverarbeiten.

Insgesamt gibt es folgende Variablentypen:

Die einfachste Form
var x = 1;
Diese Variablen behalten ihren Wert nur innerhalb des Function Node und werden bei jedem inject wieder mit ihrem Eingangswert, hier mit dem Wert 1, versehen. Dieser Variablentyp ist als Zähler nicht geeignet.

Die context Variable
context.set("x",1);
Um einen Variablenwert dauerhaft im function-Node festzuschreiben muss dieser Variablentyp gewählt werden. Der Variablenwert kann nur in dem definierten Node verwendet werden. Andere Nodes wie das switch-Node, inject-Node und change-Node können nicht auf die Variable zugreifen.
Die definierten context-Variablen werden im contextbrowser unter Node angezeigt.

Die flow Variable
Die Werte aus diesem Variablentyp können im gesamten Flow (außer in Subflows) und somit in allen auf der Seite befindlichen Nodes ausgelesen werden.
Der Variablenwert kann im gesamten Flow verwendet werden. Andere Nodes wie das switch-Node, inject-Node und change-Node können ebenfalls lesend und schreibend auf die Variable zugreifen.
Die definierten context-Variablen werden im contextbrowser unter Flow angezeigt.

Die globale Variable
Die Werte aus diesem Variablentyp können über alle Flows von Node-Red in den Nodes ausgelesen werden. Andere Nodes wie das switch-Node, inject-Node und change-Node können ebenfalls lesend und schreibend auf die Variable zugreifen.
Die definierten globalen-Variablen werden im contextbrowser unter Global angezeigt.
Zuletzt geändert von Garf am 14.03.2018, 18:04, insgesamt 1-mal geändert.

rewenode
starter
Beiträge: 23
Registriert: 02.11.2017, 02:36

Re: msg.payload werte extrahieren

Beitrag von rewenode » 14.03.2018, 12:41

Perfekte Auflistung
Die flow Variable
Die Werte aus diesem Variablentyp können im gesamten Flow und somit in allen auf der Seite befindlichen Nodes ausgelesen werden. ...
außer in Subflows

Garf
professional
Beiträge: 143
Registriert: 28.09.2017, 19:42

Re: msg.payload werte extrahieren

Beitrag von Garf » 14.03.2018, 18:06

rewenode hat geschrieben:außer in Subflows
Wie und wo legt man diese an. Ich lerne, was Node-Red betrifft, immer gerne noch dazu. Und deutschsprachige Literatur zu Node-Red habe ich bisher noch keine gefunden.

rewenode
starter
Beiträge: 23
Registriert: 02.11.2017, 02:36

Re: msg.payload werte extrahieren

Beitrag von rewenode » 14.03.2018, 22:29

Garf hat geschrieben:
rewenode hat geschrieben:außer in Subflows
Wie und wo legt man diese an. Ich lerne, was Node-Red betrifft, immer gerne noch dazu. Und deutschsprachige Literatur zu Node-Red habe ich bisher noch keine gefunden.
https://github.com/node-red/node-red/wi ... :-subflows
Subflow.png
Subflow.png (231.95 KiB) 417 mal betrachtet

Garf
professional
Beiträge: 143
Registriert: 28.09.2017, 19:42

Re: msg.payload werte extrahieren

Beitrag von Garf » 15.03.2018, 15:19

Cool.
Gesehen habe ich den Menüpunkt schon mal. Da muss ich den Subflow wohl mal austesten.

Danke für die Info

Antworten