Seite 1 von 1

[V2.0 IP5] String innerhalb json in int bzw. float wandeln

Verfasst: Fr Jun 04, 2021 10:11 pm
von Advenoni
Abend zusammen,

nachdem MQTT ja viel zum ausprobieren anregt wollte ich von mir zwei Feuchtesensoren im Hochbeet über MQTT auswerten.
Es handelt sich um Sensoren von Ecowitt die über ein Docker auf MQTT verfügbar gemacht werden können.
Soweit funktioniert das Ganze, nur werden ein Teil der Zahlen (Feuchte und Batteriespannung) als String geschickt.
MQTT_String_Int.PNG
Gibt es hier eine Möglichkeit das in eine Zahl zu wandeln?
Einfach als Datentyp int oder float zu wählen führt leider zum Fehler, als String geht es problemlos.

Gruß,
Martin

Re: [V2.0 IP5] String in int bzw. float wandeln

Verfasst: Fr Jun 04, 2021 10:45 pm
von blaubaerli
Hallo Martin,

ist ja abenteuerlich, in ein und demselben JSON als Quelle einige Zahlenwerte nativ als Zahlen und die nächsten als String? Oder kannst du das auf der sendenden Seite ggf. noch beeinflussen?

Beste Grüße
Jens

Re: [V2.0 IP5] String in int bzw. float wandeln

Verfasst: Fr Jun 04, 2021 10:55 pm
von Advenoni
Hallo Jens,

Ja, das hat mich auch etwas verwundert...
Hab leider keinen Einfluss darauf wie die Daten gesendet werden. Geht alles über das Script von dem Docker Container.

Gruß,
Martin

Re: [V2.0 IP5] String in int bzw. float wandeln

Verfasst: Sa Jun 05, 2021 9:55 am
von StefanW
Hallo Martin,
Advenoni hat geschrieben: Fr Jun 04, 2021 10:11 pmnachdem MQTT ja viel zum ausprobieren anregt
Unbedingt, bitte nutzt die neuen Möglichkeiten und bitte berichtet darüber. Weil das regt auch andere Nutzer an weitere Geräte und Funktionen nun zu integrieren.

Advenoni hat geschrieben: Fr Jun 04, 2021 10:11 pmwollte ich von mir zwei Feuchtesensoren im Hochbeet über MQTT auswerten.... Soweit funktioniert das Ganze, nur werden ein Teil der Zahlen (Feuchte und Batteriespannung) als String geschickt.
Das ist ein starkes Stück. Da hat der Entwickler wohl nicht ganz aufgepasst.


MQTT Spezifikation: Die Datenübertragung

Bei MQTT ist leider ein gewisser WIldwuchs möglich, weil es gibt gar keine Übereinkunft was im Payload stehen darf. Vom Protokoll her sind maximal 268.435.455 Bytes (rund 260 MB) in einer Message erlaubt (auch wenn die meisten Broker / Clients das nicht zulassen). Was dann in dieser Datenmenge kodiert ist, ist dem jeweiligen Sender überlassen.

Alle Daten werden ÜBLICHERWEISE als String gesendet, bei "Zahlen" nur ohne Anführungszeichen. Das verhält sich wie beim CSV Format, das ist binär ebenfalls als Zeichenkette kodiert, Zahlen werden mithin als Folge arabischer Ziffern plus Dezimaltrennzeichen im Datenstrom dargestellt.

Es handelt sich bei Zahlen in MQTT also ÜBLICHERWEISE nicht um ein binäres Zahlenformat wie 32-Bit-Signed-Integer oder 64-Bit-Float oder ähnlichem (so wie das ÜBLICHERWEISE bei Modbus übertragen wird) sondern um einen ZUMEIST UTF-8 kodierten String, der menschlich lesbare arabische Ziffern beinhaltet.

Die Besonderheit in diesem Fall ist, dass nun einzelne Zahlendarstellungen noch mit Anführungszeichen umfasst sind, was diese als String (im großen String) nach JSON Formatnotation kennzeichnet.


==> Das ist hier eindeutig falsch kodiert, weil in JSON sind Zahlen nicht als String mit Anführungszeichen zu kodieren (Boolesche Werte mit den Schlüsselwörtern true und false übrigens auch nicht).

==> Die empfehlenswerte Maßnahme wäre, den Entwickler auf GitHub darauf hinzuweisen, dass sein Format eben nicht der JavaScript Object Notation entspricht. Weil da fallen dann sicher auch andere darüber.


Advenoni hat geschrieben: Fr Jun 04, 2021 10:11 pmGibt es hier eine Möglichkeit das in eine Zahl zu wandeln?
Jein. Das kommt auf das zu verknüpfende Ziel an.


Eines der Projekte an denen wir arbeiten, ist dieses Leistungsmerkmal: Die automatische Typkonvertierung

Die jeweiligen Subsysteme wandeln damit den verknüpften Quell-Datentyp (im Rahmen der Möglichkeiten) bei der Weiterleitung auf das jeweils eigene Objekt. Das passiert immer EINGEHEND. In den Technologien Modbus und MQTT ist das bereits umgesetzt, für 1-Wire wird das derzeit entwickelt. Bei den anderen Technologien (wie z.B. Zeitserien, Logik) usw. kenne ich den Status gerade nicht. Womöglich liest das ein Entwickler und kann dazu noch eine Aussage machen.

==> Insofern, einfach mal ausprobieren, ob der Verknüpfungsassistent (aka "DOS") das Verknüpfen erlaubt und die Konvertierung von String auf Integer / Float ermöglicht.

Hinweis: Bei Konvertierungen die zu Datenverlust führen, z.B. Float auf Boolean, zeigt der Verknüpfungsassistent (aka "DOS") ein Ausrufezeichen an, ein Tooltipp erklärt dazu, dass dies eine verlustbehaftete Konvertierung ist.

Hinweis: Dieses neue Leistungsmerkmal der automatischen Typkonvertierung ist noch nicht durchgängig implementiert, sondern befindet sich in Teilen noch in der Implementierungsphase, daher haben wir hierzu noch nicht soviel erwähnt. Aber es soll die Konfiguration nochmal vereinfachen, weil die Objekte unterschiedlicher Objekttyen werdend damit - im Rahmen der Möglichkeiten - noch einfacher verknüpfbar.


lg

Stefan

Re: [V2.0 IP5] String in int bzw. float wandeln

Verfasst: Sa Jun 05, 2021 2:56 pm
von Advenoni
Hallo Stefan,

vielen Dank für die ausführliche Antwort.
Bezüglich herumspielen kann ich schon mal sagen, dass es mit einem ESP32 sehr einfach ist Daten dann über MQTT mit dem TWS auszuwerten. Aber hierzu dann erst mehr wenn ich weiß, dass das Ganze auch zuverlässig läuft.

Ich werde dann mal den Author bei GitHub darauf hinweisen bzw. ansprechen.
Bin jetzt dann erst mal im Urlaub, kann also dauern bis ich mich dann wieder melde :-)

Gruß,
Martin

Re: [V2.0 IP5] String in int bzw. float wandeln

Verfasst: Sa Jun 05, 2021 8:14 pm
von Advenoni
Manchmal geht etwas schneller wie erwartet.
Das Skript wurde von bachya angepasst und nun kommen die Werte alle so wie sie sollen :dance:

Gruß,
Martin