Script mit Webschalter auslösen
Aufgabe:
Es soll auf der Weboberfläche einen Schalter geben, der mehrere Lampen zugleich einschaltet. Ausserdem soll diese Aktion auch per Fernbedienung ausgelöst werden können.
Voraussetzungen:
Es seien in FHEM drei Geräte Licht_1 - Licht_3 definiert, also z.b. 3 FS20 Schaltsteckdosen, Unterputzschalter o.ä. oder deren HM-Equivalent.
Vorgehen:
Zunächst ist ein FS20 Dummy anzulegen:
define Licht_an FS20 11114444 1a attr Licht_an dummy 1 attr Licht_an room HAUS
Wobei:
11114444 de ist der FS20 Hauskode und "1a" ist die Kanaladresse in Hex, also in ELV Notation 12 33
Das erzeugt auf der Weboberfläche erstmal einen normal aussehenden FS20 Schalter im Raum HAUS.
Den kann man auf der Weboberfläche schalten oder auch mit einer Fernbediehnung, die die Werte 11114444 1a hat.
Als nächstes muss ein Script angelegt werden, das auf Betätigung des Schalters reagiert. Dazu nimmt man "notify".
define act_on_Licht_an notify Licht_an {\ if ("%" ne "off") {\ fhem("set Licht_1 on ;; set Licht_2 on ;; set Licht_3 on")\ }\ else {\ fhem("set Licht_1 off ;; set Licht_2 off ;; set Licht_2 off")\ }\ }
Erläuterungen:
define act_on_Licht_an
es wird eine Aktion definiert die "act_on_Licht_an" heisst. Der Namen hat keine spezielle Bedeutung, er könnte auch "Blabberschnalz33" lauten, aber sprechende Namen sind leichter zu lesen.
notify Licht_an
reagiere wenn der Schalter "Licht_an" betätigt wird. Beachte, dass es egal ist, ob der an- oder ausgeschaltet oder gedimmt wird. Sobald er 'irgendwas'macht, wird die folgende Aktion ausgelöst.
{
was jetzt kommt ist keine reines "FHEM Kommando" mehr, sondern PERL
if (
prüfen ob der Ausdruck in der Klammer gleich zutrifft, nur dann die Kommandos ausführen.
"%" ne "off")
"%" ist der Wert des letzten Kommandos. Den Kram in der nächsten Klammer NUR machen, wenn dieser Wert nicht gleich (ne = not equal) "off" ist. Mit anderen Worten: Den folgenden Kram nur machen, wenn auf der Weboberfläche ON gedrückt wurde, oder auf der Fernbedienung ein ON oder DIM UP Befehl ausgelöst wurde. Man könnte auch auf ("%" eq "on") testen. Nachteil ist aber, wenn jemand an der Fernbedienung versehentlich zu lange drückt und damit einen Dimmbefehl auslöst, geht das Licht nicht an!
{ fhem("set Licht_1 on ;; set Licht_2 on ;; set Licht_3 on") }
PERL soll FHEM mitteilen, dass FHEM "set Licht_1 on ; set Licht_2 on ; set Licht_3 on" ausführen soll, also alle drei Lampen an. Beachte die Verdoppelung der Semikolons, das ist nötig, weil so PERL mitgeteilt wird, dass die Dinger nicht irgendwelche PERL Bedeutung haben, sondern an FHEM weitergereicht werden sollen; das nennt man "Escapen"
else
Falls der Test am Anfang NICHT erfolgreich war (mit anderen Worten jemand OFF gedrückt hat - egal ob auf Weboberfläche oder Fernbedienung), dann mach was jetzt kommt.
{ fhem("set Licht_1 off ;; set Licht_2 off ;; set Licht_2 off") }
PERL soll FHEM mitteilen (etc, analog oben)
}
Ende mit PERL-Kram
Anmerkungen:
Es ist unerheblich, ob die Aktionen in den Scripten FS20 Aktoren ansprechen oder Licht_1 z.B. eine HomeMatic (HM) Komponente ist. Der Dummyschalter muss auch nicht ein FS20 Schalter sein. Es lassen sich alle Welten beliebig mischen.
Mit den obigen Beispielen lassen sich also z.B. auch HM Komponenten mit einer FS20 Fernbedienung betätigen. Voraussetzung ist jedoch, dass am FHEM Host Funkzentralen für beide Systeme angeschlossen sind, also z.b. zwei CUL, einer in SlowRF Mode und einer im HM Mode, oder ein CUN(O) in SlowRF Mode und ein HM LAN Konfigurationsadapter.