DOIF/Automatisierung: Unterschied zwischen den Versionen

Aus FHEMWiki
Zeile 92: Zeile 92:
<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
defmod di_Licht_all DOIF subs  {\
defmod di_Licht_all DOIF subs  {\
## Parameter   1    2          3          4 5   6   7   8      9\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
@{$_params}=(qw(Szene Daemmerung Zeitspanne on off von bis Status aktiv));;\
##              Szene        Dämmerungssensor   Zeitspanne                            Einschaltbefehl            Ausschaltbefehl\
push (@{$_sc},[("Erdgeschoss","Daemmerung2",      "([06:25-08:00|8] or [15:00-23:30])", "Lampekueche,Lampeflur on", "Lampekueche,Lampeflur off")]);;\
push (@{$_sc},[("Kinderz_2", "Daemmerung2",      "[06:25-08:00|8] or [15:00-23:10]",   "schrank2 on",              "schrank2 off")]);;\
push (@{$_sc},[("Terrasse",   "Dunkelheit",      "[16:00-23:30]",                      "Terrasse on",              "Terrasse off")]);;\
push (@{$_sc},[("Garten",    "Dunkelheit",      "[16:00-23:30]",                      "Garten pct 50",            "Garten off")]);;\
push (@{$_sc},[("Strauch1",   "Dunkelheit",      "[17:00-23:05]",                      "Strauch1 on",              "Strauch1 off")]);;\
push (@{$_sc},[("Strauch2",  "Dunkelheit",      "[17:00-23:05]",                      "Strauch2 on",              "Strauch2 off")]);;\
push (@{$_sc},[("Eingang",    "Dunkelheit",      "[17:00-23:35]",                      "Aussenbeleuchtung on",    "Aussenbeleuchtung off")]);;\
\
\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
push (@{$_sc},[("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 (@{$_sc},[("Kinderz_2", "Daemmerung2", "[06:25-08:00|8] or [15:00-23:10]","schrank2 on","schrank2 off","12-01","03-31","off","on")]);;\
push (@{$_sc},[("Terrasse", "Dunkelheit", "[17:00-23:05]","Terrasse on", "Terrasse off", "01-01", "12-31", "off","on")]);;\
push (@{$_sc},[("Garten", "Dunkelheit","[16:00-23:30]","Garten pct 50","Garten off","01-01", "12-31", "off", "on")]);;\
push (@{$_sc},[("Strauch1", "Dunkelheit", "[17:00-23:05]","Strauch1 on","Strauch1 off","01-01","12-31", "off", "on")]);;\
push (@{$_sc},[("Strauch2","Dunkelheit","[17:00-23:05]","Strauch2 on","Strauch2 off", "01-01", "12-31", "off", "on")]);;\
\
\
## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
Zeile 108: Zeile 108:
   set_State("initialized");;\
   set_State("initialized");;\
   for (my $i=0;;$i < @{$_sc};;$i++) {\
   for (my $i=0;;$i < @{$_sc};;$i++) {\
    for (my $j=7;;$j < @{$_params};;$j++) { ## Parameter 6 und 7 werden als Reading angelegt\
       set_Reading ($_sc[$i][0].".Status","off");;\
       set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);;\
  set_Reading ($_sc[$i][0].".aktiv","off");;\
    }\
   }\
   }\
}\
}\
Zeile 116: Zeile 115:
\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 {      ## Parameter: Szene Daemmerung Zeitspanne on off von bis\
light_$1 {      ## Parameter: Szene Daemmerung Zeitspanne on off \
                 ##            $1    $2        $3        $4 $5 $6  $7\
                 ##            $1    $2        $3        $4 $5\
   if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$6" or $md le "$7")) {\
   if ([$SELF:$1.aktiv] eq "auto") {\
     if (($3) and [$2] eq "on") {\
     if (($3) and [$2] eq "on") {\
       fhem_set($4);;\
       fhem_set($4);;\
      set_State("Szene: $1");;\
       set_Reading("$1.Status","on",1);;\
       set_Reading("$1.Status","on",1);;\
     } else {\
     } else {\
Zeile 129: Zeile 127:
   }\
   }\
} ## Ende des light-Blocks\
} ## Ende des light-Blocks\
\
active_$1 {\
  if ([$SELF:$1.aktiv] eq "on") {\
    fhem_set ($4);;\
    set_Reading("$1.Status","on",1);;\
  }\
  if ([$SELF:$1.aktiv] eq "off") {\
    fhem_set ($5);;\
    set_Reading("$1.Status","off",1);;\
  }\
} ## Ende des active-Blocks \
) ## Ende der Templatedefinition\
) ## Ende der Templatedefinition\
\
\
## Generierung der Steuerung pro Licht-Szene mit Hilfe des obigen Templates\
## Generierung der Steuerung pro Licht-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5",$_$6,$_$7))\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5"))
 
attr di_Licht_all room Licht
attr di_Licht_all uiTable {\
attr di_Licht_all uiTable {\
   package ui_Table;;\
   package ui_Table;;\
   $TC{1..10}="style='padding-left: 5px;; padding-right: 5px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
   $TC{1..5}="style='padding-left: 2px;; padding-right: 2px;;' align='center'";;\
\
}\
}\
\
\
## Überschrift der Szenarien\
## Überschrift der Parameter\
"Szene"|"Dämmerung"|"Zeitspanne"|"on"|"off"|"von"|"bis"|"Status"|"aktiv"\
"Szene"|"Dämmerung"|"Zeitspanne"|"Status"|"ausgeführt"|"aktiv"\
\
\
## Pro Datensatz einer Licht-Szene wird eine Zeile mit Werten und Widgets generiert\
## Pro Datensatz einer Licht-Szene 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"))
FOR (@{$VAR{sc}},"$_$1"|icon([$_$2])|"$_$3"|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0)|WID([$SELF:$_$1.aktiv],"select,auto,on,off"))
 
</syntaxhighlight>
</syntaxhighlight>
''Ergebnis der Beispieldefinition in der Webansicht:''
''Ergebnis der Beispieldefinition in der Webansicht:''

Version vom 19. Juli 2021, 21:55 Uhr

An dieser Stelle werden Lösungen für praxisrelevante Automatisierungsaufgaben mit Hilfe des DOIF-Moduls vorgestellt. Insbesondere werden mit Hilfe von Templates generische DOIF-Lösungen an konkreten Beispielen dargestellt, die für mehrere Szenarien nutzbar sind.

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.
  • Ein Lichtszenario soll durch folgende Angaben definierbar sein: Szenario-Name, Daemmerungssensor (on/off), Zeitspanne, Einschaltbefehl, Ausschaltbefehl, Zeitraum des Jahres, aktueller Zustand der Szene (on/off), Aktivierungsschalter.
  • Ein neues Szenario 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  {\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
##              Szene         Dämmerungssensor    Zeitspanne                            Einschaltbefehl             Ausschaltbefehl\
push (@{$_sc},[("Erdgeschoss","Daemmerung2",      "([06:25-08:00|8] or [15:00-23:30])", "Lampekueche,Lampeflur on", "Lampekueche,Lampeflur off")]);;\
push (@{$_sc},[("Kinderz_2",  "Daemmerung2",      "[06:25-08:00|8] or [15:00-23:10]",   "schrank2 on",              "schrank2 off")]);;\
push (@{$_sc},[("Terrasse",   "Dunkelheit",       "[16:00-23:30]",                      "Terrasse on",              "Terrasse off")]);;\
push (@{$_sc},[("Garten",     "Dunkelheit",       "[16:00-23:30]",                      "Garten pct 50",            "Garten off")]);;\
push (@{$_sc},[("Strauch1",   "Dunkelheit",       "[17:00-23:05]",                      "Strauch1 on",              "Strauch1 off")]);;\
push (@{$_sc},[("Strauch2",   "Dunkelheit",       "[17:00-23:05]",                      "Strauch2 on",              "Strauch2 off")]);;\
push (@{$_sc},[("Eingang",    "Dunkelheit",       "[17:00-23:35]",                      "Aussenbeleuchtung on",     "Aussenbeleuchtung off")]);;\
\
\
## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
if ($::init_done) {\
  fhem("deletereading $SELF .*");;\
  set_State("initialized");;\
  for (my $i=0;;$i < @{$_sc};;$i++) {\
      set_Reading ($_sc[$i][0].".Status","off");;\
	  set_Reading ($_sc[$i][0].".aktiv","off");;\
  }\
}\
} ## end of subs\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 {      ## Parameter: Szene Daemmerung Zeitspanne on off \
                ##            $1    $2         $3         $4 $5\
  if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "on") {\
      fhem_set($4);;\
      set_Reading("$1.Status","on",1);;\
    } else {\
      fhem_set ($5);;\
      set_Reading("$1.Status","off",1);;\
    }\
  }\
} ## Ende des light-Blocks\
\
active_$1 {\
  if ([$SELF:$1.aktiv] eq "on") {\
    fhem_set ($4);;\
    set_Reading("$1.Status","on",1);;\
  }\
  if ([$SELF:$1.aktiv] eq "off") {\
    fhem_set ($5);;\
    set_Reading("$1.Status","off",1);;\
  }\
} ## Ende des active-Blocks \
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Licht-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5"))
attr di_Licht_all room Licht
attr di_Licht_all uiTable {\
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;; padding-right: 2px;;' align='center'";;\
\
}\
\
## Überschrift der Parameter\
"Szene"|"Dämmerung"|"Zeitspanne"|"Status"|"ausgeführt"|"aktiv"\
\
## Pro Datensatz einer Licht-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$_$1"|icon([$_$2])|"$_$3"|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0)|WID([$SELF:$_$1.aktiv],"select,auto,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_beschattung1 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\
  if ([$4-$5]) {                                 ## innerhalb des Zeitfensters     \
    if ([$2:measured-temp] > 24 and [$3] eq "on" and !$VAR{$1}) { ## Wenn die Zimmertemperatur über 24 und Sonne scheint und die Rollläden noch nicht heruntergefahren wurden\
      fhem_set("$6 $7");;                        ## Fenster herunterfahren\
      set_State("Szene: $1 Beschattung");;       ## Status mit letztem Befehl belegen \
      $VAR{$1}=1;;                               ## Merker setzen, dass Fenster bereits heruntergefahren wurde\
    } elsif ([$2:measured-temp] < 23.5 and [$3] eq "off" and $VAR{$1}) { ## Wenn die Zimmertemperatur unter 23.5 und Sonne scheint nicht und die Rollläden bereits heruntergefahren wurden\
      fhem_set("$6 $8");;                        ## Fenster hochfahren\
      set_State("Szene: $1 keine Beschattung");; ## 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\
\
## 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  {\
@{$_params}= qw(  Szene      Temperatursensor  Sonnensensor Rollladen        runter hoch   von   bis Status aktiv);;\
\
## Definition einzelner Datensätze pro Szene, Szenen können zeilenweise gelöscht bzw. hinzugefügt werden\
push (@{$_sc},[qw(Bad                 TH_Bad_HM     Sonne_s R_Bad                30   on 13:00 22:00 off on)]);;\
push (@{$_sc},[qw(Dachgeschoss        TH_DG_HM      Sonne_s R_Dachboden          30   on 13:00 22:00 off on)]);;\
push (@{$_sc},[qw(Kueche              TH_Kueche_HM  Sonne_s R_Kueche             50   on 09:00 14:00 off on)]);;\
push (@{$_sc},[qw(Kinderzimmer_1_ost  TH_Kz_o_HM    Sonne_s R_Kinderzimmer1_O    30   on 09:00 14:00 off on)]);;\
push (@{$_sc},[qw(Kinderzimmer_1_sued TH_Kz_o_HM    Sonne_s R_Kinderzimmer1_S    25   on 13:00 22:00 off on)]);;\
push (@{$_sc},[qw(Kinderzimmer_2_sued TH_Kz_w_HM    Sonne_s R_Kinderzimmer2_S    25   on 13:00 22:00 off on)]);;\
push (@{$_sc},[qw(Kinderzimmer_2_west TH_Kz_w_HM    Sonne_w R_Kinderzimmer2_W.*  25   on 15:30 22:00 off on)]);;\
push (@{$_sc},[qw(Wohnzimmer_west     TH_WZ_HM      Sonne_w R_W_W[23]            25   on 15:30 22:00 off on)]);;\
\
if ($::init_done) {                        ## Bei Änderung der Definition werden alle erfoderlichen Readings erstellt und vorbelegt\
    fhem("deletereading $SELF .*");;        ## alle Readings des Moduls löschen\
    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 {\
  for (my $i=0;;$i < @{$_sc};;$i++) {\
    set_Reading($_sc[$i][0].".Status","off",1);;\
  }\
\
}\
}\
\
DEF TPL_shutter ( ## Definition des Templates namens TPL_shutter, Parameter: $1:Szenenname, $2:Temperatursensor, $3:Sonnensonsor, $4:Rollläden, $5:runter, $6:hoch, $7:von, $8:bis, $9:Status, $10:aktiv \
shutter_$1 {  \
if ($10 eq "on" and [$7-$8]) {         ## wenn Szene aktiv und innerhalb  des Zeitfensters\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and get_Reading("$9") eq "off") { ## Wenn die Zimmertemperatur über 24 und Sonne scheint und Rollläden noch nicht heruntergefahren wurden\
    fhem_set("$4 $5");;                 ## Rollläden herunterfahren\
    set_State("Szene: $1 $5");;         ## 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") { ## Wenn die Zimmertemperatur unter 23.5 und Sonne scheint nicht und Rollläden bereits heruntergefahren wurden\
    fhem_set("$4 $6");;                 ## Rollläden hochfahren\
    set_State("Szene: $1 $6");;         ## Status mit letzer Szene belegen\
    set_Reading("$1.Status","off",1);;  ## Status für Szene im Reading ablegen\
   }\
}\
}\
) ## Ende der Templatedefinition\
\
reset {[00:01];; reset_state();;}     ## nachts alle Status zurücksetzen\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_shutter($_$1,$_$2,$_$3,$_$4,$_$5,$_$6,[$SELF:$_$1.von],[$SELF:$_$1.bis],$_$1.Status,[$SELF:$_$1.aktiv]))\

attr di_beschattung2 uiTable {\
  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").substr(::ReadingsTimestamp("$SELF","$_$1.Status",0),11,5)|WID([$SELF:$_$1.aktiv],"select,on,off"))

Ergebnis der Beispieldefinition in der Webansicht:

Beschattung2.png

Zeitgesteuerte Heizungsregelung mit Hilfe von Raumthermostaten

Die folgenden Beispiele funktioniert mit HM-Wandthermostaten. Sie können ebenso für andere Thermostate oder Module wie THRESHOLD entsprechend angepasst werden.

Steuerung von Raumthermostaten für mehrere Räume ohne GUI

Beispieldefinition mit einem Template im DOIF-Perlmodus

Zeiten, Raumthermostate und Temperaturen werden in der Definition selbst festgelegt und werden dort geändert. Im Status des Moduls werden zur Laufzeit die aktuell gesetzten Temperaturen festgehalten.

defmod di_Thermostate DOIF DEF TPL_set_temp ( ## Template zum Setzen der Zimmertemperaturen\
{$1;;   ## Zeitangabe\
set_State("KU $2, BA $3, DG $4, WZ $5, KO $6, KW $7,Ke $8");;\
fhem_set"TH_Kueche_HM desired-temp $2";;\
fhem_set"TH_Bad_HM desired-temp $3";;\
fhem_set"TH_DG_HM desired-temp $4";;\
fhem_set"TH_WZ_HM desired-temp $5";;\
fhem_set"TH_Kz_o_HM desired-temp $6";;\
fhem_set"TH_Kz_w_HM desired-temp $7";;\
fhem_set"TH_Keller_HM desired-temp $8";;\
}\
)\
##                         Zeit                  Ku,Ba,DG,Wz,Ko,Kw,Ke\
##                        $1                     $2 $3 $4 $5 $6 $7 $8
morgens_ein TPL_set_temp ([05:00|8] or [05:30|7],21,21,21,21,21,21,22)\
morgens_aus TPL_set_temp ([08:00|8] or [09:00|7],20,20,20,21,20,20,21)\
mittags_ein TPL_set_temp ([12:00],               21,20,21,22,19,21.5,21.5)\
abends_aus TPL_set_temp  ([20:00],               21,20,20,20,20,20,21)

Steuerung von Raumthermostaten für mehrere Räume mit GUI

Beispieldefinition mit einem Template im DOIF-Perlmodus

Anforderung:

  • Es soll nur eine zentrale Steuerungslogik für das Setzen der Temperaturen für alle Räume erstellt werden.
  • Anzahl der Zeitpunkte zum Setzen der Vorgabetemperaturen soll einfach veränderbar sein.
  • Das Hinzufügen bzw. Löschen von Räumen soll durch Hinzufügen oder Löschen jeweils einer Zeile möglich sein.
  • Das Ändern der Temperaturen sowie das Ändern der Schaltzeitpunkte soll über WEB-Oberfläche möglich sein.
  • Das temporäre Ändern der aktuellen Vorgabetemperatur bis zum nächsten Schaltzeitpunkt soll über WEB-Oberfläche möglich sein.
  • Die aktuelle Temperatur des Zimmers soll visualisiert werden.
  • Schaltzeiten sollen für Wochentage und Wochenende (Ferien) separat einstellbar sein.
## Schaltzeitpunkte, Liste kann angepasst werden  \
@{$_Timer}= qw(morgens vormittags mittags nachmittags abends nachts);;\
@{$_Timer_default} = qw(05:00 09:00 13:00 16:00 20:00 23:00);;\
\
## Definition der Räume mit dazugehörigen Thermostaten, Angaben können zweilenweise erweitert werden\
push (@{$_sc},[qw(Bad TH_Bad_HM)]);;\
push (@{$_sc},[qw(Dachgeschoss TH_DG_HM)]);;\
push (@{$_sc},[qw(Kueche TH_Kueche_HM)]);;\
push (@{$_sc},[qw(Kinderzimmer_ost TH_Kz_o_HM)]);;\
push (@{$_sc},[qw(Kinderzimmer_west TH_Kz_w_HM)]);;\
push (@{$_sc},[qw(Wohnzimmer TH_WZ_HM)]);;\
push (@{$_sc},[qw(Keller TH_Keller_HM)]);;\
\
## Bei Initialisierung oder Änderung der Definition werden Timer-Readings und Temperatur-Readings erstellt und vorbelegt\
if ($::init_done) {\
    fhem("deletereading $SELF .*");;\
	for (my $j=0;;$j<@{$_Timer};;$j++)  {\
	 set_Reading($_Timer[$j],$_Timer_default[$j]);;\
	 set_Reading("$_Timer[$j]_WE",$_Timer_default[$j]);;\
     for (my $i=0;;$i < @{$_sc};;$i++)  {\
	     set_Reading("$_sc[$i][0]_$_Timer[$j]","20");;\
	  }\
	}\
}\
\
sub temp_set { ## Routine zum Setzen der Vorgabetemperaturen aller Räume für einen Zeitpunkt\
  my ($timer)=@_;;\
  for (my $i=0;;$i< @{$_sc};;$i++)  {\
     fhem_set("$_sc[$i][1] desired-temp ".get_Reading ("$_sc[$i][0]_$timer"));;\
  }\
}\
} ## subs\
\
DEF TPL_set_temp ( ## Definition des Templates namens TPL_set_temp zum Setzen der Thermostat-Vorgabetemperatur\
Timer_$1 {         ## Parameter: $1:Timername, $2:Time_AT, $3:Time_WE\
  if ([$2|AT] or [$3|WE]) {\
    temp_set("$1");;\
  }\
}\
) ## TPL_set_temp\
\
## Generierung der Steuerung pro Raum mit Hilfe des obigen Templates\
FOR(@{$_Timer},TPL_set_temp($1,[$SELF:$_],[$SELF:$1_WE]))\

attr di_Thermostate room Heizung
attr di_Thermostate uiTable {\
  package ui_Table;;\
  $TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
"Zeitpunkt"|"aktuell"|"akt. Vorgabe"|FOR (@{$_Timer},"$1"|)""\
"Wochentags"|" "|" "|FOR (@{$_Timer},WID([$SELF:$1],"time")|)""\
"Wochenende"|" "|" "|FOR (@{$_Timer},WID([$SELF:$1_WE],"time")|)""\
FOR (@{$_sc},"$1$1"|temp_hum_ring([$1$2:measured-temp],[$1$2:humidity])|temp_knob([$1$2:desired-temp],"Darkorange","set")|FOR(@{$_Timer},temp_knob([$SELF:$1$1_$2],"Darkorange","")|)"")

Ergebnis der Beispieldefinition in der Webansicht:

Di Thermostate.png