DOIF/Automatisierung
An dieser Stelle werden Lösungen für typische praxisrelevante Automatisierungsaufgaben mit Hilfe des DOIF-Moduls vorgestellt.
Die folgenden Beispieldefinitionen arbeiten mit konkreten Geräten und Readings, sie können als RAW-Definition ins eigene System übernommen werden, dazu müssen die Gerätenamen, Readings, ggf. auch Icons den existierenden Namen des eigenen Systems angepasst werden. Zum Ausprobieren der Beispiele können statt echter Geräte auch Dummys benutzt werden.
Die Seite befindet sich im Aufbau.
Licht
Einfache Zeitsteuerung für ein Szenarium
Anforderung: Lichter sollen in einem bestimmten Zeitraum leuchten.
Beispieldefinition
defmod di_licht DOIF ([21:00-23:00])\
(set Lampeflur on, set Lampekueche on)\
DOELSE\
(set Lampeflur off, set Lampekueche off)
Helligkeitsabhängige Zeitsteuerung für ein Szenarium
Anforderung: Lichter sollen innerhalb eines Zeitraums leuchten, aber nur wenn es dunkel ist.
Beispieldefinition für Dunkelheit
Zunächst wird ein DOIF-Modul definiert, welches mit Hilfe eines Helligkeitssensors den Zustand "on" bei Dunkelheit annimmt, sonst "off"
defmod Dunkelheit DOIF ([Helligkeitssensor:brightness] < 100) DOELSE
attr Dunkelheit cmdState on|off
Beispieldefinition
defmod di_licht DOIF ([16:00-23:00] and [Dunkelheit] eq "on")\
(set Lampeflur on, set Lampekueche on)\
DOELSE\
(set Lampeflur off, set Lampekueche off)
Helligkeitsabhängige Zeitsteuerung für mehrere Szenarien
Anforderung: Verschiedene Lichtszenarien sollen über Angabe bestimmter Parameter generiert werden. Eine Lichtszene soll folgende Angaben definierbar sein: Szenenname, Daemmerungssensor (on/off), Zeitspanne, Einschaltbefehl, Ausschaltbefehl, Zeitraum des Jahres. Eine neue Szene soll durch Hinzufügen eines Template-Aufruf erstellt werden können.
Beispieldefinition
defmod di_Licht_tpl DOIF DEF TPL_light ( ## Definition des Templates namens TPL_light zur Steuerung einer Lichtszene\
light_$1 { ## DOIF Block\
## Parameter Szene Daemmerung Zeitspanne on off von bis\
## $1 $2 $3 $4 $5 $6 $7\
if ($md ge "$6" or $md le "$7") {\
if (($3) and [$2] eq "on") {\
fhem_set($4);;\
set_State("Szene: $1");;\
set_Reading("$1.Status","on",1);;\
} else {\
fhem_set ($5);;\
set_Reading("$1.Status","off",1);;\
}\
}\
} ## Ende des light-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
TPL_light (Erdgeschoss,Daemmerung2,([06:25-08:00|8] or [15:00-23:00]),"Lampekueche,LampeFlur on","Lampekueche,LampeFlur off",01-01, 12-31)\
TPL_light (Kind2,Daemmerung2,[06:25-08:00|8] or [15:00-23:10],"schrank2 on","schrank2 off",12-01,03-31)\
TPL_light (Terrasse,Dunkelheit,[17:00-23:05],"Terrasse on","Terrasse off",01-01,12-31)\
TPL_light (Garten,Dunkelheit,[16:00-23:30],"Garten pct 50","Garten off",01-01,12-31)\
## hier können Szenarien durch hinzufügen weiterer Zeilen generiert werden
Helligkeitsabhängige Zeitsteuerung für mehrere Szenarien mit tabellarischer Übersicht
Anforderung: Verschiedene Lichtszenarien sollen über Angabe bestimmter Parameter generiert werden. Eine Lichtszene soll folgende Angaben haben: Szenenname, Daemmerungssensor (on/off), Zeitspanne, Einschaltbefehl, Ausschaltbefehl, Zeitraum des Jahres, aktueller Zustand der Szene (on/off), Aktivierungsschalter. Eine neue Szene soll durch hinzufügen einer Parameterzeile erstellt werden können. Erstellte Lichtszenarien sollen tabellarisch dargestellt werden und einzeln abschaltbar sein.
Beispieldefinition
defmod di_Licht_all DOIF subs {\
## Parameter 1 2 3 4 5 6 7 8 9\
@{$VAR{params}}=split (/\| */, q(Szene| Daemmerung| Zeitspanne| on| off| von| bis|Status|aktiv));;\
## Definition einzelner Datensätze pro Szene\
push (@{$VAR{sc}},[split (/\| +/,q(Erdgeschoss| Daemmerung2| ([06:25-08:00|8] or [15:00-23:00])| Lampekueche,LampeFlur on| Lampekueche,LampeFlur off| 01-01| 12-31| off| on))]);;\
push (@{$VAR{sc}},[split (/\| +/,q(Kind2| Daemmerung2| [06:25-08:00|8] or [15:00-23:10]| schrank2 on| schrank2 off| 12-01| 03-31| off| on))]);;\
push (@{$VAR{sc}},[split (/\| +/,q(Terrasse| Dunkelheit| [17:00-23:05]| Terrasse on| Terrasse off| 01-01| 12-31| off| on))]);;\
push (@{$VAR{sc}},[split (/\| +/,q(Garten| Dunkelheit| [16:00-23:30]| Garten pct 50| Garten off| 01-01| 12-31| off| on))]);;\
## ... weitere Szenarien können hier Zeilenweise hinzugefügt werden\
\
## Bei Änderung der Definition werden erforderliche Readings erstellt und vorbelegt\
if ($::init_done) {\
fhem("deletereading $SELF .*");;\
my @sc=@{$VAR{sc}};;\
my @params=@{$VAR{params}};;\
set_State("initialized");;\
for (my $i=0;;$i < @{$VAR{sc}};;$i++) {\
for (my $j=7;;$j < @params;;$j++) { ## Parameter 6 und 7 werden als Reading angelegt\
set_Reading ($sc[$i][0].".".$params[$j],$sc[$i][$j]);;\
}\
}\
}\
} ## end of subs\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 { ## DOIF Block\
## Parameter Szene Daemmerung Zeitspanne on off von bis\
## $1 $2 $3 $4 $5 $6 $7\
if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$6" or $md le "$7")) {\
if (($3) and [$2] eq "on") {\
fhem_set($4);;\
set_State("Szene: $1");;\
set_Reading("$1.Status","on",1);;\
} else {\
fhem_set ($5);;\
set_Reading("$1.Status","off",1);;\
}\
}\
} ## Ende des light-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattungsszene mit Hilfe des obigen Templates\
FOR (@{$VAR{sc}},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5",$_$6,$_$7))
attr di_Licht_all uiTable {\
package ui_Table;;\
$TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Spalten\
"Szene"|"Dämmerung"|"Zeitspanne"|"on"|"off"|"von"|"bis"|"Status"|"aktiv"\
\
## Pro Datensatz einer Beschattungsszene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$_$1"|icon([$_$2])|"$_$3"|"$_$4"|"$_$5"|"$_$6"|"$_$7"|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))
Ergebnis der Beispieldefinition in der Webansicht: