mr.b4 hat geschrieben: ↑5. Sep 2022 22:36
Ein "Umweg" über MQTT (auch möglich) scheint mir nicht sinnvoll, da ich ausser OH keinen entsprechenden "Partner" für das Gerät hätte.
Da herrscht ein Missverständnis.
MQTT ist einfach ein Kommunikationsprotokoll, genau wie http(s). MQTT ist dabei sehr einfach konfigurierbar und hat einen entscheidenden Vorteil: die Kommunikation läuft immer über Push. Natürlich kann ein Push auch angefordert werden. Bei http(s) muss openHAB aber gewöhnlich in regelmäßigen Abständen einen Pull auslösen, egal ob sich nun etwas geändert hat oder nicht, werden also Daten transportiert.
MQTT hat auch einen eingebauten Mechanismus, um zu prüfen, ob der Client erreichbar ist. Bei http(s) läuft es darauf hinaus, dass die Anfrage an den Client irgendwann in ein Timeout läuft. MQTT ist also schlicht das bessere Protokoll für M2M (Machine to Machine) Kommunikation.
Es ist auch nicht weiter schwer in Betrieb zu nehmen - Du benötigst lediglich den Broker (das ist gewöhnlich mosquitto, kann bei einer openHABian Installation einfach über openhabian-config installiert werden) und musst dann halt in openHAB eine mqtt Bridge einrichten (der Zugriff auf den Broker), im anderen mqtt Client (der Wallbox) die Zugangsdaten hinterlegen und zum Abschluiss noch ein generic mqtt Thing für die Wallbox in openHAB anlegen.
Wie gesagt, wenn man mal davon ausgeht, dass der Broker und die Bridge eingerichtet sind (also gleiche Voraussetzungen wie bei http, wo auch ein http Server vorausgesetzt ist), reduziert sich die Einrichtung dann auf das Hinterlegen der korrekten Topics und die Einrichtung von JONPATH zum zerlegen der Nachrichten.
Letzteren Schritt musst Du bei http ebenfalls machen.
Nun zu Deinem eigentlichen Problem, dem JSON:
Es bietet sich an (weil es hier ja um Read Only geht), das JSON Objekt in einem String Channel zu speichern. Auf diese Weise benötigst Du nur einen Channel (ob nun http oder mqtt spielt keine Rolle). Zu diesem Channel legst Du mehrere Links zu verschiedenen Items an. Dabei dürfen diese Items auch einen anderen Typ als String haben, z.B. Number.
Innerhalb des Links kannst Du nun (ein installiertes JSONPATH mal vorausgesetzt) eine JSONPATH angeben.
Um das Ganze etwas besser zu verstehen hier mal eine benutzerfreundliche Formatierung des JSON Objekts:
Code: Alles auswählen
{
"wbec": {
"version": "v0.4.5",
"bldDate": "Aug 18 2022 08:59:35",
"timeNow": "22:13:47"
},
"box": [
{
"busId": 1,
"version": "108",
"chgStat": 2,
"currL1": 0,
"currL2": 0,
"currL3": 0,
"pcbTemp": 307,
"voltL1": 243,
"voltL2": 244,
"voltL3": 242,
"extLock": 1,
"power": 0,
"energyP": 0,
"energyI": 7.924,
"energyC": 0,
"currMax": 16,
"currMin": 6,
"logStr": "00.779.2909/01 2116 005718",
"wdTmOut": 60000,
"standby": 4,
"remLock": 1,
"currLim": 75,
"currFs": 0,
"lmReq": 0,
"lmLim": 255,
"resCode": "0"
}
],
"modbus": {
"state": {
"lastTm": 945043,
"millis": 949851
}
},
"rfid": {
"enabled": false,
"release": false,
"lastId": ""
},
"pv": {
"mode": 0,
"watt": 0
},
"wifi": {
"mac": "8C:AA:B5:7B:3F:6D",
"rssi": -74,
"signal": 52,
"channel": 13
}
}
Der Ursprung des Baums wird in openHAB als $ dargestellt, die Trennung der Ebenen erfolgt bei JSONPATH über einen Punkt, die Namen der Knoten werden ausgeschrieben, Unbenannte Datensätze können Null-basiert gezählt werden und werden dann in eckigen Klammern geschrieben.
Deshalb ergibt sich für currLim folgender Ausdruck:
$.box[0].currLim also im Knoten
box der 1. (
0) Datensatz, dort der Parameter
currLim. Ergebnis ist dann
75 für obiges JSON Objekt.
Es gibt mit Visual Studio Code (bitte nicht mit Visual Studio verwechseln) einen tollen Editor, der mit zehntausenden Plugins erweitert werden kann. Unter anderem JSONPATH Status Bar ist ein Plugin, welches in der Statuszeile des Editors direkt anzeigt, wie der JSONPATH zum Element lautet, auf welchem gerade der Cursor steht.
Es gibt natürlich noch mächtige Tools, um z.B. aus einer Menge Datensätze denjenigen auszuwählen, bei dem ein bestimmter Parameter innerhalb des Datensatzes einen bestimmten Wert hat, z.B. die busId. Wenn Du mehrere Wallboxen dieses Typs hättest, würdest Du nur mit einer Box kommunizieren und alle Daten aller Boxen erhalten, jede in einem eigenen Datensatz. Dabei gibt es keine festgelegte Reihenfolge der Datensätze, die kann auch von Message zu Message wechseln. Hier ist es aber einfach, weil Du ja nur eine Wallbox hast.
Einen Zeitstempel von modbus bekommst Du z.B. über
$.modbus.state.lastTm, dort gibt es keine unterschiedlichen Datensätze, also auch keine eckigen Klammern.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet