Ich habe bereits in einem anderen Beitrag erklärt, wie man sich eine Zeitschaltuhr mit einem gewissen Zufall programmiert, um so Einbrecher abzuschrecken. In manchen Fällen, reicht jedoch auch eine einfache Zeitschaltuhr, die immer zur exakten eingestellten Uhrzeit schaltet. Sei es zum Beispiel für den Tannenbaum zu Weihnachten oder für ein einfaches Flurlicht, um morgens den Weg vom Schlafzimmer ins Badezimmer zu finden. In diesem Beitrag erkläre ich euch, wie ihr mit Hilfe des Moduls WeekdayTimer eine einfache Zeitschaltuhr programmiert.
Definition
Mit dem Modul „WeekdayTimer“ lassen sich für jeden Tag der Woche getrennte Zeiten definieren, in der ein Device schalten soll.
Das Einstellen der Zeitpunkte erfolgt direkt bei der Definition:
define <name> WeekdayTimer <device> [<language>] [weekdays] <profile> <command>|<condition>
„device“ steht dabei für das Device, welches geschaltet werden soll.
Mit dem optionalen Parameter „language“ lassen sich länderspezifische Angaben machen.
Der nächste Parameter ist „weekdays“. Dieser ist ebenfalls optional. Mit ihm lassen sich tagesabhängige Zeitangaben einstellen. Ist dieser Parameter nicht gesetzt, so gilt die Zeitangabe für jeden Tag der Woche. Dazu später im Beispiel mehr.
Der wichtigste Parameter ist „profile“. Hier werden die Zeitpunkte eingetragen, zu der geschaltet werden soll. Dieser Parameter hat folgenden Syntax:
Mit Wochentagangabe:
[<weekdays>|]
Ohne Wochentagangabe:
<time>|<parameter>
Für den Eintrag „weekdays“ stehen folgende Möglichkeiten zur Verfügung:
Die Zeitangabe („time“) erfolgt im Format „HH:MM:SS“. Die Angabe der Sekunden ist optional. Die Angabe erfolgt im 24 Stunden Format. Anstelle einer genauen Zeitangabe kann zum Beispiel auch der Zeitpunkt des Sonnenaufganges benutzt werden. Mehr dazu in den Beispielen.
Mit „parameter“ lässt sich der Befehl definieren, der zu eingestellten Zeit gesendet werden soll. Der hier eingestellte Befehl sollte natürlich vom verwendeten Device unterstützt werden. Möglich wäre zum Beispiel on oder off.
Mit „command“ lässt sich das auszuführende Kommando näher definieren bzw. komplexere Befehle definieren, welches dann zu den eingestellten Zeitpunkten ausgeführt wird. Wird der Parameter „condition“ nicht gesetzt, dann wird alles was nach „profile“ kommt als „command“ interpretiert. Verwendet man PERL-Code ist dieser in geschweifte Klammern zu setzen. Am besten zu veranschaulichen geht dies über Beispiele. Mehr dazu weiter unten.
Mit „condition“ lassen sich, zusätzlich zu den Zeitangaben, weitere Bedingungen setzen, die für das Schalten erfüllt sein müssen. Der Rückgabewert dieser Bedingung muss entweder „wahr“ oder „falsch“ sein. Damit eine „condition“ als solche erkannt wird, muss diese in Klammern gesetzt werden.
Innerhalb der Parameter „comand“ und „condition“ kann mit den Platzhaltern „$NAME“ und „$EVENT“ gearbeitet werden. „$NAME“ steht dabei für das zuschaltende Gerät („device“). Mit „$EVENT“ lässt sich der gesetzte Befehl „parameter“ verwenden.
Beispiele
Um das Modul „WeekdayTimer“ zu verstehen, helfen am besten ein paar Beispiele.
Beispiel 1
Das Device „WZ_Papierlampe“ jeden Montag, Dienstag, Mittwoch, Donnerstag und Freitag um 17 Uhr anschalten und um 23 Uhr wieder ausschalten:
define WZ_Licht_Timer WeekdayTimer WZ_Papierlampe 12345|17:00|on 12345|23:00|off
Durch die Profil-Einträge unter „Internals“ erkennt man direkt, ob die Definition korrekt ist. Dort wird jeder definierte Tag mit den Schaltzeiten aufgelistet.
Um das obige Device zu definieren gibt es weitere Möglichkeiten:
define WZ_Licht_Timer WeekdayTimer WZ_Papierlampe Mo-Fr|17:00|on mo-fr|23:00|off
define WZ_Licht_Timer WeekdayTimer WZ_Papierlampe !$we|17:00|on !$we|23:00|off
Beispiel 2
Das Device „WZ_Haengelampe“ jeden Tag um 17 Uhr auf Rot schalten (FF0000), Montag bis Donnerstag um 22 Uhr auf Grün schalten (00FF00) und vom Freitag und Sonntag die Lampe um 23 Uhr auf Blau schalten (0000FF):
define WZ_Licht WeekdayTimer WZ_Haengelampe 17:00|FF0000 Mo-Th|22:00|00FF00 Fr-Su|23:00|0000FF {fhem("set $NAME rgb $EVENT")}
Beispiel 3
Den Zufallstimer „ZufallsTimerWZ“ für die Anwesenheitssimulation jeden Abend um 16 Uhr aktivieren und um 23:30 deaktivieren, aber nur wenn das ROOMMATE-Device „Daniel“ nicht zuhause ist („absent“).
define aktiviereTimer WeekdayTimer ZufallsTimerWZ 16:00|on 23:30|off (ReadingsVal("Daniel", "state", "") eq "absent")
Weitere Beispiele gibt es in der Command-Ref zum Modul.
Wie ihr bemerkt, lassen sich mit dem Modul sehr schnell simple Zeitschaltuhren definieren. Es lassen sich für jeden Tag eigene Profile definieren und auch etwas komplexere Befehle festlegen. Wer jedoch ein bisschen mehr „Zufall“ in die Sache bringen möchte, dem empfehle ich das Modul „RandomTimer“.Â
Hallo Daniel,
habe gerade Deine Seite gefunden 😉
Ich versuche per weekdayTimer meine Hue zu schalten. Leider ist mir die Syntax nicht klar.
Im Prinzip möchte ich zum Einschaltzeitpunkt die Farbe und Helligkeit meiner Philips-LCT010-1-A19ECLv4 schalten.
Kannst Du mir einen Tipp geben, wie die Syntax aussieht? Also einschalten, Helligkeit und Farbe festlegen? Das wären ja 3? Befehle zum absetzen..
z.B. Die Lampe soll in Rot mit einer Helligkeit von 5% leuchten..
Im Voraus vielen Dank wenn Du Lust/Zeit hättest hier eine Antwort zu geben..
Hallo Ralf,
freut mich, dass du den Weg hierher gefunden hast 😉
Der Syntax des Timers ist relativ simpel.
Mann gibt die ganzen Zeitpunkte an und das Event was dann passieren soll. Soll das Event ein einfacher „set-Befehl“ sein, so lautet die Syntax wie folgt:
define MyWeekdayTimer WeekdayTimer $name Mo-Fr|05:19|$event Mo-Fr|05:50|$event
define MyWeekdayTimer WeekdayTimer WZ_Papierlampe Mo-Fr|05:19|on Mo-Fr|05:50|off
In diesem Fall ist das Event also „on“ bzw. „off“. Es wird nun Mo-Fr um 05:19 der Befehl „set WZ_Papierlampe on“ abgesendet und um 05:50 der Befehl „set WZ_Papierlampe off“. Gibt man also nur die Zeitangaben mit dem gewünschten Events (hier on bzw. off) an, so wird dies als set-Befehl interpretiert und so auch ausgeführt, dieser set-Befehl hat folgende Syntax:
set $name $event
. $name steht für das Device, welches bei der Definition angegeben wurde – WZ_Papierlampe. In deinem Fall könntest du damit also nur die Lampe an- bzw. ausschalten. Da dies ja über ein einfachen set-Befehl mit der Syntax klappt.Die Farbe bzw. Helligkeit anzupassen, geht zwar auch über ein set-Befehl, aber dieser ist bisschen komplexer, zum Beispiel:
set WZ_Papierlampe rgb FF0000
Man muss dem WeekdayTimer also mitteilen, dass er nun rgb entsprechend setzen soll.
define MyWeekdayTimer WeekdayTimer WZ_Papierlampe Mo-Fr|05:19|FF0000 Mo-Fr|05:50|00FF00 {fhem("set $NAME rgb $EVENT")}
Durch die Erweiterung
{fhem("set $NAME rgb $EVENT")}
kann man nun den abzusetzenden Befehl etwas erweitern. In diesem Fall also das Setzen der Farbe (rgb).Aber wie du schon merkst, kann man in diesem Fall auch nur ein Befehl absetzen.
Durch einen kleinen Trick, kann man jedoch auch mehrer Befehle absetzen. Anstelle nun als $event ein wirkliches Event anzugeben, kann man natürlich auch einfach nur eine Zahl nehmen – 1, 2, 3 usw.
Und dann in der Erweiterung durch if-Abfragen abfragen, welcher Befehl nun abgesetzt werden soll.
Zum Zeitpunkt der Definition definiert man nun erstmal den WeekdayTimer mit den gewünschten Zeitpunkten und vergibt jeden unterschiedlichen „Status“ bzw. „$event“ eine Zahl. In diesem Fall also für Mo-Fr|05:19 den Status 1 und für Mo-Fr|05:50 2.
define MyWeekdayTimer WeekdayTimer WZ_Papierlampe Mo-Fr|05:19|1 Mo-Fr|05:50|2
Über den DEF-Editor fügt man nun die if-Abfragen hinzu (siehe Bild):
WZ_Papierlampe WZ_Papierlampe Mo-Fr|05:19|1 Mo-Fr|05:50|2 {
if($EVENT eq "1") {
fhem("set $NAME on");
fhem("set $NAME rgb FF0000");
}
if($EVENT eq "2") {
fhem("set $NAME off")}
}
Innerhalb der if-Abfragen kann man nun natürlich so viele FHEM-Befehle absetzen wir man möchte.
Hoffe ich konnte dir helfen und du kannst damit deinen Plan realisieren 😉
Gruß Daniel
Danke für die Hilfe Daniel..
Den Timer selbst bekomme ich ja hin (on/off) an bestimmten Tagen/Zeiten 😉
Ich verstehe nur nicht wie ich den Hue-Lampen ein set-Befehl mit mehreren Angaben schicken kann.. Also z.B. HueDevice1 .. soll Einschalten, Farbe z.B. Rot.. Helligkeit 5%
Hoops.. Vergiss den letzten Post.. Wer lesen kann ist klar im Vorteil.. Kannst gerne löschen.. Sorry
War gerade schon am antworten 🙂 Dachte ich mir schon, dass ich etwas zu weit ausgeholt habe, aber vielleicht hilft es ja noch anderen 😉
Gruß Daniel
Danke Deiner Hilfe funtzt es jetzt 😉
Nochmals vielen Dank!!!!
HUEDevice7 de {twilight(„myTwilight“,“sr_indoor“,“05:30″,“08:00″)}|2 {twilight(„myTwilight“,“ss_indoor“,“16:00″,“23:00″)}|1
if($EVENT eq „1“) {
fhem(„set $NAME rgb ed0000 : bri 3“);
}
if($EVENT eq „2“) {
fhem(„set $NAME off“)}
PS. Du hast ganz unten eine geschweifte Klammer zuviel in Deinem Beispiel 😉
Auf diese Syntax wäre ich in 100 Jahren nicht gekommen…. Cool!!!
Hallo Daniel,
super Erklärung. Vielen Dank!
Kann ich mit dem Modul auch eine DECT200 Steckdose die in FHEM eingebunden ist nach einem Wochenplan einschalten, und das basierend auf einem TX29DTH LaCrosse Funksensor der auch bereits in FHEM eingebunden ist?
Also eine Wochentag und Temperaturabhängige Schaltung eines Aktors?
Werde aus dem Commandref diesbezüglich nicht ganz schlau.
Mein erster Versuch sieht so aus:
Fussbodenheizung 567|07:20|on 567|20:30|off (ReadingsVal(„EG.Anbau“, „temperature“, „“) < 20)
Was ich gerne möchte ist dass Fr-So die Dect200 (steuert die Fussbodenheizung) eingeschaltet wird, wenn Temperatur unter 20 Grad ist. Ideal wäre es auch, wenn ich sie sich dann abschaltet wenn 21,5 erreicht sind. Den Rest der Woche soll eine Temperatur von 19,5 Grad gehalten werden.
Hast Du eine Idee wie ich das angehen kann?
Danke Ingo
Hallo Ingo,
danke für das Lob.
Aber auch ich habe zu Danken, du hast mich auf eine neue Idee für einen Blogbeitrag gebracht ?
Schau dir diesen Beitrag mal an. Hoffe ich kann dir damit helfen.
Gruß Daniel
Hi Daniel,
wie geil ist dass denn? Danke! Das hilft mir sehr.
Komme aber erst in den nächsten Tagen dazu es mir in Ruhe anzusehen und nach zubauen.
VG Ingo
Hallo 🙂 vielen Dank für den Timer! Klappt wunderbar 🙂
Ich hätte diesen gerne jedoch auch noch abhängig von dem Sonnenuntergang. Also schalte Mo-Fr an bei Sonnenuntergang, Aus um 23:00 Uhr. Sa-So schalte bei Sonnenuntergang an, um 24:00 aus.
Ist dies möglich oder gibt es sogar eine grafische darstellung mit so Bausteinen die man anklicken kann?
Danke :))