Rule mit received command... Stehe auf dem Schlauch?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
DrLoop
Beiträge: 5
Registriert: 8. Feb 2023 14:57
Answers: 0

Rule mit received command... Stehe auf dem Schlauch?

Beitrag von DrLoop »

Hallo zusammen,

habe hier ein kleines Problem, das mich fast irre macht...

Hintergrund:
Bin von DeConz auf zigbee2mqtt umgestiegen, alles kein großes Ding, innerhalb in openhab funktioniert alles so wie es soll.
Da ich jedoch natürlich auch alle vorhandenen Regeln anpassen muss hier mein Problem:

Per MQTT kommt von einem Schalter ein Command "on" als String. Diesen will ich per Rule abgreifen um z.B. eine Leuchte zu schalten.
Mit "received command" bekomme ich das aber irgendwie nicht hin?

Rule sieht z.B. so aus:

Code: Alles auswählen

rule "Tischlampe Manu Büro"
when
    Item TRADFRI_Button_1_A received command "on"
then
    if(TRADFRI_E14_W_1_SW.state == ON) {
        sendCommand(TRADFRI_E14_W_1_SW, OFF)
    } else {
        sendCommand(TRADFRI_E14_W_1_SW, ON)
    }         
end
Das Item ist der Action-Channel des Buttons, innerhalb von openhab wird das gesendete Command auch korrekt angezeigt.
Hab schon diverse Schreibweisen getestet, also mit "" und ohne, klein/groß, ohne Angabe bei when und dafür mit if(receivedCommand == "on") bei then....
Mit received update klappt alles, allerdings gehen damit auch sämtliche Lampen an wenn MQTT mal neu gestartet wird... deswegen wollte ich das mit received command machen.

Kann mir irgendjemand bitte einen kleinen Schubs in die richtige Richtung geben, irgendwie stehe ich mittlerweile völlig auf dem Schlauch warum das so nicht funktioniert! :)

Danke,
Gruß Manuel

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

Re: Rule mit received command... Stehe auf dem Schlauch?

Beitrag von udo1toni »

Herzlich willkommen im openHAB Forum!

Grundsätzlich ist es so, dass openHAB der Chef ist. Mithin wird alles, was empfangen wird, als Status betrachtet, es sei denn, man sorgt dafür, dass es als Befehl interpretiert wird.
Du hast leider nicht angegeben, welche Version von openHAB Du verwendest, da gibt es immer ein paar "steht erst ab x.y zur Verfügung".
Zum Glück musst Du aber auch nicht unbedingt auf received command triggern, ein received update geht auch.

Aber weiter: Ein Switch Item kennt erst mal zwei Status, ON und OFF. ON ist etwas anderes als on und noch mal etwas anderes als "on" oder "ON". (in Anführungszeichen handelt es sich um einen String, nicht um einen Status).
In openHAB ist grundsätzlich die Groß/Kleinschreibung für jeden einzelnen Buchstaben zu beachten. In der Konfiguration kannst Du immer davon ausgehen, dass die Schreibweise camelCase ist, das heißt, ein Schlüseelwort, welches eigentlich aus mehreren aneinandergereihten Schlüsselworten besteht wird an den betreffenden Stellen durch einen einzelnen Großbuchstaben gekennzeichnet. In den Rules ist das bei den Actions auch so, z.B. sendCommand(). Bei den Status werden ausschließlich Großbuchstaben verwendet, also ON, CLOSED, PLAY usw. Das gilt auch für Befehle, z.B. UP oder STOP.

Du kannst im events.log von openHAB jederzeit nachschauen, was openHAB empfängt und in welchem Item es das speichert. Allerdings mit einer Einschränkung: Wenn ein Item seinen Status nicht ändert (also mehrfach hintereinander der gleiche Wert empfangen wird) wird das ignoriert, falls es nicht explizit im Logging aktiviert wurde. Schau also bitte mal ins Log, ob dort etwas passiert, wenn Du den Taster drückst und loslässt.

Deine Rule zum toggeln der Lampe wäre so sinnvoll:

Code: Alles auswählen

rule "Tischlampe Manu Büro"
when
    Item TRADFRI_Button_1_A received update ON
then
    TRADFRI_E14_W_1_SW.sendCommand(if(TRADFRI_E14_W_1_SW.state == ON) OFF else ON)
end
Also: Sende an das Item TRADFRI_E14_W_1_SW einen Befehl. Falls der Status gerade ON ist, sende OFF, sonst ON. Das if() wird hier als ternärer Operator verwendet, das ist nicht ganz so gut lesbar, aber schön kurz...

Da es sich hier sowohl beim Knopf als auch bei der Lampe um ein Tradfri Gerät handelt und ich mich mit dem Krempel nicht auskenne: Kann man die Tradfri Geräte nicht direkt koppeln? Meine Empfehlung wäre, wann immer möglich den direkten Weg zu gehen, statt des Umwegs über openHAB. Der Hintergrund ist einfach, dass die Taste dann auch noch funktioniert, wenn openHAB mal ausfallen sollte (was es natürlich nicht sollte...)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

DrLoop
Beiträge: 5
Registriert: 8. Feb 2023 14:57
Answers: 0

Re: Rule mit received command... Stehe auf dem Schlauch?

Beitrag von DrLoop »

Mh, das Problem ist aber dass das Item TRADFRI_Button_1_A ein String-Item ist und kein Switch-Item?
Einen Switch-Channel gibts bei keinem der Schalter (egal ob HUE, Gira, Aqara oder Tradfri), leider nur einen String-Channel (action).

Und zigbee2mqtt sendet leider auch nicht ON, sondern on darüber.

Direkt koppeln würde gehen, teilweise werden durch die Buttons aber auch noch mehr bzw. andere Aktionen gesteuert und so einen "Mix" wollte ich vermeiden ;)

ach so, und ich verwende Version 3.4 :)

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

Re: Rule mit received command... Stehe auf dem Schlauch?

Beitrag von udo1toni »

Na dann nimmst Du halt received update "on".
Alternativ kannst Du auch nur received update verwenden und dann innerhalb der Rule auf "on" testen:

Code: Alles auswählen

rule "Tischlampe Manu Büro"
when
    Item TRADFRI_Button_1_A received update
then
    if(TRADFRI_Button_1_A.state.toString == "on")
        TRADFRI_E14_W_1_SW.sendCommand(if(TRADFRI_E14_W_1_SW.state == ON) OFF else ON)
end
Achso... Bei openHAB3.4 gibt es auf jeden Fall schon die Option is command in mqtt, die Du unter den Advanced Options im jeweiligen Channel setzen kannst.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

DrLoop
Beiträge: 5
Registriert: 8. Feb 2023 14:57
Answers: 0

Re: Rule mit received command... Stehe auf dem Schlauch?

Beitrag von DrLoop »

Super, vielen lieben Dank, so funktioniert das jetzt einwandfrei!
Bei einem Neustart von MQTT bleiben die Lampen aus, genau so wollte ich es :)

Antworten