JSON PATH fPort in einem Payload auswerten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Sat_Dad
Beiträge: 14
Registriert: 27. Dez 2019 12:54

JSON PATH fPort in einem Payload auswerten

Beitrag von Sat_Dad »

Hallo Zusammen,

ich bräuchte mal Eure Hilfe bei folgender Herausforderung:
Ausgangsituation:
- ich habe einen Sensor, der seine Daten per LORA WAN an meinen MQTT-Broker schickt
- dieser Sensor liefert zu verschiedenen Zeiten einen Payload, der sich je nach MessageType durch den jeweiligen fPort unterscheidet
z.B. Messdaten mit fPort 16, Statusmeldungen mit fPort 48 usw.
- je nach Message Type haben diese payloads auch eine andere Datenstruktur
- ich habe zwei Things angelegt, die die unterschiedliche Struktur abbilden, diese werden auch sauber bestückt

Problem:
- da ich nur mit dem einfachen JSONPATH analysiere, mehr bringe ich derzeit als bekennender Software-Legastheniker noch nicht hin, und das topic ja identisch ist, läuft bei einem event immer die eine oder die andere Auswertung auf Fehler.

Gibt es eine Möglichkeit ohne größeren Aufwand auch eine einfach JSON Path Abfrage so zu gestalten, dass sie mir die beiden Message Types auseinander hält?

die relevanten Code Schnipsel wie folgt(fPort und object befinden sich auf derselben Strukturebene) :
der Payload für die StatusMessage

Code: Alles auswählen

"fCnt":51,"fPort":48,"data":"MAAAAgEJNgBIAGMBaAYAKA6q","object":{"Bat":99,"Level":40,"Period":6,"Temp":14}}
der Payoad einer Messung:

Code: Alles auswählen

"fCnt":52,"fPort":16,"data":"EAAAAAAoDqoAJxghAIgXogCIF6I=","object":{"L1":40,"L2":39,"L3":136,"L4":136,"Temp1":14,"Temp2":24,"Temp3":23,"Temp4":23}}'
Und hier Beispiele, wie ich den JsonPath bisher realisiert habe:
aus der Messung (fPort16):

Code: Alles auswählen

JSONPATH:$.object.Temp1
bzw.
aus dem Status (fPort 48):

Code: Alles auswählen

JSONPATH:$.object.Level
Vielleicht kann mich einer von Euch in die richtige Richtung schubsen (oder ich muss auf mich meine alten Tage doch noch mit Programmierung auseinandersetzen ;-)) )

danke und Gruß
Detlef

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

Re: JSON PATH fPort in einem Payload auswerten

Beitrag von udo1toni »

Du kannst mehrere Transformations miteinander verketten, auf diese Weise kannst Du ungültige JSON Objekte ausfiltern. Wenn Du openHAB3 nutzt, lies einfach aufmerksam den erläuternden Text zur incomming Value Transformation, ansonsten halt in der Doku vom mqtt2 Addon die entsprechende Stelle. Das Verkettungssymbol ∩ ist leider über die normale Tastatur nur sehr umständlich einzugeben, es ist aber in beiden Texten enthalten, so dass man es dort über die Zwischenablage einfach klauen kann ;)

Eine andere Möglichkeit wäre, in der entsprechenden Ebene im JSONPATH einen Filter einzubauen, dann bleibt das Pattern bei Fehlen des passenden Wertes ebenfalls leer.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Sat_Dad
Beiträge: 14
Registriert: 27. Dez 2019 12:54

Re: JSON PATH fPort in einem Payload auswerten

Beitrag von Sat_Dad »

Hallo,

eine Unmenge der ganzen Anleitungen und Tipps im Web habe ich gelesen, aber leider nicht so richtig verstanden.
Aber trotzdem Danke für den Hinweis mit dem "Lesen bildet" ;-))
Mit viel rumprobieren bin ich nun auf folgende Lösung gekommen:

Code: Alles auswählen

$[?(fPort==48)]object.Level
Scheint jedenfalls im Emulator so zu laufen und bringt mir nur bei fPort= 48 den Levelwert. Mal sehen was OH beim nächsten Update der Message sagt. Die kommt leider nur einmal die Woche, da ist Geduld angesagt.
Ein Problem habe ich noch:
der Filter

