MQTT-Daten weiter verarbeiten z.B. in Math-Datei

Die Verbindung zum Smart Home und Internet der Dinge (IoT)

Moderator: Ulrich

Antworten
GiMichael
Beiträge: 23
Registriert: Mo 12. Jul 2021, 20:16
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

MQTT-Daten weiter verarbeiten z.B. in Math-Datei

Beitrag von GiMichael »

Habe eine Verbindung über MQTT an den IO Broker aufgebaut (IO Broker ist der Broker/Server und Solaranzeige ist der Client/Subscriber). Ich kann erfolgreich Daten an den IO Broker übertragen und erhalte auch Datenpunkte vom IO Broker. Also Verbindung steht in beide Richtungen.

Nur leider gibt es ein "Problem" mit den Zeitangaben, so dass ich es in der Solaranzeige nicht richtig weiterverarbeiten kann. Die Influx Daten von Solaranzeige (berechnet in der Math-Datei) haben einen anderen Zeitstelmpel als die Influx-Daten von MQTT. Sind nur ein paar Sekunden, aber leider nicht in der gleichen Zeile. Hier mal die Tabellenwerte
Unbenannt2.JPG
Klima ist ein berechneter Wert aus Math
heizen-mit-klimaanlage-aktiv kommt von MQTT

Ich wollte den Wert "heizen-mit-klimaanlage-aktiv" von MQTT nutzen, um damit den Strom der Klimaanlage auf Kühlen und Heizen aufzuteilen. Geht in der Math-Datei leider nicht. Wenn ich dort die Variable "heizen-mit-klimaanlage-aktiv" abfrage, bekomme ich einen PHP Fehler in der Zeile. Variable offensichtlich nicht vorhanden.
Unbenannt.JPG
Unbenannt.JPG (19.15 KiB) 594 mal betrachtet
Wie komme ich jetzt an den Wert dran, um es weiter zu verarbeiten

GiMichael
Beiträge: 23
Registriert: Mo 12. Jul 2021, 20:16
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: MQTT-Daten weiter verarbeiten z.B. in Math-Datei

Beitrag von GiMichael »

Hallo, gibt es keine Lösung, wie ich die Daten von MQTT Broker weiter verarbeiten kann? In Influx sind sie drin, allerdings möchte ich gerne den Strom aufteilen. Ich hoffe mein PHP-Schnipsel ist verständlich, was ich dort versuche

GiMichael
Beiträge: 23
Registriert: Mo 12. Jul 2021, 20:16
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: MQTT-Daten weiter verarbeiten z.B. in Math-Datei

Beitrag von GiMichael »

So, bin jetzt ein bisschen weiter gekommen. Habe die Solaranzeige inzwischen auf die V5.07 64 bit upgedated. Bei MQTT hat sich dadurch nichts verändert

Der MQTT Broker (vom IO Broker) sendet nur veränderte Daten weiter. D.h. wenn die Temperatur bei der letzten Subscription 22,3 war, dann wird 1 Minute später bei erneuter Subscription kein Wert gesendet, sofern die Temperatur sich nicht geändert hat. Das Ergebnis sind dann solche Tabellen in influx.

Code: Alles auswählen

time                aussentemp druck feuchte heizen_mit_klima_aktiv innentemp_az innentemp_sz innentemp_wz regen regen_gestern regen_heute regen_last_h windrichtung windspeed windstoss
----                ---------- ----- ------- ---------------------- ------------ ------------ ------------ ----- ------------- ----------- ------------ ------------ --------- ---------

1661613297000000000                                                                                        0
1661613296000000000                                                                                              0
1661613295000000000                                                                                                            0
1661613294000000000                                                                                                                        0
1661613293000000000                                                                                                                                     W
1661613292000000000                                                                                                                                                  1
1661613291000000000                                                                                                                                                            2
1661613290000000000                                                 23.5
1661613289000000000                                                              23
1661613288000000000                                                                           23.5
D.h. jede Veränderung wird zu einem anderen Datum abgespeichert (ich weiß die Datenkopie ist nicht optimal. Hier sind die Werte jede Sekunde gekommen und nicht je Minute - ich finde aber gerade die richtige Stelle nicht.)

Für die Anzeige in Grafana ist das machbar. Leider nicht, wenn ich es in der eigenen Erweiterung _math verarbeiten will. Ich kann zwar die letzten Werte aus dem MQTT Measurement holen und dann verarbieten. Aber das Datenfeld ist dann häufig "null" also leer. Warum? Hier ein Beispiel

Code: Alles auswählen

time                aussentemp druck  feuchte heizen_mit_klima_aktiv innentemp_az innentemp_sz innentemp_wz regen regen_gestern regen_heute regen_last_h windrichtung windspeed windstoss
----                ---------- -----  ------- ---------------------- ------------ ------------ ------------ ----- ------------- ----------- ------------ ------------ --------- ---------
1661614831000000000            1017.1
1661614830000000000 22.2
Es wurden zuletzt zwei Werte aktualisiert. Der Druck und die Aussentemp haben sich geändert. Beide wurden mit einem Abstand von 1 Sek in die Influx-DB geschrieben. Wenn ich jetzt den Druck in der math-Datein hole und weiterverarbeite, dann ist alles gut. Der letzte Wert ist 1017,1. Wenn ich aber aussentemp nutzen will, dann bekomme ich eben "null" und somit keinen Wert. Die 22.2 sind leider nicht der letzte Wert.

Hat da jemand eine Lösung?

"Edit:" Zwei Punkte habe ich noch vergessen.
1. Die Solaranzeige sendet keine ID mit - ein Fehler? Könnte zu Problemen führen. Zumindest geben mir das die MQTT Cracks im anderen Forum mit. Eine ID sollte immer dabei sein und diese sollte innerhalb eines Brokers uniq sein also nicht von 2 Clients verwendet werden.
Unbenannt.JPG


2. Der Broker sendet z.T. die Messages mehrfach (hier 11 mal) und bricht dann wegen Erfolglosigkeit ab

Code: Alles auswählen

4043	2022-08-27 17:49:24.626	warn	Client [] Message 6 deleted after 11 retries
Ich habe dann 11x den gleichen Wert in der Influx MQTT measurement. Passiert nicht immer, nur manchmal aber durchaus regelmäßig.

Code: Alles auswählen

time                aussentemp druck  feuchte heizen_mit_klima_aktiv innentemp_az innentemp_sz innentemp_wz regen regen_gestern regen_heute regen_last_h windrichtung windspeed windstoss
----                ---------- -----  ------- ---------------------- ------------ ------------ ------------ ----- ------------- ----------- ------------ ------------ --------- ---------
1661615243000000000                                                  24
1661615241000000000                                                  24
1661615239000000000                                                  24
1661615237000000000                                                  24
1661615235000000000                                                  24
1661615233000000000                                                  24
1661615231000000000                                                  24
1661615229000000000                                                  24
1661615227000000000                                                  24
1661615225000000000                                                  24
1661615223000000000                                                  24

Keine Ahnung warum. Hat jemand da auch eine Lösung?

GiMichael
Beiträge: 23
Registriert: Mo 12. Jul 2021, 20:16
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: MQTT-Daten weiter verarbeiten z.B. in Math-Datei

Beitrag von GiMichael »

So jetzt mal ein Update. Habe die MQTT Kommunikation über Nacht laufen lassen. Die Temperaturdaten werden an die Solaranzeige übertragen. Immer nur dann wenn sich ein Wert ändert. Ist soweit ok, und kann ich auch anzeigen lassen in Grafana.

Nur die Nutzung in der eigenen Erweiterung (math-Datei) funktioniert nicht. Hier kann ich nur sporadisch auf z.B. die Außentemperatur zugreifen. Leider immer nur dann wenn die Außentemperatur zufällig der letzte geschriebene Wert war. Wenn andere Werte danach geschrieben wurden und sei es nur 1 Sekunde später, dann kann ich die Außentemperatur nicht mehr abrufen.

Die Solaranzeige läuft ja streng im Minutentakt ab. Alle Daten werden mit gleichem Timestamp 1x die Minute geschrieben. Dies gilt leider nicht für MQTT. Die empfangenen Daten haben keinen festen Timestamp sondern werden (zumindest bei mir) immer dann geschrieben, wenn sie ankommen. Siehe Bild - die erste Temperatur kommt von MQTT direkt und der zweite Wert ist die letzte Zahl, die in der math-Datei ankam. Ist in diesem Fall 30 Minuten alt. So kann ich die MQTT-Daten leider nicht in der math-Datei weiter verarbeiten.

Unbenannt.JPG
Unbenannt.JPG (14.55 KiB) 531 mal betrachtet

GiMichael
Beiträge: 23
Registriert: Mo 12. Jul 2021, 20:16
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: MQTT-Daten weiter verarbeiten z.B. in Math-Datei

Beitrag von GiMichael »

Jetzt mal zusammenfassend meine Erfahrungen mit MQTT niedergeschrieben. Im Grunde funktioniert es und die Daten werden übertragen und in die Influx geschrieben. Ich habe damit nur 2 Probleme.

1. Die Daten werden im Measurement nicht in einem Datensatz verarbeitet, sondern in mehreren. Wenn ich also 10 Wert übertrage, dann schreibt die Solaranzeige 10 Datensätze mit unterschiedlichen Timestamps und jeweils einem Wert (wie oben beschreiben). Das macht die Auswertung schwierig.

2. Die Daten werden alle als String abgelegt. Es gibt keien Möglichkeit Zahlen als Number in die Influx zu schreiben. Somit sind Auswertungen in Grafana wie select max("aussentemp") .... nicht möglich. Die Darstellung als Grafen geht durch einen kleinen Trick, wenn man die Daten transformiert.

Letztlich habe ich mir so geholfen. Ich nutze die Math-Datei und hole immer den letzten Wert aus der Influx measurement MQTT. Diesen schreibe ich dann in Measurement IO_Broker hinein. Dadurch wird es zum einen in eine Zahl umgewandelt (sofern möglich) und außerdem hat es dann den zentralen Timestamp.

Code: Alles auswählen

  $Datenbank = "solaranzeige";

  $DBSelect = "heizen_mit_klima_aktiv";
    
  $DBSelect = "aussentemp";
  $aktuelleDaten["Query"] = "db=" . $Datenbank . "&q=" . urlencode('select last('.$DBSelect.') from "MQTT"');
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $aktuelleDaten[$DBSelect] = $rc["results"][0]["series"][0]["values"][0][1];

  $DBSelect = "innentemp_wz";
  $aktuelleDaten["Query"] = "db=" . $Datenbank . "&q=" . urlencode('select last('.$DBSelect.') from "MQTT"');
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $aktuelleDaten[$DBSelect] = $rc["results"][0]["series"][0]["values"][0][1];

  $DBSelect = "innentemp_az";
  $aktuelleDaten["Query"] = "db=" . $Datenbank . "&q=" . urlencode('select last('.$DBSelect.') from "MQTT"');
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $aktuelleDaten[$DBSelect] = $rc["results"][0]["series"][0]["values"][0][1];

  $DBSelect = "innentemp_sz";
  $aktuelleDaten["Query"] = "db=" . $Datenbank . "&q=" . urlencode('select last('.$DBSelect.') from "MQTT"');
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $aktuelleDaten[$DBSelect] = $rc["results"][0]["series"][0]["values"][0][1];
  
  // und weiter hinten dann
 $aktuelleDaten["ZusatzQuery"] .= "\n";
$aktuelleDaten["ZusatzQuery"] .= "IO_Broker ";
$aktuelleDaten["ZusatzQuery"] .= "AussenTemp=".$aktuelleDaten["aussentemp"];
$aktuelleDaten["ZusatzQuery"] .= ",InnenTemp_WZ=".$aktuelleDaten["innentemp_wz"];
$aktuelleDaten["ZusatzQuery"] .= ",InnenTemp_AZ=".$aktuelleDaten["innentemp_az"];
$aktuelleDaten["ZusatzQuery"] .= ",InnenTemp_SZ=".$aktuelleDaten["innentemp_sz"];
$aktuelleDaten["ZusatzQuery"] .= "  ".$aktuelleDaten["zentralerTimestamp"];
  
  
Ansonsten wäre noch die API möglich. Habe mich aber noch nicht ausrechend damit beschäftigt. Falls jemand noch andere Ideen hat, gerne melden.

Antworten