HomeWizard per JSON auslesen
-
- Beiträge: 302
- Registriert: 7. Mär 2021 14:49
Re: HomeWizard per JSON auslesen
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 !
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
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: HomeWizard per JSON auslesen
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:
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: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.
"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" ]
}
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": []
}
}
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 178
- Registriert: 6. Jun 2020 20:55
- Wohnort: Kirchheim Teck
Re: HomeWizard per JSON auslesen
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
-
- Beiträge: 31
- Registriert: 10. Jan 2023 09:52
Re: HomeWizard per JSON auslesen
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...
-
- Beiträge: 31
- Registriert: 10. Jan 2023 09:52
Re: HomeWizard per JSON auslesen
Juhu! Das läuft so! Perfekt, danke!
Noch eine Frage: wenn ich einen Status (on/off) statt einer Zahl auslesen will, verwende ich string?
Noch eine Frage: wenn ich einen Status (on/off) statt einer Zahl auslesen will, verwende ich string?
-
- Beiträge: 31
- Registriert: 10. Jan 2023 09:52
Re: HomeWizard per JSON auslesen
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...
Type string : switch1 "Steckdose 1" [stateTransformation="JSONPATH:$.response.switches[?(@.name=='Ein')].status" ]
Dann erhalte ich nur "NULL" zurück...
-
- Beiträge: 489
- Registriert: 30. Apr 2021 13:13
Re: HomeWizard per JSON auslesen
hast Du es mal mit Type switch versucht?
-
- Beiträge: 31
- Registriert: 10. Jan 2023 09:52
Re: HomeWizard per JSON auslesen
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...

P.S.: ich würde das Thema gern als gelöst markieren, aber ich finde die Option nicht...
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: HomeWizard per JSON auslesen
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.
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