Seite 1 von 1
OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 23. Nov 2021 18:18
von rene
Hallo openHAB fans !
Ich versuche einen JSON Wert via HTTP PUT zu senden, um ein Gerät zu steuern.
Dazu wählte ich ein HTTP URL Thing und habe dann einen channel damit verbunden. Das lesen des Wertes funktioniert schon. Um den Wert zu ändern, muss man ein JSON mit PUT senden. Wie macht man das?
Hier meine Konfiguration:
Code: Alles auswählen
UID: http:url:askoheat
label: HTTP askoheat
thingTypeUID: http:url
configuration:
ignoreSSLErrors: false
baseURL: http://192.168.178.113/
delay: 0
stateMethod: GET
refresh: 10
commandMethod: PUT
contentType: application/json
timeout: 3000
bufferSize: 2048
channels:
- id: HeaterStep
channelTypeUID: http:number
label: Heater Step
description: ""
configuration:
stateExtension: getcmd.json
stateTransformation: JSONPATH:$.MODBUS_CMD_SET_HEATER_STEP
commandExtension: /
Das folgende JSON muss als Payload im PUT Request gesendet werden. Anstatt der Zahl 0 möchte ich einen Wert mitliefern der im Stepper gesetzt wird. Reicht es hier eine commandTransformation hinzuzufügen?
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 25. Nov 2021 23:23
von udo1toni
Du musst halt das json als String zusammensetzen. Als Beispiel kanst Du Dich an der Doku orientieren:
https://www.openhab.org/addons/bindings ... formatting
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 26. Nov 2021 09:43
von rene
Vielen Dank für die Antwort. Das löst leider mein Problem noch nicht. In der Doku steht wie man eine URL formatiert, ich möchte aber das JSON als Payload senden, nicht in der URL.
Mir sind 2 Sachen noch nicht klar.
- Wie muss der commandTransformation aussehen, damit der HTTP Request mit einem Payload gesendet wird (also nicht als URL Parameter)?
- Wie kann ich den Wert vom Stepper in den JSON-String vom Payload einfügen (evtl. mit %1$ )?
Gibt es dafür eine spezielle Transformation?
Ich habe übrigens auch schon mit einem JS probiert. Dazu habe ich im transformations-Verzeichnis eine .js Datei abgelegt und darin dann versucht mit sendHttpPutRequest(...) die Request zu senden. Aber das hat nicht geklappt. Die Funktion steht da nicht zur Verfügung.
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 28. Nov 2021 15:15
von udo1toni
Es gibt kein Text2JSON. Du musst einfach den String zusammen bauen. Im Beispiel ist das halt in der URL eingebaut, aber so viel Transferleistung sollte man erwarten können dass Du den erzeugten String auch direkt als Payload senden kannst.
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 29. Nov 2021 14:21
von rene
Leider hilft mir diese Aussage nicht weiter. Ich hätte eigentlich erwartet, dass es so funktionieren müsste:
commandTransformation: "{MODBUS_CMD_SET_HEATER_STEP:%1$s}"
leider liege ich da falsch.
Kann mir jemand sagen was ich falsch mache?
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 30. Nov 2021 12:13
von udo1toni
%2$ sollte dem Command entsprechen (%1$ ist aktuelle Zeit/Datum)
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 3. Dez 2021 12:08
von rene
Danke für den Hinweis. Ich habe noch nicht verstanden, wie man dies dann in die Payload verpackt. Oder anders gesagt, welchen Transformation-Service man hier verwenden muss.
Wenn ich es so schreibe:
commandTransformation: "{MODBUS_CMD_SET_HEATER_STEP:%2$}"
erhalte ich diesen Fehler: Transformation service {MODBUS_CMD_SET_HEATER_STEP for pattern %2$} not found!
Als Versuch habe ich dann einfach mal eine Map erstellt und mit name heaterStep.map abgelegt.
Code: Alles auswählen
1={MODBUS_CMD_SET_HEATER_STEP:1}
2={MODBUS_CMD_SET_HEATER_STEP:2}
3={MODBUS_CMD_SET_HEATER_STEP:3}
4={MODBUS_CMD_SET_HEATER_STEP:4}
5={MODBUS_CMD_SET_HEATER_STEP:5}
6={MODBUS_CMD_SET_HEATER_STEP:6}
7={MODBUS_CMD_SET_HEATER_STEP:7}
und so hat es geklappt. Ist sicher nicht die eleganteste Lösung, aber sie funktioniert.
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 3. Dez 2021 17:10
von udo1toni
Du macht da gar keine Transformation, das wird als commandExtension angegeben.
Re: OH3 HTTP PUT Request mit JSON Payload senden
Verfasst: 4. Dez 2021 13:23
von rene
Wenn ich das als commandExtension eingebe wird der String eben in der URL angefügt und nicht im payload.