HTTP zum Senden von Item-Werten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Jesco
Beiträge: 9
Registriert: 10. Apr 2021 12:16
Answers: 0

HTTP zum Senden von Item-Werten

Beitrag von Jesco »

Ich möchte Daten aus OpenHAB (Version 4.2) an eine Wallbox schicken.
Die Wallbox bietet eine HTTP-API. (Alternativ auch MQTT oder Modbus, ich vermute aber, dass die HTTP-API am einfachsten einzubinden ist).

Konkret muss dazu z.B. folgender HTTP-Request (als GET oder POST) gesendet werden:

Code: Alles auswählen

http://192.168.xxx.yyy/cnf?cmd=set_ajax_meter&dev_id=M3&import_wh=10000&export_wh=10000&power_w=100
Dabei ist die IP-Adresse der Wallbox einzutragen und natürlich die aktuellen Werte (hier für Zählerstände und aktuelle Leistung).

Ich habe in OpenHAB das HTTP-Binding installiert, da ich vermute, dass dies damit umgesetzt werden kann.

Allerdings bin ich bislang nicht erfolgreich gewesen, daher würde ich mich über Unterstützung freuen:
Ist das HTTP-Binding für diese Aufgabenstellung überhaupt geeignet? Gibt es andere Lösungsmöglichkeiten?
Wie muss die Konfiguration aussehen, um den genannten Request abzusetzen?

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

Re: HTTP zum Senden von Item-Werten

Beitrag von udo1toni »

Tatsächlich wird mqtt mit ziemlicher Sicherheit die einfachste Möglichkeit sein, die Wallbox einzubinden. Modbus ist ein PitA, http ist eher so la la...

Wenn Du mehrere Werte auf einen Schlag schreiben musst, kannst Du das http Binding direkt links liegen lassen (bzw. Du müsstest mindestens einen Umweg über eine Rule gehen, aber dann kannst Du auch gleich aus der Rule heraus senden...)

Das Gleiche wird aber auch für mqtt gelten. Ein Channel überträgt exakt einen Wert (wenn wir beim Color Channel die gesamte Farbe als einen Wert betrachten) und Du musst hier ja drei Werte senden, das sind also drei Channel. Entweder die Wallbox kann die drei Werte separat entgegennehmen (drei Topics, oder zumindest drei unabhängig voneinander gesendete JSON Objekte, die jeweils nur einen Wert enthalten müssen), oder Du musst zwingend über eine Rule gehen.

Als DSL Rule sähe das z.B. so aus:

Code: Alles auswählen

rule "set Wallbox"
when
    Item xyz received command
then
    val Integer iImport = 10000
    val Integer iExport = 10000
    val Integer  iPower =   100
    val String strMyURL = "http://192.168.xxx.yyy/cnf?cmd=set_ajax_meter&dev_id=M3&import_wh=" + 
                 iImport.toString + "&export_wh=" + iExport.toString + "&power_w=" + iPower.toString
    sendHttpGetRequest(strMyURL)
end
Die Rule wird durch ein gesendetes Kommando an das Item xyz getriggert.
Die Rule setzt die drei lokalen Integer Konstanten mit den gewünschten Werten.
Anschließend wird die URL zusammengesetzt und schließlich versendet.
sendHttpGetRequest() ist eine Core Funktion, die läuft auch ohne, dass das http Binding installiert ist.
Wann die Rule ausgelöst wird, kann natürlich auch von anderen Dingen abhängen, z.B. von Eingangsgrößen, die letztlich die Werte iImport, iExport und iPower beeinflussen. Da fehlt aber noch etwas Input von Deiner Seite :)
Die Konstanten können natürlich auch abhängig von Items gesetzt werden, wichtig ist nur, dass das Format passt (hier also Integer) und die Konstanten als Objekte angelegt werden, damit die Methode .toString zur Verfügung steht.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Jesco
Beiträge: 9
Registriert: 10. Apr 2021 12:16
Answers: 0

Re: HTTP zum Senden von Item-Werten

Beitrag von Jesco »

Vielen Dank für die umfangreiche Antwort!

Ich habe es jetzt mit einer Rule probiert, das scheint noch an einer fehlenden Authentifizierung zu scheitern. Gibt es die Möglichkeit dem sendHttpGetRequest-Befehl Authentifizierungsinformationen mitzugeben?

Um alternativ MQTT zu verwenden, wird ein separater MQTT-Server benötigt, korrekt? Für den Raspi bietet sich dann wohl Mosquitto an.
Können die Daten an MQTT auch in einer Rule gesendet werden?

Warum hältst du nicht viel von Modbus?

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

Re: HTTP zum Senden von Item-Werten

Beitrag von udo1toni »

Modbus ist... speziell...
Schau Dir gerne an, wie das konfiguriert wird :) dann wirst Du schnell verstehen, was ich meine.
Grundsätzlich gibt es bei Modbus auch zwei verschiedene Optionen, nämllich "allgemeines" Modbus und gerätespezifisches Modbus. Bei letzterem kann die Konfiguration durchaus komfortabel sein, nur muss exakt Dein Gerät unterstützt werden, z.B. das Modbus Sungrow Binding unterstützt diverse Sungrow Inverter. Die Konfiguration reduziert sich dann auf wenige Eckdaten (IP, User, Passwort...) und Du bekommst eine komplette Anbindung mit diversen Channels, die komplett aufbereitet sind und "einfach funktionieren". Hast Du aber ein Gerät, welches nicht speziell unterstützt wird, musst Du auf die allgemeine Modbus Unterstützung ausweichen, dann musst Du die exakten Adressen kennen, ob es sich um Coils, Input, Holding oder Discrete handelt usw. Und Du musst ebenfalls wissen, in welchem Format Du auf die Werte zugreifen willst/musst. Du musst also im Grunde das anzusteuernde Gerät sehr genau kennen, um überhaupt eine Chance zu haben, die Definition in openHAB korrekt anzugeben.
Modbus ist - auf die allgemeine Variante bezogen - definitiv ein Binding für weit fortgeschrittene Anwender (nicht, dass es nicht auch als Anfänger möglich wäre, das hinzukriegen, aber das Frustrationsrisiko ist sehr hoch).

Mqtt auf der anderen Seite ist ein tolles Protokoll, zum einen, weil es sehr einfach zu implementieren ist (mosquitto installieren, Adresse eintragen, auf Wunsch User/Passwort, muss aber nicht sein, und los), zum anderen weil es trotz M2M-Schnittstelle auch leicht für Menschen les- und verstehbar ist.
Es gibt als Tool z.B. den MQTT Explorer (Microsoft Store, kostenlos, OpenSource) um die gesamte Kommuniktaion einzusehen und gegebenenfalls zu debuggen, in openHABian ist eine Installationsroutine für mosquitto (mit User/Passwort) schon implementiert, openHAB hat eine sehr gute Unterstützung für mqtt (incl. voller Unterstützung von QuantityType/Units of Measurement) und selbstverständlich kannst Du direkt aus Rules heraus auch Topics publishen, die nicht als Channel angelegt sind (wichtig, um dynamische Topics einsetzen zu können). Da mqtt aber keine Core Funktion ist, musst Du hier die mqttActions importieren, um sie nutzen zu können. Das ist aber nur eine Zeile Code, also nix Wildes.

Code: Alles auswählen

         val mqttActions = getActions("mqtt","mqtt:broker:mosquitto")
Nach dieser Zuordnung steht die Action mqttActions.publishMQTT() zur Verfügung, der Du dann das Topic, die Payload, sowie optional Retention mit übergeben kannst, das ist also echt komfortabel. Der Zugriff auf den Broker wird dann über die als Thing konfigurierte Bridge gemacht (im Beispiel heißt die Bridge mqtt:broker:mosquitto)

Bezüglich der fehlenden Authentisierung: Du kannst mit sendHttpGetRequest wahlweise auch einen Header mit übergeben und dort die Authentisierung definieren (falls nicht über die URL authentisiert werden kann), Du musst dazu natürlich wissen, wie der Header aussehen muss.
Und schon sind wir wieder an der Stelle, wo ich darauf hinweise, dass mqtt "einfach einfach" ist. :)
Auch bei mqtt kann man die Kommunikation absichern (sogar mit Zertifikaten und verschlüsselter Kommunikation, User und Passwort ohnehin...), aber es ist eben "einfach einfach", Zugriffsdaten in mosquitto und den Clients eintragen, fertig.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Jesco
Beiträge: 9
Registriert: 10. Apr 2021 12:16
Answers: 0

Re: HTTP zum Senden von Item-Werten

Beitrag von Jesco »

Danke für die ausführlichen Erläuterungen, v.a. auch zu Modbus und MQTT.

Ich war jetzt mit HTTP mit folgender Rule erfolgreich:

Code: Alles auswählen

rule "Wallbox"
when
    Time cron "0/20 * * * * ?"      // alle 20 Sekunden
then
  val String baseUrl = "192.168.xxx.xxx"
  val String deviceId = "M3"
  val String authId = "username:password"

  val Integer iEnergyImport = 10000
  val Integer iEnergyExport = 10000
  val Integer iPower = 100
  val String authStr = authId + "@"
  val String strMyUrl = "http://" + authStr + baseUrl + "/cnf?cmd=set_ajax_meter&dev_id=" + deviceId + "&import_wh=" + iEnergyImport.toString + "&export_wh=" + iEnergyExport.toString + "&power_w=" + iPower.toString

  sendHttpGetRequest(strMyUrl)
end
Aber dabei werden Nutzername und Passwort unverschlüsselt übertragen. Ich werde mich daher wie vorgeschlagen mit MQTT beschäftigen und versuchen darauf umzustellen.

Antworten