Seite 1 von 2

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

Verfasst: 31. Jul 2021 00:40
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! :-)

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

Verfasst: 31. Jul 2021 14:43
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.

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

Verfasst: 31. Jul 2021 16:31
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 :)

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

Verfasst: 31. Jul 2021 22:00
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.

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

Verfasst: 1. Aug 2021 11:53
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

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

Verfasst: 1. Aug 2021 12:19
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?

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

Verfasst: 1. Aug 2021 12:23
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.

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

Verfasst: 1. Aug 2021 13:54
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.

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

Verfasst: 1. Aug 2021 15:50
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

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

Verfasst: 1. Aug 2021 18:34
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.