Seite 1 von 1

HTTP Binding (einfach erklärt?)

Verfasst: 12. Sep 2022 10:50
von Oekel
Hi,

ich habe derzeit irrsinnig große Probleme das HTTP-Binding von OH3 zu verstehen.
https://www.openhab.org/addons/bindings/http/

Dabei sind die persönlichen Anforderungen wirklich minimal.
- Kein https
- Kein OAth
- Keine Query-Parmeter

Ich möchte einfach nur einige "Switsche", die das gleiche erledigen wie der folgende Direktaufruf im Browser:
Relay 1 AUS:
http://192.168.11.200/30000/00
Relay 1 AN:
http://192.168.11.200/30000/01
Relay 2 AUS:
http://192.168.11.200/30000/02
Relay 2 AN:
http://192.168.11.200/30000/03
....

Binding installieren und Instanz anlegen ist ja klar, aber jetzt muss ich doch einen Channel anlegen, der genau das obige tut, richtig?
channels:
- id: switch
channelTypeUID: http:switch
label: Powerswitch
description: ""
configuration:
onValue: "1"
offValue: "0"
stateExtension: getstate.json
stateTransformation: JSONPATH:$.on∩MAP:true1false0.map
commandExtension: "%2$s"
Folgendes habe ich mal aus einem anderen Beitrag geklaut (für den ersten Eindruck)
Doch für was stehen "stateExtension" und "stateTransformation" hier genau und wie sehen typische Beispiele aus?
Ich habe ja weder ein JSON noch Parameter für hinein. Mein Server nimmt die URL Parameter entgegen und gut ist :(

Hier noch schnell das Modul NC1601: https://de.aliexpress.com/item/1005003219107674.html

Re: HTTP Binding (einfach erklärt?)

Verfasst: 12. Sep 2022 21:30
von udo1toni
Du musst erst mal das Thing anlegen. Und im Thing musst Du mindestens die BaseURL setzen.
Ich bin mir nicht zu 100% sicher, ob meine Konfiguraiton korrekt ist, das müsste man halt mal ausprobieren:

Code: Alles auswählen

UID: http:url:nc1601_1
label: NC1601 Modul
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.11.200/30000/
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  contentType: text/plain
  timeout: 3000
  bufferSize: 2048
channels:
  - id: ch1
    channelTypeUID: http:switch
    label: Kanal 1
    description: ""
    configuration:
      onValue: "01"
      mode: WRITEONLY
      offValue: "00"
      commandExtension: "%2$s"
  - id: ch2
    channelTypeUID: http:switch
    label: Kanal 2
    description: ""
    configuration:
      onValue: "03"
      mode: WRITEONLY
      offValue: "02"
      commandExtension: "%2$s"
Da das Modul nicht abgefragt werden kann, welche Relais angezogen sind (zumindest ist dies bei Aliexpress nicht vermerkt), musst Du die Channel Writeonly betreiben. Entsprechend gibt es auch keine stateExtension.

Zur Erklärung:

Die Base URL wird immer gesendet, egal welcher Channel angesprochen wir, egal ob der Status erfragt und ein Befehl abgesetzt wird.
Sie wird ergänzt durch den String in commandExtension bzw. stateExtension, wobei %1 den aktuellen Zeitstempel enthält und %2 den zu sendenden Befehl. $s ist die Formatierung als String. In der Theorie wird der ON Befehl für Channel 1 also umgesetzt über (baseURL+commandExtension) in die URL http://192.168.11.200/30000/01 und OFF in http://192.168.11.200/30000/00, weil %2$s für on mit 01 und für off mit 00 ersetzt wird.

Re: HTTP Binding (einfach erklärt?)

Verfasst: 18. Sep 2022 17:36
von Oekel
udo1toni hat geschrieben: 12. Sep 2022 21:30 Zur Erklärung:

Die Base URL wird immer gesendet, egal welcher Channel angesprochen wir, egal ob der Status erfragt und ein Befehl abgesetzt wird.
Sie wird ergänzt durch den String in commandExtension bzw. stateExtension, wobei %1 den aktuellen Zeitstempel enthält und %2 den zu sendenden Befehl. $s ist die Formatierung als String. In der Theorie wird der ON Befehl für Channel 1 also umgesetzt über (baseURL+commandExtension) in die URL http://192.168.11.200/30000/01 und OFF in http://192.168.11.200/30000/00, weil %2$s für on mit 01 und für off mit 00 ersetzt wird.
Danke, werde es die Tage mal testen. (Hardware liegt an anderem Ort als mein HAB-Server; beide aber im gleichen VLAN, weshalb die Erreichbarkeit sichergestellt ist)

Was ich von deiner Erklärung zwar verstanden habe, aber in der Doku nicht finden konnte ist das Mapping von
%1
%2

-->https://www.openhab.org/addons/bindings ... formatting
Es gibt scheinbar kein %3 usw? Was hätte es dann mit dem JSON auf sich, wenn mal doch mal komplexere Anfragen hat? (vermutlich nur vernünftiger API)

Re: HTTP Binding (einfach erklärt?)

Verfasst: 18. Sep 2022 19:22
von oh73
vielleicht hilft es,
hier mal meine Schalter die mit Http Binding eingebunden sind,

meine Befehle sind aber was länger als nur "0" und "1",

hab aber nur für das Commando %2 drin!

Code: Alles auswählen

UID: http:url:0de4fe720f
label: Aio Gateway http
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: true
  baseURL: http://192.168.178.23/command?
  delay: 0
  stateMethod: GET
  refresh: 60
  commandMethod: GET
  timeout: "3000"
  bufferSize: "2048"
channels:
  - id: http_Rev_1
    channelTypeUID: http:switch
    label: Rev 1 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=Send2&type=CODE&code=190800810005001903004400e300d9004e0044090100010101000100010101000100010000000000000101000002
      escapedUrl: false
      offValue: XC_FNC=Send2&type=CODE&code=190800810005001903004400e300d600510044090100010101000100010101000100010000000000000000010102
      commandExtension: "%2$s"
  - id: http_Rev_2
    channelTypeUID: http:switch
    label: Rev 2 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=Send2&type=CODE&code=190800810005001903004400e300d9004e004408ff00010101000100010001010100010000000000000101000002
      escapedUrl: false
      offValue: XC_FNC=Send2&type=CODE&code=190800810005001903004400e300d9004e0044090100010101000100010001010100010000000000000000010102
      commandExtension: "%2$s"
  - id: http_Rev_3
    channelTypeUID: http:switch
    label: Rev 3 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=Send2&type=CODE&code=190800810005001903004500e300da004e004508fe00010101000100010001000101010000000000000101000002
      escapedUrl: false
      offValue: XC_FNC=Send2&type=CODE&code=190800810005001903004300e400da004e0043090200010101000100010001000101010000000000000000010102
      commandExtension: "%2$s"
  - id: http_FS20_1
    channelTypeUID: http:switch
    label: FS20 1 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=FS20&data=e79f001000
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=FS20&data=e79f000000
      commandExtension: "%2$s"
  - id: http_FS20_3
    channelTypeUID: http:switch
    label: FS20 3 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=FS20&data=e79f021000
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=FS20&data=e79f020000
      commandExtension: "%2$s"
  - id: http_FS20_4
    channelTypeUID: http:switch
    label: FS20 4 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=FS20&data=e79f031000
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=FS20&data=e79f030000
      commandExtension: "%2$s"
  - id: http_IT_ST_2
    channelTypeUID: http:switch
    label: IT Steckdose 2 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=IT&data=01E
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=IT&data=016
      commandExtension: "%2$s"
  - id: http_IT_ST_3
    channelTypeUID: http:switch
    label: IT Steckdose 3 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=IT&data=02E
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=IT&data=026
      commandExtension: "%2$s"
  - id: http_IT_Sch_3
    channelTypeUID: http:switch
    label: IT Schalter 3 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=IT&data=E2E
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=IT&data=E26
      commandExtension: "%2$s"
  - id: http_IT_Sch_4
    channelTypeUID: http:switch
    label: IT Schalter 4 http
    description: null
    configuration:
      mode: WRITEONLY
      onValue: XC_FNC=SendSC&type=IT&data=30E
      escapedUrl: false
      offValue: XC_FNC=SendSC&type=IT&data=306
      commandExtension: "%2$s"
  - id: http_IT_Ro_1
    channelTypeUID: http:rollershutter
    label: IT Rolladen 1 http
    description: null
    configuration:
      mode: WRITEONLY
      escapedUrl: false
      commandExtension: "%2$s"
      downValue: XC_FNC=SendSC&type=IT&data=F06
      stopValue: XC_FNC=SendSC&type=IT&data=F06
      upValue: XC_FNC=SendSC&type=IT&data=F0E
  - id: http_IT_Ro_2
    channelTypeUID: http:rollershutter
    label: IT Rolladen 2 http
    description: null
    configuration:
      mode: WRITEONLY
      escapedUrl: false
      commandExtension: "%2$s"
      downValue: XC_FNC=SendSC&type=IT&data=F16
      stopValue: XC_FNC=SendSC&type=IT&data=F16
      upValue: XC_FNC=SendSC&type=IT&data=F1E
sind alles Schalter ohne Status Rückmeldung!
muss man schon mal 2 x schalten damit der Status stimmt.
ansonsten funktioniert das aber.

Re: HTTP Binding (einfach erklärt?)

Verfasst: 19. Sep 2022 05:36
von udo1toni
Oekel hat geschrieben: 18. Sep 2022 17:36 Was ich von deiner Erklärung zwar verstanden habe, aber in der Doku nicht finden konnte ist das Mapping von
%1
%2
Wie meinst Du das? Du hast ja schon den Link zu der richtigen Stelle in der Doku angegeben.
The URL is used as format string and two parameters are added:

the current date (referenced as %1$)
the transformed command (referenced as %2$)

After the parameter reference the format needs to be appended. See the link above for more information about the available format parameters (e.g. to use the string representation, you need to append s
In der Doku ist lediglich das $ als Bestandteil der Variablen angegeben, was aber ungenau ist.
Das $ ist Teil der Formatierung. In der Folge ist dann ja nur von dem s die Rede, welches halt genauso auch Teil des Textes sein könnte.

Es gibt genau die zwei Parameter %1 und %2 , denn was sollte denn ein dritter Parameter enthalten? Es gibt ja nur diese beiden Werte als sinnvolle Datenquelle.
Wenn der Status als JSON geliefert wird, kannst Du JSONPATH verwenden, um einen einzelnen Wert auf dem JSON Objekt herauszufischen. Umgekehrt könnte man auch ein gültiges JSON Objekt als Bestandteil des Befehls übergeben, wobei das schnell aufwändig und fehleranfällig werden kann - aber man ist letztlich von der anzusteuernden Hardware abhängig und hat meist keine wirkliche Wahl...