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.