Servus Jan! Ich gehe anders als die anderen Mal auf Dein eigentliches Ziel ein. Am 14.01.23 um 19:58 schrieb Jan Schmidt:
Werte durchiterieren und z.B. so ausgeben? (das soll später nach mqtt published und in mysql geschrieben werden)
Du willst mit Python Daten per MQTT versenden. Leider ist MQTT nur ein Transport-Protokoll, welches aber über die Daten welche transportiert werden keine Vorgaben trifft. Daran krankt das ganze Home-Automatisation Zeug und ist auf einem Niveau von 1990. BÄHH! Dazu eine Erläuterung im Beispiel. Du hast aus einem Sensor die Temperatur des Raumes "Keller" gemessen, diese sei in einer Python Variable "t" gespeichert, deren Wert 18.2 c° sei.
t = 18.2
Nu erzeugen wir darus einen Menschenlesbaren Datensatz in Form einen Python Dicts.
ds = {'keller': t} ds {'keller': 18.2}
Was nun fehlt ist die Einheit 'Grad C'.
ds = {'keller': { 'value' :t, 'unit':'Grad C'}}
{'keller': {'value': 18.2, 'unit': 'Grad C'}} Schon besser. Noch besser ist es, wenn wir dem Keller auch sagen, was für eine Eigenschaft wir gemessen haben.
ds = {'keller': {'temperatur' : { 'value' :t, 'unit':'Grad C'}, 'feuchte': {'value':85, 'unit':'Prozent'}}}
ds['keller']['temperatur']['value'] 18.2
Wenn Dir das mit den ganzen Klammern zu lästig wird gibt es dafür Python-Module (z.B.addict https://pypi.org/project/addict/), die das ganauso wie in Perl/Javascript abkürzen können. Aber nun haben wir einen schönen Datensatz für den Keller.
from pprint import pprint pprint(ds) {'keller': {'feuchte': {'unit': 'Prozent', 'value': 85}, 'temperatur': {'unit': 'Grad C', 'value': 18.2}}}
Nun willst Du das per mqtt senden. Mqtt kann nur "texte" übermittelt. Daher musst Du nun Deine schöne Python-Struktur in einen Text umwandeln.
from pprint import pformat daten_als_text = pformat(ds) daten_als_text "{'keller': {'feuchte': {'unit': 'Prozent', 'value': 85},\n 'temperatur': {'unit': 'Grad C', 'value': 18.2}}}"
Diese Daten lassen sich nun einfach per mqqt senden. Deine Python Daten-Struktur ist in einen Test serialisiert worden. Aber das ist nur der Anfang des Problems. Denn wie soll die Gegenstelle nun diesen Text de-serialisieren, also die ursprüngliche Datenstruktur so wieder herstellen, dass sie im Code verwendet werden kann. Das Ganze wird noch komplizierter, wenn die Gegenstelle in einer anderen Programmiersprache arbeitet. Damit Daten also sinnvoll zwischen Systemen ausgetauscht werden können braucht es Serialisierungs-Standards [1]. Nehmen wir einmal an Du serialisierts Deine Daten als JSON.
import json json.dumps(ds) '{"keller": {"temperatur": {"value": 18.2, "unit": "Grad C"}, "feuchte": {"value": 85, "unit": "Prozent"}}}'
Nun schickst Du diesen JSON-String per mqtt zu einer Javascript-Software, die JSON erwartet. Diese Javascript-Software erzeugt aus den erwarteten JSON-Daten eine Variable "data". [Um dieses Beispiel auszuführen nimm einen Firefox. Mache SHIFT-CTRL-i, klicke im neuen Menu auf "Console" und trage unten wo die ">>" sind den Code ein ]
data= JSON.parse('{"keller": {"temperatur": {"value": 18.2, "unit": "Grad C"}, "feuchte": {"value": 85, "unit": "Prozent"}}}')>> data.keller.feuchte
Object{ value: 85, unit: "Prozent"} Das ist schon mal ziemlich geil, Du hast strukturierte Python-Daten umgewandlet in strukturiete JavaScript-Daten. Das Javascript-Programm kann nun mit diesem Datensatz arbeiten. Nun kommt das lang erwartete "ABER". ***Aber, auf beiden Seiten muss klar sein, welches Struktur-Element was bedeutet.* Denn genausogut könnte man die Daten so ablegen: ds = {'temperatur': {'keller' : { 'value' :t, 'unit':'Grad C'}, 'speicher' : {}} 'feuchte': {'keller' : {'value':85, 'unit':'Prozent'}}} Du betrittst hier ein weites Feld mit vielen Dornenranken. Aber wir helfen natürlich gerne. [1]https://journal.ub.tu-berlin.de/eceasst/article/download/1134/1078 Beste Grüße Volker -- ========================================================= inqbus Scientific Computing Dr. Volker Jaenisch Hungerbichlweg 3 +49 (8860) 9222 7 92 86977 Burggenhttps://inqbus.de =========================================================