JSONPATH Transformation für MQTT String Array

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
blondi
Beiträge: 7
Registriert: 15. Apr 2022 10:34
Answers: 0

JSONPATH Transformation für MQTT String Array

Beitrag von blondi »

Ich bräuchte Hilfe beim Auslesen von MQTT Daten einer Wärmepumpe, genauer gesagt für folgende Daten (vermutlich String Array):

MQTT Explorer Topic:

Code: Alles auswählen

ebusd/24849/temperature.outside
Value:

Code: Alles auswählen

0;0;0d;°C;50.0;-50.0;19.7
Ich habe schon kreuz und quer gesucht, finde aber nichts was mir weiterhilft.

Thing:

Code: Alles auswählen

    Thing topic Waermepumpe
    {
        Type string : OutsideTemp  [ stateTopic="ebusd/24849/temperature.outside.[6]", transformationPattern="JSONPATH:$.value" ]
    }
Item:

Code: Alles auswählen

Number Aussentemperatur     "Wärmetauscher Lufttemperatur [%d °C]"             {channel="mqtt:topic:mosquitto:OutsideTemp"}
Ich habe die verschiedensten Versionen vom transformationPattern probiert, kein Erfolg. Ich würde im obigen Fall den siebten Wert (19.7) als Zahl benötigen.

Wer kann mir eine Lösung verraten?

Danke
Werner

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

Re: JSONPATH Transformation für MQTT String Array

Beitrag von Harka »

Moin,
das ist kein JSON.
Ich würde das mit folgendermaßen lösen:

Code: Alles auswählen

JS:|(input).split(';')[6]
Voraussetzung ist OH ab Version 4 und installiertes JavaScript Scripting. Ich nutze keine Textkonfiguration aber es sollte so gehen

Code: Alles auswählen

Type string : OutsideTemp  [ stateTopic="ebusd/24849/temperature.outside", transformationPattern="JS:|(input).split(';')[6]" ]
e: Du kannst den Type auch gleich auf number setzen.
Zuletzt geändert von Harka am 15. Jun 2024 20:03, insgesamt 1-mal geändert.

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

Re: JSONPATH Transformation für MQTT String Array

Beitrag von udo1toni »

Ich gehe davon aus, dass der Wert die gesamte Payload des Topics ist. Es handelt sich also nicht um ein JSON Objekt, mithin kannst Du auch nicht mit JSONPath arbeiten. Stattdessen must Du mutmaßlich einen REGEX Ausdruck verwenden. Im Text kommen mehrere Semikola vor, Dich interessiert der Wert nach dem letzten Semikolon, das sähe dann z.B. so aus:

Code: Alles auswählen

transformationPattern="REGEX:.*;(\d+\.\d)" 
in openHAB muss immer die gesamte REGEX matchen. Zurückgegeben wird dann die erste Gruppe.
In diesem Fall ist die erste Gruppe also der letzte Part des Strings, der String besteht aus einer beliebigen Zeichenfolge (.*), der eine Semikolon folgt, dem dann die Gruppe folgt. Die Gruppe besteht aus einer beliebigen Anzahl Ziffern (mindestens eine), gefolgt von einem Punkt (muss escaped werden, deshalb der Backslash), gefolgt von exakt einer Ziffer.
Falls der wert auch negativ werden kann, müsste man das noch ergänzen:

Code: Alles auswählen

transformationPattern="REGEX:.*;(-?\d+\.\d)" 
Das Minuszeichen ist das Zeichen, das ? bedeutet "null- oder einmal"
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

blondi
Beiträge: 7
Registriert: 15. Apr 2022 10:34
Answers: 0

Re: JSONPATH Transformation für MQTT String Array

Beitrag von blondi »

Danke für die schnellen Antworten. Leider führen beide nicht zum Ziel.

Bei dem Tip von Harka kommt im Log kein Fehler aber auch kein Wert in das Item.

Bei dem Tip von udo1toni meldet OH einen Fehler in der Datei und nichts geht mehr.

Gibts noch andere Tips?

Danke
Werner

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

Re: JSONPATH Transformation für MQTT String Array

Beitrag von Harka »

Moin,
sollten aber alle gehen (getestet!). Was für eine Fehlermeldung gibt es bei der RegEx-Lösung?
Was gibt dies aus? ->

Code: Alles auswählen

JS:|console.warn(input);console.warn(input.split(';'));console.warn(parseFloat(input.split(';')[6]));
Welche Version hast Du? Sind Javascript und die RegEx-Transformation installiert?

Info: ".split(';')[6]" kann auch durch ".split(';').slice(-1)[0]" ersetzt werden um geziehlt auf den letzten Wert zuzugreifen.

blondi
Beiträge: 7
Registriert: 15. Apr 2022 10:34
Answers: 0

Re: JSONPATH Transformation für MQTT String Array

Beitrag von blondi »

Hallo noch einmal,

Danke auch noch einmal für die Tips, habe nun Erfolg:

Der Tip von Harka war schlußendlich richtig, ich hatte in der item Definition noch einen Fehler. Nach bereinigung habe ich nun Werte.

lg
Werner

Antworten