Seite 1 von 2

JSONPATH und optionale Werte

Verfasst: 30. Dez 2021 10:08
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

Re: JSONPATH und optionale Werte

Verfasst: 30. Dez 2021 18:39
von HABuserJM
Ein ähnliches Problem habe ich auch, siehe hier in meinem Thread.

Re: JSONPATH und optionale Werte

Verfasst: 30. Dez 2021 19:49
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

Re: JSONPATH und optionale Werte

Verfasst: 31. Dez 2021 13:35
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...

Re: JSONPATH und optionale Werte

Verfasst: 4. Sep 2022 00:20
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

Re: JSONPATH und optionale Werte

Verfasst: 27. Aug 2023 17:20
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

Re: JSONPATH und optionale Werte

Verfasst: 27. Aug 2023 19:28
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 ;)

Re: JSONPATH und optionale Werte

Verfasst: 27. Aug 2023 19:37
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!

Re: JSONPATH und optionale Werte

Verfasst: 27. Aug 2023 20:12
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.

Re: JSONPATH und optionale Werte

Verfasst: 27. Aug 2023 20:31
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: