In unserem Artikel “Intelligente Zeitschaltuhr mit FHEM” zeigen wir bereits, wie man das Licht oder die Rolläden jeden Tag zu einer bestimmten Zeit schalten kann – oder abhängig von der Dunkelheit (gemessen anhand des Sonnenauf- und -untergangs). Wenn man seine Lampen oder anderen Aktoren aber nicht jeden Tag gleich schalten möchte, geht das mit einer einfach if-Abfrage in FHEM.
Wenn man am Wochenende nämlich gerne länger schlafen möchte, muss das Licht im Schlafzimmer schließlich nicht wie an den Tagen in der Woche angeschaltet werden – oder die per FHEM gesteuerten Rolläden bleiben am Samstag und Sonntag etwas länger unten.
» Tipp: Wie gebe ich FHEM-Befehle ein?
Einfache if Abfrage / if Bedingung mit FHEM
FHEM stellt den aktuellen Wochentag in der Variable $wday zur Verfügung, es gibt aber noch viel mehr Variablen zur Zeit-Berechnung: Diese haben wir in diesem Artikel aufgeführt. Mit der $wday Variable lässt sich bestimmen, ob heute Montag, Dienstag, Mittwoch oder aber Wochenende ist. Die Zählung beginnt bei “0”, was Sonntag entspricht:
Sonntag: $wday = 0
Montag: $wday = 1
Dienstag: $wday = 2
Mittwoch: $wday = 3
Donnerstag: $wday = 4
Freitag: $wday = 5
Samstag: $wday = 6
» Tipp: Diese vordefinierten Variablen stehen in FHEM zur Verfügung
FHEM Aktor nur an einem bestimmten Tag schalten
Mit der Abfrage der Variable “$wday” erhält man so den aktuellen Tag, den man in einer if Abfrage nutzen kann, um einen FHEM Aktor ein- oder auszuschalten. Um also eine Lampe nur Montags zu schalten, hilft dieser define-Befehl:
define LampeSZ at *08:15:00 { if($wday == 1) { fhem("set SCHLAFZIMMER on") }}
Damit wird der FHEM-Befehl “set SCHLAFZIMMER on” zum Schalten einer Schlafzimmer-Lampe ausgeführt, wenn es Montag, 08:15 Uhr ist.
FHEM Aktor nur in der Woche schalten / nicht am Wochenende
In der IF Abfrage lassen sich aber auch mehrere Bedingungen kombinieren: So kann man die Lampe an allen Wochentagen anschalten, wenn man einfach die zusätzlichen Tage hinzufügt:
define LampeSZ at *08:15:00 { if($wday == 1 || $wday == 2 || $wday == 3 ||
$wday == 4 || $wday == 5) { fhem("set SCHLAFZIMMER on") }}
Die beiden Querstriche “||” bedeuten bei der if Bedingung “oder”: Das Licht wird in dieser if Bedingung also angeschaltet, wenn der Tag “$wday” entweder 1 oder 2 oder 3 oder 4 oder 5 ist – am Samstag und Sonntag bleibt die Lampe aus.
Braucht man für andere if Abfragen die “und” Formulierung, nutzt man statt “||” diese Zeichen: “&&” (ohne Anführungsstriche):
define LampeSZ at *08:15:00 { if($wday == 1 && $hour >= 8) { fhem("set SCHLAFZIMMER on") }}
Tipp: Weitere Variablen wie $weekday und $hour in FHEM
if, else if und else
Neben der IF-Bedingung gibt es auch das optionale ELSE: Dies wird ausgeführt, wenn die IF-Bedingung nicht zuftrifft:
define LampeSZ at *08:15:00 {\
if($wday == 0) {\
#Sonntag!
fhem("set SCHLAFZIMMER_Sonntag on");;\
} else {\
#Wochentags!
fhem("set SCHLAFZIMMER_Woche on");;\
}\
}
In unserem Beispiel wird am Sonntag die Lampe SCHLAFZIMMER_Sonntag eingeschaltet, in der Woche die Lampe SCHLAFZIMMER_Woche. Wie man den Code eingibt und warum am Zeilenende ein Backslash ist zeigen wir in diesem Artikel – alternativ kann man auch alles in eine Zeile schreiben!
Neben IF und ELSE gibt es aber auch noch ELSE IF: Damit kann man spezielle Abfragen machen wie diese (Achtung: ELSE IF wird in Perl, anders als zum Beispiel in PHP, zwingend “elsif” geschrieben!):
define LampeSZ at *08:15:00 {\
if($wday == 0) {\
#Sonntag!
fhem("set SCHLAFZIMMER_Sonntag on");;\
} elsif($wday == 1) {\
#Montag!
fhem("set SCHLAFZIMMER_Montag on");;\
} elsif($wday == 2) {\
#Dienstag!
fhem("set SCHLAFZIMMER_Dienstag on");;\
} else {\
#alle anderen Tage
fhem("set SCHLAFZIMMER_Woche on");;\
}\
}