Modul YAAHM: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
(→‎Umstellung Sommer- zu Winterzeit: weblink Zeitumstellung)
Markierungen: mobile edit mobile web edit
 
(97 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 auf Attribute zu setzen.
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 | 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 [[#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 (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 ==
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 [[#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 ==
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 | 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==
==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 25: Zeile 79:
gesetzt werden. Für dieses Wiki werden die deutschen Ausgabedaten verwendet.
gesetzt werden. Für dieses Wiki werden die deutschen Ausgabedaten verwendet.


==Konfiguration==
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'' im oberen Menü des Webinterfaces wird dieser versteckte Raum angezeigt. Er enthält
 
===Settings===
==Set-Befehle ==
Im oberen Bereich sind drei Eingabefelder zu sehen:
Das YAAHM-Device kennt die folgenden Set-Befehle (''YYY'' ist duch den tatsächlichen Device-Namen zu ersetzen):
*''Wait Action'' ist ein FHEM-Befehl, der beim Scharfschalten des Alarms ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt ''Alarmanlage wird in Kürze scharf geschaltet''.
set YYY time (after|before)midnight | [before|after]sunrise | [before|after]sunset | morning | noon | afternoon | evening | night | wakeup | sleep
*''Arm Delay'' ist eine Verzögerungszeit, die zwischen dem Scharfschalten des Alarms und der tatsächlichen Wirksamkeit vergeht. Diese Zeit kann beispielsweise genutzt werden, um das Haus ohne Auslösung des Alarms zu verlassen.
Erzeugt manuell den entsprechenden Event.
*''Arm Action'' ist ein FHEM-Befehl, der beim Scharfschalten ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt ''Alarmanlage scharf geschaltet''.
set YYY manualnext &lt;timernumber&gt; &lt;time&gt;
*''Disarm Action'' ist ein FHEM-Befehl, der beim Unscharfschalten ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt ''Alarmanlage unscharf geschaltet''.
set YYY manualnext &lt;timername&gt; &lt;time&gt;
*''Cancel Action'' ist ein FHEM-Befehl, der beim Widerrufen eines Alarms ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt ''Alarm widerrufen''.
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 &lt;string&gt;
set YYY deleteWeekly &lt;string&gt;
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 | 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=
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===
[[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===
 
[[Datei:summary_2.png|600px|]]
 
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.
 


[[Datei:alarm_settings.png]]
==== Das YAAHM-Widget ====


8 Alarmlevel sind für das Modul normalerweise möglich (kann durch Setzen eines einzelnen Parameters im Modulcode verändert werden).
[[Datei:YAAHM_widget_1.png|400px|]]
In der Tabelle 'Settings' können für jeden Level die Startzeit ''ts'' und Endzeit ''te'' des Alarmlevels gesetzt werden. Formate für die Zeitangabe können sein:
* hh:mm - direkte Eingabe einer festen Zeit.
* {''funktion''} - eine beliebige Perl-Funktion in geschweiften Klammern, die einen gültigen Zeitwert hh:mm zurückliefert. Die Gültigkeit wird erst zur Laufzeit überprüft. Beispielsweise  "30 Minuten vor Sonnenuntergang" als {sunset_abs(-1800)}.
Diese Aktivierungszeiten wirken sich wie folgt auf den Alarmlevel aus:
*Wenn  ''ts'' < ''te'', ist dieser Alarmlevel aktiv, falls ''ts'' < Zeit < ''te''.
*Wenn  ''ts'' >= ''te'', ist dieser Alarmlevel aktiv, falls ''ts'' < Zeit <= 23:59 sowie wenn 0:00 < Zeit <= ''te''.
Ferner kann für jeden Alarmlevel gesetzt oder bedient werden
*Eine Nachricht zur Erläuterung des Alarms (Teil 2)
*Eine Checkbox ''Armed'' = scharf
*Ein Button ''Cancel'' zum Canceln = Aufheben des Alarms


===Sensors===
Dabei handelt es sich um eine dynamisch erzeugte SVG-Datei, die man auch in beliebige eigene Webseiten einbinden kann. Der Aufruf dafür lautet
Danach wird die Tabelle der Sensoren angezeigt. Für jeden Sensor kann gesetzt werden:
<IP-Adresse:Port>/fhem/YAAHM_timewidget?name='<Device-Name>'&size='<breite>x<höhe>'
*Alarmlevel, die hierdurch ausgelöst werden
Selbstverständlich kann man das auch in einen eigenen Weblink einbauen.
*Ein regulärer Ausdruck, bei dessen Erkennung die Auslösung erfolgt
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".  
*Eine Nachricht zur Erläuterung des Alarms (Teil 1)
*Ein Selektor, um festzulegen, ob dieser Sensor den Alarm
**auslöst (=Raise),
**widerruft (=Cancel),
**scharf schaltet (=Arm) oder
**unscharf schaltet (=Disarm).
'''Achtung: Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.'''


Die insgesamt in den ''STATE'' der Alarmanlage geschriebene Nachricht besteht dann aus
Die gegenwärtige Zeit (beim Aufruf !) wird in rot angezeigt.
(Anzeige der Zustände) (Nachricht Teil 1)' '(Nachricht Teil 2).
Bitte weiter unten nachlesen, was mit der [[#Anzeige der Zustände|Anzeige der Zustände]] gemeint ist.
In diesen Nachrichten werden die folgenden Ersetzungen vorgenommen
* $NAME vird durch den Namen des auslösenden Devices ersetzt
* $EVENT wird durch den kompletten Event ersetzt
* $EVTPART1... wird durch den 1. Teilstring des Events gefüllt, etc.


[[Datei:alarm_sensors.png]]
Hinweis: Es ist angedacht, dieses Widget noch sehr viel interaktiver zu machen.


===Actors===
===Einstellung des Tages-Profils===
Anschließend wird die Tabelle der Aktoren angezeigt. Für jeden Aktor kann gesetzt werden:
*Alarmlevel, die diesen Aktor starten
*Ein FHEM-Kommando zum Starten des Aktors
*Ein FHEM-Kommando zum Stoppen des Aktors
*Eine Zeitverzögerung  - entweder als Angabe von Sekunden (<60) oder im Format mm:ss
In den Strings für diese Aktionen werden folgende Ersetzungen vorgenommen:
* $NAME vird durch den Namen des auslösenden Devices ersetzt
* $EVENT wird durch den kompletten Event ersetzt
* $EVTPART1... wird durch den 1. Teilstring des Events gefüllt, etc.
* $SHORT wird durch die vollständige Kurznachricht der Alarmauslösung ersetzt


[[Datei:alarm_actors.png]]
[[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.


==Aktivierung==
==Einstellung der Wochen-Profile==
Durch Anklicken des Buttons ''Set Alarms'' werden die ''alarmSettings''-Attribute befüllt.
[[Datei:weekly_2.png|400 px]]
'''Achtung, Folgendes beachten'''
*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.
*Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.
*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.
*Der Button ''Set Alarms'' wird nur funktionieren, wenn keine [[#Sperrung|Sperrung]] vorliegt, siehe unten.
*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.
*Es empfiehlt sich, danach ein ''Save Config'' auszuführen, damit die Attribute und Notifier permanent sind.
*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''.


===Anzeige der Zustände===
=Sonstiges=
Auf Wunsch können die Zustände der Alarmanlage zusammen mit der konkreten Meldung im internal ''STATE'' (bzw. reading ''state'', beide sind in diesem Modul identisch) angezeigt werden.
==Sperrung==
Hierfür gibt es ein Attribut ''statedisplay'' mit den folgenden möglichen Werten, die nachfolgend am Beispiel für den Zustand "Alarm Level 1 ausgelöst" erläutert sind:
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.
* ''none'' - keine Anzeige
* ''simple'' - OXOOOOOO
* ''color'' - <span style="color:green"> 0 <span style="width:1ex;color:red">1</span> 2 3 4 5 6 7</span>
* ''table''&nbsp;-&nbsp;<table><tr style="height:1ex"><td style="width:1ex;background-color:green"/><td style="width:1ex;background-color:red"/><td style="width:1ex;background-color:green"/><td style="width:1ex;background-color:green"/><td style="width:1ex;background-color:green"/><td style="width:1ex;background-color:green"/><td style="width:1ex;background-color:green"/><td style="width:1ex;background-color:green"/></tr></table>


Das Problem ist, dass möglicherweise das internal ''STATE'' an anderer Stelle verwendet werden soll - z.B. beim Versenden von Mails als ''Value('AAA')''
Es macht natürlich keinen Sinn, eine HTML-Tabelle in eine Mail zu packen. Deshalb sollte für die Weiterverarbeitung statt des obigen Code die Abkürzung ''$SHORT'' in den Feldern des Alarm-Moduls verwendet werden. Sie wird vor der Ausführung ersetzt durch ''$defs{'AAA'}{READINGS}{"short"}{VAL}''
Dies enthält nur die Meldung, nicht aber die Anzeige aller Zustände.


Alternativ kann man auch die Zustandsanzeige durch Wahl des Attributwertes ''none'' komplett abstellen.
==Umstellung Sommer- zu Winterzeit==
===Sperrung===
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
Das Reading ''lockstate'' muss den Wert ''unlocked'' haben, damit durch Anklicken des Buttons ''Set Alarms'' die ''alarmSettings''-Attribute befüllt werden können. 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.
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