NEWS
[Erledigt]BME280 mit ESP8266 von MQTT auf Webserver als Text
-
Hallo,
habe 2 BME 280 Sensoren die über ESP8266 an den iobroker (MQTT) senden. Jetzt möchte ich die werte mit etwas Text über einem Webserver bei Node Red als reinen Text anzeigen lassen. Der Hintergedanke ist, möchte die werte auf LCD4Linux Linux SAT Reciver mir anzeigen zu lassen. Das kann aber nur reinen Text leider. Einen Wert vom einem Sensor habe ich zum Laufen bekommen über die Funktion node so:
if (msg.topic === "esp01/temperature") { context.value = msg.payload ; return null ; } else { msg.payload = context.value || "Warten auf Daten :)" ; return msg ; }
das geht dann weiter an an Tamplate node
Sensor Terasse Temperatur {{payload}} °Celsius Luftfeuchtigkeit {{payload2}} % Luftdruck {{payload3}} hPa Sensor Wohnzimmer Temperatur {{payload4}} °Celsius Luftfeuchtigkeit {{payload5}} % Luftdruck {{payload6}} hPa
Nur der Payload wird als variable, so wie Sensor sendet angezeigt das Funktioniert.
Es wird der Topic ausgewertet und als Payload weitergeleitet es gibt aber 4 Topic pro Sensor wie kann ich das umsetzen das alle werte angezeigt werden? In den stellen die ich möchte Payload 2-6
ich hoffe, jemand kann mir helfen
danke MFG
-
-
Hallo danke für die Antwort
ich habe keine Ahnung, bin neu in dem Bereich, habe das aus dem Internet so Übernomen, es funktioniert auch aber halt nur mit einem Payload an eine Stelle brauche aber 3 pro Sensor (sind ja 3 werte/topic vom Sensor) damit ich das dann im Text einfügen kann, weiß aber nicht wie ich das umzusetzen soll
mfg
-
-
@jabba76 Vielleicht helfe - ich - mache einfach aus der Payload ein Objekt und Du greifst auf die Eigenschaften zu. Also payload.temperature usw. Wenn das eine Tabelle werden soll, machst Du aus den Objekten ein Array und iterierst über Angular Directiven.
-
Danke das du helfen möchtest ich brauche schon mehr Erklärung wo ich was reinschreiben soll?
Das kommt vom Sensor an:
{"topic":"esp01/temperature","payload":"27.71","qos":1,"retain":true,"_topic":"esp01/temperature","_msgid":"9c900137.efb7b"}
dann kommt noch das:
{"topic":"esp01/pressure","payload":"1030.77","qos":1,"retain":true,"_topic":"esp01/pressure","_msgid":"402e6b69.3286b4"}
und das letzte das:
{"topic":"esp01/humidity","payload":"46.65","qos":1,"retain":true,"_topic":"esp01/humidity","_msgid":"3d6f2cec.f64da4"}
jetzt die drei ausfiltern und weiterleiten als einzelne Nachricht so das die werte im Text angezeigt werden
Danke mfg
-
@jabba76 Ab 23 Uhr habe ich bissi mehr Zeit - dann mach ich Dir einen Vorschlag.
-
Ok keine Eile weiß nicht, ob ich noch da bin dann schaue ich mir das morgen an.
Die Payload von dem zweiten Sensor sind die gleichen nur halt esp02 steht da
Vielen Dank
-
@jabba76 So ich hab Dir jetzt mal auf die schnelle was gebastelt - aber ich bin kein HTML Spezi.
Grundsätzlich habe ich mal mit Inject Nodes - Deine JSON Nachrichten simuliert - Du musst für einen Sensor mindestens alle 3 - 1 mal betätigen - später werden die Werte nur noch aktualisiert.
Das Ganze dann in einer Template Node verarbeitet wie gewünscht.
Da Du ja JSON Strings rausbekommst - habe ich auch Strings genommen, ansonsten wenn Du Objekte bekommst ist es noch besser.
Also die oberen 3 Inject Nodes simulieren den ersten Sensor mit den JSON Strings die Du gepostet hast, die unteren 3 einen 2.Sensor bei dem ich nur die Werte leicht geändert habe:
Die Ausgabe dieser blauen Template Nodes sieht dann wie folgt aus - wie gesagt Du brauchst ja nur Text und ich habe keine Formatierungen vorgenommen, um es schön zu machen:
Wenn Du die Sensordaten dann noch quasi in mehreren Objekten zusammenfassen willst kannst Du dann auch Tabellen erstellen - deshalb hier mal die beiden nochmals in eine Nachricht zusammengefasst - wobei ich einfach mal Deinen Sensor esp02 - als Sensor im Bad genommen habe, esp01 als Sensor im Wohnzimmer.
Hier also grafisch der vollständige Flow:
Dann könnte die Payload aus mehreren Objekten bestehen, wie Du aus dem Output der letzten debug Node siehst:
Eine Tabelle aus dem eben gezeigten Objekt würde man dann ungefähr so aussehen:
Und zum Schluß noch der Flow zum Importieren, damit Du selbst damit spielen kannst und mit Deinen Sensoren füttern kannst:
Ach und statt Bad nimmst halt Terasse
-
@jabba76 So ich habe noch ein bisschen weiter gebastelt
- weil mir eingefallen ist, dass Du vielleicht mit mqtt Wildcards als Input arbeiten möchtest und dann muss man nicht einen Datenpunkt abgreifen, sondern es können beliebig viele ankommen.
Dann muss man das Ganze ordnen und ich habe das jetzt mal manuell gemacht indem ich über eine Change Node mit 13 Regeln
so ein msg.parts Objekt gefüllt habe - damit eine Join Node das automatisch zusammensetzen kann. Das könnte man ggf. auch aufteilen - aber das überlasse ich jemand anders.
Eine Beschreibung zum msg.parts Objekt findet man hier:
Füllt man diese werden über die Change Node erst dann Nachrichten ausgegeben, wenn alle 3 Werte (Temperatur, Druck und Feuchtigkeit) komplett sind.
Man sieht auch hier anhand der Debug Node - wie erst alle 3 Werte eines Sensors ankommen müssen, bevor die endgültige Nachricht erzeugt wurde.
Beim ersten Node habe ich mal gezeigt, wie das msg.parts Objekt gefüllt wird, damit die JOIN Node das automatisch zusammensetzen kann.
Die Ausgabe ist die gleiche nur dass nun die Ausgabe welchen Sensors variabel und nicht mehr fix ist:
Diese wird wie man sieht nun über den msg. topic geschrieben (hier mal der Inhalt der Template Node):
<p> Dies sind Werte des Sensors {{msg.topic}}:<br> Temperatur: {{msg.payload.temperature}} °Celsius<br> Druck: {{msg.payload.pressure}} %<br> Feuchtigkeit: {{msg.payload.humidity}} hPa<br> </p>
Hier wieder der Flow zum Import:
Damit sollte das Prinzip eigentlich verstanden sein.
-
Hallo, danke für deine Zeit und Arbeit ich habe mich wohl schlecht ausgedrückt.
Es soll nicht auf dem Dashboard sein, sondern über http in node mit GET als komplette Text ausgegeben werden und auf jeden Fall kein HTML das wird dann nicht unterstützthabe das von hier Link Text
nur halt in der Template node nicht mit HTML, sondern TEXT
Mit den einen Parameter funktioniert alles bestens, wie kann ich die anderen Parameter einbinden?
-
@jabba76 Nun mit etwas transfer-Denken hättest Du das ja auch ggf. modifizieren können. (Insofern waren meine Mühen nicht ganz umsonst, wie Du an der Modifikation des ursprünglichen Flows siehst
) Im Prinzip lässt Du bei den reinen Template nodes - den msg_präfix weg - kann man wahrscheinlich auch bei den Dashboard templates machen.
Ich hab jetzt mal alles ohne Formatierung gemacht.
Du musst diesen Text dann eh als HTML Request Node rausschicken zu einem externen Webserver rausschicken.
Falls nicht und Du Node RED als Webserver nutzen willst, wie in dem Link und nur Text raushaben willst, wie in dem Beispiel, dass Du verlinkt hast (der hat aber HTML Formatierungen drin gehabt) - dann speicherst Du das in einer Flow-Variablen ab und gibst es dann auf Anforderung heraus:
Ohne Formatierungen kommt dann zum Bespiel mit beiden Sensoren kombiniert folgendes raus:Hier nochmal alles:
Also Du siehst das Grundprinzip bleibt gleich. Du kannst auch jeden Sensor in einer eigenen Flow-Variablen abspeichern und durch unterschiedliche Aufrufe der URL Dir entweder die Daten des einen oder anderen Sensors ausgeben lassen. Das sollte ja jetzt kein Problem mehr darstellen!
Hier nochmal die Ausgaben der beiden Debug Nodes - als reiner Text:
Und nun den gesamten Flow:
Wie man mal wieder sieht es geht ohne irgendwelche Codezeilen
EDIT:
Im Browser habe ich aber nur das obere Beispiel ausgegeben - da Du vielleicht auf Anforderung die Ergebnisse beider Sensoren ausgeben willst und nicht die, die sich gerade geändert haben - ansonsten muss man halt das Ergebnis unten in der Flow Variablen speichern.
Und sowas wie Angular Direktiven zur Tabellenerstellung funktionieren in den reinen Template Nodes nicht.
Und wie immer: Je mehr Infos man rausgibt, desto weniger Missverständnisse! -
@jabba76 Um das untere Ergebnis auch noch auszugeben - habe ich halt noch eine 2.Flowvariable genutzt und man ruft dieses Ergebnis mit ChangedSensors auf:
Hier nur mal als Screenshot wie Du unterschiedliche Flowvariablen dann mit unterschiedlichen Aufrufen ausgibst:
-
@jabba76 Und nochwas - was mir gerade einfällt. Natürlich bekommst Du die Werte erst, wenn diese von Deinen Sensoren aktualisiert werden in mqtt.
Du kannst das aber mit verschiedenen Möglichkeiten initialisieren:- Was man aber machen kann ist, dass Du die Inject Nodes nutzt/behälst, um diese bei Start von Node Red mit Initialwerten zu befüllen. Dann ist sichergestellt, dass auch nur wenn 1 Wert sich ändert bereits das ganze Objekt zusammengebaut wird.
- Du holst Dir die Daten über iobroker in Nodes bei Start raus und setzt diese anstelle der Inject Nodes
- Du speicherst die Nachrichten als retained im MQTT. Diese Möglichkeit ist zwar ein Standard, aber ich mag sie nicht besonders, da es ggf. schwer ist, die wieder wegzubekommen.
Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken.
-
@jabba76 Zur Vervollständigung hier nochmal der Flow ergänzt zum Aufruf des Webservers für die Ausgabe der Einzelsensoren mit /esp01 bzw. /esp02.
Die Zeilenumbrüche aus der Template Node werden hier nicht dargestellt. Falls Dein SAT Reciever damit nicht umgehen kann, musst das halt in der Template Node ändern.
-
@jabba76 sagte in BME280 mit ESP8266 von MQTT auf Webserver als Text:
habe 2 BME 280 Sensoren die über ESP8266 an den iobroker (MQTT) senden.
Hi jabba76,
an welchen Pins hast Du die beiden BME280 angeschlossen? D3 (SDA) und D4 (SCL) ? und den zweiten -parallel oder an D1 & D2 ?
Danke Dir
Paul -
Hallo danke dir für die gute Arbeit war leider lange nicht da aus Zeitmangel.
Dein Flow so wie er ist funktioniert wunderbar das was da ausgegeben wird wird auch richtig Angezeigt.
Jetzt wollte ich die inject node durch meine iobroker in node ersetzen damit die Daten vom Sensor einfliessen können leider funktioniert das nicht, die ausgebe kann nicht gebaut werden.Fehler Meldung:
Message missing key property 'msg.topic' - cannot add to object
Meine Sensoren geben sowas raus
temperatur {"val":23.16,"ack":true,"ts":1637513514166,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1637513514166} Luftdruck {"val":1004.75,"ack":true,"ts":1637513514168,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1637513514168} Luftfeuchte {"val":42.69,"ack":true,"ts":1637513514169,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1637513514169}
könntest du noch mal drüber schauen wie ich das anpassen kann/soll damit die Daten übernomen werden und auch Angezeigt werden können dafür wäre ich dir sehr dankbar.
Es wird erst ausgabe gebaut wenn alle Sensoren alle Daten gesendet haben? weil jeder sendet alle 15 min wenn der erste gesendet hat und der zweite noch 5 min hat wird die ausgabe erst in 20min Online richtig?@PeterHansen soory das so spät erst ja das sind D1 und D2 Pins. bei Youtube das eingeben "ESP8266 Deep-Sleep, BME280 Daten über MQTT senden"
mfg
-
@jabba76 sagte in BME280 mit ESP8266 von MQTT auf Webserver als Text:
Hallo danke dir für die gute Arbeit war leider lange nicht da aus Zeitmangel.
Dein Flow so wie er ist funktioniert wunderbar das was da ausgegeben wird wird auch richtig Angezeigt.
Jetzt wollte ich die inject node durch meine iobroker in node ersetzen damit die Daten vom Sensor einfliessen können leider funktioniert das nicht, die ausgebe kann nicht gebaut werden.Fehler Meldung:
Message missing key property 'msg.topic' - cannot add to object
Meine Sensoren geben sowas raus
temperatur {"val":23.16,"ack":true,"ts":1637513514166,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1637513514166} Luftdruck {"val":1004.75,"ack":true,"ts":1637513514168,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1637513514168} Luftfeuchte {"val":42.69,"ack":true,"ts":1637513514169,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1637513514169}
könntest du noch mal drüber schauen wie ich das anpassen kann/soll damit die Daten übernomen werden und auch Angezeigt werden können dafür wäre ich dir sehr dankbar.
Es wird erst ausgabe gebaut wenn alle Sensoren alle Daten gesendet haben? weil jeder sendet alle 15 min wenn der erste gesendet hat und der zweite noch 5 min hat wird die ausgabe erst in 20min Online richtig?@PeterHansen soory das so spät erst ja das sind D1 und D2 Pins. bei Youtube das eingeben ESP8266 Deep-Sleep, BME280 Daten über MQTT senden
mfg
Ja ursprünglich wolltest Du ja den Flow über HTTP mit NodeRed als WebServer ansprechen. Mit den iobroker In Nodes ist es eigentlich einfach.
Klar (s. Fehlermeldung) musst Du den Topic noch ergänzen, aber wichtig ist (hängt davon ab, wieviele Flows Du schon hast), wie ist Deine NodeRed Adapter Konfig eingestellt. Also:
- Hast Du schon viele Flows die mit iobroker In NOdes arbeiten?
- Wenn nicht - auf jeden Fall Zeichenkonvertierung in der Adapterkonfig ausschalten (empfehle ich immer zuerst)
- Wenn nicht musst Du alle Strings ggf. wieder umwandeln.
Am Besten ist Du postest hier mal direkt die Ausgabe Deines Strings - Objektes - das aus Deiner iobroker in Node rauskommt und zwar des kompleten NAchrichtenobjektes - die iobroker In Nodes setzen den msg.topic den vollständigen Pfad des Datenpunktes im iobroker und nicht die Objekte sondern den Value rausholen - wofür nimmst Du das Objekt????:
Also hier wieder auf value umstellen!
Entweder das komplette Nachricht als Screenshot oder wenn als JSON - dann bitte im Debugfenster auf Wert kopieren gehen und den JSON hier posten:
{"topic":"0_userdata/0/testType","payload":19.5,"acknowledged":false,"timestamp":1636835207813,"lastchange":1636835207813,"from":"system.adapter.node-red.0","_msgid":"2465ec6b.e48df4"}
-
Dann habe ich micht wohl nicht richtig ausgedrückt
esp mit sensoren senden an MQTT die werte wollte ich über NodeRed im Browser als Text nicht HTML das hast du ja gemacht so würde das auf LCD4Linux funktionieren, nur jetzt wollte ich in denem Flow die sensoren einbinden und Zonk.
ok die Object ausgebe steht schon oben mehr kommt da nicht raus "val" sind ja die Wrte und mein system ist sagen wir mal ganz frisch
ist noch nicht so viel drin
thx
das kommt dabei raus
23.52
-
@jabba76 sagte in BME280 mit ESP8266 von MQTT auf Webserver als Text:
Dann habe ich micht wohl nicht richtig ausgedrückt
esp mit sensoren senden an MQTT die werte wollte ich über NodeRed im Browser als Text nicht HTML das hast du ja gemacht so würde das auf LCD4Linux funktionieren, nur jetzt wollte ich in denem Flow die sensoren einbinden und Zonk.
ok die Object ausgebe steht schon oben mehr kommt da nicht raus "val" sind ja die Wrte und mein system ist sagen wir mal ganz frisch
ist noch nicht so viel drin
thx
das kommt dabei raus
23.52
Das komplette Nachrichtenobjekt bitte: