HomeWizard per JSON auslesen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

oh73
Beiträge: 302
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: HomeWizard per JSON auslesen

Beitrag von oh73 »

wo läuft bei dir openhab ?
da gibt es ein Conf - Verzeichnis , bei Ubuntu ist das /etc/openhab/
und da sind Unterverzeichnise, item, rules, things, usw.
die Rule da in das rules Verzeichnis abgelegt mit der Endung .rules
openhab erkennt das dann!

den Wert kann man dann auch mit

item_name.postUpdate(Wert)
in ein Item schreiben.

Edit:
es geht auch über die GUI, aber nicht direkt als Script.
hab mal versucht was geht ist bei Rules neue rule erstellen, dann bei when Auslöser auswählen, danach bei then das script einfügen, aber nur den Teil der bei meinem Beispiel zwischen then und end steht !
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: HomeWizard per JSON auslesen

Beitrag von udo1toni »

Grundsätzlich wäre $.response.switches[1].tte schon passend ($.response.switches.1.tte hingegen nicht).

"Korrekt" im Sinne von "so wird ein Schuh draus" ist hingegen, dafür ein Thing anzulegen.
Ich kenne die zugehörige URL nicht, aber nehmen wir mal an, das Ding ist über http://homewizard/ erreichbar, und das json kommt über jsondata rein, also als Adresse komplett http://homewizard/jsondata, woraufhin das JSON Objekt ausgeliefert wird. Dann sieht das Thing (in einer Textdatei, mit Channel für die Temperatur) so aus:

Code: Alles auswählen

Thing http:url:homewiz "homeWizard" [ 
    baseURL="http://homewizard/jsondata",
    refresh=60
    ] {
    Channels: 
        Type number : temp "Temperatur Arbeitszimmer" [stateTransformation="JSONPATH:$.response.switches[?(@.name=='Arbeitszimmer')].tte", unit="°C" ]
}
Unter baseURL wird also die komplette URL angegeben. Falls es unterschiedliche Zweige gibt, könnte man hier auch nur einen Teil der URL angeben und dann bei jedem Channel den Rest der URL mit angeben, aber ich möächte versuchen, es einfach zu halten.
refresh=60 bedeutet, dass die URL einmal pro Minute aufgerufen wird.
Jetzt der Channel: Der Typ ist number, die ID heißt temp, als stateTransformation wird JSONPATH ausgeführt (das Binding muss dazu installiert sein). unit="°C" sorgt dafür, dass der Zahlenwert direkt mit der Einheit versehen wird. Der Channel kann dann direkt mit einem Number:Temperature Item verlinkt werden (channel="http:url:homewiz:temp").

Nun kommt die große Spezialität, der angegeben Path:
$.response.switches ist klar, [] beschreibt den nächsten Knoten, ? wählt einen (oder mehrere) Knoten nach bestimmten Kriterien aus. Die Kriterien stehen in den Klammern (). Dabei ist @ der gewählte Knoten. .name ist der gleichnamige Parameter, der gleich == dem String '' Arbeitszimmer sein muss. Innerhalb dieses Knotens soll der Wert von tte ausgelesen werden. Einfache Anführungszeichen müssen hier verwendet werden, weil der Path selbst in doppelten Anführungszeichen steht.

Der Punkt dieser Schreibweise : Niemand garantiert Dir, dass alle Knoten des JSON Objekts immer in der identischen Reihenfolge ausgegeben werden.
Da wir den Knoten aber anhand eines eindeutigen Merkmals auswählen, ist edas nun egal und es wird immer der richtige Knoten ausgewählt.

JSONPATH ist eine sehr elegante Methode, auf solche Daten zuzugreifen, man muss sich aber ein wenig damit beschäftigen, um erfolgreich zum Ziel zu kommen.

Du brauchst zum Auslesen des Werts keine Rule.
Natürlich könnte man das gleiche auch über eine Rule erreichen, aber wozu? Die Schnittstelle von openHAB zu extrenen Datendiensten ist hier universell genug.

Wenn Du weitere Werte verwenden willst, legst Du einfach weitere Channel mit den passenden Paths an. Erlaubt das Gerät auch, Werte zu schreiben, so müssen baseURL und stateExtension sowie commandExtension entsprechend angepasst werden (am einfachsten, wenn konkrete Beispiele der realen URL vorliegen).

Tipp am Rande: das JSON Objekt kann man recht einfach entweder über einen Online JSON Validator aufhübschen (angegebener Link nur als Beispiel), oder man verwendet ein entsprechendes Plugin, z.B. für Notepad++ oder VS Code (den ich ohnehin dringend für die Arbeit mit openHAB empfehlen möchte).
Sieht dann nach drei Klicks so aus:

Code: Alles auswählen

{
    "status": "ok",
    "version": "3.403",
    "request": {
        "route": "/get-sensors"
    },
    "response": {
        "preset": 0,
        "time": "2023-01-10 10:23",
        "switches": [
            {
                "id": 0,
                "name": "Ein",
                "type": "switch",
                "status": "off",
                "favorite": "no"
            },
            {
                "id": 1,
                "name": "Arbeitszimmer",
                "type": "radiator",
                "tte": 20.0,
                "favorite": "no"
            }
        ],
        "uvmeters": [],
        "windmeters": [],
        "rainmeters": [],
        "thermometers": [],
        "weatherdisplays": [],
        "energymeters": [],
        "energylinks": [],
        "heatlinks": [],
        "hues": [],
        "scenes": [],
        "kakusensors": [
            {
                "id": 0,
                "name": "Tor rechts",
                "status": null,
                "type": "contact",
                "favorite": "no",
                "timestamp": "00:00",
                "cameraid": null
            },
            {
                "id": 1,
                "name": "Tor links",
                "status": null,
                "type": "contact",
                "favorite": "no",
                "timestamp": "00:00",
                "cameraid": null
            }
        ],
        "cameras": []
    }
}
und man benötigt kein Bild dafür. VS Code hat auch Plugins, die bei Auswahl eines konkreten Wertes innerhalb des JSON Objekts unten in der Statusleiste den vollständigen Path anzeigen und auf Wunsch in die Zwischenablage kopieren. Dort wird natürlich kein Filter verwendet, da steht dann also [1] als Teil des Ausdrucks, aber damit ist halt schon der Großteil des Pfads ermittelt und der Suchstring ist schnell selbst zusammengestellt, wenn man weiß, wie.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Mclupo
Beiträge: 178
Registriert: 6. Jun 2020 20:55
Answers: 2
Wohnort: Kirchheim Teck

Re: HomeWizard per JSON auslesen

Beitrag von Mclupo »

Danke Udo für die ausführliche Erklärung. Für die faulen ,wie mich , war es mal wieder eine Anregung alles genauer unter GitHub „jsonpath“ nachzulesen.
OH 3.4.2 auf Raspi 4 mit Aeotec z-wave Stick gen 5+ und zigbee conbee II

loewes
Beiträge: 31
Registriert: 10. Jan 2023 09:52
Answers: 2

Re: HomeWizard per JSON auslesen

Beitrag von loewes »

Wow, vielen Dank, das hilft zum Verständnis! Ich brauch vermutlich noch ein bisschen, um das umzusetzen, aber schon mal Danke! Ich melde mich wieder, ob das so geklappt hat...

loewes
Beiträge: 31
Registriert: 10. Jan 2023 09:52
Answers: 2

Re: HomeWizard per JSON auslesen

Beitrag von loewes »

Juhu! Das läuft so! Perfekt, danke!
Noch eine Frage: wenn ich einen Status (on/off) statt einer Zahl auslesen will, verwende ich string?

loewes
Beiträge: 31
Registriert: 10. Jan 2023 09:52
Answers: 2

Re: HomeWizard per JSON auslesen

Beitrag von loewes »

Update: das hier funktioniert jedenfalls nicht:
Type string : switch1 "Steckdose 1" [stateTransformation="JSONPATH:$.response.switches[?(@.name=='Ein')].status" ]
Dann erhalte ich nur "NULL" zurück...

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

Re: HomeWizard per JSON auslesen

Beitrag von Harka »

hast Du es mal mit Type switch versucht?

loewes
Beiträge: 31
Registriert: 10. Jan 2023 09:52
Answers: 2

Re: HomeWizard per JSON auslesen

Beitrag von loewes »

Hallo, jetzt hab ich mehrere vergebliche Versuche mit dem Typ switch unternommen, da konnte ich aber nicht den on/off State definieren... Danach hab ich das Ganze wieder auf den Typ string zurückgeändert.... und jetzt liest er on und off aus. Was jetzt anders war weiß ich nicht. Vielen Dank nochmal für Eure Hilfen, ich habe sicher noch mehr Fragen zu anderen Punkten... :)

P.S.: ich würde das Thema gern als gelöst markieren, aber ich finde die Option nicht...

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

Re: HomeWizard per JSON auslesen

Beitrag von udo1toni »

Wenn Du über Text Dateien konfigurierst, musst Du immer bedenken, dass openHAB die Things nur dann korrekt einliest (oder besser nur die Änderungen), wenn die Channel ID sich geändert hat (womit es dann als "neuer" Channel betrachtet wird), oder alternativ das Binding komplett neu gestartet wird (über openHAB Neustart oder in der Karaf Konsole bundle:restart binding-id)

Es gibt keine Möglichkeit, ein Thema als "gelöst" zu markieren, Du kannst höchstens eine Antwort als "beste" Antwort markieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten