Seite 1 von 2

Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 18:56
von adele
Hallo zusammen,
ich habe folgendes Problem: Von meinem Stromzähler-Lesegerät bekomme ich Daten im JSON- Format

Code: Alles auswählen

{"Anzeige" : 16611347.40, "T1" : 16611347.40, "T2" : 0.00, "Pall" : 539.00, "PL1" : 140.00, "PL2" : 57.00, "PL3" : 341.00, "Luftdruck" : 988.84}
Als Thinks-Datei steht folgendes:

Code: Alles auswählen

Thing http:url:StromZaehler "Stromzaehler" [
    baseURL="http://10.10.18.2/werte.json",
    refresh=15] {
        Channels:
         Type number : Stromzaehler_Anzeige  "ZaehlerAnzeige" [transformationPattern="JSONPATH:$.Anzeige"]
         Type number : Stromzaehler_T1       "Zaehler_T1"     [transformationPattern="JSONPATH:$.T1"]
         Type number : Stromzaehler_T2       "Zaehler_T2"     [transformationPattern="JSONPATH:$.T2"]
         Type number : Stromzaehler_Pall     "Zaehler_Power"  [transformationPattern="JSONPATH:$.Pall"]
         Type number : Stromzaehler_PL1      "Zaehler_L1"     [transformationPattern="JSONPATH:$.PL1"]
         Type number : Stromzaehler_PL2      "Zaehler_L2"     [transformationPattern="JSONPATH:$.PL2"]
         Type number : Stromzaehler_PL3      "Zaehler_L3"     [transformationPattern="JSONPATH:$.PL3"]
}
Warum wird ein item wie

Code: Alles auswählen

Number text1 {channel="http:url:StromZaehler:Stromzaehler_T1"} 
mit UNDEF beschickt. Wo steckt der Fehler beim Zugriff auf die JSON-Daten?

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 19:33
von udo1toni
Das Du das JSONPath Addon installiert? Weil, das sieht eigentlich gut aus (es fehlt nur die Unit, aber die verhindert ja nicht, dass der Pfad ausgewertet wird)

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 19:47
von adele
Hallo Udo,
ja das Addon ist da, im Addon-Store wird neben JSONPath der (REMOVE) -Button angezeigt.
Mit Unit meinst Du

Code: Alles auswählen

[transformationPattern="JSONPATH:$.UNIT.PL3"
und da steht dann so etwas wie POWer drin? Wenn es daran liegen sollte, dann muss ich meinen Leser einfach noch mal umprogrammieren.
Mir würde aber auch eine Lösung reichen, die so etwas verarbeitet wie:

Code: Alles auswählen

[16611822.20, 16611822.20, 0.00, 757.00, 139.00, 374.00, 242.00, 988.73]
Auch hier kann ich an den Code noch Hand anlegen um die Daten mundgerecht dem OH4 zu servieren.

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 20:08
von udo1toni
Nein, mit unit meine ich

Code: Alles auswählen

Thing http:url:StromZaehler "Stromzaehler" [
    baseURL="http://10.10.18.2/werte.json",
    refresh=15] {
        Channels:
         Type number : Anzeige  "Zähler Anzeige" [transformationPattern="JSONPATH:$.Anzeige", unit="kWh"]
         Type number : T1       "Zähler T1"     [transformationPattern="JSONPATH:$.T1", unit="kWh"]
         Type number : T2       "Zähler T2"     [transformationPattern="JSONPATH:$.T2", unit="kWh"]
         Type number : Pall     "Zähler Power"  [transformationPattern="JSONPATH:$.Pall", unit="kW"]
         Type number : PL1      "Zähler L1"     [transformationPattern="JSONPATH:$.PL1", unit="kW"]
         Type number : PL2      "Zähler L2"     [transformationPattern="JSONPATH:$.PL2", unit="kW"]
         Type number : PL3      "Zähler L3"     [transformationPattern="JSONPATH:$.PL3", unit="kW"]
}
falls dies die Einheiten sind... :) ich kenne ja Deinen Zähler nicht.
Anschließend kannst Du dann die Items so definieren:

Code: Alles auswählen

Number:Energy StromAnzeige "Stromzähler " {channel="http:url:StromZaehler:Anzeige", unit="kWh", stateDescription=""[pattern="%.1f kWh"]}
Number:Energy StromT1      "Stromzähler " {channel="http:url:StromZaehler:T1", unit="kWh", stateDescription=""[pattern="%.1f kWh"]}
Number:Energy StromT2      "Stromzähler " {channel="http:url:StromZaehler:T2", unit="kWh", stateDescription=""[pattern="%.1f kWh"]}
Number:Power  StromAll     "Stromzähler " {channel="http:url:StromZaehler:Pall", unit="kW", stateDescription=""[pattern="%.1f kW"]}
Number:Power  StromL1      "Stromzähler " {channel="http:url:StromZaehler:PL1", unit="kW", stateDescription=""[pattern="%.1f kW"]}
Number:Power  StromL2      "Stromzähler " {channel="http:url:StromZaehler:PL2", unit="kW", stateDescription=""[pattern="%.1f kW"]}
Number:Power  StromL3      "Stromzähler " {channel="http:url:StromZaehler:PL3", unit="kW", stateDescription=""[pattern="%.1f kW"]}
und Die Unit darf beim Item auch abweichen, sie muss nur zur Größe passen. Du könntest also auch MWs (MegaWattsekunden) oder J (Joule) statt kWh für die Energiemenge angeben, oder mW (Milliwatt) statt kW für die Leistung, openHAB rechnet das dann automatisch um. Die unit beim Item sollte aber nach der Ersteinrichtung nicht mehr geändert werden, weil die Persistence dieses Feld nutzt - die state Description kannst Du ändern nach Lust und Laune.

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 20:53
von adele
Hallo Udo,
vielen Dank für Deine Mühe. Der Fehler muss aber irgendwo sonst stecken. Ich habe Deine Code-Schnippsel einfach in meine Things und in die Items - Datein geschrieben. Das Fehlerprotokoll gibt dann folgendes aus:

Code: Alles auswählen

2024-01-17 20:45:17.521 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromAnzeige' changed from NULL to UNDEF
2024-01-17 20:45:17.542 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromT1' changed from NULL to UNDEF
2024-01-17 20:45:17.547 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromT2' changed from NULL to UNDEF
2024-01-17 20:45:17.551 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromAll' changed from NULL to UNDEF
2024-01-17 20:45:17.556 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromL1' changed from NULL to UNDEF
2024-01-17 20:45:17.560 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromL2' changed from NULL to UNDEF
2024-01-17 20:45:17.564 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'StromL3' changed from NULL to UNDEF
Ich habe mal in der Things den Wert von "Type number : Anzeige" auf "Type string : Anzeige" gesetzt und auch das erste Item entsprechend geändert - dann bekomme ich meine komplette JSON-Datei als String angezeigt.

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 22:06
von udo1toni
Ja, das deutet halt darauf hin, dass JSONPath nicht installiert ist.
Alternativ ist das JSON Objekt ungültig, dann wäre das Beispiel von oben halt nicht vollständig, denn das ist ok.

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 22:36
von adele
Ich noch mal -
meine "/var/lib/openhab/config/org/openhab/addons.config" sieht so aus:

Code: Alles auswählen

:org.apache.felix.configadmin.revision:=L"19"
automation="jsscripting"
binding="astro,tr064,upnpcontrol,ftpupload,http,lgwebos,zwave,exec,avmfritz"
persistence="rrd4j,mapdb"
service.pid="org.openhab.addons"
transformation="regex,jsonpath,map,exec"
ui="basic"
JSONPath sollte also da sein.

Kann es sein, dass an meinen JSON-Daten irgend etwas nicht stimmt oder ich noch ein EOT oder \n anhängen muss, damit die Verarbeitung in Gang kommt?
Deine Code-Segmente habe ich 1:1 übernommen, genau so wie mein Zeug am Anfang - ich bin etwas ratlos.

Ist mir gerade noch so aufgefallen: die [Info] kommt auch nicht wieder - Anzeige in der Fehlerkonsole genau ein mal!

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 17. Jan 2024 23:54
von peter-pan
udo1toni hat geschrieben: 17. Jan 2024 22:06 Alternativ ist das JSON Objekt ungültig, dann wäre das Beispiel von oben halt nicht vollständig, denn das ist ok.
Das denke ich auch. Dein Beispiel

Code: Alles auswählen

{"Anzeige" : 16611347.40, "T1" : 16611347.40, "T2" : 0.00, "Pall" : 539.00, "PL1" : 140.00, "PL2" : 57.00, "PL3" : 341.00, "Luftdruck" : 988.84}
ist ok und sollte deshalb auch so wie es Udo beschrieben hat, ausgewertet werden können.

Wenn du als Erstes einen Channel

Code: Alles auswählen

Type string : alles      "Alle Werte"  [ stateTransformation="JSONPATH:$.*" ]
in dein Thing einfügst und ein passendes Item dazu anlegst,

Code: Alles auswählen

String   Alles       "String komplett"        {channel="http:url:StromZaehler:alles"}
dann sollte auch dieses Ergebnis

Code: Alles auswählen

[16611822.20, 16611822.20, 0.00, 757.00, 139.00, 374.00, 242.00, 988.73]
in deinem String stehen.

Die anderen Items sollten dann auch richtig gefüllt werden.

Welche Version von openHAB hast du denn laufen ?

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 18. Jan 2024 00:24
von udo1toni
Oh... ja, ganz dummer Fehler...
Das Schlüsselwort heißt bei http tatsächlich stateTransformation, das Schlüsselwort transformationPattern stammt stattdessen von mqtt. (doof, dass hier unterschiedliche Begriffe eingeführt wurden... das sollte mal angeglichen werden, so wie "damals" host, Hostname und ipAddress vereinheitlicht wurden...

Das Thing muss also so aussehen:

Code: Alles auswählen

Thing http:url:StromZaehler "Stromzaehler" [
    baseURL="http://10.10.18.2/werte.json",
    refresh=15] {
        Channels:
         Type number : Anzeige  "Zähler Anzeige" [stateTransformation="JSONPATH:$.Anzeige", unit="kWh"]
         Type number : T1       "Zähler T1"      [stateTransformation="JSONPATH:$.T1", unit="kWh"]
         Type number : T2       "Zähler T2"      [stateTransformation="JSONPATH:$.T2", unit="kWh"]
         Type number : Pall     "Zähler Power"   [stateTransformation="JSONPATH:$.Pall", unit="kW"]
         Type number : PL1      "Zähler L1"      [stateTransformation="JSONPATH:$.PL1", unit="kW"]
         Type number : PL2      "Zähler L2"      [stateTransformation="JSONPATH:$.PL2", unit="kW"]
         Type number : PL3      "Zähler L3"      [stateTransformation="JSONPATH:$.PL3", unit="kW"]
}

Re: Probleme beim Auslesen mit jsonpath

Verfasst: 18. Jan 2024 11:59
von adele
Und LÄUFT!
Danke Udo!
Aber auf den Fehler muss man erst mal kommen - nochmals vielen Dank.