JSONPATH in Javaspript zerlegen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Gerd_B2809
Beiträge: 13
Registriert: 18. Jan 2019 12:51
Answers: 1

JSONPATH in Javaspript zerlegen

Beitrag von Gerd_B2809 »

Hej,

habe mal eine Frage.
Der Sachverhalt:
Ich habe ein NXPanel welches mir bei einem Tastendruck folgende Daten an ein Item liefert

Code: Alles auswählen

{"button": {"pid": 10, "bid": 1, "state": 0, "next": 0}} 
Ich bin nun soweit das ich diese Daten in einem Script zerlegt habe und damit auch arbeiten kann.

Code: Alles auswählen

var nxpanel185 = items.getItem("NSPanel185_NxPanel185Result");

var debug = 1;
if (debug == 1)
{
  console.log("nxpanel185 "+nxpanel185.state);
}

var objekt = JSON.parse(nxpanel185.state);
var pid = objekt.botton.pid;
var bid = objekt.botton.bid;

if (debug == 1)
{
console.log("pid "+pid+" bid "+bid);
}
  
Das funktioniert auch alles soweit, sobald ich dann aber einen Datensatz vom Dimmer bekomme

Code: Alles auswählen

{"dimmer":{"pid":16,"power":0,"hsbcolor":"180,100,50"}}
gibt einen Fehlermeldung im Log.

Code: Alles auswählen

2022-04-05 16:23:27.096 [INFO ] [org.openhab.automation.script       ] - nxpanel185 {"button": {"pid": 10, "bid": 1, "state": 0, "next": 0}} 
2022-04-05 16:23:27.098 [INFO ] [org.openhab.automation.script       ] - pid 10 bid 1
2022-04-05 16:24:34.012 [INFO ] [org.openhab.automation.script       ] - nxpanel185 {"dimmer":{"pid":16,"power":0}} 
2022-04-05 16:24:34.016 [ERROR] [b.automation.script.javascript.stack] - Failed to execute script:
org.graalvm.polyglot.PolyglotException: TypeError: Cannot read property "pid" from undefined
Das ist erstmal auch alles so richtig, weil das Script aus dem Datensatz "dimmer" die "buttom"-Daten ja nich auslesen kann ,
nun zu meiner Frage wie kann ich vorher schon filtern ob es ein button oder ein dimmer ist?
Oder ist es besser wenn ich hier für jede Option ein Item anlege?

Dann würden es ein paar mehr Rules werden, wollte es eigentlich in einer unterbringen.

Gruß Gerd

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

Re: JSONPATH in Javaspript zerlegen

Beitrag von udo1toni »

Wenn das JSON Objekt über ein String Item in der Rule landet, musst Du ja nur prüfen, ob ein bestimmtes Schlüsselwort enthalten ist. In der DSL sähe das z.B. so aus:

Code: Alles auswählen

rule "get command from NXPanel"
when
    Item NXPanel received update // oder den Channel gleich so konfigurieren, dass es ankommend als Befehl verstanden wird, dann received command
then
    val strIn = NXPanel.state.toString // bei received command stattdessen receivedCommand.toString
    var strData = ""
    if(strIn.contains("button") {
        strData = transform("JSONPATH","$.button",strIn)
        // mach was mit strData
    }) else if (strIn.contains("dimmer") {
        strData = transform("JSONPATH","$.dimmer",strIn)
        // mach was anderes mit strData
    } else if(...) {
        ...
        // mach irgendwas ganz verrücktes
    }
end
Den Code kannst Du so ähnlich auch mit JavaScript erstellen. Natürlich muss die Prüfung mit .contains() hinreichend sein, Du musst also ein Unterscheidungskriterium haben, anhand dessen Du klar entscheden kannst, wie im weiteren vorzugehen ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Gerd_B2809
Beiträge: 13
Registriert: 18. Jan 2019 12:51
Answers: 1

Re: JSONPATH in Javaspript zerlegen

Beitrag von Gerd_B2809 »

Danke,

das war der mir fehlende Ansatz, das bringt mich weiter.

Gruß Gerd

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Re: JSONPATH in Javaspript zerlegen

Beitrag von HABuserJM »

Gibt es denn hier im Forum einen Beitrag zum nxpanel? Der englische Thread bei openhab.org ist für mich nämlich leider nicht gut zu verstehen bzw. ich kann meine Probleme englisch schlecht beschreiben..

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

Re: JSONPATH in Javaspript zerlegen

Beitrag von udo1toni »

Nein, ich denke nicht, dass es außer diesem Thread hier etwas dazu gibt. Aber selbst ohne Kenntnis der Hardware ist es meist kein großes Problem, ein Gerät anzubinden, solange es nur grundsätzlich möglich erscheint.

Hab also keine Hemmungen, hier auf deutsch zu fragen, das Schlimmste, was passieren kann, ist, dass niemand eine Antwort auf Deine Fragen kennt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten