DOIF/Automatisierung

Aus FHEMWiki
Zur Navigation springen Zur Suche springen

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 Szenario

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 Szenario

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:

  • Es soll nur eine Steuerung für alle Lichtszenarien programmiert werden.
  • Verschiedene Lichtszenarien sollen über Angabe bestimmter Parameter generiert werden.
  • Eine Lichtszene soll durch folgende Angaben definierbar sein: Szenenname, Daemmerungssensor (on/off), Zeitspanne, Einschaltbefehl, Ausschaltbefehl, Zeitraum des Jahres.
  • Eine neue Szene soll durch Hinzufügen eines Template-Aufrufs 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 Daemmerungssensor Zeitspanne on off von bis\
                                         ## Nr.:       $1    $2                $3         $4 $5  $6  $7\
  if ($md ge "$6" or $md le "$7") {      ## wenn innerhalb der Jahreszeit (von bis)\
    if (($3) and [$2] eq "on") {         ## wenn in der Zeitspanne und Dämmerung on\
      fhem_set($4);;                     ## schalte on-Befehle\
      set_State("Szene: $1");;           ## Setze Status des DOIF-Moduls\
    } else {\
      fhem_set ($5);;                    ## sonst, schalte off-Befehle\
    }\
  }\
} ## Ende des light-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattungsszene 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 weitere Szenarien durch hinzufügen weiterer Zeilen generiert werden

Helligkeitsabhängige Zeitsteuerung für mehrere Szenarien mit tabellarischer Übersicht

Anforderung:

  • Es soll nur eine Steuerung für mehrere Lichtszenarien programmiert werden.
  • Verschiedene Lichtszenarien sollen über Angabe bestimmter Parameter generiert werden.
  • Eine Lichtszene soll durch folgende Angaben definierbar sein: 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))]);;\
## push (@{$VAR{sc}},[split (/\| +/,q(<meine Parameter>))]);; <----------weitere Szenarien können 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 8 (Status) und 9 (aktiv) 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:

Licht Szenarien.png

Beschattung

Beschattungssteuerung abhängig von der Zimmertemperatur und Sonneneinstrahlung für mehrere Szenarien

Anforderung:

  • Es soll nur eine zentrale Steuerungslogik für alle Beschattungsszenarien erstellt werden.
  • Ein Beschattungsszenario soll durch folgende Angaben definierbar sein: Name der Szene, Temperatursensor des Zimmers, Sonnensensor, von Uhrzeit, bis Uhrzeit, Rollläden, Befehl zum Herunterfahren, Befehl zum Hochfahren.
  • Ein neues Beschattungsszenario soll nur durch das Hinzufügen eines Template-Aufrufs erstellt werden können.

Zunächst wird ein DOIF-Modul definiert, welches verzögert mit Hilfe einer PV-Anlage den Zustand "on" bei Sonneneinstrahlung annimmt, sonst "off".

Beispieldefinition für Sonneneinstrahlung

defmod Sonne_s DOIF ([zaehler:PV-Leistung] > 2.5)
attr Sonne_s cmdState on|off
attr Sonne_s wait 1800:7200

Beispieldefinition des Steuermoduls

defmod di_beschattung DOIF DEF TPL_shutter (## Definition des Templates namens TPL_shutter\
## Parameternummer $1             $2                           $3           $4          $5          $6        $7                        $8 \
## Bedeutung       Name der Szene Temperatursensor des Zimmers Sonnensensor von Uhrzeit bis Uhrzeit Rollladen Befehl zum Herunterfahren Befehl zum Hochfahren\
shutter_$1 {                                 ## DOIF Block\
  ## Wenn die Zimmertemperatur über 24 und Sonne scheint innherhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\  
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$4-$5] and !$VAR{$1}) {\
    fhem_set("$6 $7");;                      ## Rollladen in Beschattungsposition herunterfahren\
    set_State("Szene: $1 $7");;              ## Status mit letztem Befehl belegen \
    $VAR{$1}=1;;                             ## Merker setzen, dass Fenster bereits heruntergefahren wurde\
  } else {                                   ## der Else-Fall kann auskommentiert werden, wenn Rollläden nicht automatisch hochfahren sollen\
    fhem_set("$6 $8");;                      ## Rollladen hochfahren\
    set_State("Szene: $1 $8");;              ## Status mit letztem Befehl belegen \
    $VAR{$1}=0;;                             ## Merker zurücksetzen\
  }\
    \
}\
)  ## Ende der Templatedefinition\
\
reset {[00:01];;delete $VAR;;}    ## DOIF-Block namens reset um nachts alle Merker zu löschen, wenn der else-Fall auskommentiert wird\
## Definition einzelner DOIF-Blöcke pro Fenstergruppe mit Hilfe des Templates\
##           $1           $2       $3      $4    $5    $6   $7 $8\
TPL_shutter (Dachgeschoss,TH_DG_HM,Sonne_s,12:00,21:00,R_DG,30,on)\
TPL_shutter (Kueche,TH_Kueche_HM,Sonne_s,09:00,14:00,R_Kueche,50,on)\
TPL_shutter (Kinderzimmer1_ost,TH_Kz_o_HM,Sonne_s,09:00,14:00,R_Kinderzimmer1_O,30,on)\
TPL_shutter (Kinderzimmer1_sued,TH_Kz_o_HM,Sonne_s,12:00,21:00,R_Kinderzimmer1_S,25,on)\
TPL_shutter (Kinderzimmer2_sued,TH_Kz_w_HM,Sonne_s,12:00,21:00,R_Kinderzimmer2_S,25,on)\
TPL_shutter (Kinderzimmer2_west,TH_Kz_w_HM,Sonne_w,15:30,22:00,R_Kinderzimmer2_W.*,25,on)\
TPL_shutter (Wohnzimmmer_sued,TH_WZ_HM,Sonne_s,12:30,21:00,R_W_S,25,on)\
TPL_shutter (Wohnzimmer_west,TH_WZ_HM,Sonne_w,15:30,22:00,R_W_W[23],25,on)\
## hier können weitere Szenarien für weitere Fenster hinzugefügt werden

Beschattungssteuerung abhängig von der Zimmertemperatur und Sonneneinstrahlung für mehrere Szenarien mit Visualisierung

Anforderung:

  • Es soll nur eine zentrale Steuerungslogik für alle Beschattungsszenarien erstellt werden.
  • Ein Beschattungsszenario soll durch folgende Angaben definierbar sein: Name der Szene, Temperatursensor des Zimmers, Sonnensensor(on/off), von Uhrzeit, bis Uhrzeit, Rollläden, Befehl zum Herunterfahren, Befehl zum Hochfahren, Status, Modus(aktiv/deaktiv)
  • Ein neues Beschattungsszenario soll nur durch das Hinzufügen einer Parameter-Zeile erstellt werden können.
  • Erstellte Beschattungsszenarien sollen automatisch tabellarisch dargestellt werden und einzeln abschaltbar sein.

Beispieldefinition des Steuermoduls

defmod di_beschattung2 DOIF subs  {\
## Parameter                       1            2               3            4                5      6    7     8   9     10\
@{$VAR{params}}=   split (/\| */,q(Szene|      Temperatursensor|Sonnensensor|Rollladen|       runter|hoch|von|  bis|Status|aktiv));;\
## Definition einzelner Datensätze pro Szene\
push (@{$VAR{sc}},[split (/\| */,q(Bad|                TH_Bad_HM|    Sonne_s|R_Bad|               30|  on|12:00|21:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Dachgeschoss|       TH_DG_HM|     Sonne_s|R_Dachboden|         30|  on|12:00|21:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kueche|             TH_Kueche_HM| Sonne_s|R_Kueche|            50|  on|09:00|14:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_ost| TH_Kz_o_HM|   Sonne_s|R_Kinderzimmer1_O|   30|  on|09:00|14:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_sued|TH_Kz_o_HM|   Sonne_s|R_Kinderzimmer1_S|   25|  on|12:00|23:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_sued|TH_Kz_w_HM|   Sonne_s|R_Kinderzimmer2_S|   25|  on|12:00|21:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_west|TH_Kz_w_HM|   Sonne_w|R_Kinderzimmer2_W.*| 25|  on|15:30|21:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_sued|    TH_WZ_HM|     Sonne_s|R_W_S|               25|  on|12:30|21:00| off|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_west|    TH_WZ_HM|     Sonne_w|R_W_W[23]|           25|  on|15:30|21:00| off|on))]);;\
## push (@{$VAR{sc}},[split (/\| */,q(<Parameterliste>))]);;<--------hier können weitere Szenarien hinzugefügt werden\
\
if ($::init_done) {                          ## Bei Änderung der Definition werden alle erfoderlichen Readings erstellt und vorbelegt\
    fhem("deletereading $SELF .*");;         ## alle Readings des Moduls löschen\
    my @sc=@{$VAR{sc}};;\
    my @params=@{$VAR{params}};;\
    set_State("initialized");;               ## Status setzen\
    for (my $i=0;;$i < @sc;;$i++) {\
      for (my $j=6;;$j < @{$sc[$i]};;$j++) { ## für Parameter 7 bis 10 Readings anlegen\
        set_Reading ($sc[$i][0].".".$params[$j],$sc[$i][$j]);;\
      }\
    }\
  }\
\
sub reset_state {                            ## Routine zum Zurücksetzen aller Status\
  my @sc=@{$VAR{sc}};;\
  for (my $i=0;;$i < @sc;;$i++) {\
    set_Reading($sc[$i][0].".Status","off",1);;\
  }\
\
}\
}\
\
DEF TPL_shutter ( ## Definition des Templates namens TPL_shutter\
shutter_$1 {      ## DOIF Block\
## Parameternr  $1         $2               $3           $4        $5     $6   $7  $8  $9     $10 \
## Bedeutung    Szenenname Temperatursensor Sonnensonsor Rollläden runter hoch von bis Status aktiv\
if ($10 eq "on") { ## wenn Szene aktiv\
  ## Wenn die Zimmertemperatur über 24 und Sonne scheint innerhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$7-$8] and get_Reading("$9") eq "off") {\
    fhem_set("$4 $5");;                     ## Rollläden herunterfahren\
    set_State("Szene: $1 Beschattung");;    ## Status setzen\
    set_Reading("$1.Status","on",1);;       ## Status für Szene im Reading ablegen  \
  } elsif ([$2:measured-temp] < 23.5 and [$3] eq "off" and get_Reading("$9") eq "on") { ## der elseif-Fall für das Hochfahren kann auskommentiert werden\
    fhem_set("$4 $6");;                     ## Rollläden hochfahren\
    set_State("Szene: $1 Rollläden oben");; ## Status mit letzer Szene belegen\
    set_Reading("$1.Status","off",1);;  ## Status für Szene im Reading ablegen\
   }\
}\
}\
) ## Ende der Templatedefinition\
\
reset {[00:01];;     ## nachts alle Status zurücksetzen\
  reset_state();;\
}\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$VAR{sc}},TPL_shutter($_$1,$_$2,$_$3,$_$4,$_$5,$_$6,[$SELF:$_$1.von],[$SELF:$_$1.bis],$_$1.Status,[$SELF:$_$1.aktiv]))
attr di_beschattung2 uiTable { ## tabellarische Visualisierung mit Hilfe des uiTable-Attributs\
  package ui_Table;;\
  $TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Parameter\
"Szene"|"Temperatur"|"Einstrahlung"|"von"|"bis"|"Status"|"aktiv"\
\
## Pro Datensatz einer Beschattungs-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$_$1"|temp_ring([$_$2:measured-temp])|icon([$_$3:state],"fa_cloud","weather_sun\@yellow")|[$SELF:$_$1.von]|[$SELF:$_$1.bis]|icon([$SELF:$_$1.Status],"fts_shutter_10","fts_shutter_80")|WID([$SELF:$_$1.aktiv],"select,on,off"))

Ergebnis der Beispieldefinition in der Webansicht:

Beschattung2.png