Code: Alles auswählen

$[?(fPort==48)
am Anfang blendet mir die Beschreibungen der Ebene 1 aus, damit kann ich den fPort auf Ebene 1 nicht mehr auswerten, da dann dort nur noch der Wert "48" statt 'fPort': 48 steht.
Irgendwelche Ideen, wie ich das noch in den Griff kriege?

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

Re: JSON PATH fPort in einem Payload auswerten

Beitrag von udo1toni »

Sat_Dad hat geschrieben: 17. Mai 2021 19:31 Hallo,

eine Unmenge der ganzen Anleitungen und Tipps im Web habe ich gelesen, aber leider nicht so richtig verstanden.
Aber trotzdem Danke für den Hinweis mit dem "Lesen bildet" ;-))
So war das gar nicht gemeint... Es ist eher der Punkt, dass der Text nicht eben sehr prominent auf dieses Feature (Verkettung der Transformations) darauf hinweist, und sehr naheliegend ist das auch nicht...

Zu dem Problem mit der ausgeblendeten Ebene: das verstehe ich nicht so ganz. Kannst Du das noch mal näher erläutern?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Sat_Dad
Beiträge: 14
Registriert: 27. Dez 2019 12:54

Re: JSON PATH fPort in einem Payload auswerten

Beitrag von Sat_Dad »

nichts für ungut deswegen auch der ;-))
aber so langsam verzweifle ich an dem Thema. Die Filter, die ich mir da zusammengebaut habe laufen allesamt auf einen allgemeinen Fehler:

Code: Alles auswählen

Executing the JSONPATH-transformation failed: An error occurred while transforming JSON expression.
aber immerhin vermurkst er mir die Daten nicht mehr :(

Also nach Beschreibung auf der OH Seite, ich laufe noch auf OH2, soll der JsonPath Addon ein Derivat von Jayway und Goessner sein. Bisher kannte ich nur jsonpath.com. Aber der Decoder passt offensichtlich garnicht zu dem AddOn. Habe heute nun mal einen anderen Online Decoder ausprobiert (https://jsonpath.herokuapp.com), der liefert bei Jayway und Goessner Decodierung teilweise unterschiedliche Ergebnisse.
Kennt jemand einen online Decoder, der tatsächlich mit der Sprache des OH Addon kompatibel ist?

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

Re: JSON PATH fPort in einem Payload auswerten

Beitrag von udo1toni »

Also bisher hatte ich noch nie Probleme, wenn ich die grundlegenden Funktionen von JSONPATH verwendet habe (Filter gehört da dazu...) Aber ja, es wird nur ein Teil der Funktionen unterstützt. Auf die Schnelle habe ich aber keinen Tipp, wo Du nachschauen kannst, was genau nicht geht.


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Sat_Dad
Beiträge: 14
Registriert: 27. Dez 2019 12:54

Re: JSON PATH fPort in einem Payload auswerten

Beitrag von Sat_Dad »

Es ist wirklich eigenartig. Wenn ich meinen Payload decodieren möchte dann gibt mir der Filter:

Code: Alles auswählen

$[?($.fPort==48)].object.Level
- bei JsonPath.com: ein

Code: Alles auswählen

no match
- bei jsonpath.herokuapp.com mit JayWay: den Levelwert (der auch richtig ist)
- bei jsonpath.herokuapp.com mit Goessner: ein

Code: Alles auswählen

false

Ich bin aber guter Hoffnung, dass der Filter stimmt, denn wenn ich den fPort auf "47" ändere wirft der Decoder mit JayWay einen leeren String aus. Und der deckt sich nun auch mit der Fehlermeldung im Log

Code: Alles auswählen

Incoming payload 'NULL' not supported by type 'NumberValue'
.
Er erkennt also, dass er einen "null" String zurückbekommt.
Jetzt muss ich nur noch bis zum Wochenende warten, da die Statusmeldung mit fPort 48 nur einmal pro Woche kommt

Antworten