Status eines Things bei Änderung via HTTP GET senden (OH3)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

zdhh22
Beiträge: 5
Registriert: 31. Jul 2021 00:22

Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von zdhh22 »

Ich nutze für meine Hausautomatisierung hauptsächlich FHEM. Allerdings gibt es eine Schnittstelle zu meiner Warema Markise (OpenWMS), die nur unter openHAB läuft. Der dazugehörige USB Stick und Blind Actuator wurden als Thing in openHAB angelegt. Jetzt möchte ich gerne bei Änderung des Status einer dieser Things von "ONLINE" auf "irgendwas" einen HTTP GET Request in der Art

Code: Alles auswählen

http://fhem.local:8083/fhem?cmd=setreading%20WaremaMarkise%20state%20<hierSollDerStatusVonThingRein>
den Status an FHEM übertragen. Aber nur dann, wenn er sich wirklich verändert. Da mir dei Erfahung mit openHAB fehlt, komme ich nicht so richtig weiter.

Ich habe schon etwas zum Thema HTTP Binding gelesen, aber komme nicht mit folgenden Dingen so richtig weiter.
  • Senden des Status des Things bei Veränderung an FHEM
  • Auslesen des Status des Things und in die URL einbetten
  • Auslesen der Markisenposition (Shutter mit Position in openHAB sichtbar) und den Wert über die Base URL des HTTP Bindings mitgeben
  • Zugriff auf Werte innerhalb von openHAB und an HTTP Binding übergeben
Ich hoffe ihr könnt mein Anliegen einigermaßen nachvollziehen und mir vielleicht ein paar Punkte zur weiteren Recherche geben? Vielen Dank! :-)

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

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von udo1toni »

Du kannst einfach eine Rule dafür schreiben. Als Trigger für die Rules steht in diesem Fall Thing <thingUID> changed zur Verfügung, also vermutlich genau das, was Du suchst.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zdhh22
Beiträge: 5
Registriert: 31. Jul 2021 00:22

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von zdhh22 »

Vielen Dank für deine Rückmeldung. Den Teil konnte ich mir schon denken, aber mir fehlt das Know How für die Voraussetzungen . Dadurch ist vermutlich auch meine Frage nicht konkret genug. Ich würde gerne nochmal Schritt für Schritt vorgehen. ;-)

1. Konfiguriert ist ein Blind Actuator und WMS-Stick Transceiver (pic01.png) zur Steuerung der Markise. Die Steuerung erfolgt über dazugehörige Shutter Item (pic01.png).
pic01.png
2. Anlegen eines neuen Things WaremaStatus vom Typ HTTP Binding (pic03.png).
pic03.png
3. Anlegen eines Channels um z.B. den Status des Transceiver abzubilden.

Bei Schritt 3. komme ich nicht weiter. Wie konfiguriere ich, dass der Status abgegriffen wird (pic04.png) und in der URL mittel GET an mein FHEM übergeben werden kann?
pic04..png
Die Regel am Ende ist vermutlich selbsterklärend, wenn ich den vorhergehenden Schritt verstanden habe.
1. Prüfe ob Status geändert wurde (trigger, when)
2. Rufe den Channel vom HTTP Bind auf, um Status zu setzen (action, then)

Kannst du mir hier bitte noch mal einen Ansatz geben? Danke :)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von udo1toni »

Also, im http Thing musst Du eine Base URL eintragen. Das ist mindestens der FQDN oder die IP von Deinem Zielsystem (also FHEM), mit vorangestelltem http://. Mindestens deshalb, weil Du die URL auch beliebig weiter ergänzen kannst. Die Base URL könnte also

Code: Alles auswählen

http://192.168.178.55/
lauten, aber genauso gut auch

Code: Alles auswählen

http://192.168.178.55:8080/irgendein/Unterordner/
Wichtig ist nur, dass alle Channel diese BaseURL für alle URL Felder verwenden, ergänzt um weitere Teilstrings. Im ersten Fall kannst Du also alles auf der IP ansprechen, was auf Port 80 läuft (Standardport...), im 2. Fall nur den Teil, der in der Serverstruktur unterhalb irgendein/Unterordner/ liegt (und dieser Server muss auf Port 8080 lauschen).

Wenn Du nur exakt eine URL ansprechen willst, kannst Du die URL auch vollständig als baseURL eintragen (das sieht auf Deinem Screenshot so aus).
Im nächsten Schritt brauchst Du einen Channel, über den Du den Befehl (bzw. die Information) senden kannst.
Nun muss aber (gerade bei GET) noch irgendwie ein dynamischer Teil in die URL rein, schließlich willst Du nicht pro gemeldetem Zustand ein Thing anlegen. Du musst also fast zwingend im Feld command URL extension etwas eintragen. %2$s ist dabei der Platzhalter, welcher durch den Befehl ersetzt wird. Du kannst an dieser Stelle auch noch eine Manipulation des Befehls vornehmen, das ist z.B. wichtig bei Schaltern, die nur die Befehle ON und OFF kennen. Vielleicht erwartet der http Server aber 1 und 0 statt ON und OFF.
In Deinem Fall wirst Du aber ohnehin mit einem String besser fahren.

Es fehlt noch ein Detail, was gerne bei Neulingen für Verwirrung sorgt, nämlich ein Item. Dieses Item wird mit dem Channel verknüpft.
Dazu muss man wissen, dass openHAB intern einen eigenen "Bus" hat, den openHAB Bus. Alles, was irgendwie gesteuert oder angezeigt werden soll, muss auf diesen Bus. Und Items sind die Speicher des Busses. Ein Item kann einen Status halten (je nach Typ) und Befehle senden und empfangen. Wenn ein Item einen Befehl sendet, dann leitet es diesen Befehl an alle Channel weiter, mit denen es verknüpft ist. Da Du den Channel als String Channel nutzen willst, musst Du auch ein String Item verknüpfen (das ist aber nicht unbedingt zwingend... ;) )
Der Itemname kann nachträglich nicht geändert werden (genau wie Thing Name und Channel Name), man sollte also direkt beim Anlegen genau überlegen, wie das Item heißen soll, sonst muss man später das Item löschen und neu anlegen.
Verknüpfungen zwischen Channel und Item können hingegen jederzeit geändert werden.

Wenn Du das Item soweit hast, brauchst Du nur noch eine Rule (oder auch mehrere Rules, ganz nach Belieben), die bei Änderung des Thing Status einen String an das Item sendet (welches diesen String dann an den Channel schickt...)

Das sieht sehr komplex aus, die Idee dahinter ist aber einigermaßen sinnvoll. Things repräsentieren in openHAB externe Hardware (wobei der Begriff Hardware hier maximal dehnbar ist - z.B. gibt es mit dem Astro Binding Sonne und Mond als Things, oder auch mit OpenWeatherMap das Wetter an beliebigen Orten. das ist natürlich keine Hardware im klassischen Sinn. Bei Geräten wie einem per mqtt gesteuerten Zwischenstecker ist das aber ganz passend, und daher kommt letztlich das Bild).
Die Channel repräsentieren dann einzelne Eigenschaften dieses Geräts, wie z.B. die Schaltstellung eines Relais oder die Helligkeit einer angeschlossenen Lampe (mitsamt dem Steuerbefehl, um den Zustand zu ändern).

Danach (also in dem Moment, wo diese Channel mit Items verbunden sind) gibt es keine Abhängigkeiten von der verwendeten Hardware mehr, es spielt keine Rolle, ob ich nun Homematic, knx, mqtt, http, zigbee oder zwave verwende, es spielt keine Rolle, ob es um einen Staubsauger, einen Fernseher oder den Rasensprinkler geht. Es gibt nur noch eine sehr begrenzte Anzahl möglicher Befehle, mit denen alles abgedeckt werden kann.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zdhh22
Beiträge: 5
Registriert: 31. Jul 2021 00:22

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von zdhh22 »

Erstmal vielen Dank für deine ausführliche und verständliche Beschreibung. Ein Teil davon habe ich unbewusst auch so getan, aber jetzt erschließen sich mir ein paar Zusammenhänge und das Verständnis nimmt zu. Vielleicht wechsel icg irgendwann von FHEM auf openHAB. ;-)

Ich habe jetzt eine Regel aufgebaut, die aller paar Sekunden (trigger) zum Test etwas an FEHM senden soll.
  1. Thing erstellt (WaremaStatusHttpBindingThing) und base URL hinterlegt
  2. String-Channel (WaremaStatusChannel) und %2$s als Command URL Extension hinterlegt. Change ist Write Only. %2$s dient als Platzhalter, um den dynamischen Teil vom Item zu empfangen - so habe ich es verstanden. ;-)
  3. Item (WaremaStatusItem) vom Typ String angelegt. Dies ging unter OH3 direkt über Things -> Channel -> "Add link to Item". Dadurch wurde das Item mit der Verlinkung zum Channel erstellt.
  4. Rule (WaremStatusRule) angelegt. Für den Test ein "Time Event" angelegt. Dies Cron läuft aller 5 Sekunden.
  5. Der Rule WaremStatusRule habe ich ein "Action, Item Action" angefügt und das WaremaStatusItem hinterlegt. Den Teil "command" hatte ich erstmal freigelassen.
    pic01.png
  6. Der Cron der Regel läuft, aber die base URL wird nicht aufgrufen. Erst als ich unter 5. bei "command" etwas eingefügt hatte, wurde die base URL vom HTTP Binding aufgerufen und um diesen Teil ergänzt. Das bei "command" etwas hinterlegt sein muss, war mir nicht klar.
Wie kann ich diesem "command" den aktuellen Status eines beliebigen anderen Things oder Items mitgeben, damit dies als dynamischer Parameter an meine base URL angefügt wird?

In der Dokumentation habe ich etwas von integrierten "actions" gefunden, aber wenn ich diese so einfach bei "Command" in der Regel hinterlege, bekomme ich den Status nicht an die base URL.
pic02.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von udo1toni »

zdhh22 hat geschrieben: 1. Aug 2021 11:53 String-Channel (WaremaStatusChannel) und %2$s als Command URL Extension hinterlegt. Change ist Write Only. %2$s dient als Platzhalter, um den dynamischen Teil vom Item zu empfangen - so habe ich es verstanden. ;-)
Ja, aber es muss natürlich an der richtigen Stelle in der URL landen. Ist das denn so?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zdhh22
Beiträge: 5
Registriert: 31. Jul 2021 00:22

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von zdhh22 »

Ja, das funktioniert.

Kannst du mir bitte noch einen Hinweis zum letzten Teil meines Posts geben?
zdhh22 hat geschrieben: 1. Aug 2021 11:53 Wie kann ich diesem "command" den aktuellen Status eines beliebigen anderen Things oder Items mitgeben, damit dies als dynamischer Parameter an meine base URL angefügt wird?

In der Dokumentation habe ich etwas von integrierten "actions" gefunden, aber wenn ich diese so einfach bei "Command" in der Regel hinterlege, bekomme ich den Status nicht an die base URL.

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

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von udo1toni »

Also, eigentlich sieht das sehr gut aus.

Schalte doch bitte mal auf die Code Ansicht um (oranges Titelband rechts). Dort kannst Du den Code als Text kopieren und hier einfügen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zdhh22
Beiträge: 5
Registriert: 31. Jul 2021 00:22

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von zdhh22 »

So sieht es aktuell aus. Der Teil "getThingStatusInfo("openwms:bridge:c7144902")" wird als String so wie er ist an das HTTP Binding weitergegeben. Die Methode getThingStatusInfo wird also nicht ausgeführt.

Code: Alles auswählen

triggers:
  - id: "3"
    configuration:
      cronExpression: 0/5 * * * * ? *
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "1"
    configuration:
      itemName: WaremaStatusItem
      command: getThingStatusInfo("openwms:bridge:c7144902")
    type: core.ItemCommandAction

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

Re: Status eines Things bei Änderung via HTTP GET senden (OH3)

Beitrag von udo1toni »

Hm. Sieht eigentlich wunderbar aus.
Ich bin allerdings, was die UI Rules betrifft kein Spezialist. Vielleicht sieht noch jemand anderes einen Fehler?

Du könntest auch mal einen Blick ins log werfen, ob denn das Item den korrekten Status enthält.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten