http post von OH2 auf OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

http post von OH2 auf OH3

Beitrag von Quautiputzli »

Hallo,
ich nutze derzeit OH2 und will umsteigen auf OH3. Aktuell steuere ich ein paar Rolläden über einen raspberry der mit http angesprochen wird. Das ist aktuell nur in der home.items definiert, und sieht so aus:

Code: Alles auswählen

Rollershutter   GF_Office_Shutter 	  "Rollo Büro"       <rollershutter>      (GF_Office, gShutter)   ["Rollershutter"]         {ga="Blinds", http=">[UP:POST:http://192.168.2.200/addapp/gpio_t.php?g=B&n=21&z=0.5] >[DOWN:POST:http://192.168.2.200/addapp/gpio_t.php?g=B&n=20&z=0.5] >[STOP:POST:http://192.168.2.200/addapp/gpio_t.php?g=B&n=21&z=0.1]"}

Dazu gibt es dann noch eine sitemap. Je nachdem ob UP, DOWN oder STOP gedrückt wird, wird eben ein bestimmter http POST geschickt. Das funktioniert so wunderbar. Ein thing habe ich nicht angelegt.

Nun möchte ich das in OH3 ummüntzen. Ich hab schon gesehen, dass ich dort ein thing und channels brauche. Ich würde das dann auch über die MainUI machen wollen. Nur leider weiß ich nicht, wo und was in welche Zeile muss bei den channels. Ich hab etwas rumprobiert, bekam es aber nicht zum laufen.

Ich hoffe Ihr könnt mir helfen.
Danke und Servus
Servus

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

Re: http post von OH2 auf OH3

Beitrag von udo1toni »

Moin,

das alte http Binding verwendet die OH1 Konfiguration, das neue http Binding verwendet die OH2/3 Konfiguration. Hauptunterschied für den Anwender: Im ersten Fall gibt es (eventuell) eine Teilkonfiguration in einer <bindingname>.cfg im Verzeichnis services/, itemspezifische Konfigurationen stehen direkt in der Itemdefinition. Im zweiten Fall wird der Teil der Konfiguration, die in der *.cfg stand in einem Thing eingetragen, welches als Bridge dient. Die itemspezifische Konfiguration liegt in Channels, welche dann mit dem Item verlinkt werden.

Ich setze voraus, dass http bereits installiert ist (ansonsten musst Du das spätestens während dem Anlegen des Things bei der Auswahl des Bindings nachholen (da gibt es extra einen Link zum installieren zusätzlicher Bindings)

Schritt für Schritt:

Zunächst musst Du ein http URL Thing anlegen,
Main UI -> Administration -> Einstellungen -> Things -> rechts unten weißes Plus auf blauem Grund -> http Binding -> http URL Thing

Hier trägst Du unter Unique ID einen kurzen Namen ein, da es sich um eine Verbindung zum Raspberry handelt, z.B. raspi. Erlaubt sind hier Buchstaben des englischen Alphabets und Ziffern sowie der Unterstrich. Nimm einen kurzen Namen!
Unter Label kannst Du ein beliebiges Label eintragen, z.B. HTTP für Rollläden. Zu lang sollte auch das nicht sein, schließlich wird das Label in Listen angezeigt, die nur eine bestimmte Breite haben. Das Label wird als Sortierkriterium genutzt, das heißt, Du findest das angegebene Thing dann in meinem Beispiel unter H.
In Base URL kommt nun die URL rein, welche angesprochen wird, in Deinem Fall http://192.168.2.200/addapp/gpio_t.php
Du musst außerdem noch den Haken bei Show advanced setzen, damit Du auf POST umschalten kannst.
Der Content type ist vermutlich text/plain, da bin ich mir aber nicht sicher. :)

Nun klickst Du unten auf Create Thing.
Du landest umgehend in der Liste der angelegten Things und wählst aus dieser Liste das soeben angelegte Thing aus, dann schaltest Du oben in der Mitte auf die Channelansicht um und wählst Add Channel aus. Als Identifier schreibst Du z.B. shutter1 und als Label
z.B. Rollo Büro (es gelten die gleichen Regeln wie für das Thing)

Wieder den Haken bei Show advanced setzen.

Bei Command URL Extension trägst Du den fixen Anteil ein, also ?g=B&n=

Bei UP schreibst Du 21&z=0.5 rein, bei DOWN schreibst Du 20&z=0.5 rein, bei STOP schreibst Du 21&z=0.1 rein. Ganz unten setzt Du noch Write Only und klickst zum Abschluss auf Create.

Wenn Du nun oben auf Code umschaltest, solltest Du etwas in dieser Form erhalten:

Code: Alles auswählen

UID: http:url:raspi
label: HTTP für Rollläden
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.2.200/addapp/gpio_t.php
  refresh: 30
  commandMethod: POST
  contentType: text/plain
  timeout: 3000
  bufferSize: 2048
channels:
  - id: shutter1
    channelTypeUID: http:rollershutter
    label: Rollo Büro
    description: ""
    configuration:
      mode: WRITEONLY
      commandExtension: ?g=B&n=
      downValue: 20&z=0.5
      stopValue: 21&z=0.1
      upValue: 21&z=0.5
Zurück in der Channelansicht klickst Du auf den Channel und wählst Add Link to Item, je nachdem kannst Du ein vorhandenes Item nehmen oder an dieser Stelle ein neues Item erzeugen.
Beim Erzeugen des Items wählst Du einen Name, ein Label, setzt die Category auf rollershutter und die Semantik kannst Du z.B. auf OpenLevel und Level setzen. Den Rest ignorierst Du und klickst zum Abschluss auf Link.

Anschließend bist Du wieder in der Channelansicht und siehst das verlinkte Item, welches Du auch direkt auswählen kannst. Auch Steuerknöpfe sind nun vorhanden und ein entsprechender Klick sollte dann die Funktion auslösen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: http post von OH2 auf OH3

Beitrag von Quautiputzli »

So in etwa hab ich mir das auch gedacht, und angelegt, aber es hat nicht funktioniert.
Ich hab dann das Thing nochmal gelöscht, neu angelegt, mit vorhandenem Item verlinkt, später auch mit neuem Item verlinkt, aber läuft nicht.

Ich hab dann den string anders zusammengesetzt, weil ich in der Anleitung gelesen habe, dass openhab evtl. selbst fehlende Schrägstriche auffüllt. Nicht dass dort dann an falscher Stelle / eingefügt werden.
Wenn man sich das openhab.log ansieht

Code: Alles auswählen

2021-02-15 21:46:36.269 [INFO ] [nding.http.internal.HttpThingHandler] - Using the secure client for thing 'http:url:raspi'.
2021-02-15 21:46:44.207 [WARN ] [nding.http.internal.HttpThingHandler] - Splitting header '' failed. No '=' was found. Ignoring
2021-02-15 21:46:44.238 [WARN ] [p.internal.http.HttpResponseListener] - Requesting 'http://192.168.2.200/addapp' (method='POST', content='org.eclipse.jetty.client.util.StringContentProvider@1b389bc') failed: 400 Bad Request
sieht mann, dass die baseUrl und die commandExtension richtig zusammengesetzt werden, aber die "UP- STOP- DOWN-values" nicht angehängt werden. Ich kann mit dem Fehler

Code: Alles auswählen

Splitting header '' failed. No '=' was found. Ignoring
nicht so richtig was anfangen.

Irgendetwas muss man da wohl anders machen. Möglcherweise braucht man für die "UP- STOP- DOWN-values" so eine Art Variablen die dann eingeesetzt werden, oder man muss die Funktion header benutzten. Nicht dass die "UP- STOP- DOWN-values" im body oder header geschickt werden, anstatt in dem request-string.
Servus

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: http post von OH2 auf OH3

Beitrag von Quautiputzli »

Ich hab es nun folgendermaßen abgeändert.

Code: Alles auswählen

UID: http:url:raspi
label: HTTP Wave
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  headers:
    - ""
  baseURL: http://192.168.2.200
  refresh: 30
  commandMethod: POST
  contentType: text/plain
  timeout: 3000
  bufferSize: 2048
channels:
  - id: shutter1
    channelTypeUID: http:rollershutter
    label: Rollo
    description: ""
    configuration:
      mode: WRITEONLY
      moveValue: B&n=21&z=0.1
      commandExtension: addapp/gpio_t.php?g=%2$s
      downValue: B&n=20&z=0.5
      stopValue: B&n=21&z=0.1
      upValue: B&n=21&z=0.5
So funktioniert es. Es kommt allerdings immer noch der Eintrag im openhab.log

Code: Alles auswählen

2021-02-16 15:31:09.510 [WARN ] [nding.http.internal.HttpThingHandler] - Splitting header '' failed. No '=' was found. Ignoring
Kann damit jemand was anfangen?
Servus

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: http post von OH2 auf OH3

Beitrag von Quautiputzli »

Quautiputzli hat geschrieben: 16. Feb 2021 15:37 Es kommt allerdings immer noch der Eintrag im openhab.log

Code: Alles auswählen

2021-02-16 15:31:09.510 [WARN ] [nding.http.internal.HttpThingHandler] - Splitting header '' failed. No '=' was found. Ignoring
Kann damit jemand was anfangen?
So, das hab ich nun auch rausbekommen. Das lag daran, das ich beim Thing in das Feld "Header" testweise mal was reingeschrieben habe. Ich hab das nun im code rausgelöscht, und nun passt das.

Das einzige was nun übrig ist, ist entweder das

Code: Alles auswählen

2021-02-16 17:08:09.146 [INFO ] [nding.http.internal.HttpThingHandler] - Using the insecure client for thing 'http:url:raspi'.
oder das

Code: Alles auswählen

2021-02-16 15:38:28.908 [INFO ] [nding.http.internal.HttpThingHandler] - Using the secure client for thing 'http:url:raspi'.
je nachdem ob man beim Thing "Ignore SSL Errors" einschaltet oder nicht. Ich denke aber, das ist kein Problem, da nur Info.
Servus

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

Re: http post von OH2 auf OH3

Beitrag von udo1toni »

Ja, cool.

Im Übrigen wäre eine andere Möglichkeit, auf dem entfernten Raspberry die verwendete Software zum Schalten um mqtt zu erweitern. Für mich sieht es so aus, als wäre das einfach eine Möglichkeit, die GPIO des Remote Raspberry zu steuern, da gäbe es wahrscheinlich elegantere Möglichkeiten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: http post von OH2 auf OH3

Beitrag von Quautiputzli »

Ja mit mqtt hab ich auf diesem Raspberry auch schon was gemacht um GPIOs zu schalten, aber das mit http hab ich schon früher erstellt. Und es erschien mir für den Fall einfacher. Ich steuere damit ein Handfernbedienung über Transistoren. Mit dem http-request kann ich das schön auswählen. Es bedeutet:
g=B / Gruppe B, 2 GPIOs für 0.1s tasten
n=20 / Reihe 2 Austaster, 2 GPIOs für die Zeit z tasten
n=21 / Reihe 2 Eintaster, 2 GPIOs für die Zeit z tasten
z=0.1 / Zeit z

Ich brauche dann nur ein *.php dass die Befehle dann wieder über Variablen an ein python weitergibt, und die GPIOs schaltet.
Servus

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: http post von OH2 auf OH3

Beitrag von Quautiputzli »

Hallo, ich habe nun noch eine Frage zu dem http-Binding.
Ich habe ja ein http-Thing mit mehreren Channels, die Kommandos zu einem anderen Raspi schicken, um etwas zu schalten. Das funktioniert so weit auch. Wenn aber nun 2 oder mehrere Channels (z.B. bedingt durch Aufruf in einer Rule) gleichzeitig ein Kommando bekommen funktioniert es nicht. Dann werden die Nachrichten wohl irgendwie "verschluckt". Kann man irgendwo einen zeitlichen Abstand einstellen nachdem die Channels nacheinander "abgefertigt" werden? Fürs Einlesen scheint es sowas zu geben, aber zum Rausschicken?

Edit:
Kann man den http Post der wirklich rausgeschickt wir in einem log sehen? Im normalen Frontail sehe ich das ja nicht.
Servus

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

Re: http post von OH2 auf OH3

Beitrag von udo1toni »

Wenn Du mehr vom http Binding sehen willst, musst Du das log Level anpassen (Anleitungen dazu gibt es einige, auch hier). Warum sich das http Binding verschluckt, wenn mehrere Channel sehr zeitnah senden sollen, erschließt sich mir nicht - gewöhnlich sollte das Binding so etwas abfangen. Um das zu verifizieren, kannst Du vor einem Befehl, der an http sendet, ein Thread::sleep(100) einfügen (oder eben dahinter) um sicher dafür zu sorgen, dass da nichts durcheinander gerät.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: http post von OH2 auf OH3

Beitrag von Quautiputzli »

Okay, das mit dem log-level habe ich geschafft.

Man sieht dort schön was passiert wenn man die Gruppe gMarkisen (mit zwei Mitgliedern) betätigt.

Code: Alles auswählen

22:36:29.851 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'gMarkisen' received command DOWN
22:36:29.862 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'GF_Terrace_Shutter_2' received command DOWN
22:36:29.870 [INFO ] [openhab.event.ItemCommandEvent       ] - Item 'GF_Terrace_Shutter_1' received command DOWN
22:36:29.870 [TRACE] [inding.http.internal.HttpThingHandler] - Sending to 'http://192.168.2.200/addapp/gpio_t.php?g=B&n=40&z=0.5': Method = {GET}, Headers = {Accept-Encoding: gzip, User-Agent: Jetty/9.4.20.v20190813}, Content = {null}
22:36:29.872 [INFO ] [openhab.event.ItemStatePredictedEvent] - Item 'GF_Terrace_Shutter_2' predicted to become DOWN
22:36:29.879 [INFO ] [openhab.event.ItemStatePredictedEvent] - Item 'GF_Terrace_Shutter_1' predicted to become DOWN
22:36:29.881 [TRACE] [inding.http.internal.HttpThingHandler] - Sending to 'http://192.168.2.200/addapp/gpio_t.php?g=B&n=30&z=0.5': Method = {GET}, Headers = {Accept-Encoding: gzip, User-Agent: Jetty/9.4.20.v20190813}, Content = {null}
22:36:29.887 [INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'GF_Terrace_Shutter_2' changed from UNDEF to 100
22:36:29.888 [INFO ] [nhab.event.GroupItemStateChangedEvent] - Item 'gMarkisen' changed from UNDEF to 100 through GF_Terrace_Shutter_1
22:36:29.890 [TRACE] [l.HttpDynamicStateDescriptionProvider] - returning new stateDescription for http:url:http_vz:Terrace_Shutter_2
22:36:29.891 [INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'GF_Terrace_Shutter_1' changed from UNDEF to 100
22:36:29.895 [TRACE] [l.HttpDynamicStateDescriptionProvider] - returning new stateDescription for http:url:http_vz:Terrace_Shutter_1
22:36:30.852 [TRACE] [tp.internal.http.HttpResponseListener] - Received from 'http://192.168.2.200/addapp/gpio_t.php?g=B&n=40&z=0.5': Code = {200}, Headers = {Server: nginx/1.14.2, Date: Fri, 18 Jun 2021 20:36:30 GMT, Content-Type: text/html; charset=UTF-8, Transfer-Encoding: chunked, Connection: keep-alive, Content-Encoding: gzip}, Content = {
}
22:36:30.861 [TRACE] [tp.internal.http.HttpResponseListener] - Received from 'http://192.168.2.200/addapp/gpio_t.php?g=B&n=30&z=0.5': Code = {200}, Headers = {Server: nginx/1.14.2, Date: Fri, 18 Jun 2021 20:36:30 GMT, Content-Type: text/html; charset=UTF-8, Transfer-Encoding: chunked, Connection: keep-alive, Content-Encoding: gzip}, Content = {
}
es werden ziemlich schnell nintereinanter (11ms wenn ich das richtig sehe) die beiden POSTs abgeschickt. Aber die Gegenseite kann das wohl so nicht verarbeiten. Was mich etwas wundert. Ich hätte gedacht, dass das erste Kommando funktioniert, und das zweite eben dann nicht. Aber bei beiden kommt Code 200 als Antwort, und keiner der beiden Markisen fährt. Bleibt fürs erste wohl nichts anderes übrig, als in der Rule eine zeitliche Verzögerung einzubauen.

Ich dachte nur, früher als ich noch openHAB 2.5 auf der synology laufen hatte, dass es da funktionierte.

Edit:
Ich hätte mir das so gedacht, das openhAB das zweite Kommando erst losschickt, wenn die Antwort vom ersten gekommen ist, oder wenn das zu lange dauert, eben ein Timeout kommt.
Servus

Antworten