
Switch Badezimmer_1_Deckenlicht "Deckenlicht" (Badezimmer_1, Lampen) { homematic="address=LEQ0900581, channel=1, parameter=STATE" }
Unsere Badezimmerrenovierung nähert sich dem Ende, die Fertigstellung ist zum Greifen nahe. So langsam ist es daher an der Zeit, die Beleuchtungssteuerung in Angriff zu nehmen! Hier kommt der HM-LC-Sw4-DR zum Einsatz: ein 4-fach Funk-Schaltaktor, der per Hutschienenmontage seinen Platz direkt im Sicherungskasten findet. Die Deckenbeleuchtung (LED, nicht dimmbar) ist an Channel 1 angeschlossen: ist LEQ0900581:1 also auf ON, so brennt das Licht, ist es auf OFF, so ist das Licht aus. Analog hierzu lässt sich in openHAB ein Switch definieren, der genau das widerspiegelt: alle weiteren Schalter, die eingesetzt werden sollen, werden dann diesen Switch manipulieren, so dass zu jeder Zeit ein konsistenter Zustand herrscht.
Switch Badezimmer_1_Deckenlicht "Deckenlicht" (Badezimmer_1, Lampen) { homematic="address=LEQ0900581, channel=1, parameter=STATE" }
In meinem Setup ist der Switch Badezimmer_1_Deckenlicht der Gruppe Badezimmer_1 angegliedert und somit auch in der openHAB-App angezeigt: übers Smartphone kann ich das Licht nun schon ein- und ausschalten. Das allein ist jedoch natürlich nicht praktikabel, schon gar nicht für Besucher ;-)
Es wird auch ein üblicher Wandschalter benötigt (unsere sind von Merten), und ihn habe ich über HM-SwI-3-FM, eine 3-fach Funk-Schalterschnittstelle, ins Spiel gebracht: er hängt an Channel 1. Im Webinterface der CCU2 können wir nun also den Button betätigen (Status und Bedienung → Geräte → HM-SwI-3-FM → Button anklicken) und in der DEBUG-Ausgabe von openHAB beobachten, wie er sich meldet:
Received new (Boolean) value 'true' for DatapointConfig[address=LEQ1097103,channel=1,parameter=PRESS]
Wird hingegen der physikalische Schalter betätigt, verwirrt er damit, dass er kein PRESS-Event liefert, sondern lediglich ein INSTALL_TEST; alle weiteren Aktionen in openHAB müssen hiervon abhängig gemacht werden!
Received new (Boolean) value 'true' for DatapointConfig[address=LEQ1097103,channel=1,parameter=INSTALL_TEST]
Und in meinem Setup sieht das dann so aus:
Switch Badezimmer_1_3fach_1 "Außenschalter: Deckenlicht" { homematic="address=LEQ1097103, channel=1, parameter=INSTALL_TEST" }
Das Verwirrende an dieser Schalterschnittstelle ist im ersten Moment, dass sie beim Betätigen nicht klassisch ON beziehungsweise OFF sendet; sie weiß nicht, was eigentlich an ihr angeschlossen ist und welchen Status das angeschlossene Gerät gerade innehat. Stattdessen wird mit jedem Betätigen ein true für INSTALL_TEST gesendet. Da Badezimmer_1_3fach_1 als Switch in openHAB hinterlegt wird, wird das übergebene true zu einem ON konvertiert — keep in mind, den Zustand OFF wird er nie annehmen! In meinem Setup gehört der Außenschalter keiner openHAB-Gruppe an und wird in der App nicht angezeigt.
Was also soll nun passieren, wenn der Schalter betätigt wird? Eigentlich ganz einfach: ist das Licht aus, soll es angeschaltet werden — und umgekehrt. Und da die Schaltung wiederum auf Badezimmer_1_Deckenlicht erfolgt, müssen wir nichts weiter tun, um den Zustand konsistent zu halten — auch, wenn das Licht über den Außenschalter eingeschaltet wird, wird es in der App korrekt angezeigt und kann beispielsweise hierüber ausgeschaltet werden. Mein Regelwerk habe ich in Badezimmer_1_Deckenlicht.rulesGITHUB festgehalten.
rule "Aussenschalter Deckenlicht Badezimmer_1" when Item Badezimmer_1_3fach_1 received update ON then logInfo("Badezimmer_1", "Status Deckenlicht ist {}", Badezimmer_1_Deckenlicht.state) if(Badezimmer_1_Deckenlicht.state==ON) { Badezimmer_1_Deckenlicht.sendCommand(OFF) } else { Badezimmer_1_Deckenlicht.sendCommand(ON) } logInfo("Badezimmer_1", "Aussenschalter schaltet Deckenlicht {}", Badezimmer_1_Deckenlicht.state) end
In der DEBUG-Ausgabe lässt sich die Abarbeitung des Regelwerks gut nachvollziehen — erst für das Anschalten des Lichts, anschließend wird der Schalter erneut betätigt um es wieder auszuschalten:
19:45:21.344 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'true' for DatapointConfig[address=LEQ1097103,channel=1,parameter=INSTALL_TEST] 19:45:21.352 [DEBUG] [.h.i.c.s.AbstractTypeConverter:105 ] - Converting (Boolean) value 'true' with OnOffTypeConverter for HmDatapoint[address=LEQ1097103,channel=1,parameter=INSTALL_TEST] 19:45:21.357 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_3fach_1 state updated to ON 19:45:21.396 [DEBUG] [m.r.internal.engine.RuleEngine:305 ] - Executing rule 'Aussenschalter Deckenlicht Badezimmer_1' 19:45:21.484 [INFO ] [nhab.model.script.Badezimmer_1:53 ] - Status Deckenlicht ist OFF 19:45:21.511 [INFO ] [runtime.busevents :22 ] - Badezimmer_1_Deckenlicht received command ON 19:45:21.519 [DEBUG] [.b.h.i.c.HomematicCommunicator:243 ] - Received command ON for item Badezimmer_1_Deckenlicht 19:45:21.541 [DEBUG] [.h.i.c.s.AbstractTypeConverter:66 ] - Converting type OnOffType with value 'ON' to (Boolean) value with OnOffTypeConverter for HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 19:45:21.547 [DEBUG] [o.o.b.h.i.c.HomematicPublisher:73 ] - Sending to Homematic server HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 19:45:21.794 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'true' for DatapointConfig[address=LEQ0900581,channel=1,parameter=STATE] 19:45:21.799 [DEBUG] [.h.i.c.s.AbstractTypeConverter:105 ] - Converting (Boolean) value 'true' with OnOffTypeConverter for HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 19:45:21.813 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_Deckenlicht state updated to ON 19:45:21.817 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'false' for DatapointConfig[address=LEQ0900581,channel=1,parameter=WORKING] 19:45:21.824 [INFO ] [nhab.model.script.Badezimmer_1:53 ] - Aussenschalter schaltet Deckenlicht ON 19:45:25.844 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'true' for DatapointConfig[address=LEQ1097103,channel=1,parameter=INSTALL_TEST] 19:45:25.849 [DEBUG] [.h.i.c.s.AbstractTypeConverter:105 ] - Converting (Boolean) value 'true' with OnOffTypeConverter for HmDatapoint[address=LEQ1097103,channel=1,parameter=INSTALL_TEST] 19:45:25.854 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_3fach_1 state updated to ON 19:45:25.861 [DEBUG] [m.r.internal.engine.RuleEngine:305 ] - Executing rule 'Aussenschalter Deckenlicht Badezimmer_1' 19:45:25.878 [INFO ] [nhab.model.script.Badezimmer_1:53 ] - Status Deckenlicht ist ON 19:45:25.913 [INFO ] [runtime.busevents :22 ] - Badezimmer_1_Deckenlicht received command OFF 19:45:25.919 [DEBUG] [.b.h.i.c.HomematicCommunicator:243 ] - Received command OFF for item Badezimmer_1_Deckenlicht 19:45:25.925 [DEBUG] [.h.i.c.s.AbstractTypeConverter:66 ] - Converting type OnOffType with value 'OFF' to (Boolean) value with OnOffTypeConverter for HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 19:45:25.931 [DEBUG] [o.o.b.h.i.c.HomematicPublisher:73 ] - Sending to Homematic server HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 19:45:26.133 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'false' for DatapointConfig[address=LEQ0900581,channel=1,parameter=STATE] 19:45:26.138 [DEBUG] [.h.i.c.s.AbstractTypeConverter:105 ] - Converting (Boolean) value 'false' with OnOffTypeConverter for HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 19:45:26.146 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_Deckenlicht state updated to OFF 19:45:26.173 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'false' for DatapointConfig[address=LEQ0900581,channel=1,parameter=WORKING] 19:45:26.161 [INFO ] [nhab.model.script.Badezimmer_1:53 ] - Aussenschalter schaltet Deckenlicht OFF
Zuguterletzt darf auch HM-PB-6-WM55 mitspielen, ein 6-fach-Wandtaster, der sich äußerst variabel einsetzen lässt. Ich reserviere für mein Deckenlicht Channel 1 und Channel 2, beliebige andere Konstellationen sind denkbar.
Switch Badezimmer_1_6fach_1_release "Wandtaster: Deckenlicht an/ aus" { homematic="address=MEQ0385873, channel=1, parameter=PRESS_LONG_RELEASE" } Switch Badezimmer_1_6fach_2_release "Wandtaster: Deckenlicht an/ aus" { homematic="address=MEQ0385873, channel=2, parameter=PRESS_LONG_RELEASE" }
Das Schalten des Deckenlichts lege ich auf das Event PRESS_LONG_RELEASE, also auf den Moment, in dem die Taste nach einem langen Tastendruck losgelassen wird (PRESS_SHORT werde ich beim Einbinden der Wandlampen nutzen, welche auch dimmbar sein werden; auf Channel 1 und Channel 2 belasse ich dieses Event vorerst unbelegt, ebenso wie PRESS_LONG). Das Regelwerk zur Schaltung lässt sich nun leicht anpassen, indem lediglich der when-Teil der Regel erweitert wird (vgl. Badezimmer_1_Deckenlicht.rulesGITHUB):
rule "Schaltung Deckenlicht Badezimmer_1" when Item Badezimmer_1_3fach_1 received update ON or Item Badezimmer_1_6fach_1_release received update ON or Item Badezimmer_1_6fach_2_release received update ON then ...
11:42:49.659 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_6fach_1_release state updated to ON 11:42:49.667 [DEBUG] [m.r.internal.engine.RuleEngine:305 ] - Executing rule 'Schalte Deckenlicht Badezimmer_1' 11:42:50.678 [INFO ] [nhab.model.script.Badezimmer_1:53 ] - Status Deckenlicht ist OFF 11:42:51.880 [INFO ] [runtime.busevents :22 ] - Badezimmer_1_Deckenlicht received command ON 11:42:51.888 [DEBUG] [.b.h.i.c.HomematicCommunicator:243 ] - Received command ON for item Badezimmer_1_Deckenlicht 11:42:51.894 [DEBUG] [.h.i.c.s.AbstractTypeConverter:66 ] - Converting type OnOffType with value 'ON' to (Boolean) value with OnOffTypeConverter for HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 11:42:51.900 [DEBUG] [o.o.b.h.i.c.HomematicPublisher:73 ] - Sending to Homematic server HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 11:42:52.083 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'true' for DatapointConfig[address=LEQ0900581,channel=1,parameter=STATE] 11:42:52.087 [DEBUG] [.h.i.c.s.AbstractTypeConverter:105 ] - Converting (Boolean) value 'true' with OnOffTypeConverter for HmDatapoint[address=LEQ0900581,channel=1,parameter=STATE] 11:42:52.103 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_Deckenlicht state updated to ON 11:42:52.108 [DEBUG] [.b.h.i.c.HomematicCommunicator:174 ] - Received new (Boolean) value 'false' for DatapointConfig[address=LEQ0900581,channel=1,parameter=WORKING] 11:42:52.566 [DEBUG] [.h.i.c.s.AbstractTypeConverter:66 ] - Converting type OnOffType with value 'OFF' to (Boolean) value with OnOffTypeConverter for HmDatapoint[address=MEQ0385873,channel=1,parameter=PRESS_LONG_RELEASE] 11:42:52.571 [DEBUG] [.h.i.c.s.AbstractTypeConverter:105 ] - Converting (Boolean) value 'false' with OnOffTypeConverter for HmDatapoint[address=MEQ0385873,channel=1,parameter=PRESS_LONG_RELEASE] 11:42:52.583 [INFO ] [runtime.busevents :26 ] - Badezimmer_1_6fach_1_release state updated to OFF 11:42:52.587 [DEBUG] [.h.i.communicator.ItemDisabler:98 ] - Disabled Item Badezimmer_1_6fach_1_release with binding DatapointConfig[address=MEQ0385873,channel=1,parameter=PRESS_LONG_RELEASE] 11:42:52.695 [INFO ] [nhab.model.script.Badezimmer_1:53 ] - Schalte Deckenlicht in Badezimmer_1 ON
HM-PB-6-WM55, der Wandtaster, äußert sich in der DEBUG-Ausgabe von openHAB anders als HM-SwI-3-FM, an welchem der Wandschalter hängt: beim Betätigen von PRESS_LONG_RELEASE sendet er ein ON und einen Moment später dann ein OFF, so dass bei ihm der Default-Zustand jederzeit OFF, also false, ist. Deshalb ist es auch sehr wichtig, das Regelwerk von received update ON abhängig zu machen und nicht lediglich von received update — die obenstehende Regel würde sonst bei (einmaligem!) Betätigen des Wandtasters im ersten Schritt das Licht an- und im nächsten Moment direkt wieder abschalten.