Seite 1 von 1

JSONPATH in Javaspript zerlegen

Verfasst: 5. Apr 2022 16:35
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

Re: JSONPATH in Javaspript zerlegen

Verfasst: 5. Apr 2022 17:21
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.

Re: JSONPATH in Javaspript zerlegen

Verfasst: 12. Apr 2022 16:07
von Gerd_B2809
Danke,

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

Gruß Gerd

Re: JSONPATH in Javaspript zerlegen

Verfasst: 6. Jun 2022 17:25
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..

Re: JSONPATH in Javaspript zerlegen

Verfasst: 7. Jun 2022 00:16
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.