Modul YAAHM: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
(→‎Umstellung Sommer- zu Winterzeit: weblink Zeitumstellung)
Markierungen: mobile edit mobile web edit
 
(74 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 11: Zeile 11:
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_YAAHM.pm.  
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_YAAHM.pm.  


=Allgemeines=
=Einführung=
Das Modul ''95_YAAHM.pm'' stellt eine komfortable Oberfläche bereit, um per Webinterface die zyklische Ausführung von Kommandos - mit Tages- und Wochenprofil - zu konfigurieren. Der Titel '''YAAHM''' ist das Akronym für ''Yet Another Auto Home Module'', denn es gibt ja schon verschiedene Module, die den Zeitablauf in einem SmartHome vereinfachen sollen. Warum also noch Eines ?
Viele Kommandos in FHEM orientieren sich an Tageszeiten. Beispielsweise sollen Rollläden zu Sonnenaufgang hochgefahren werden, morgens die Kaffeemaschine und die Heizung eingeschaltet und bei Sonnenuntergang kontrolliert werden, ob das Garagentor geschlossen ist. Jeder dieser Befehle könnte mit einem zeitgesteuerten at-Device definiert werden. Das Modul ''95_YAAHM.pm'' stellt für diese Aufgaben eine einheitliche und  komfortable zu steuernde Oberfläche bereit. Man benötigt somit nicht mehrere at, sondern sammelt alle Befehle in YAAHM. Der Titel '''YAAHM''' ist das Akronym für ''Yet Another Auto Home Module'', denn es gibt ja schon verschiedene Module, die den Zeitablauf in einem SmartHome vereinfachen sollen.  


Ganz einfach: Die Philosophie von YAAHM ist die einfache Bedienbarkeit im Frontend, mit Eingabefeldern und Visualisierungselementen - statt dabei Unmengen von Attributen zu setzen. Dafür gibt es verschiedene Begriffe zu verstehen.
Die Philosophie von YAAHM ist die einfache Bedienbarkeit im Frontend, mit Eingabefeldern und Visualisierungselementen und ohne Unmengen von Attributen. Dafür gilt es zunächst, verschiedene Begriffe zu verstehen.


== Tages-Typ ==
== Tages-Typ ==
Ohne weitere Angaben unterscheidet YAAHM die beiden Tagestypen Wochenende und Werktag.
Ein Tagestyp wird Befehle bestimmen, die im Laufe eines Tages ausgeführt werden sollen. Am Anfang eines Tages (nach Mitternacht) sollen beispielsweise doppelte Einträge in einer Datenbank gelöscht werden, zu Sonnenaufgang werden Rollläden hochgefahren und zur Weckzeit schaltet sich die Kaffeemaschine ein. Dabei soll man aber bei den einzelnen Befehlen unterscheiden können, ob wir einen Arbeitstag, ein Wochenende oder einen Feiertag haben: An einem Werktag soll der Rollladen zu Sonnenaufgang hochfahren, an einem Feiertag dagegen erst später.
Durch das Setzen der Attribute ''vacationDevices'' und ''holidayDevices'', die jeweils eine komma-separierte Liste aus holiday-Devices oder Calendar-Devices sein können, holt YAAHM sich jeden Morgen kurz nach Mitternacht noch weitere Informationen. Nämlich, ob es sich um einen Ferientag (vacation) oder einen Feiertag (holiday) handelt. Der letztendliche Tagestyp wird dann in einer Priorisierung festgelegt: Feiertag hat die höchste Priorität, gefolgt von Wochenende, Ferientag und Werktag.


Für jedes Wochen-Profil kann man angeben, ob es auch an einem Ferientag (=Fer) und an einem Feiertag (=Fei) gültig sein soll, siehe [[#Einstellung der Wochen-Profile | Wochen-Profile]].
In YAAHM wird dies durch Tagestypen gelöst. Es sind immer die beiden Tagestypen ''Wochenende'' und ''Werktag'' definiert. Weitere Tagestypen, die dann die Steuerung anderer Befehle erlauben, kann man mit den Attributen ''vacationDevices'' (für Ferientage) und ''holidayDevices'' (Feiertage) hinzufügen. Dabei ist jeweils eine Semikolon-separierte Liste aus holiday-Devices oder Calendar-Devices anzugeben (da die Eingaben direkt in fhem("") eingetragen werden, sind die Regeln der [[Klammerebenen]] zu beachten). Der letztendliche Tagestyp wird dann in einer Priorisierung festgelegt: ''Feiertag'' hat die höchste Priorität, gefolgt von ''Wochenende'', ''Ferientag'' und ''Werktag''. Welcher Tagestyp vorliegt, wird durch YAAHM jeden Morgen kurz nach Mitternacht fixiert.


== Tages-Profil ==
== Tages-Profil ==
Das Tagesprofil besteht aus einer Kette von Ereignissen (Events), die an jedem Tag zeitgesteuert ablaufen. Welcher Event als letztes durchgeführt wurde, steht im Reading '''housetime''', der vorhergehende Event im Reading ''prev_housetime'' und der vom gegenwärtigen Zeitpunkt aus nächste Event im Reading ''next_housetime''. Für jedes Event kann eine Liste von FHEM-Kommandos angegeben werden, die dann ausgeführt werden.
Das Tagesprofil besteht aus einer Kette von Ereignissen, die an jedem Tag aufeinander folgen. Für jedes Ereignis kann eine Liste von FHEM-Kommandos angegeben werden, die dann ausgeführt werden. Welches Ereignis als Letztes eintrat, steht im Reading '''housetime''', das vorhergehende Ereignis im Reading ''prev_housetime'' und das vom gegenwärtigen Zeitpunkt aus nächste Ereignis im Reading ''next_housetime''.  


Die vordefinierten Events umfassen
Wenn man mit jedem eingetretenen Ereignis eine weitere selbst definierte Funktion ausführen möchte, kann man dazu das folgende Attribut verwenden
*''Nach Mitternacht'' und ''Vor Mitternacht'' (aftermidnight, beforemidnight) sind Events, die mit einem Offset an jedem Tag nach bzw. vor Mitternacht ausgeführt werden.
attr <Modulname> timehelper {hier_die_Perl_Funktion_eintragen(Argumente)}
*''Sonnenaufgang'', ''Vor Sonnenaufgang'' und ''Nach Sonnenaufgang'' (sunrise, beforesunrise, aftersunrise) sind Events, die an jedem Tag zu Sonnenaufgang bzw. mit einem Offset davor und danach ausgeführt werden. Der Zeitpunkt des Sonnenaufgangs wird aus dem Modul 95_Astro.pm berechnet.
Die angegebene Perl-Hilfsfunktion wird dann bei jedem Ereignis aufgerufen. Die entsprechenden Argumente, die je nach aktueller Zeit vom Modul automatisch eingefügt werden, lauten dann wie folgt (siehe auch [[#Attribute | Attribute]]):
*''Sonnenuntergang'', ''Vor Sonnenuntergang'' und ''Nach Sonnenuntergang'' (sunset, beforesunset, aftersunset) sind Events, die an jedem Tag zu Sonnenuntergang bzw. mit einem Offset davor und danach ausgeführt werden. Der Zeitpunkt des Sonnenuntergangs wird aus dem Modul 95_Astro.pm berechnet.
 
*''Morgen'', ''Mittag'', ''Nachmittag'', ''Abend'' und ''Nacht'' (morning, noon, afternoon, evening, night) sind Events, die zu einer einstellbaren Zeit an jedem Tag ausgeführt werden.
*aftermidnight, beforemidnight: ''Nach Mitternacht'' und ''Vor Mitternacht'' sind Ereignisse, die mit einem Offset an jedem Tag nach bzw. vor Mitternacht ausgeführt werden.
Das Reading '''housephase''' nimmt zwischen ''Morgen'' und ''Nacht'' den Wert ''Tageszeit'' an, sonst den Wert ''Nachtzeit''.
*sunrise, beforesunrise, aftersunrise: ''Sonnenaufgang'', ''Vor Sonnenaufgang'' und ''Nach Sonnenaufgang'' sind Ereignisse, die an jedem Tag zu Sonnenaufgang bzw. mit einem Offset davor und danach ausgeführt werden. Der Zeitpunkt des Sonnenaufgangs wird aus dem Modul 95_Astro.pm berechnet. Mit dem Attribut ''sunrise'' kann ausgewählt werden, welcher Horizontwinkel für den Sonnenaufgang genommen wird, siehe dort.
*''Wecken'' und ''Schlafen'' (wakeup,sleep) sind Events, die durch die beiden Standard-Wochenprofile gleichen Namens ausgelöst werden. Die entsprechenden Zeiten können von Tag zu Tag beliebig variieren.
*sunset, beforesunset, aftersunset: ''Sonnenuntergang'', ''Vor Sonnenuntergang'' und ''Nach Sonnenuntergang'' sind Ereignisse, die an jedem Tag zu Sonnenuntergang bzw. mit einem Offset davor und danach ausgeführt werden. Der Zeitpunkt des Sonnenuntergangs wird aus dem Modul 95_Astro.pm berechnet. Mit dem Attribut ''sunset'' kann ausgewählt werden, welcher Horizontwinkel für den Sonnenuntergang genommen wird, siehe dort.
*morning, noon, afternoon, evening, night: ''Morgen'', ''Mittag'', ''Nachmittag'', ''Abend'' und ''Nacht'' sind Ereignisse, die zu einer einstellbaren Zeit an jedem Tag ausgeführt werden. Das Reading '''housephase''' nimmt zwischen ''Morgen'' und ''Nacht'' den Wert ''Tageszeit'' an, sonst den Wert ''Nachtzeit''.
*wakeup, sleep: ''Wecken'' und ''Schlafen'' sind Ereignisse, die durch die beiden Standard-Wochenprofile gleichen Namens ausgelöst werden. Die entsprechenden Zeiten können von Tag zu Tag beliebig variieren.


== Wochen-Profile ==
== Wochen-Profile ==
Jedes Wochenprofil besteht aus einem Ereignis (Event) je Wochentag. Für dieses Event kann eine Liste von FHEM-Kommandos angegeben werden, die dann ausgeführt werden. Zwei Standard-Wochenprofile ''Wecken'' und ''Schlafen'' sind vordefiniert und können nicht gelöscht werden. Eine beliebige Anzahl weiterer Wochenprofile kann angelegt und wieder gelöscht werden.  
Es gibt Ereignisse, die an jedem Wochentag ausgeführt werden sollen. Allerdings variiert möglicherweise die Startzeit je Wochentag. Beispielsweise soll an jedem Tag der Woche das Gartentor öffnen; Montags soll dies aber um 5:40, dienstags um 5:50 und Mittwochs bis Freitags um 6:10 geschehen, am Wochenende soll das Gartentor geschlossen bleiben. Da der Befehl an jedem Wochentag derselbe ist und nur die Startzeit variiert, eignet sich dafür das ''Wochenprofil''.
 
Für jedes Wochen-Profil kann man angeben, ob es auch an einem ''Urlaubstag'' (=Url) und an einem ''Feiertag'' (=Fei) gültig sein soll, siehe [[#Einstellung der Wochen-Profile | Wochen-Profile]].
 
Ein Wochenprofil definiert dabei diejenigen Ereignisse, die an jedem Wochentag ausgeführt werden sollen. Es ist möglich, mehrere Wochenprofile zu definieren. Zwei Standard-Wochenprofile ''Wecken'' und ''Schlafen'' sind vordefiniert und können nicht gelöscht werden; weitere Wochenprofile können angelegt und wieder gelöscht werden.  


Für jedes Wochenprofil kann eine '''manuelle Auslösezeit''' eingegeben werden. Ist diese später als der gegenwärtige Zeitpunkt, wird sie für den aktuellen Tag verwendet. Ist diese früher als der gegenwärtige Zeitpunkt, wird sie erst am nächsten Tag als Ausnahmezeit verwendet.
Für jedes Wochenprofil kann eine manuelle Auslösezeit (im Beispiel oben wären dies montags 5:40, dienstags 5:50, mittwochs bis freitags 6:10 sowie samstags und sonntags off) eingegeben werden. Ist die Auslösezeit später als der gegenwärtige Zeitpunkt, wird sie für den aktuellen Tag verwendet. Ist die Auslösezeit früher als der gegenwärtige Zeitpunkt, wird sie erst am nächsten Tag als Ausnahmezeit verwendet. Lautet die manuelle Auslösezeit 'off', wird der heutige Auslösezeitpunkt abgeschaltet, wenn er noch nicht verstrichen ist - sonst der morgige Auslösezeitpunkt. Nach Ausführung wird der manuelle Eintrag anscheinend nicht gelöscht.
 
Das Modul ermöglicht mit dem Attribut ''timeHelper'' die Angabe einer Perl-Hilfsfunktion, die für die beiden ersten (Standard-)Wochenprofile bei Eintritt des Events mit den entsprechenden Argumenten aufgerufen wird, siehe [[#Attribute | Attribute]].


== (Nutzungs-)Modus ==
== (Nutzungs-)Modus ==
Der '''housemode''' (bzw. (Nutzungs-)Modus) besagt, dass sich das SmartHome in einem der drei Modi ''Normal'', ''Party'' oder ''Abwesenheit'' befindet. Dabei bedeutet:
Der '''housemode''' (bzw. (Nutzungs-)Modus) besagt, dass sich das SmartHome in einem der vier Modi ''Normal'', ''Party'', ''Abwesenheit'' oder ''Nicht Stören'' befindet. Dabei bedeutet:
*''Normal'' = normale Tages- und Wochen-Profile werden angewandt, keine speziellen Anordnungen.
*''Normal'' (Readingswert normal) = normale Tages- und Wochen-Profile werden angewandt, keine speziellen Anordnungen.
*''Party'' = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen betreffend die Sicherheit und den Übergang in den Nachtzustand zu realisieren. Das Modul selbst sorgt dafür, dass im Party-Modus das SmartHome nicht in einen gesicherten Zustand versetzt werden kann.
*''Party'' (Readingswert party) = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen betreffend die Sicherheit und den Übergang in den Nachtzustand zu realisieren. Das Modul selbst sorgt dafür, dass im Party-Modus das SmartHome nicht in einen gesicherten Zustand versetzt werden kann.
**''Abwesenheit'' = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen zu realisieren.  
*''Abwesenheit'' (Readingswert absence) = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen zu realisieren.
*''Nicht Stören'' (Readingswert donotdisturb) = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen zu realisieren.  
Die Festsetzung des Modus bleibt bestehen, bis eine erneute manuelle Änderung durchgeführt wird. Ausnahme: Wenn das Attribut ''modeAuto'' gesetzt wird, kann sich der Modus auch bei bestimmten Events ändern.
Die Festsetzung des Modus bleibt bestehen, bis eine erneute manuelle Änderung durchgeführt wird. Ausnahme: Wenn das Attribut ''modeAuto'' gesetzt wird, kann sich der Modus auch bei bestimmten Events ändern.
Für jedes Wochen-Profil kann man angeben, ob es auch im Party-Modus (=Par) und bei Abwesenheit (=Abw) gültig sein soll, siehe [#Wochen-Profile].
Für jedes Wochen-Profil kann man angeben, ob es auch im Party-Modus (=Par) und bei Abwesenheit (=Abw) gültig sein soll, siehe [[#Einstellung der Wochen-Profile | Wochen-Profile]].
 
Das Modul ermöglicht mit dem Attribut ''modeHelper'' die Angabe einer Perl-Hilfsfunktion, die zu jedem Wechsel des Modus mit den entsprechenden Argumenten aufgerufen wird, siehe [[#Attribute | Attribute]]


== (Sicherheits-)Zustand ==
== (Sicherheits-)Zustand ==
Der '''housestate''' (bzw. (Sicherheits-)Zustand) besagt, dass sich das SmartHome in einem der vier Zustände ''Nicht gesichert'', ''Gesichert'', ''Geschützt'' oder ''Überwacht'' befindet. Die Festsetzung des Zustands bleibt bestehen, bis eine erneute manuelle Änderung durchgeführt wird. Ausnahme: Wenn das Attribut ''stateAuto'' gesetzt wird, kann sich der Zustand auch bei bestimmten Events ändern. Dabei bedeutet:
Der '''housestate''' (bzw. (Sicherheits-)Zustand) besagt, dass sich das SmartHome in einem der vier Zustände ''Nicht gesichert'', ''Gesichert'', ''Geschützt'' oder ''Überwacht'' befindet. Die Festsetzung des Zustands bleibt bestehen, bis eine erneute manuelle Änderung durchgeführt wird. Ausnahme: Wenn das Attribut ''stateAuto'' gesetzt wird, kann sich der Zustand auch bei bestimmten Events ändern. Dabei bedeutet (beispielsweise !)
**''Nicht gesichert'' =  
**''Ungesichert'' (Readingswert unsecured) = Türen sind unverschlossen, Fenster dürfen geöffnet sein
**''Gesichert'' =
**''Gesichert'' (Readingswert secured) = Türen sind verschlossen, Fenster dürfen nur in Ausnahmefällen geöffnet sein
**''Geschützt'' =
**''Geschützt'' (Readingswert protected) = Türen sind verschlossen, Fenster dürfen nur in Ausnahmefällen geöffnet sein, die Alarmanlage ist scharf geschaltet
**''Überwacht'' =
**''Überwacht'' (Readingswert guarded) = Türen sind verschlossen, Fenster dürfen nur in Ausnahmefällen geöffnet sein, die Alarmanlage ist scharf geschaltet, in regelmäßigen Abständen wird der Zustand des Hauses überprüft und bei Veränderungen irgendwie gemeldet. Vielleicht läuft auch noch eine Anwesenheitssimulation
 
Das Modul ermöglicht mit dem Attribut ''stateHelper'' die Angabe einer Perl-Hilfsfunktion, die zu jedem Wechsel des Zustands mit den entsprechenden Argumenten aufgerufen wird, siehe [[#Attribute | Attribute]]. Welche FHEM-Devices dabei geschaltet werden, muss also in dieser externen Hilfsfunktion angegeben werden.
 
Allerdings lässt sich in YAAHM der Schaltzustand dieser Devices periodisch überwachen. Sie werden dazu in das Attribut 'stateDevices' eingetragen, siehe unten.


=YAAHM-Device=
=YAAHM-Device=
==Installation==
YAAHM ist Bestandteil der FHEM-Distribution. Die Installation erfolgt über den Standard-Updatemechanisnmus. Zu YAAHM gehören das Modul 95_YAAHM.pm und die Datei yaahm.js in /fhem/www/pgm2
==Definition==
==Definition==
Das YAAHM_Device - hier mit dem Namen ''YYY'' versehen - selbst wird über
Das YAAHM-Device - hier mit dem Namen ''YYY'' versehen - selbst wird über
  define YYY YAAHM
  define YYY YAAHM
definiert. Diese Definition legt einen versteckten Raum "ProfileRoom" an, welcher über einen Weblink im oberen Menü des Webinterfaces erreichbar ist.  
definiert. Diese Definition legt einen versteckten Raum "ProfileRoom" an, welcher über einen Weblink im oberen Menü des Webinterfaces erreichbar ist.  
Zeile 65: Zeile 81:
Beim Anklicken des Begriffes ''Profile'' (eben der genannte Weblink) im oberen Menü des Webinterfaces wird dieser versteckte Raum angezeigt. Er enthält an erster Stelle das YAAHM-Device. Für die Konfiguration dieses Devices siehe den nächsten Abschnitt, für die Bedienung siehe den Abschnitt [Bedienung].
Beim Anklicken des Begriffes ''Profile'' (eben der genannte Weblink) im oberen Menü des Webinterfaces wird dieser versteckte Raum angezeigt. Er enthält an erster Stelle das YAAHM-Device. Für die Konfiguration dieses Devices siehe den nächsten Abschnitt, für die Bedienung siehe den Abschnitt [Bedienung].


==Konfiguration ==
==Set-Befehle ==
Das YAAHM-Device kennt die folgenden Set-Befehle (''YYY'' ist duch den tatsächlichen Device-Namen zu ersetzen):
Das YAAHM-Device kennt die folgenden Set-Befehle (''YYY'' ist duch den tatsächlichen Device-Namen zu ersetzen):
  set YYY time (after|before)midnight | [before|after]sunrise | [before|after]sunset | morning | noon | afternoon | evening | night | wakeup | sleep
  set YYY time (after|before)midnight | [before|after]sunrise | [before|after]sunset | morning | noon | afternoon | evening | night | wakeup | sleep
Zeile 71: Zeile 87:
  set YYY manualnext &lt;timernumber&gt; &lt;time&gt;
  set YYY manualnext &lt;timernumber&gt; &lt;time&gt;
  set YYY manualnext &lt;timername&gt; &lt;time&gt;
  set YYY manualnext &lt;timername&gt; &lt;time&gt;
Setzt die manuelle Auslösezeit für den Wochen-Timer, der durch die Angabe einer fortlaufenden Nummerierung (beginnend bei 0) oder seinen Namen identifiiert wird.  
Setzt die manuelle Auslösezeit für das Wochen-Profil (Timer genannt), das durch die Angabe einer fortlaufenden Nummerierung (beginnend bei 0) oder seinen Namen identifiziert wird. Das nicht löschbare Standard-Wochen-Profil ''Wecken'' hat die Timer-Nummer 0, das nicht löschbare Standard-Wochen-Profil ''Schlafen'' hat die Timer-Nummer 1.
  set YYY mode normal | party | absence
  set YYY mode normal | party | absence | donotdisturb
Setzt den (Nutzungs-)Modus des SmartHome
Setzt den (Nutzungs-)Modus des SmartHome
  set YYY state unsecured | secured | protected | guarded
  set YYY state unsecured | secured | protected | guarded
Setzt den (Sicherheits-)Zustand des SmartHome
Setzt den (Sicherheits-)Zustand des SmartHome
set YYY checkstate (0|5|10)
Führe die Überprüfung, ob alle stateDevices (siehe Attribute) für diesen (Sicherheits-)Zustand den richtigen Wert haben, manuell sofort oder mit 5 bzw. 10 Sekunden Verzögerung aus.
set YYY correctstate 
Führe für jedes stateDevice (siehe Attribute), das nicht den richtigen Wert hat, das FHEM-Kommando ''set <stateDevice> <sollzustand>'' aus.
  set YYY createWeekly &lt;string&gt;
  set YYY createWeekly &lt;string&gt;
  set YYY deleteWeekly &lt;string&gt;
  set YYY deleteWeekly &lt;string&gt;
Erzeuge oder entferne ein Wochen-Profil mit dem entsprechenden Namen.
Erzeuge oder entferne ein Wochen-Profil mit dem entsprechenden Namen. Die beiden Standard-Wochen-Profile ''Wecken'' und ''Schlafen'' können nicht gelöscht werden.
  set YYY locked  |unlocked
  set YYY locked  |unlocked
Sperre oder entsperre das Überschreiben der Timer
Sperre oder entsperre das Überschreiben der Timer, siehe [[#Sperrung | Sperrung]].
set YYY save | restore
Speichere die Daten persistent, oder hole sie aus der betreffenden Datei ''YAAHMFile'' (Achtung für Nutzer der configdb: Das File wird in der Datenbank abgelegt, nicht im Dateisystem).
 
==Get-Befehle==
Das YAAHM-Device kennt die folgenden Get-Befehle (''YYY'' ist duch den tatsächlichen Device-Namen zu ersetzen):
get YYY next &lt;timernumber&gt; 
get YYY next &lt;timername&gt; 
get YYY sayNext &lt;timernumber&gt; 
get YYY sayNext &lt;timername&gt; 
Holt die nächste Auslösezeit für das betreffende Wochen-Profil (Timer genannt). Mit dem Befehl ''next'' erfolgt das in einem Format, das für textuelle Ausgabegeräte geeignet ist, mit dem Befehl ''sayNext'' in einem Format, das für Sprach-Ausgabegeräte geeignet ist. Die Identifikation des Wochen-Profiles (Timer genannt) erfolgt durch die Angabe einer fortlaufenden Nummerierung (beginnend bei 0) oder seinen Namen. Das nicht löschbare Standard-Wochen-Profil ''Wecken'' hat die Timer-Nummer 0, das nicht löschbare Standard-Wochen-Profil ''Schlafen'' hat die Timer-Nummer 1.
  get YYY version
Gibt die Versionsnummer des Moduls zurück
get YYY template
Gibt Vorschläge für Helferfunktionen zurück.
 
==Attribute==
*Wenn das Attribut '''timeHelper''' auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld für das Tages-Profil und die Aktionsfelder der beiden ersten (=Standard-)Wochenprofile, verbunden mit dem Argument des entsprechenden Events. Einen entsprechenden Vorschlag für eine solche Helferfunktion kann man sich durch ''get YYY template'' anzeigen lassen.
 
*Wenn das Attribut '''modeHelper''' auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch die Ausführung dieser Funktion (verbunden mit dem Argument des entsprechenden Events) bei einem Wechsel des (Nutzungs-)Modus. Einen entsprechenden Vorschlag für eine solche Helferfunktion kann man sich durch ''get YYY template'' anzeigen lassen.
*Wenn das Attribut '''modeAuto''' auf 1 gesetzt wird, wechselt der (Nutzungs-)Modus automatisch zu bestimmten Events:
**Die Events ''sleep'' und ''morning'' bewirken, dass der Modus ''Party'' aufgehoben wird und wieder ''Normal'' ist.
**Der Event ''wakeup'' bewirkt, dass der Modus ''Abwesenheit'' aufgehoben wird und wieder ''Normal'' ist.
**Jeder Event bewirkt, dass der Modus ''Nicht Stören'' aufgehoben wird und wieder ''Normal'' ist.
 
*Wenn das Attribut '''norepeat''' auf 1 gesetzt wird, sind am gleichen Tage keine Wiederholungen eines (Wochen-)Timers aus dem Wochen-Profil möglich - allerdings werden manuelle Zeiten akzeptiert.
 
*Wenn das Attribut '''stateHelper''' auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch die Ausführung dieser Funktion (verbunden mit dem Argument des entsprechenden Events) bei einem Wechsel des (Sicherheits-)Zustands. Einen entsprechenden Vorschlag für eine solche Helferfunktion kann man sich durch ''get YYY template'' anzeigen lassen.
*Wenn das Attribut '''stateAuto''' auf 1 gesetzt wird, wechselt der (Sicherheits-)Zustand automatisch zu bestimmten Events:
**Wenn der Modus ''Normal'' ist und der Zustand ''Nicht gesichert'' ist, wird bei Eintritt der Events ''sleep'' oder ''night'' der Zustand auf ''Gesichert'' gesetzt.
**Wenn der Modus ''Party'' durch den Event ''sleep'' verlassen wurde, und der Zustand ''Nicht gesichert'' ist, wird der Zustand auf ''Gesichert'' gesetzt.
 
*Das Attribut '''sunrise''' kann die Werte ''SunRise'' (echter Sonnenaufgang, default), ''CivilTwilightMorning'' (Horizontwinkel -6°), ''NauticalTwilightMorning'' (Horizontwinkel -12°), ''AstroTwilightMorning'' (Horizontwinkel -18°) oder ''CustomTwilightMorning'' (beliebiger Horizontwinkel als Attribut im Astro-Device) annehmen. Damit wird bestimmt, welche Zeit tatsächlich als Sonnenaufgangszeit verwendet wird.
*Das Attribut '''sunset''' kann die Werte ''SunSet'' (echter Sonnenuntergang, default), ''CivilTwilightEvening'' (Horizontwinkel -6°), ''NauticalTwilightEvening'' (Horizontwinkel -12°), ''AstroTwilightEvening'' (Horizontwinkel -18°) oder ''CustomTwilightEvening'' (beliebiger Horizontwinkel als Attribut im Astro-Device) annehmen. Damit wird bestimmt, welche Zeit tatsächlich als Sonnenuntergangszeit verwendet wird.
 
*Das Attribut '''stateDevices''' enthält eine kommagetrennte Liste von FHEM-Devices, die jeweils gefolgt werden von den erwarteten ''state''-Readings (getrennt durch ein ":"-Zeichen) für die entsprechenden (Sicherheits-) Zustände, also z.B. für eine Haustür, die in den (Sicherheits-) Zuständen ''Gesichert'', ''Geschützt'' und ''Überwacht'' abgeschlossen sein soll:
HausTuer::locked:locked:locked:locked
**Ob die korrekte Stellung der jeweiligen Devices erreicht wurde, wird periodisch in jeweils '''stateInterval''' Minuten geprüft und in der [[#Zusammenfassung | Zusammenfassung]] angezeigt.
**Für jedes Device, dessen Zustand nicht der Vorgabe entspricht, wird die im Attribut '''stateWarning''' genannte Funktion mit den Argumenten ''Device'', ''Sollzustand'', ''Istzustand'' aufgerufen.
 
*'''linkname''' ist der Name für den Link im FHEM-Menü. Default: ''Profile''.
*'''hiddenroom''' ist der Name für den versteckten Raum, der das YAAHM-Device enthält. Default: ''ProfileRoom''
*'''lockstate''' ist der Sperrzustand für das Device, siehe [[#Sperrung | Sperrung]]
*Wenn das Attribut '''simulation''' auf 1 gesetzt wird, werden die Kommandos in den Aktionsfeldern nicht ausgeführt, sondern nur eine Log-Meldung geschrieben.
 
*'''holidayDevices''', '''vacationDevices''' und '''specialDevices''' sind attribute, die jeweils eine kommagetrennte Liste von FHEM-Devices enthalten. Diese dürfen vom Typ holiday oder vom Typ calendar sein.
**holidayDevices enthält die Liste der Feiertage (=höchste Tagespriorität)
**vacationDevices enthält die Liste der Schulferien (=dritthöchste Tagespriorität)
**specialDevices enthält eine Liste von Einzelterminen (z.B. der Müllabfuhr)
*Diese Kalenderdaten werden jeweils kurz nach Mitternacht eingelesen und in der [[#Zusammenfassung | Zusammenfassung]] angezeigt.


=Webinterface=
=Webinterface=
Zeile 87: Zeile 156:
Das Webinterface teilt sich in zwei Abschnitte: Die Übersicht (oder toptable), bestehend aus den beiden Flächen '''Aktion''' und '''Zusammenfassung''', sowie die Profilbereiche. Die Übersicht lässt sich auch separat als Weblink '''<YAAHM_Device-Name>_shortlink''' in einen beliebigen FHEM-Raum einbinden.
Das Webinterface teilt sich in zwei Abschnitte: Die Übersicht (oder toptable), bestehend aus den beiden Flächen '''Aktion''' und '''Zusammenfassung''', sowie die Profilbereiche. Die Übersicht lässt sich auch separat als Weblink '''<YAAHM_Device-Name>_shortlink''' in einen beliebigen FHEM-Raum einbinden.
===Aktion===
===Aktion===
[[Datei:action_2.png|600px|]]


[[Datei:action_2.png|600px|]]
Im Aktionsfeld werden links der aktuelle Mode (=housemode) und der aktuelle (Sicherheits-) Zustand (housestate) angezeigt. Das rote Kreuz beim Zustand besagt, dass nicht alle in dem Attribut '''stateDevices''' definierten FHEM-Devices im korrekten Zustand für diesen (Sicherheits-) Zustand sind. Im Feld rechts daneben befinden sich Buttons zum Wechsel von Mode und Zustand.
 
Unten befindet sich für jeden Wochentimer ein Eingabefeld für die 'nächste manuelle Auslösezeit'. Trägt man dort einen Wert ein, der für den heutigen Tag in der Vergangenheit liegt, wird dies als die nächste Auslösezeit am morgigen Tag interpretiert. Liegt der Wert für den heutigen Tag in der Zukunft, wird es als die nächste Auslösezeit am heutigen Tag interpretiert. Die Werte werden im Device gespeichert, sobald man das Feld verlässt.


===Zusammenfassung===
===Zusammenfassung===
Zeile 94: Zeile 166:
[[Datei:summary_2.png|600px|]]
[[Datei:summary_2.png|600px|]]


===Tages-Profil===
Hier werden in nicht-editierbarer Form die wichtigsten Daten für den gegenwärtigen und den darauffolgenden Tag angezeigt.
*Rechts oben die Liste der '''stateDevices'''. Wie man hier sieht, ist eine der Türen nicht geschlossen und somit der Zustand ''Gesichert'' nicht vollständig erfüllt. Es ist Aufgabe der externen Helferfunktionen, dies ggf. zu korrigieren.
 
 
==== Das YAAHM-Widget ====
 
[[Datei:YAAHM_widget_1.png|400px|]]
 
Dabei handelt es sich um eine dynamisch erzeugte SVG-Datei, die man auch in beliebige eigene Webseiten einbinden kann. Der Aufruf dafür lautet
<IP-Adresse:Port>/fhem/YAAHM_timewidget?name='<Device-Name>'&size='<breite>x<höhe>'
Selbstverständlich kann man das auch in einen eigenen Weblink einbauen.
Markiert sind auf diesem Kreis die ''housetime''-Events ''Sonnenaufgang'', ''Morgen'', ''Mittag'', ''Nachmittag'', ''Abend'', ''Sonnenuntergang'' und ''Nacht''. Die ''Tageszeit'' ist ferner durch einen türkisfarbenen Sektor gekennzeichnet, und Mitternacht ist immer "unten".
 
Die gegenwärtige Zeit (beim Aufruf !) wird in rot angezeigt.
 
Hinweis: Es ist angedacht, dieses Widget noch sehr viel interaktiver zu machen.
 
===Einstellung des Tages-Profils===


[[Datei:daily_2.png|600 px]]
[[Datei:daily_2.png|600 px]]
*Der Startbutton erzeugt einen externen Timer (mit dem DOIF-Modul), der auf die Zeiten der definierten ''housetime''-Events zugreift.
*Wenn dieser Timer erzeugt wurde, zeigt das Webinterface den entsprechenden Link an. Ein grüner Haken bedeutet, dass der Timer aktiv (enabled) ist, wenn er deaktiviert wurde (disabled), wird ein rotes Kreuz angezeigt.
*Die Aktionsfelder enthalten jeweils eine semikolon-getrennte List von FHEM-Befehlen, die bei Eintreten des Timer-Events abgearbeitet wird.
*Wenn das Attribut ''timeHelper'' auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld, verbunden mit dem Argument des entsprechenden Events.


==Einstellung der Wochen-Profile==
==Einstellung der Wochen-Profile==
Zeile 104: Zeile 197:
*Die Checkboxen Par und Abw geben an, ob das betreffende Wochen-Profil (und damit der Timer) auch in den Modi ''Party'' und ''Abwesenheit'' aktiv ist. Die Checkboxen Fer und Fei geben an, ob das betreffende Wochen-Profil (und damit der Timer) auch an den Tagestypen ''Ferientag'' und ''Feiertag'' aktiv ist.
*Die Checkboxen Par und Abw geben an, ob das betreffende Wochen-Profil (und damit der Timer) auch in den Modi ''Party'' und ''Abwesenheit'' aktiv ist. Die Checkboxen Fer und Fei geben an, ob das betreffende Wochen-Profil (und damit der Timer) auch an den Tagestypen ''Ferientag'' und ''Feiertag'' aktiv ist.
*Die Aktionsfelder enthalten jeweils eine komma-getrennte List von FHEM-Befehlen, die bei Eintreten des Timer-Events abgearbeitet wird.  
*Die Aktionsfelder enthalten jeweils eine komma-getrennte List von FHEM-Befehlen, die bei Eintreten des Timer-Events abgearbeitet wird.  
Wenn das Attribut ''timeHelper'' auf einen Perl-Funktionsnamen gesetzt wird, erfolgt bei den beiden ersten (=Standard-) Timern automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld, verbunden mit dem Argument ''wakeup'' oder ''sleep''.
*Wenn das Attribut ''timeHelper'' auf einen Perl-Funktionsnamen gesetzt wird, erfolgt bei den beiden ersten (=Standard-) Timern automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld, verbunden mit dem Argument ''wakeup'' oder ''sleep''.


==Konfiguration==
=Sonstiges=
===Sperrung===
==Sperrung==
Das Reading ''lockstate'' muss den Wert ''unlocked'' haben, damit durch Anklicken der Start-Buttons für die Timer diese auch gestartet werden. Das ist in der Regel beim ersten Laden des Moduls '''nicht''' der Fall, hierzu muss also das Reading von Hand auf den richtigen Wert gesetzt werden. Dazu muss der Befehl '''set ... unlocked''' ausgeführt werden.
Das Reading ''lockstate'' muss den Wert ''unlocked'' haben, damit durch Anklicken der Start-Buttons für die Timer diese auch gestartet werden. Das ist in der Regel beim ersten Laden des Moduls '''nicht''' der Fall, hierzu muss also das Reading von Hand auf den richtigen Wert gesetzt werden. Dazu muss der Befehl '''set ... unlocked''' ausgeführt werden.
==Umstellung Sommer- zu Winterzeit==
Das Reading Astro hat derzeit ein Problem, wenn von Sommer- zu Winterzeit umgestellt wird. Dann verrutscht die Aktualisierung des YAAHM-Geräts in den vorigen Tag und die Termine werden nicht korrekt synchronisiert. Um wieder in den Gleichklang zu kommen, genügt eine einmalige Ausführung des Befehls
set <YAAHM-Device> initialize
Siehe dazu https://forum.fhem.de/index.php?topic=74914.0

Aktuelle Version vom 28. März 2021, 19:53 Uhr

YAAHM
Zweck / Funktion
Das Modul stellt eine komfortable Oberfläche bereit, um per Webinterface die zyklische Ausführung von Kommandos - mit Tages- und Wochenprofil - zu konfigurieren
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Unterstuetzende Dienste
Modulname 95_YAAHM.pm
Ersteller Prof. Dr. Peter A. Henning
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_YAAHM.pm.

Einführung

Viele Kommandos in FHEM orientieren sich an Tageszeiten. Beispielsweise sollen Rollläden zu Sonnenaufgang hochgefahren werden, morgens die Kaffeemaschine und die Heizung eingeschaltet und bei Sonnenuntergang kontrolliert werden, ob das Garagentor geschlossen ist. Jeder dieser Befehle könnte mit einem zeitgesteuerten at-Device definiert werden. Das Modul 95_YAAHM.pm stellt für diese Aufgaben eine einheitliche und komfortable zu steuernde Oberfläche bereit. Man benötigt somit nicht mehrere at, sondern sammelt alle Befehle in YAAHM. Der Titel YAAHM ist das Akronym für Yet Another Auto Home Module, denn es gibt ja schon verschiedene Module, die den Zeitablauf in einem SmartHome vereinfachen sollen.

Die Philosophie von YAAHM ist die einfache Bedienbarkeit im Frontend, mit Eingabefeldern und Visualisierungselementen und ohne Unmengen von Attributen. Dafür gilt es zunächst, verschiedene Begriffe zu verstehen.

Tages-Typ

Ein Tagestyp wird Befehle bestimmen, die im Laufe eines Tages ausgeführt werden sollen. Am Anfang eines Tages (nach Mitternacht) sollen beispielsweise doppelte Einträge in einer Datenbank gelöscht werden, zu Sonnenaufgang werden Rollläden hochgefahren und zur Weckzeit schaltet sich die Kaffeemaschine ein. Dabei soll man aber bei den einzelnen Befehlen unterscheiden können, ob wir einen Arbeitstag, ein Wochenende oder einen Feiertag haben: An einem Werktag soll der Rollladen zu Sonnenaufgang hochfahren, an einem Feiertag dagegen erst später.

In YAAHM wird dies durch Tagestypen gelöst. Es sind immer die beiden Tagestypen Wochenende und Werktag definiert. Weitere Tagestypen, die dann die Steuerung anderer Befehle erlauben, kann man mit den Attributen vacationDevices (für Ferientage) und holidayDevices (Feiertage) hinzufügen. Dabei ist jeweils eine Semikolon-separierte Liste aus holiday-Devices oder Calendar-Devices anzugeben (da die Eingaben direkt in fhem("") eingetragen werden, sind die Regeln der Klammerebenen zu beachten). Der letztendliche Tagestyp wird dann in einer Priorisierung festgelegt: Feiertag hat die höchste Priorität, gefolgt von Wochenende, Ferientag und Werktag. Welcher Tagestyp vorliegt, wird durch YAAHM jeden Morgen kurz nach Mitternacht fixiert.

Tages-Profil

Das Tagesprofil besteht aus einer Kette von Ereignissen, die an jedem Tag aufeinander folgen. Für jedes Ereignis kann eine Liste von FHEM-Kommandos angegeben werden, die dann ausgeführt werden. Welches Ereignis als Letztes eintrat, steht im Reading housetime, das vorhergehende Ereignis im Reading prev_housetime und das vom gegenwärtigen Zeitpunkt aus nächste Ereignis im Reading next_housetime.

Wenn man mit jedem eingetretenen Ereignis eine weitere selbst definierte Funktion ausführen möchte, kann man dazu das folgende Attribut verwenden

attr <Modulname> timehelper {hier_die_Perl_Funktion_eintragen(Argumente)}

Die angegebene Perl-Hilfsfunktion wird dann bei jedem Ereignis aufgerufen. Die entsprechenden Argumente, die je nach aktueller Zeit vom Modul automatisch eingefügt werden, lauten dann wie folgt (siehe auch Attribute):

  • aftermidnight, beforemidnight: Nach Mitternacht und Vor Mitternacht sind Ereignisse, die mit einem Offset an jedem Tag nach bzw. vor Mitternacht ausgeführt werden.
  • sunrise, beforesunrise, aftersunrise: Sonnenaufgang, Vor Sonnenaufgang und Nach Sonnenaufgang sind Ereignisse, die an jedem Tag zu Sonnenaufgang bzw. mit einem Offset davor und danach ausgeführt werden. Der Zeitpunkt des Sonnenaufgangs wird aus dem Modul 95_Astro.pm berechnet. Mit dem Attribut sunrise kann ausgewählt werden, welcher Horizontwinkel für den Sonnenaufgang genommen wird, siehe dort.
  • sunset, beforesunset, aftersunset: Sonnenuntergang, Vor Sonnenuntergang und Nach Sonnenuntergang sind Ereignisse, die an jedem Tag zu Sonnenuntergang bzw. mit einem Offset davor und danach ausgeführt werden. Der Zeitpunkt des Sonnenuntergangs wird aus dem Modul 95_Astro.pm berechnet. Mit dem Attribut sunset kann ausgewählt werden, welcher Horizontwinkel für den Sonnenuntergang genommen wird, siehe dort.
  • morning, noon, afternoon, evening, night: Morgen, Mittag, Nachmittag, Abend und Nacht sind Ereignisse, die zu einer einstellbaren Zeit an jedem Tag ausgeführt werden. Das Reading housephase nimmt zwischen Morgen und Nacht den Wert Tageszeit an, sonst den Wert Nachtzeit.
  • wakeup, sleep: Wecken und Schlafen sind Ereignisse, die durch die beiden Standard-Wochenprofile gleichen Namens ausgelöst werden. Die entsprechenden Zeiten können von Tag zu Tag beliebig variieren.

Wochen-Profile

Es gibt Ereignisse, die an jedem Wochentag ausgeführt werden sollen. Allerdings variiert möglicherweise die Startzeit je Wochentag. Beispielsweise soll an jedem Tag der Woche das Gartentor öffnen; Montags soll dies aber um 5:40, dienstags um 5:50 und Mittwochs bis Freitags um 6:10 geschehen, am Wochenende soll das Gartentor geschlossen bleiben. Da der Befehl an jedem Wochentag derselbe ist und nur die Startzeit variiert, eignet sich dafür das Wochenprofil.

Für jedes Wochen-Profil kann man angeben, ob es auch an einem Urlaubstag (=Url) und an einem Feiertag (=Fei) gültig sein soll, siehe Wochen-Profile.

Ein Wochenprofil definiert dabei diejenigen Ereignisse, die an jedem Wochentag ausgeführt werden sollen. Es ist möglich, mehrere Wochenprofile zu definieren. Zwei Standard-Wochenprofile Wecken und Schlafen sind vordefiniert und können nicht gelöscht werden; weitere Wochenprofile können angelegt und wieder gelöscht werden.

Für jedes Wochenprofil kann eine manuelle Auslösezeit (im Beispiel oben wären dies montags 5:40, dienstags 5:50, mittwochs bis freitags 6:10 sowie samstags und sonntags off) eingegeben werden. Ist die Auslösezeit später als der gegenwärtige Zeitpunkt, wird sie für den aktuellen Tag verwendet. Ist die Auslösezeit früher als der gegenwärtige Zeitpunkt, wird sie erst am nächsten Tag als Ausnahmezeit verwendet. Lautet die manuelle Auslösezeit 'off', wird der heutige Auslösezeitpunkt abgeschaltet, wenn er noch nicht verstrichen ist - sonst der morgige Auslösezeitpunkt. Nach Ausführung wird der manuelle Eintrag anscheinend nicht gelöscht.

Das Modul ermöglicht mit dem Attribut timeHelper die Angabe einer Perl-Hilfsfunktion, die für die beiden ersten (Standard-)Wochenprofile bei Eintritt des Events mit den entsprechenden Argumenten aufgerufen wird, siehe Attribute.

(Nutzungs-)Modus

Der housemode (bzw. (Nutzungs-)Modus) besagt, dass sich das SmartHome in einem der vier Modi Normal, Party, Abwesenheit oder Nicht Stören befindet. Dabei bedeutet:

  • Normal (Readingswert normal) = normale Tages- und Wochen-Profile werden angewandt, keine speziellen Anordnungen.
  • Party (Readingswert party) = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen betreffend die Sicherheit und den Übergang in den Nachtzustand zu realisieren. Das Modul selbst sorgt dafür, dass im Party-Modus das SmartHome nicht in einen gesicherten Zustand versetzt werden kann.
  • Abwesenheit (Readingswert absence) = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen zu realisieren.
  • Nicht Stören (Readingswert donotdisturb) = kann in Hilfsfunktionen verwendet werden, um spezielle Anordnungen zu realisieren.

Die Festsetzung des Modus bleibt bestehen, bis eine erneute manuelle Änderung durchgeführt wird. Ausnahme: Wenn das Attribut modeAuto gesetzt wird, kann sich der Modus auch bei bestimmten Events ändern. Für jedes Wochen-Profil kann man angeben, ob es auch im Party-Modus (=Par) und bei Abwesenheit (=Abw) gültig sein soll, siehe Wochen-Profile.

Das Modul ermöglicht mit dem Attribut modeHelper die Angabe einer Perl-Hilfsfunktion, die zu jedem Wechsel des Modus mit den entsprechenden Argumenten aufgerufen wird, siehe Attribute

(Sicherheits-)Zustand

Der housestate (bzw. (Sicherheits-)Zustand) besagt, dass sich das SmartHome in einem der vier Zustände Nicht gesichert, Gesichert, Geschützt oder Überwacht befindet. Die Festsetzung des Zustands bleibt bestehen, bis eine erneute manuelle Änderung durchgeführt wird. Ausnahme: Wenn das Attribut stateAuto gesetzt wird, kann sich der Zustand auch bei bestimmten Events ändern. Dabei bedeutet (beispielsweise !)

    • Ungesichert (Readingswert unsecured) = Türen sind unverschlossen, Fenster dürfen geöffnet sein
    • Gesichert (Readingswert secured) = Türen sind verschlossen, Fenster dürfen nur in Ausnahmefällen geöffnet sein
    • Geschützt (Readingswert protected) = Türen sind verschlossen, Fenster dürfen nur in Ausnahmefällen geöffnet sein, die Alarmanlage ist scharf geschaltet
    • Überwacht (Readingswert guarded) = Türen sind verschlossen, Fenster dürfen nur in Ausnahmefällen geöffnet sein, die Alarmanlage ist scharf geschaltet, in regelmäßigen Abständen wird der Zustand des Hauses überprüft und bei Veränderungen irgendwie gemeldet. Vielleicht läuft auch noch eine Anwesenheitssimulation

Das Modul ermöglicht mit dem Attribut stateHelper die Angabe einer Perl-Hilfsfunktion, die zu jedem Wechsel des Zustands mit den entsprechenden Argumenten aufgerufen wird, siehe Attribute. Welche FHEM-Devices dabei geschaltet werden, muss also in dieser externen Hilfsfunktion angegeben werden.

Allerdings lässt sich in YAAHM der Schaltzustand dieser Devices periodisch überwachen. Sie werden dazu in das Attribut 'stateDevices' eingetragen, siehe unten.

YAAHM-Device

Installation

YAAHM ist Bestandteil der FHEM-Distribution. Die Installation erfolgt über den Standard-Updatemechanisnmus. Zu YAAHM gehören das Modul 95_YAAHM.pm und die Datei yaahm.js in /fhem/www/pgm2

Definition

Das YAAHM-Device - hier mit dem Namen YYY versehen - selbst wird über

define YYY YAAHM

definiert. Diese Definition legt einen versteckten Raum "ProfileRoom" an, welcher über einen Weblink im oberen Menü des Webinterfaces erreichbar ist.

  • Der Name dieses Raumes kann durch das Attribut hiddenRoom geändert werden.
  • Dieses Modul verwendet das globale Attribut language zur Bestimmung der Anzeigedaten (Standard: EN=english). Für deutsche Ausgabedaten muss in FHEM das Attribut
attr global language DE

gesetzt werden. Für dieses Wiki werden die deutschen Ausgabedaten verwendet.

Beim Anklicken des Begriffes Profile (eben der genannte Weblink) im oberen Menü des Webinterfaces wird dieser versteckte Raum angezeigt. Er enthält an erster Stelle das YAAHM-Device. Für die Konfiguration dieses Devices siehe den nächsten Abschnitt, für die Bedienung siehe den Abschnitt [Bedienung].

Set-Befehle

Das YAAHM-Device kennt die folgenden Set-Befehle (YYY ist duch den tatsächlichen Device-Namen zu ersetzen):

set YYY time (after|before)midnight | [before|after]sunrise | [before|after]sunset | morning | noon | afternoon | evening | night | wakeup | sleep

Erzeugt manuell den entsprechenden Event.

set YYY manualnext <timernumber> <time>
set YYY manualnext <timername> <time>

Setzt die manuelle Auslösezeit für das Wochen-Profil (Timer genannt), das durch die Angabe einer fortlaufenden Nummerierung (beginnend bei 0) oder seinen Namen identifiziert wird. Das nicht löschbare Standard-Wochen-Profil Wecken hat die Timer-Nummer 0, das nicht löschbare Standard-Wochen-Profil Schlafen hat die Timer-Nummer 1.

set YYY mode normal | party | absence | donotdisturb

Setzt den (Nutzungs-)Modus des SmartHome

set YYY state unsecured | secured | protected | guarded

Setzt den (Sicherheits-)Zustand des SmartHome

set YYY checkstate (0|5|10)

Führe die Überprüfung, ob alle stateDevices (siehe Attribute) für diesen (Sicherheits-)Zustand den richtigen Wert haben, manuell sofort oder mit 5 bzw. 10 Sekunden Verzögerung aus.

set YYY correctstate  

Führe für jedes stateDevice (siehe Attribute), das nicht den richtigen Wert hat, das FHEM-Kommando set <stateDevice> <sollzustand> aus.

set YYY createWeekly <string>
set YYY deleteWeekly <string>

Erzeuge oder entferne ein Wochen-Profil mit dem entsprechenden Namen. Die beiden Standard-Wochen-Profile Wecken und Schlafen können nicht gelöscht werden.

set YYY locked  |unlocked

Sperre oder entsperre das Überschreiben der Timer, siehe Sperrung.

set YYY save | restore

Speichere die Daten persistent, oder hole sie aus der betreffenden Datei YAAHMFile (Achtung für Nutzer der configdb: Das File wird in der Datenbank abgelegt, nicht im Dateisystem).

Get-Befehle

Das YAAHM-Device kennt die folgenden Get-Befehle (YYY ist duch den tatsächlichen Device-Namen zu ersetzen):

get YYY next <timernumber>  
get YYY next <timername>  
get YYY sayNext <timernumber>  
get YYY sayNext <timername>  

Holt die nächste Auslösezeit für das betreffende Wochen-Profil (Timer genannt). Mit dem Befehl next erfolgt das in einem Format, das für textuelle Ausgabegeräte geeignet ist, mit dem Befehl sayNext in einem Format, das für Sprach-Ausgabegeräte geeignet ist. Die Identifikation des Wochen-Profiles (Timer genannt) erfolgt durch die Angabe einer fortlaufenden Nummerierung (beginnend bei 0) oder seinen Namen. Das nicht löschbare Standard-Wochen-Profil Wecken hat die Timer-Nummer 0, das nicht löschbare Standard-Wochen-Profil Schlafen hat die Timer-Nummer 1.

 get YYY version

Gibt die Versionsnummer des Moduls zurück

get YYY template

Gibt Vorschläge für Helferfunktionen zurück.

Attribute

  • Wenn das Attribut timeHelper auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld für das Tages-Profil und die Aktionsfelder der beiden ersten (=Standard-)Wochenprofile, verbunden mit dem Argument des entsprechenden Events. Einen entsprechenden Vorschlag für eine solche Helferfunktion kann man sich durch get YYY template anzeigen lassen.
  • Wenn das Attribut modeHelper auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch die Ausführung dieser Funktion (verbunden mit dem Argument des entsprechenden Events) bei einem Wechsel des (Nutzungs-)Modus. Einen entsprechenden Vorschlag für eine solche Helferfunktion kann man sich durch get YYY template anzeigen lassen.
  • Wenn das Attribut modeAuto auf 1 gesetzt wird, wechselt der (Nutzungs-)Modus automatisch zu bestimmten Events:
    • Die Events sleep und morning bewirken, dass der Modus Party aufgehoben wird und wieder Normal ist.
    • Der Event wakeup bewirkt, dass der Modus Abwesenheit aufgehoben wird und wieder Normal ist.
    • Jeder Event bewirkt, dass der Modus Nicht Stören aufgehoben wird und wieder Normal ist.
  • Wenn das Attribut norepeat auf 1 gesetzt wird, sind am gleichen Tage keine Wiederholungen eines (Wochen-)Timers aus dem Wochen-Profil möglich - allerdings werden manuelle Zeiten akzeptiert.
  • Wenn das Attribut stateHelper auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch die Ausführung dieser Funktion (verbunden mit dem Argument des entsprechenden Events) bei einem Wechsel des (Sicherheits-)Zustands. Einen entsprechenden Vorschlag für eine solche Helferfunktion kann man sich durch get YYY template anzeigen lassen.
  • Wenn das Attribut stateAuto auf 1 gesetzt wird, wechselt der (Sicherheits-)Zustand automatisch zu bestimmten Events:
    • Wenn der Modus Normal ist und der Zustand Nicht gesichert ist, wird bei Eintritt der Events sleep oder night der Zustand auf Gesichert gesetzt.
    • Wenn der Modus Party durch den Event sleep verlassen wurde, und der Zustand Nicht gesichert ist, wird der Zustand auf Gesichert gesetzt.
  • Das Attribut sunrise kann die Werte SunRise (echter Sonnenaufgang, default), CivilTwilightMorning (Horizontwinkel -6°), NauticalTwilightMorning (Horizontwinkel -12°), AstroTwilightMorning (Horizontwinkel -18°) oder CustomTwilightMorning (beliebiger Horizontwinkel als Attribut im Astro-Device) annehmen. Damit wird bestimmt, welche Zeit tatsächlich als Sonnenaufgangszeit verwendet wird.
  • Das Attribut sunset kann die Werte SunSet (echter Sonnenuntergang, default), CivilTwilightEvening (Horizontwinkel -6°), NauticalTwilightEvening (Horizontwinkel -12°), AstroTwilightEvening (Horizontwinkel -18°) oder CustomTwilightEvening (beliebiger Horizontwinkel als Attribut im Astro-Device) annehmen. Damit wird bestimmt, welche Zeit tatsächlich als Sonnenuntergangszeit verwendet wird.
  • Das Attribut stateDevices enthält eine kommagetrennte Liste von FHEM-Devices, die jeweils gefolgt werden von den erwarteten state-Readings (getrennt durch ein ":"-Zeichen) für die entsprechenden (Sicherheits-) Zustände, also z.B. für eine Haustür, die in den (Sicherheits-) Zuständen Gesichert, Geschützt und Überwacht abgeschlossen sein soll:
HausTuer::locked:locked:locked:locked
    • Ob die korrekte Stellung der jeweiligen Devices erreicht wurde, wird periodisch in jeweils stateInterval Minuten geprüft und in der Zusammenfassung angezeigt.
    • Für jedes Device, dessen Zustand nicht der Vorgabe entspricht, wird die im Attribut stateWarning genannte Funktion mit den Argumenten Device, Sollzustand, Istzustand aufgerufen.
  • linkname ist der Name für den Link im FHEM-Menü. Default: Profile.
  • hiddenroom ist der Name für den versteckten Raum, der das YAAHM-Device enthält. Default: ProfileRoom
  • lockstate ist der Sperrzustand für das Device, siehe Sperrung
  • Wenn das Attribut simulation auf 1 gesetzt wird, werden die Kommandos in den Aktionsfeldern nicht ausgeführt, sondern nur eine Log-Meldung geschrieben.
  • holidayDevices, vacationDevices und specialDevices sind attribute, die jeweils eine kommagetrennte Liste von FHEM-Devices enthalten. Diese dürfen vom Typ holiday oder vom Typ calendar sein.
    • holidayDevices enthält die Liste der Feiertage (=höchste Tagespriorität)
    • vacationDevices enthält die Liste der Schulferien (=dritthöchste Tagespriorität)
    • specialDevices enthält eine Liste von Einzelterminen (z.B. der Müllabfuhr)
  • Diese Kalenderdaten werden jeweils kurz nach Mitternacht eingelesen und in der Zusammenfassung angezeigt.

Webinterface

In diesem Abschnitt wird die Bedienung des Webinterfaces und damit die Konfiguration der Hausautomatik beschrieben. Um sie zu erreichen, klickt man auf den Begriff Profile im oberen Menü des Webinterfaces.

Das Webinterface teilt sich in zwei Abschnitte: Die Übersicht (oder toptable), bestehend aus den beiden Flächen Aktion und Zusammenfassung, sowie die Profilbereiche. Die Übersicht lässt sich auch separat als Weblink <YAAHM_Device-Name>_shortlink in einen beliebigen FHEM-Raum einbinden.

Aktion

Action 2.png

Im Aktionsfeld werden links der aktuelle Mode (=housemode) und der aktuelle (Sicherheits-) Zustand (housestate) angezeigt. Das rote Kreuz beim Zustand besagt, dass nicht alle in dem Attribut stateDevices definierten FHEM-Devices im korrekten Zustand für diesen (Sicherheits-) Zustand sind. Im Feld rechts daneben befinden sich Buttons zum Wechsel von Mode und Zustand.

Unten befindet sich für jeden Wochentimer ein Eingabefeld für die 'nächste manuelle Auslösezeit'. Trägt man dort einen Wert ein, der für den heutigen Tag in der Vergangenheit liegt, wird dies als die nächste Auslösezeit am morgigen Tag interpretiert. Liegt der Wert für den heutigen Tag in der Zukunft, wird es als die nächste Auslösezeit am heutigen Tag interpretiert. Die Werte werden im Device gespeichert, sobald man das Feld verlässt.

Zusammenfassung

Summary 2.png

Hier werden in nicht-editierbarer Form die wichtigsten Daten für den gegenwärtigen und den darauffolgenden Tag angezeigt.

  • Rechts oben die Liste der stateDevices. Wie man hier sieht, ist eine der Türen nicht geschlossen und somit der Zustand Gesichert nicht vollständig erfüllt. Es ist Aufgabe der externen Helferfunktionen, dies ggf. zu korrigieren.


Das YAAHM-Widget

YAAHM widget 1.png

Dabei handelt es sich um eine dynamisch erzeugte SVG-Datei, die man auch in beliebige eigene Webseiten einbinden kann. Der Aufruf dafür lautet

<IP-Adresse:Port>/fhem/YAAHM_timewidget?name='<Device-Name>'&size='<breite>x<höhe>'

Selbstverständlich kann man das auch in einen eigenen Weblink einbauen. Markiert sind auf diesem Kreis die housetime-Events Sonnenaufgang, Morgen, Mittag, Nachmittag, Abend, Sonnenuntergang und Nacht. Die Tageszeit ist ferner durch einen türkisfarbenen Sektor gekennzeichnet, und Mitternacht ist immer "unten".

Die gegenwärtige Zeit (beim Aufruf !) wird in rot angezeigt.

Hinweis: Es ist angedacht, dieses Widget noch sehr viel interaktiver zu machen.

Einstellung des Tages-Profils

Daily 2.png

  • Der Startbutton erzeugt einen externen Timer (mit dem DOIF-Modul), der auf die Zeiten der definierten housetime-Events zugreift.
  • Wenn dieser Timer erzeugt wurde, zeigt das Webinterface den entsprechenden Link an. Ein grüner Haken bedeutet, dass der Timer aktiv (enabled) ist, wenn er deaktiviert wurde (disabled), wird ein rotes Kreuz angezeigt.
  • Die Aktionsfelder enthalten jeweils eine semikolon-getrennte List von FHEM-Befehlen, die bei Eintreten des Timer-Events abgearbeitet wird.
  • Wenn das Attribut timeHelper auf einen Perl-Funktionsnamen gesetzt wird, erfolgt automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld, verbunden mit dem Argument des entsprechenden Events.

Einstellung der Wochen-Profile

Weekly 2.png

  • Der Startbutton erzeugt externe Timer (mit dem DOIF-Modul), die auf das Reading ring_<timer-no> zugreifen. Dieses Reading wird jeweils kurs nach Mitternacht auf den korrekten Wert für den entsprechenden Tag gesetzt.
  • Wenn diese Timer erzeugt wurden, zeigt das Webinterface den entsprechenden Link an. Ein grüner Haken bedeutet, dass der Timer aktiv (enabled) ist, wenn er deaktiviert wurde (disabled), wird ein rotes Kreuz angezeigt.
  • Die Checkboxen Par und Abw geben an, ob das betreffende Wochen-Profil (und damit der Timer) auch in den Modi Party und Abwesenheit aktiv ist. Die Checkboxen Fer und Fei geben an, ob das betreffende Wochen-Profil (und damit der Timer) auch an den Tagestypen Ferientag und Feiertag aktiv ist.
  • Die Aktionsfelder enthalten jeweils eine komma-getrennte List von FHEM-Befehlen, die bei Eintreten des Timer-Events abgearbeitet wird.
  • Wenn das Attribut timeHelper auf einen Perl-Funktionsnamen gesetzt wird, erfolgt bei den beiden ersten (=Standard-) Timern automatisch der Eintrag des Perl-Funktionsnamens in das Aktionsfeld, verbunden mit dem Argument wakeup oder sleep.

Sonstiges

Sperrung

Das Reading lockstate muss den Wert unlocked haben, damit durch Anklicken der Start-Buttons für die Timer diese auch gestartet werden. Das ist in der Regel beim ersten Laden des Moduls nicht der Fall, hierzu muss also das Reading von Hand auf den richtigen Wert gesetzt werden. Dazu muss der Befehl set ... unlocked ausgeführt werden.


Umstellung Sommer- zu Winterzeit

Das Reading Astro hat derzeit ein Problem, wenn von Sommer- zu Winterzeit umgestellt wird. Dann verrutscht die Aktualisierung des YAAHM-Geräts in den vorigen Tag und die Termine werden nicht korrekt synchronisiert. Um wieder in den Gleichklang zu kommen, genügt eine einmalige Ausführung des Befehls

set <YAAHM-Device> initialize

Siehe dazu https://forum.fhem.de/index.php?topic=74914.0