Weckautomation
Die Module ROOMMATE und GUEST können dazu genutzt werden, Bewohner und Gäste in FHEM als ein Device zu repräsentieren und durch Events deren Status zu erfassen bzw. zu ändern (beispielsweise durch das GEOFANCY Modul für Anwesenheitserkennung). Das zur Modulfamilie dazugehörige Modul RESIDENTS fasst die Status mehrerer Bewohner logisch zusammen.
Inzwischen unterstützen die Module auch bei der Erstellung einer Weckautomation, indem sie die Logik kapseln und häufig verwendete Standardfunktionen bereitstellen. Die Verwendung soll in diesem Artikel anhand eines Beispiels näher erläutert werden.
Was soll erreicht werden?
Hier ein kurzer Überblick über die Funktionen, die wir am Ende realisiert haben werden:
- 3 unterschiedliche Wecker
- 1 für Werktage Mo-Fr
- 1 für werktägliche Samstage
- 1 für Sonn- und Feiertage
- Automatischer Reset der Weckzeiten
- werktäglicher Wecker soll auf einen Standardwert zurückstellen, falls er mal verstellt wurde
- automatischer Reset des werktäglicher Weckers soll zeitweise abschaltbar sein
- nach einem Sonn- oder Feiertagen soll der automatische Reset des werktäglichen Weckers immer wieder eingeschaltet werden
- die Samstags- und Sonntags-Wecker sollen immer nach ihrer Ausführung resettet werden
- jeder Wecker startet eine Weckprogramm 30 Minuten vor der programmierten Zeit
- langsames hochfahren der Rollläden
- Wakeup Light über eine HUE Birne von Warmweiß/2000K zu Kaltweiß/5600K
- an Werktagen: Chillout Weckmusik wird langsam lauter gestellt
- Snooze Funktion über die SONOS Taste am Gerät an Werktagen (erneutes Play nach 5 Minuten)
- forciertes Aufstehen an Werktagen durch automatischen Wechsel des Bewohner Devices zu "awake" und dadurch starten der "aufgewacht sein" Prozesse (siehe unten)
- Starten des Weckprogramms nur bei tatsächlicher Anwesenheit des betroffenen Bewohners
- Ansage der Uhrzeit zur gewählten Weckzeit
- Prozess / Automation für
- bettfein machen: Lichtszene setzen, Chillout Musik in Schlafzimmer und Badezimmer abspielen
- schlafen legen: Ansage der eingestellten Weckzeit & Ausschalten aller Verbraucher
- aufgewacht sein: Ansage Raumluftqualität, Wettervorhersage; Lokalradio einschalten und in Räume verteilen; Küchenlicht an, HUE in Schlafzimmer mit Aufwach-Farbtemperatur
- Berücksichtigung / Steuerung des Haus Modus
- Wechsel zwischen Morgen-, Tag-, Abend- und Nacht-Modus entsprechend der Schlafgewohnheiten (zusätzlich zur Tageszeit abhängigen Steuerung/Umschaltung, die hier aber nicht Thema sein soll)
- Statuswerte, Events, Readings und Funktionen
- Wurde ein Wecker ausgelöst?
- Ist gerade ein Weckprogramm aktiv?
- Abbrechen/sofortiges beenden des Weckprogramms
- Verhindern von durch Fehlkonfiguration parallel ausgeführten Weckern für die selbe Person
- Welcher ist der nächste Wecker, der bis Mitternacht des nächsten Tages ausgeführt wird und wann ist das?
- Wann wurde ein Wecker zuletzt ausgeführt und welcher Wecker wurde überhaupt zuletzt ausgeführt?
- Wie viele Bewohner werden gerade geweckt?
- Wie viele Bewohner sind gerade aufgewacht?
- Schaltung bei erstem Bewohner, der geweckt wird
- Schaltung bei erstem Bewohner, der aufgewacht ist
- Statistik
- Wie lange dauerte der Schlaf des Bewohners?
- Wie lange war in dem Haus niemand wach?
Wichtig dabei zu erwähnen ist, dass die Prozesse so umgesetzt worden sind, dass Bewohner sowohl zeitgleich, als auch zeitversetzt oder komplett getrennt ins Bett gehen und aufwachen können. Dafür werden einige Schaltungen pro Bewohner und dessen Schlafzimmer vorgenommen und andere erst dann, wenn die RESIDENTS Bewohnergruppe einen bestimmten Status erreicht hat.
Notwendige Devices anlegen
RESIDENTS und ROOMMATE Devices
Wir starten mit einem RESIDENTS Device, um die Bewohner Status später logisch zusammenfassen zu können:
define rr_Bewohner RESIDENTS
Anschließend legen wir pro Bewohner ein ROOMMATE Device an. Dafür verwenden wir eine Funktion, die in RESIDENTS eingebaut ist und die Devices korrekt untereinander verbindet (die Reihenfolge, in der RESIDENTS und ROOMMATE/GUEST Geräte definiert werden, sind hier entscheidend). Der Einfachheit halber definieren wir in diesem Beispiel nur einen Bewohner.
set rr_Bewohner addRoommate Julian
Es wurde nun automatisch ein Device namens "rr_Julian" angelegt (abgeleitet aus dem angegebenen Vornamen aus dem addRoommate Befehl). Anschließend setzen wir einmalig den initialen Status für die Bewohner mittels set Befehl:
set rr_Julian home
Der automatische Wechsel des Status bei Anwesenheit/Abwesenheit wird hier nicht weiter thematisiert, hier sei auf den Artikel Anwesenheitserkennung verwiesen, insbesondere den GEOFANCY Teil.
Wecker Devices anlegen
Die Devices, über die die Weckzeit und das Weckverhalten eingestellt werden, sind eigentlich normale Dummy Devices. Das zugewiesene ROOMMATE/GUEST/RESIDENTS Device "versklavt" diese Geräte jedoch und führt bestimmte Befehle zur Wecksteuerung und -Verwaltung aus, sobald das Dummy-Device geändert wird. Der Vorteil dabei ist, dass man sich eine Menge eigenen Code und viele unterschiedliche Notify und Dummy Devices spart, was wiederum der Übersichtlichkeit zu Gute kommt.
Wir legen nun unsere drei Wecker für unseren Beispiel Bewohner an. Dafür führen wir einfach 3 mal den selben Befehl hintereinander aus:
set rr_Julian create wakeuptimer set rr_Julian create wakeuptimer set rr_Julian create wakeuptimer
In der Logdatei erscheinen verschiedene Meldungen über alle automatisch angelegte Devices inkl. Name und Typ:
2015.03.28 12:19:49 3: RESIDENTStk rr_Julian_wakeuptimer1: new notify macro device Macro_rr_Julian_wakeuptimer1 created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new at-device at_rr_Julian_wakeuptimer1 created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_gotosleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_gotosleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_asleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_awoken created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Bewohner_gotosleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Bewohner_gotosleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Bewohner_asleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created 2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Bewohner_awoken created 2015.03.28 12:19:51 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created 2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new notify macro device Macro_rr_Julian_wakeuptimer2 created 2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new at-device at_rr_Julian_wakeuptimer2 created 2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new notify macro device Macro_rr_Julian_wakeuptimer3 created 2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new at-device at_rr_Julian_wakeuptimer3 created
Als Rückgabe in FHEMWEB erhält man eine Meldung wie diese hier:
Dummy rr_Julian_wakeuptimer1 and other pending devices created and pre-configured. You may edit Macro_rr_Julian_wakeuptimer1 to define your wake-up actions and at_rr_Julian_wakeuptimer1 for optional at-device adjustments.
Wie man sieht wurden anfänglich eine ganze Menge von Notify-Macros und Watchdogs sowie ein at-Device pro Wecker angelegt. Dabei sind vor allem die Macro-Devices und die Wecker Dummy Devices interessant. Hier werden Weck- und Auslöseverhalten konfiguriert. die at- und Watchdog-Devices können aber für fortgeschrittene Nutzer beliebig angepasst werden. Auch die Dummy Devices können bis auf wenige Ausnahmen (Attribut "userattr") vollständig umkonfiguriert werden. Wer Devices umbenennt, sollte unbedingt darauf achten, dass auch das entsprechende Attribut im Wecker-Dummy-Device angepasst wird.
Allen Devices ist ein entsprechender Kommentar hinzugefügt, der dessen Funktion kurz erklärt. Alle Macros enthalten bereits ein Gerüst für den Weckprozess mit einigen Beispielen. Die Beispielschaltungen sind dabei noch auskommentiert. Nicht auskommentierter Code sollte als notwendiger Teil für die Weckautomation betrachtet werden und wird dort auch durch einen entsprechenden Kommentar erklärt.
Im Folgenden werden wir jetzt Schritt für Schritt das oben beschriebene Szenario konfigurieren.
Konfiguration des Auslöseverhaltens
In der Grundkonfiguration löst jeder Wecker sein eigenes Weckprogramm täglich zur voreingestellten Zeit aus. Dabei wird allerdings kein längeres Programm gestartet, sondern lediglich einmalig das im Attribut wakeupMacro hinterlegte Notify-Macro getriggert. Das ist in der Beispiel-Grundkonfiguration kein Problem und lässt lediglich einen Logfile Eintrag erstellen.
Als erstes möchten wir, dass alle 3 Timer das selbe Macro zum Wecken verwenden, damit wir den Code nur einmal pflegen müssen. Die anderen beiden Macros löschen wir anschließend:
attr rr_Julian_wakeuptimer2 wakeupMacro Macro_rr_Julian_wakeuptimer1 attr rr_Julian_wakeuptimer3 wakeupMacro Macro_rr_Julian_wakeuptimer1 delete Macro_rr_Julian_wakeuptimer2 delete Macro_rr_Julian_wakeuptimer3
Nun konfigurieren wir die Auslöseverhalten so, wie wir es oben vorgegeben haben:
Wake-up Timer 1
Wecker nur Mo-Fr auslösen:
attr rr_Julian_wakeuptimer1 wakeupDays 1,2,3,4,5
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:
attr rr_Julian_wakeuptimer1 wakeupHolidays andNoHoliday
Hinweis: Hierfür muss ein holiday-Device erstellt sein und in der global Config im Attribut 'holidays2we‘ verlinkt sein. Ansonsten erhält man beim setzen einer Weckzeit später entsprechende Fehlermeldungen, die darauf hinweisen.
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):
attr rr_Julian_wakeuptimer1 wakeupOffset 30
Aufstehen forcieren:
attr rr_Julian_wakeuptimer1 wakeupEnforce 1
Standard Weckzeit hinterlegen:
attr rr_Julian_wakeuptimer1 wakeupDefaultTime 07:30
Weckzeit nur an diesen Tagen automatisch zurückstellen:
attr rr_Julian_wakeuptimer1 wakeupResetdays 1,2,3,4,5
Hinweis: Ein Reset findet normalerweise täglich zur angegebenen Weckzeit statt; unabhängig davon, ob das Weckprogramm tatsächlich gestartet wird. Dies kann man auf bestimmte Tage einschränken. Wenn wir also beispielsweise am Freitag Abend bereits die Weckzeit für nächsten Montag einstellen, möchten wir nicht, dass diese am Samstag oder Sonntag wieder zurückgesetzt wird.
Zum einfacheren Aktivieren/Deaktivieren des Resets wollen wir ein weiteres Dummy nutzen:
attr rr_Julian_wakeuptimer1 wakeupResetSwitcher rr_Julian_wakeuptimer1_resetswitcher
Hinweis: Der Dummy-Gerätename kann frei gewählt werden. Sofern es nicht existiert wird es automatisch angelegt und vorkonfiguriert.
Wake-up Timer 2
Wecker nur Samstags auslösen:
attr rr_Julian_wakeuptimer2 wakeupDays 6
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:
attr rr_Julian_wakeuptimer2 wakeupHolidays andNoHoliday
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):
attr rr_Julian_wakeuptimer2 wakeupOffset 30
Aufstehen forcieren:
attr rr_Julian_wakeuptimer2 wakeupEnforce 1
Standard Weckzeit hinterlegen:
attr rr_Julian_wakeuptimer2 wakeupDefaultTime 09:30
Weckzeit nur an diesen Tagen automatisch zurückstellen:
attr rr_Julian_wakeuptimer2 wakeupResetdays 6
Wake-up Timer 3
Wecker nur Sonntags auslösen:
attr rr_Julian_wakeuptimer3 wakeupDays 0
Wecker zusätzlich auch an Feiertagen ausführen:
attr rr_Julian_wakeuptimer3 wakeupHolidays orHoliday
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):
attr rr_Julian_wakeuptimer3 wakeupOffset 30
Standard Weckzeit hinterlegen:
attr rr_Julian_wakeuptimer3 wakeupDefaultTime 10:30