DOIF/Templates: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(29 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
An dieser Stelle wird die Nutzung von Templates im DOIF-Modul erklärt. Mit Hilfe von Templates können Lösungen nicht nur für eine Problemstellung, im Folgenden '''Szenario''' genannt, sondern gleich generisch (allgemeingültig) für mehrere Szenarien erstellt werden.
An dieser Stelle wird die Nutzung von Templates im DOIF-Modul erklärt. Mit Hilfe von Templates können Lösungen nicht nur für eine Problemstellung, im Folgenden '''Szenario''' genannt, sondern gleich generisch (allgemeingültig) für mehrere Szenarien erstellt werden.
==Definition ohne Templates==


Die Vorgehensweise dazu wird am Beispiel einer Zeitschaltuhr aufgezeigt.
Die Vorgehensweise dazu wird am Beispiel einer Zeitschaltuhr aufgezeigt.
Zeile 5: Zeile 7:
Ausgangspunkt soll eine einfache Zeitschaltuhr mit jeweils drei Einschalt- und drei Ausschalt-Zeitpunkten sein.
Ausgangspunkt soll eine einfache Zeitschaltuhr mit jeweils drei Einschalt- und drei Ausschalt-Zeitpunkten sein.


'''Definition ohne Templates'''
Dazu wird folgende Definition vorgenommen:


Dazu wird folgende Definition vorgenommen:
<syntaxhighlight lang="perl">
defmod di_zeitschaltuhr DOIF {if ([10:00] or [12:00] or [16:00]) {fhem_set"Flurlampe on"} elsif ([11:00] or [14:00] or [20:00]) {fhem_set ("Flurlampe off")}}
</syntaxhighlight>


Hier wurden sowohl Zeiten, als auch das Gerät festgelegt. Möchte man nun eine weitere Zeitschaltuhr definieren, so kann man die Definition samt Steuerung kopieren, die festen Angaben der Zeitpunkte und das zu schaltende Gerät abändern. Auf diese Weise lassen sich beliebig viele DOIF-Blöcke anfertigen, die für sich eigenständig funktionieren:
<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
defmod di_zeitschaltuhr DOIF {if ([10:00] or [12:00] or [16:00]) {fhem_set"lampe on"} elsif ([11:00] or [14:00] or [20:00]) {fhem_set ("lampe off")}}
defmod di_zeitschaltuhr DOIF \
{if ([10:00] or [12:00] or [16:00]) {fhem_set"Flurlampe on"} elsif ([11:00] or [14:00] or [20:00]) {fhem_set ("Flurlampe off")}}\
{if ([09:00] or [11:00] or [16:30]) {fhem_set"Tischlampe on"} elsif ([10:00] or [13:30] or [21:00]) {fhem_set ("Tischlampe off")}}
</syntaxhighlight>
</syntaxhighlight>


Hier wurden sowohl Zeiten, als auch das Gerät festgelegt. Möchte man nun eine weitere Zeitschaltuhr definieren, so würde man die Definition kopieren den Modulnamen und die festen Angaben der Zeitpunkte und das zu schaltende Gerät abändern. Auf diese Weise ließen sich beliebig viele Modul-Kopien anfertigen, die für sich eigenständig funktionieren würden. Das Problem fällt allerdings spätestens dann auf, wenn man an der Steuerung etwas ändern möchte, z. B. einen weiteren Zeitpunkt oder eine andere Bedingung zum Ein- oder Ausschalten hinzufügen möchte, die nicht nur ein Szenario betrifft, sondern alle. Dann muss man alle Kopien entsprechen abändern.
Das Problem fällt allerdings spätestens dann auf, wenn man an der Steuerung etwas ändern möchte, z. B. einen weiteren Zeitpunkt oder eine andere Bedingung zum Ein- oder Ausschalten hinzufügen möchte, die nicht nur ein Szenario betrifft, sondern alle. Dazu müsste man alle Kopien entsprechend abändern.


'''Definition mit Templates'''
==Definition mit Templates==
 
Ausgehend von der ursprünglichen Definition, wird ein DOIF mit einem Template erstellt. Hierbei werden feste Angaben durch Platzhalter ersetzt. Anschließend wird das definierte Template mehrfach mit unterschiedlichen Zeiten und Geräten genutzt, um mehrere Szenarien zu definieren.
{{Randnotiz|RNText='''DOIF-Templates'''
{{Randnotiz|RNText='''DOIF-Templates'''
* eine Template-Definition hat folgenden Aufbau '''DEF TPL_<Template-Name> (<DOIF-Definition im Perlmodus>)'''
* Aufbau einer Template-Definition: '''DEF TPL_<Template-Name> (<DOIF-Definition im Perlmodus>)'''
* <Template-Name> ist ein freiwählbare Name
* '''<Template-Name>''' ist ein freiwählbare Name
* Platzhalter für variable Informationen werden mit $1, $2 usw. angegeben
* Platzhalter für variable Informationen werden mit '''$1''', '''$2''' usw. angegeben
* Der Aufruf eines Templates: '''TPL_<Template-Name>(<Parameter1>,<Parameter2>,....)'''
* Der Aufruf eines Templates: '''TPL_<Template-Name>(<Parameter1>,<Parameter2>,....)'''
* Der übergebene '''<Parameter1>''' wird im Template anstelle des Platzhalters '''$1''' eingesetzt, '''<Parameter2>''' anstelle des Platzhalters '''$2''' usw.
* Der übergebene '''<Parameter1>''' wird im Template anstelle des Platzhalters '''$1''' eingesetzt, '''<Parameter2>''' anstelle des Platzhalters '''$2''' usw.
Zeile 25: Zeile 34:
* Innerhalb eines DOIFs können beliebig viele Template-Aufrufe vorgenommen werden
* Innerhalb eines DOIFs können beliebig viele Template-Aufrufe vorgenommen werden
}}
}}
Ausgehend von der obigen Definition, wird ein Template erstellt. Hiebei werden feste Angaben durch Platzhalter ersetzt. Anschließend wird das definierte Template hier TPL_ZS mehrfach mit unterschiedlichen Zeiten und Geräten genutzt, um mehrere Szenarien zu definieren.
<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
defmod di_zeitschaltuhr DOIF DEF TPL_ZS ( ## Definition des Templates namens TPL_ZS\
defmod di_zeitschaltuhr DOIF DEF TPL_ZS ( ## Definition des Templates namens TPL_ZS\
Zeile 39: Zeile 45:
</syntaxhighlight>
</syntaxhighlight>


Hier wurde die Steuerung mit Hilfe von Platzhaltern $1, $2 usw. verallgemeinert. Die eigentliche Definition der Steuerung hat durch den Aufruf des Templates TPL_ZS stattgefunden. Die übergebenen Zeiten und Geräte wurden anstatt der Platzhalter im Template eingesetzt. Nun arbeiten zwei unabhängige Zeitschaltuhren mit unterschiedlichen Zeitpunkten und unterschiedlichen Geräten innerhalb eines DOIF-Moduls. Wird die Steuerungsdefinition innerhalb des Templates geändert, so wirkt sich die Änderung für alle Template-Aufrufe, also für alle definierten Zeitschaltuhren.
Hier wurde die Steuerung mit Hilfe von Platzhaltern $1, $2 usw. verallgemeinert. Die eigentliche Definition der Steuerung hat durch den Aufruf des Templates TPL_ZS stattgefunden. Die übergebenen Zeiten und Geräte wurden anstatt der Platzhalter im Template eingesetzt. Nun arbeiten zwei unabhängige Zeitschaltuhren mit unterschiedlichen Zeitpunkten und unterschiedlichen Geräten innerhalb eines DOIF-Moduls. Wird die Steuerungsdefinition innerhalb des Templates geändert, so wirkt sich die Änderung auf alle Template-Aufrufe, also auf alle definierten Zeitschaltuhren aus. Dabei muss die Anzahl und die Reihenfolge der Parameter zu den Platzhaltern passen.
 
Der Vorteil der Nutzung von Templates macht sich besonders dann bemerkbar, wenn die Steuerung komplex ist und viele Szenarien zu erstellen sind.
 
==FHEM-Modus vs. Perl-Modus mit Templates==
 
'''Anwendungsbeispiel: Raumtemperatursteuerung'''
 
Anforderung: Zu bestimmten Zeiten sollen die Vorgabetemperaturen in den Thermostaten der einzelnen Zimmer gesetzt werden.
 
===FHEM-Modus===
In diesem Beispiel werden mehrere Zweige mit Zeittriggern definiert. Mit dem set-Befehl wird die Solltemperatur im Wandthermostat des Zimmers gesetzt.
<syntaxhighlight lang="perl">
defmod di_Heizung DOIF ([05:00|8] or [05:30|7])\
  (set TH_Kueche_HM desired-temp 21,\
  set TH_Bad_HM desired-temp 22,\
  set TH_DG_HM desired-temp 21,\
  set TH_WZ_HM desired-temp 21,\
  set TH_Kz_w_HM desired-temp 21,\
  set TH_Kz_o_HM desired-temp 21)\
DOELSEIF ([08:00|8] or [09:00|7])\
  (set TH_Kueche_HM desired-temp 20,\
  set TH_Bad_HM desired-temp 20,\
  set TH_DG_HM desired-temp 20,\
  set TH_WZ_HM desired-temp 21,\
  set TH_Kz_w_HM desired-temp 20,\
  set TH_Kz_o_HM desired-temp 20)\
DOELSEIF ([12:00])\
  (set TH_Kueche_HM desired-temp 21,\
  set TH_Bad_HM desired-temp 20,\
  set TH_DG_HM desired-temp 21,\
  set TH_WZ_HM desired-temp 22,\
  set TH_Kz_w_HM desired-temp 21,\
  set TH_Kz_o_HM desired-temp 21)\
DOELSEIF ([20:00])\
  (set TH_Kueche_HM desired-temp 21,\
  set TH_Bad_HM desired-temp 20,\
  set TH_DG_HM desired-temp 20,\
  set TH_WZ_HM desired-temp 20,\
  set TH_Kz_w_HM desired-temp 20,\
  set TH_Kz_o_HM desired-temp 20)
</syntaxhighlight>
===Perl-Modus mit Templates===
Dieses Beispiel erledigt die gleiche Aufgabe, wie das vorherige. Hier kommt allerdings im Perl-Modus ein Template zum Einsatz.  
<syntaxhighlight lang="perl">
defmod di_heizung3 DOIF DEF TPL_set_temp ( ## Template zum Setzen der Zimmertemperaturen\
{$1;;  ## Zeitangabe\
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";;\
}\
)\
##            Zeit                  Ku,Ba,DG,WZ,Ko,Kw\
##            $1                    $2 $3 $4 $5 $6 $7
TPL_set_temp ([05:00|8] or [05:30|7],21,22,21,22,21,21)\
TPL_set_temp ([08:00|8] or [09:00|7],20,20,20,21,20,20)\
TPL_set_temp ([12:00],              21,20,21,22,21,21)\
TPL_set_temp ([20:00],              21,20,20,20,20,20)
</syntaxhighlight>
Beim zweiten Beispiel sind die variablen Vorgaben der Zeiten, als auch der Temperaturen von der Steuerungslogik getrennt worden. Die Definition fällt kürzer aus. Die Szenarien lassen sich kompakter darstellen und leichter pflegen. Das Einfügen einer weiteren Zeile generiert ein neues Szenario für einen weiteren Zeitpunkt.
==Weitere Anwendungsbeispiele mit Templates==
Weitere Anwendungsbeispiele mit Templates findet man u. a. [https://wiki.fhem.de/wiki/DOIF/Automatisierung DOIF-Automatisierung]

Aktuelle Version vom 25. Oktober 2020, 16:42 Uhr

An dieser Stelle wird die Nutzung von Templates im DOIF-Modul erklärt. Mit Hilfe von Templates können Lösungen nicht nur für eine Problemstellung, im Folgenden Szenario genannt, sondern gleich generisch (allgemeingültig) für mehrere Szenarien erstellt werden.

Definition ohne Templates

Die Vorgehensweise dazu wird am Beispiel einer Zeitschaltuhr aufgezeigt.

Ausgangspunkt soll eine einfache Zeitschaltuhr mit jeweils drei Einschalt- und drei Ausschalt-Zeitpunkten sein.

Dazu wird folgende Definition vorgenommen:

defmod di_zeitschaltuhr DOIF {if ([10:00] or [12:00] or [16:00]) {fhem_set"Flurlampe on"} elsif ([11:00] or [14:00] or [20:00]) {fhem_set ("Flurlampe off")}}

Hier wurden sowohl Zeiten, als auch das Gerät festgelegt. Möchte man nun eine weitere Zeitschaltuhr definieren, so kann man die Definition samt Steuerung kopieren, die festen Angaben der Zeitpunkte und das zu schaltende Gerät abändern. Auf diese Weise lassen sich beliebig viele DOIF-Blöcke anfertigen, die für sich eigenständig funktionieren:

defmod di_zeitschaltuhr DOIF \
{if ([10:00] or [12:00] or [16:00]) {fhem_set"Flurlampe on"} elsif ([11:00] or [14:00] or [20:00]) {fhem_set ("Flurlampe off")}}\
{if ([09:00] or [11:00] or [16:30]) {fhem_set"Tischlampe on"} elsif ([10:00] or [13:30] or [21:00]) {fhem_set ("Tischlampe off")}}

Das Problem fällt allerdings spätestens dann auf, wenn man an der Steuerung etwas ändern möchte, z. B. einen weiteren Zeitpunkt oder eine andere Bedingung zum Ein- oder Ausschalten hinzufügen möchte, die nicht nur ein Szenario betrifft, sondern alle. Dazu müsste man alle Kopien entsprechend abändern.

Definition mit Templates

Ausgehend von der ursprünglichen Definition, wird ein DOIF mit einem Template erstellt. Hierbei werden feste Angaben durch Platzhalter ersetzt. Anschließend wird das definierte Template mehrfach mit unterschiedlichen Zeiten und Geräten genutzt, um mehrere Szenarien zu definieren.

Info green.pngDOIF-Templates
  • Aufbau einer Template-Definition: DEF TPL_<Template-Name> (<DOIF-Definition im Perlmodus>)
  • <Template-Name> ist ein freiwählbare Name
  • Platzhalter für variable Informationen werden mit $1, $2 usw. angegeben
  • Der Aufruf eines Templates: TPL_<Template-Name>(<Parameter1>,<Parameter2>,....)
  • Der übergebene <Parameter1> wird im Template anstelle des Platzhalters $1 eingesetzt, <Parameter2> anstelle des Platzhalters $2 usw.
  • Innerhalb eines DOIFs können beliebig viele Template-Definitionen vorgenommen werden
  • Innerhalb eines DOIFs können beliebig viele Template-Aufrufe vorgenommen werden
defmod di_zeitschaltuhr DOIF DEF TPL_ZS ( ## Definition des Templates namens TPL_ZS\
{if ([$1] or [$2] or [$3]) {fhem_set"$4 on"} elsif ([$5] or [$6] or [$7]) {fhem_set ("$4 off")}}\
) ## Ende der Template-Definition\
\
## Definition mehrer Zeitschaltuhren mit Hilfe des obigen Templates\
##      $1    $2    $3    $4        $5    $6    $7\
TPL_ZS (10:00,12:00,16:00,Flurlampe,11:00,14:00,20:00)
TPL_ZS (09:00,11:00,16:30,Tischlampe,10:00,13:30,21:00)

Hier wurde die Steuerung mit Hilfe von Platzhaltern $1, $2 usw. verallgemeinert. Die eigentliche Definition der Steuerung hat durch den Aufruf des Templates TPL_ZS stattgefunden. Die übergebenen Zeiten und Geräte wurden anstatt der Platzhalter im Template eingesetzt. Nun arbeiten zwei unabhängige Zeitschaltuhren mit unterschiedlichen Zeitpunkten und unterschiedlichen Geräten innerhalb eines DOIF-Moduls. Wird die Steuerungsdefinition innerhalb des Templates geändert, so wirkt sich die Änderung auf alle Template-Aufrufe, also auf alle definierten Zeitschaltuhren aus. Dabei muss die Anzahl und die Reihenfolge der Parameter zu den Platzhaltern passen.

Der Vorteil der Nutzung von Templates macht sich besonders dann bemerkbar, wenn die Steuerung komplex ist und viele Szenarien zu erstellen sind.

FHEM-Modus vs. Perl-Modus mit Templates

Anwendungsbeispiel: Raumtemperatursteuerung

Anforderung: Zu bestimmten Zeiten sollen die Vorgabetemperaturen in den Thermostaten der einzelnen Zimmer gesetzt werden.

FHEM-Modus

In diesem Beispiel werden mehrere Zweige mit Zeittriggern definiert. Mit dem set-Befehl wird die Solltemperatur im Wandthermostat des Zimmers gesetzt.

defmod di_Heizung DOIF ([05:00|8] or [05:30|7])\
  (set TH_Kueche_HM desired-temp 21,\
   set TH_Bad_HM desired-temp 22,\
   set TH_DG_HM desired-temp 21,\
   set TH_WZ_HM desired-temp 21,\
   set TH_Kz_w_HM desired-temp 21,\
   set TH_Kz_o_HM desired-temp 21)\
DOELSEIF ([08:00|8] or [09:00|7])\
   (set TH_Kueche_HM desired-temp 20,\
   set TH_Bad_HM desired-temp 20,\
   set TH_DG_HM desired-temp 20,\
   set TH_WZ_HM desired-temp 21,\
   set TH_Kz_w_HM desired-temp 20,\
   set TH_Kz_o_HM desired-temp 20)\
DOELSEIF ([12:00])\
   (set TH_Kueche_HM desired-temp 21,\
   set TH_Bad_HM desired-temp 20,\
   set TH_DG_HM desired-temp 21,\
   set TH_WZ_HM desired-temp 22,\
   set TH_Kz_w_HM desired-temp 21,\
   set TH_Kz_o_HM desired-temp 21)\
DOELSEIF ([20:00])\
   (set TH_Kueche_HM desired-temp 21,\
   set TH_Bad_HM desired-temp 20,\
   set TH_DG_HM desired-temp 20,\
   set TH_WZ_HM desired-temp 20,\
   set TH_Kz_w_HM desired-temp 20,\
   set TH_Kz_o_HM desired-temp 20)

Perl-Modus mit Templates

Dieses Beispiel erledigt die gleiche Aufgabe, wie das vorherige. Hier kommt allerdings im Perl-Modus ein Template zum Einsatz.

defmod di_heizung3 DOIF DEF TPL_set_temp ( ## Template zum Setzen der Zimmertemperaturen\
{$1;;   ## Zeitangabe\
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";;\
}\
)\
##            Zeit                   Ku,Ba,DG,WZ,Ko,Kw\
##            $1                     $2 $3 $4 $5 $6 $7
TPL_set_temp ([05:00|8] or [05:30|7],21,22,21,22,21,21)\
TPL_set_temp ([08:00|8] or [09:00|7],20,20,20,21,20,20)\
TPL_set_temp ([12:00],               21,20,21,22,21,21)\
TPL_set_temp ([20:00],               21,20,20,20,20,20)

Beim zweiten Beispiel sind die variablen Vorgaben der Zeiten, als auch der Temperaturen von der Steuerungslogik getrennt worden. Die Definition fällt kürzer aus. Die Szenarien lassen sich kompakter darstellen und leichter pflegen. Das Einfügen einer weiteren Zeile generiert ein neues Szenario für einen weiteren Zeitpunkt.

Weitere Anwendungsbeispiele mit Templates

Weitere Anwendungsbeispiele mit Templates findet man u. a. DOIF-Automatisierung