MQTT-Daten im JSON-Format mit korrekter Einheit umwandeln
Verfasst: 19. Sep 2024 10:18
Ich versuche in OpenHAB (v4.2) per MQTT empfangene Daten, die im JSON-Format übertragen werden, als Items mit Datentyp 'Number' abzuspeichern.
Dafür habe ich auf einem Rasperry Pi den MQTT-Broker Mosquitto installiert und in OpenHAB das 'MQTT Binding'. Als Bridge zu Mosquitto habe ich über die GUI folgendes Thing erstellt: 'MQTT Binding' > 'MQTT Broker' (ich bin dieser Anleitung gefolgt).
Ich habe dann ein weiteres Thing erstellt: 'MQTT Binding' > 'Generic MQTT Thing'. Dort habe ich einen Channel hinzugefügt und als 'MQTT State Topic' den String für das zu lesende Topic eingetragen.
Um den JSON-String zu parsen scheint es nun zwei Möglichkeiten zu geben:
Ich würde mich freuen einen Tipp zu bekommen, wie ich das korrekt konfigurieren muss. Möglicherweise müssen hier zwei Transformationen verkettet werden, ich habe aber keine Anleitung gefunden, wie das zu definieren ist. Und viele Anleitungen beziehen sich auf die Definition in Textdateien, während in der GUI offenbar eine andere Notation erwartet wird.
Ich habe folgende weitere Fragen:
Dafür habe ich auf einem Rasperry Pi den MQTT-Broker Mosquitto installiert und in OpenHAB das 'MQTT Binding'. Als Bridge zu Mosquitto habe ich über die GUI folgendes Thing erstellt: 'MQTT Binding' > 'MQTT Broker' (ich bin dieser Anleitung gefolgt).
Ich habe dann ein weiteres Thing erstellt: 'MQTT Binding' > 'Generic MQTT Thing'. Dort habe ich einen Channel hinzugefügt und als 'MQTT State Topic' den String für das zu lesende Topic eingetragen.
Um den JSON-String zu parsen scheint es nun zwei Möglichkeiten zu geben:
- (a) Im Channel des 'Generic MQTT Thing' unter 'Incoming Value Transformations' die passende Transformation für genau einen gewünschten Datenpunkt eingeben, z.B.:
Dann muss aber für jeden Datenpunkt ein eigener Channel des 'Generic MQTT Thing' erstellt werden.
Code: Alles auswählen
JSONPATH:$.total_energy
- (b) Daher habe ich das Feld 'Incoming Value Transformations' im Channel des 'Generic MQTT Thing' frei gelassen und füge diese Transformation erst im Item hinzu. Ich habe ein Item vom Typ 'Number' erstellt, als Einheit habe ich 'kWh' gewählt, da dies die einzige Einheit der Energie ist, die sich in der GUI wählen lässt. Unter 'Channel Links' habe ich einen Link zum erstellten Channel des 'Generic MQTT Thing' hinzugefügt. Dort habe ich unter 'Profile' die Option 'JSONPATH' ausgewählt und als Ausdruck eingetragen:
Code: Alles auswählen
$.total_energy
Ich würde mich freuen einen Tipp zu bekommen, wie ich das korrekt konfigurieren muss. Möglicherweise müssen hier zwei Transformationen verkettet werden, ich habe aber keine Anleitung gefunden, wie das zu definieren ist. Und viele Anleitungen beziehen sich auf die Definition in Textdateien, während in der GUI offenbar eine andere Notation erwartet wird.
Ich habe folgende weitere Fragen:
- Auch unterhalb des Things 'MQTT Binding' > 'MQTT Broker' lassen sich Channels erstellen. Zu welchem Zweck würde man dort Channels erstellen? Bzw. warum existiert überhaupt das 'Generic MQTT Thing' als eigenes Thing und die Channels werden nicht ausschließlich unterhalb des 'MQTT Broker' erstellt?
- Ist es tatsächlich sinnvoll die JSON-Transformation erst im Channel Link des Items zu erstellen, oder gibt es Vorteile pro Datenpunkt auch einen eigenen Channel im Generic MQTT Thing zu erstellen (die den Mehraufwand rechtfertigen)?
- Warum werden außer kWh keine anderen Einheiten zur Auswahl angeboten? Es wäre ja denkbar, dass in anderen Fällen Energie in ganz anderen Größenordnungen zu speichern ist, dann wäre kWh als Einheit unpassend.