JSONPATH und optionale Werte

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39
Answers: 0

JSONPATH und optionale Werte

Beitrag von HiG »

MoinZen..

mein Aqara-Button liefert leider einige Werte immer nur optional aus. Manchmal sieht der JSON-Teil so aus

Code: Alles auswählen

{"battery":100,"linkquality":36,"voltage":3022}
manchmal so...

Code: Alles auswählen

{"action":"single","battery":100,"linkquality":36,"voltage":3022}
Wie bekomme ich die Fehlermeldung

Code: Alles auswählen

Executing the JSONPATH-transformation failed: Invalid path '$.action' in '{"battery":100,"linkquality":36,"voltage":3022}'
weg?

Ist zwar nur ein Warning...muss aber ja nicht im Log stehen

HABuserJM
Beiträge: 102
Registriert: 18. Apr 2021 11:30
Answers: 0
Wohnort: Berlin

Re: JSONPATH und optionale Werte

Beitrag von HABuserJM »

Ein ähnliches Problem habe ich auch, siehe hier in meinem Thread.

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39
Answers: 0

Re: JSONPATH und optionale Werte

Beitrag von HiG »

HABuserJM hat geschrieben: 30. Dez 2021 18:39 siehe hier in meinem Thread.
Hab Dir in Deinem Thread mal was geschrieben...das werde ich dann wohl auch so machen

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: JSONPATH und optionale Werte

Beitrag von udo1toni »

Wie ist der Sensor angebunden? Wenn Du das mit mqtt machst, kannst Du verkettete Transformations verwenden. Leider ist das eher stiefmütterlich erklärt, aber immerhin im Hilfetext erwähnt:
Applies transformations to an incoming MQTT topic value. A transformation example for a received JSON would be "JSONPATH:$.device.status.temperature" for a json {device: {status: { temperature: 23.2 }}}. You can chain transformations by separating them with the intersection character ∩.
Du kannst also z.B. mittels REGEX zunächst den Teil "battery" suchen und anschließend JSONPATH auf das Ergebnis los lassen:

Code: Alles auswählen

REGEX:.*battery.*∩JSONPATH:$.battery
Nein, das ∩ Zeichen steht nicht auf der normalen Tastatur zur Verfügung, das Einfachste ist es, das Zeichen aus dem Hilfetext zu kopieren. Über die Zeichentabelle stehen drei verschiedene Zeichen zur Verfügung, die sich zum Verwechseln ähnlich sehen...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

dandjo
Beiträge: 1
Registriert: 4. Sep 2022 00:13
Answers: 0

Re: JSONPATH und optionale Werte

Beitrag von dandjo »

Ich hatte das gleiche Problem und bin dazu übergegangen JSONPATH nicht zu verwenden, wenn Properties optional vorkommen können. Eine elegante Alternative ist die JS Transformation. Beispiel:

Code: Alles auswählen

JS:|JSON.parse(input).battery

Benutzeravatar
moforlive
Beiträge: 4
Registriert: 27. Aug 2023 17:12
Answers: 0

Re: JSONPATH und optionale Werte

Beitrag von moforlive »

Hallo,
falls sich noch jemand zu dem Thema auskennt, hätte ich da noch ein paar Fragen.
Bin auf das gleiche Problem, wie oben beschrieben, gestoßen.

Leider verstehe ich das mit dem JS:|JSON.pase(input).battery nicht.

Wie muss ich das ganze angeben, damit es funktioniert.

Meine vollständige Zeile unter mqtt.things lautet:

Code: Alles auswählen

Type dimmer : Dim            [ stateTopic="Wohnzimmer-ShellyDimmer02/stat/RESULT", transformationPattern="JSONPATH:$.Dimmer", commandTopic="Wohnzimmer-ShellyDimmer02/cmnd/Dimmer" ]
Das hier enthaltene transformationPattern funktoniert, jedoch mit den Fehlermeldugen im openhab.log

Code: Alles auswählen

2023-08-27 17:02:24.129 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JSONPATH-transformation failed: Invalid path '$.Dimmer' in '{"POWER":"ON"}'
2023-08-27 17:02:33.239 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JSONPATH-transformation failed: Invalid path '$.Dimmer' in '{"POWER":"OFF"}'
Ursache dafür ist ja eigentlich Tasmota, da hier mal so und mal so Werte ausgegeben werden.

Code: Alles auswählen

17:02:00.632 MQT: Wohnzimmer-ShellyDimmer02/stat/RESULT = {"POWER":"ON"}
17:02:03.278 MQT: Wohnzimmer-ShellyDimmer02/stat/RESULT = {"POWER":"ON","Dimmer":36}
Klar dass er dann eine Fehlermeldung schmeißt, wenn in der ersten Zeile kein "Dimmer" vorkommt.

Vielen Dank falls jemand helfen kann :D

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: JSONPATH und optionale Werte

Beitrag von Harka »

versuch es mal mit

Code: Alles auswählen

transformationPattern="JS:|JSON.parse(input).Dimmer"
ggf. muss noch das JavaScript Scripting-Binding installiert sein.
Danke fürs nach vorne holen - hat mir gerade geholfen ;)

Benutzeravatar
moforlive
Beiträge: 4
Registriert: 27. Aug 2023 17:12
Answers: 0

Re: JSONPATH und optionale Werte

Beitrag von moforlive »

Danke fürs super schneel Antworten.
Script funktiniert, jedoch mit "gleichem" Ergebnis. Sobald Tasmota nur den POWER Value per MQTT schickt, weiß OpenHAB, das was fehlt.
Sieht dann so aus, jedes mal wenn ich ohne Dimmer-Wert schalte:

Code: Alles auswählen

2023-08-27 19:34:48.341 [WARN ] [ab.binding.mqtt.generic.ChannelState] - Command 'null' from channel 'mqtt:topic:myMQTTBroker:WohnzimmerShellyDimmer02:Dim' not supported by type 'PercentageValue': Unknown String!

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: JSONPATH und optionale Werte

Beitrag von udo1toni »

Korrekt läuft das genau wie von mir weiter oben beschrieben, indem Du zunächst ein REGEX laufen lässt, welches nur die Payload durchreicht, welche das Schlüsselwort enthält.
Natürlich muss sowohl REGEX als auch JSONPATH installiert sein.
Für die JavaScript Variante muss mindestens JavaScript installiert sein, welches ein "internes" JSONPath mitbringt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
moforlive
Beiträge: 4
Registriert: 27. Aug 2023 17:12
Answers: 0

Re: JSONPATH und optionale Werte

Beitrag von moforlive »

Danke auch für diese schnelle Antwort.
Habe es jetzt so geschrieben:

Code: Alles auswählen

       Type switch : PowerSwitch    [ stateTopic="Wohnzimmer-ShellyDimmer02/stat/POWER",  transformationPattern="REGEX:.*POWER*∩JSONPATH:$.POWER",  commandTopic="Wohnzimmer-ShellyDimmer02/cmnd/POWER" ]
Es kommen keine Fehlermeldungen im Log, weil wenn ich den Text hinter REGEX:. änder kommen fehler.
Bloß wird jetzt der Status komplett ignoeriert.

MQTT Meldung sieht so aus:

Code: Alles auswählen

20:27:51.902 MQT: Wohnzimmer-ShellyDimmer02/stat/POWER = {"POWER":"OFF"}
Nach mehreren Tagen testen habe ich keine Lust mehr :lol:

Antworten