OH3 HTTP PUT Request mit JSON Payload senden

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
rene
Beiträge: 5
Registriert: 23. Nov 2021 08:53

OH3 HTTP PUT Request mit JSON Payload senden

Beitrag 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?

Code: Alles auswählen

{
    MODBUS_CMD_SET_HEATER_STEP:0
}

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

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

rene
Beiträge: 5
Registriert: 23. Nov 2021 08:53

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag 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.

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

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

rene
Beiträge: 5
Registriert: 23. Nov 2021 08:53

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag 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?

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

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag von udo1toni »

%2$ sollte dem Command entsprechen (%1$ ist aktuelle Zeit/Datum)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

rene
Beiträge: 5
Registriert: 23. Nov 2021 08:53

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag 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}

Code: Alles auswählen

commandTransformation: MAP:heaterStep.map
und so hat es geklappt. Ist sicher nicht die eleganteste Lösung, aber sie funktioniert.

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

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag von udo1toni »

Du macht da gar keine Transformation, das wird als commandExtension angegeben.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

rene
Beiträge: 5
Registriert: 23. Nov 2021 08:53

Re: OH3 HTTP PUT Request mit JSON Payload senden

Beitrag von rene »

Wenn ich das als commandExtension eingebe wird der String eben in der URL angefügt und nicht im payload.

Antworten