[Python-de] Re: Anfängerfrage

"Dr. Volker Jaenisch" <[email protected]> Mon, 16 Jan 2023 01:36:19 +0100
Newsgroups gmane.comp.python.general.german
Message-ID <[email protected]>
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
=========================================================
_______________________________________________
python-de Mailingliste -- [email protected]
Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an [email protected]
https://mail.python.org/mailman3/lists/python-de.python.org/
Mitgliedsadresse: [email protected]