neue Features: Generalisierung mit Templates

Begonnen von Damian, 16 Mai 2020, 18:16:51

Vorheriges Thema - Nächstes Thema

Damian

Es tritt immer wieder das Problem auf, dass man mehrere DOIFs definieren muss, die ähnlich aber nicht ähnlich genug sind, um sie über ein konventionelles DOIF zusammenzufassen.

Es gibt jetzt die Möglichkeit im DOIF-Perl-Modus eine Definition für mehrerer DOIFs vorzunehmen.

Anwendungsbeispiel:

Bisher habe ich für die Beschattung des Hauses mehrere DOIFs definieren müssen, weil bestimmte Parameter von Zimmer zu Zimmer, von Fenster zu Fenster unterschiedlich sind.

Bei mir fahren die Rollläden bei Sonneneinstrahlung nur einmal am Tag in Beschattungsposition. Mehr Automatisierung möchte ich beim Beschatten nicht haben. Vorweg: Natürlich lässt sich die untere Definition für mehr Automatisierung oder andere Anwendungen beliebig anpassen.

Das neue generalisierte DOIF sieht jetzt so aus:

defmod di_beschattung2 DOIF DEF TPL_shutter ( ## Definition des Templates namens TPL_shutter\
{  ## DOIF Block\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$4-$5] and !$VAR{$1}) { ## Wenn die Zimmertemperatur über 24 und Sonne scheint innherhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\
    fhem_set("$6 $7");;  ## Fenster herunterfahren\
    $VAR{$1}=1;;         ## Merker setzen, dass Fenster bereits heruntergefahren wurde\
  }\
}\
) ## Ende der Templatedefinition\
\
{[00:01];;delete $VAR;;}    ## nachts alle Merker löschen\
\
## Definition einzelner DOIF-Blöcke mit Hilfe des Templates\
##          $1 $2        $3      $4    $5    $6    $7\
TPL_shutter (1,TH_Bad_HM,Sonne_s,12:00,21:00,R_Bad,30)\
TPL_shutter (2,TH_DG_HM,Sonne_s,12:00,21:00,R_DG,30)\
TPL_shutter (3,TH_Kueche_HM,Sonne_s,09:00,14:00,R_Kueche,50)\
TPL_shutter (4,TH_Kz_o_HM,Sonne_s,09:00,14:00,R_Kinderzimmer1_O,30)\
TPL_shutter (5,TH_Kz_o_HM,Sonne_s,12:00,21:00,R_Kinderzimmer1_S,25)\
TPL_shutter (6,TH_Kz_w_HM,Sonne_s,12:00,21:00,R_Kinderzimmer2_S,25)\
TPL_shutter (7,TH_Kz_w_HM,Sonne_w,15:30,21:00,R_Kinderzimmer2_W.*,25)\
TPL_shutter (8,TH_WZ_HM,Sonne_s,12:30,21:00,R_W_S,25)\
TPL_shutter (9,TH_WZ_HM,Sonne_w,15:30,21:00,R_W_W.*,25)\


Hier wird zunächst ein DOIF-Template namens "TPL_shutter" mit mehreren Platzhaltern für die Steuerungslogik erstellt. Danach wird pro Fenster/Fenstergruppe das Template mit unterschiedlichen Parametern (Temperatursensor im Zimmer, Sonneneinstrahlung, Zeiten, Rollladen, Position) aufgerufen. Auf diese Weise werden mehrere DOIF-Blöcke innerhalb des DOIFs definiert, die die Funktionalität mehrerer unabhängiger DOIFs haben. Auch bei Template-Nutzung wird die gesamte Definition vom Modul in Perl übersetzt, so dass zur Laufzeit reines Perl mit maximaler Performance abgearbeitet wird.

Mit der oberen Definition konnte ich 9 konventionelle DOIFs durch ein einziges ersetzen, was die Pflege bzw. Anpassungen der Steuerung erheblich vereinfacht.

Wenn man jetzt noch über das uiTable-Attribut, das übrigens schon lange das Template-Konzept nutzt, die dazugehörige Oberfläche im gleichen Modul definiert, so hat man Steuerung und Visualisierung an einer Stelle: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung_und_Steuerung_von_Rolll.C3.A4den
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#2
Hier mal ein weiteres Beispiel für eine Zeitschaltuhr zum Setzen von Zimmertemperaturen:

zuvor konventionell:

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)\


jetzt mit Templates:

defmod di_Heizung_neu 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\
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)


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

Hallo Damian, dass ist eine Super tolle Sache mit der Beschattung, ich setze sie momentan auch mit diversen DOIFs um und habe natürlich dadurch jede Menge DOIFs am Start.
Ich werde mir das mal anschauen, obwohl ich Perl als Feind habe  ;) was nicht heißen soll das ich mich damit nicht beschäftige, aber lernen wollte ich es jetzt nicht, weil es mir nicht liegt.
Mal schauen ob ich es schaffe das mal umzusetzen und es dann praktisch auch einsetze...
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 25 Mai 2020, 18:23:16
Hallo Damian, dass ist eine Super tolle Sache mit der Beschattung, ich setze sie momentan auch mit diversen DOIFs um und habe natürlich dadurch jede Menge DOIFs am Start.
Ich werde mir das mal anschauen, obwohl ich Perl als Feind habe  ;) was nicht heißen soll das ich mich damit nicht beschäftige, aber lernen wollte ich es jetzt nicht, weil es mir nicht liegt.
Mal schauen ob ich es schaffe das mal umzusetzen und es dann praktisch auch einsetze...

Die erforderlichen Perl-Kenntnisse halten sich in Grenzen. Hier ist fast schon mehr DOIF-Kenntnis von Nutzen.

Ich versuche bei mir die restlichen DOIFs zu generalisieren. Im Beschattungsmodul kann man auch das morgendliche Hochfahren und das abendliche Runterfahren der Rollläden unterbringen. Jetzt muss ich noch die  Lichtsteuerung in ein DOIF stecken, dann ist meine Haus-Automatisierung mit wenigen DOIFs abgedeckt ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

Ok, ich habe es mir angeschaut, ist trotzdem kompliziert.
Ich stelle es gerne auch mit einem Dummy um... entweder steuert es Fhem oder ich stelle es auf Beschattung, oder komplett aus, bei einigen habe ich noch eine Weihnachten Option.
Morgens fahre ich zu flexibel einstellbaren Zeiten die Rollläden hoch, soll heißen entweder 7.45, 8 Uhr oder 8.15 usw. und abends immer zu Astro Civil, ist das mit dem DOIF so möglich...?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 25 Mai 2020, 22:21:22
Ok, ich habe es mir angeschaut, ist trotzdem kompliziert.
Ich stelle es gerne auch mit einem Dummy um... entweder steuert es Fhem oder ich stelle es auf Beschattung, oder komplett aus, bei einigen habe ich noch eine Weihnachten Option.
Morgens fahre ich zu flexibel einstellbaren Zeiten die Rollläden hoch, soll heißen entweder 7.45, 8 Uhr oder 8.15 usw. und abends immer zu Astro Civil, ist das mit dem DOIF so möglich...?
Natürlich geht das :)
In einem Perl-DOIF könntest du im Prinzip dein ganzes FHEM unterbringen, weil dort im Gegensatz zum FHEM-Modus keine Abhängigkeiten der Blöcke existieren. Ob das allerdings sinnvoll wäre, ist eine andere Frage. Es kann ebenso übersichtlicher sein, Steuerungen, die wenig Gemeinsamkeiten haben, in einzelnen DOIFs zu belassen.

Ich würde damit anfangen ähnlich aufgebaute DOIFs zu generalisieren, wie in meinem Beschattungsbeispiel, dort ist die Steuerung durch eine if-Zeile abgedeckt, der Rest sind im Wesentlichen fenster- und zimmerabhängige Parameter. Wenn das läuft, kann man versuchen es zu erweitern, wenn es sinnvoll erscheint, aber das muss man im Einzelfall sehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Man kann in der kommenden DOIF-Version im Perl-Modus, wie im FHEM-Modus, einzelne Blöcke manuell per set-Befehl ausführen. Das erleichtert das Überprüfen einer neuen Definition.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eddy242

#8
Hallo Damian,

kannst Du Dir bitte mal diesen kurzen Code anschauen. Ich habe 2 Fragen. 1) der else-Block wird pro Template Line aufgelöst, richtig? Ich könnte den Code eigentlich mit dem ?: Operator noch kürzer machen, das würde die Dopplung von Reading-Update ersparen. und 2), wie würde ich die wait- und die homebridgemappings aus dem Original-Code umsetzen (wenn letzteres überhaupt geht, das müssten ja eigentlich für Homebridge separate Geräte sein)? Vielleicht könntest Du bitte auch noch einen Hinweis geben wie die Integration mit uiTable genau geht. Würde ich im Ausführungsteil Modulvariablen setzen und im uiTable-Teil auslesen oder die eigenen Readings lesen? Danke!

vorher

defmod DOIF_Sonne_W DOIF (\
  ([Sensor_Eltako_West:brightness:d] < 27000) and\
  ([DOIF_IstEsEineHitzeWelle:state] eq "off")\
)(\
setreading $SELF Sonnenschutz GanzAuf\
) DOELSE (\
setreading $SELF Sonnenschutz [DOIF_IstEsEineHitzeWelle:Besch_Position]\
)
attr DOIF_Sonne_W DbLogExclude .*
attr DOIF_Sonne_W DbLogInclude cmd
attr DOIF_Sonne_W alias Sonnenschutz: West?
attr DOIF_Sonne_W cmdState off|on
attr DOIF_Sonne_W devStateIcon on:weather_sun@yellow off|initialized:weather_sun@grey
attr DOIF_Sonne_W genericDeviceType ContactSensor
attr DOIF_Sonne_W group Sonne,KeyStatusInfo
attr DOIF_Sonne_W homebridgeMapping clear \
ContactSensorState=state,values=off:CONTACT_DETECTED;;on:CONTACT_NOT_DETECTED \
history:size=1024
attr DOIF_Sonne_W icon weather_sun
attr DOIF_Sonne_W room ControlCenter,Tagesablauf,Homekit
attr DOIF_Sonne_W wait 900:900

nachher

defmod DOIF_TEST_Sonne DOIF DEF TPL_Sonne (\
{\
  if (([$2:brightness:d] < $3) and ([DOIF_IstEsEineHitzeWelle:state] eq "off")) {\
  set_Reading_Begin;;\
  set_Reading_Update("$4_Sonne", "off");;\
  set_Reading_Update("$4_Beschattungsposition", "GanzAuf");;\
  set_Reading_End(1);;\
  set_State("Last Change: $4 Sonne weg");;\
  } else {\
  set_Reading_Begin;;\
  set_Reading_Update("$4_Sonne", "on");;\
  set_Reading_Update("$4_Beschattungsposition", [DOIF_IstEsEineHitzeWelle:Besch_Position]);;\
  set_Reading_End(1);;\
  set_State("Last Change: $4 Sonne da");;\
  }\
}\
) ## Ende der Templatedefinition\
\
\
## Definition einzelner DOIF-Blöcke mit Hilfe des Templates\
##               $1 $2               $3     $4\
TPL_Sonne (1,Sensor_Eltako_Ost,27000,Ost)\
TPL_Sonne (2,Sensor_Eltako_West,27000,West)\
TPL_Sonne (3,Sensor_Eltako_Sued,27000,Süd)\

attr DOIF_TEST_Sonne DbLogExclude .*

setstate DOIF_TEST_Sonne 2020-06-01 07:56:57 mode enabled


Damian

1. ? geht nicht, da es keine Variablenzuweisung ist, sondern das Setzen von Readings mit einer Funktion (set_Reading)
2. wait gibt es im Perl-Modus nicht, stattdessen set_Exec ("Timer1",Sekunden,"Auszuführender Befehl") verwenden, siehe: https://fhem.de/commandref_DE.html#DOIF_set_Exec
3. uiTable arbeitet nicht mit Modulvariablen, sondern mit Readings (hier kann man $SELF für eigene Readings verwenden), zu uiTable gibt es sehr viele Beispiele: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Damian am 27 Mai 2020, 23:04:54
Man kann in der kommenden DOIF-Version im Perl-Modus, wie im FHEM-Modus, einzelne Blöcke manuell per set-Befehl ausführen. Das erleichtert das Überprüfen einer neuen Definition.

neue Version wurde eingecheckt
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eddy242

Hallo zusammen,

ich habe mein Beispiel weiterentwickelt und laufe auf ein Problem. Ich bekomme folgenden Fehler:

error         in readingsupdate("SüdWest","on",5): Undefined subroutine &DOIF::readingsupdate called at (eval 7703032) line 1.             2020-06-18 10:56:04


Habe ich die subs an der falschen Stelle? Ich hatte auch diese Variante ausprobiert, hat aber den gleichen Fehler gegeben.

set_Exec("$1_$2_timer_Sonne_aus",60,'$SELF::readingsupdate("$2","off",$1)');



Internals:
   DEF        subs {
  sub readingsupdate {
    my ($Richtung,$OnOff,$indexer) = @_;
set_Reading_Begin;
set_Reading_Update("$Richtung_Sonne", $OnOff);
set_Reading_Update("$Richtung_Beschattungsposition", ($OnOff eq "on" ? [DOIF_IstEsEineHitzeWelle:Besch_Position] : "GanzAuf"));
set_Reading_End(1);
set_State("Last Change: $Richtung Sonne $OnOff");
$VAR{$indexer} = ($OnOff eq "on" ? 1 : 0);
  }
}

DEF TPL_Sonne (
{
  if (
  ([$3:brightness:d] < $4) and
  ([$5:brightness:d] < $6) and
([DOIF_IstEsEineHitzeWelle:state] eq "off")
  ) {
    ## hier ist der Threshold unterschritten, also Sonne AUS
## wenn die Sonne noch an ist dann ist $VAR{$1} == 1 - sonst müssten wir keinen Timer starten
## Wenn wir schon einen Timer haben, starten wir natürlich keinen neuen
if ($VAR{$1} and (get_Exec("$1_$2_timer_Sonne_aus") == 0)) {
  set_Exec("$1_$2_timer_Sonne_aus",60,'readingsupdate("$2","off",$1)');
  fhem("setreading $SELF DEBUG_$1_$2_timer_Sonne_aus started");
}
## Allerdings müssen wir dann auch den eventuell laufenden Timer "Sonne an" löschen
if (get_Exec("$1_$2_timer_Sonne_an") > 0) {
  del_Exec("$1_$2_timer_Sonne_an");
  fhem("setreading $SELF DEBUG_$1_$2_timer_Sonne_an deleted");
}
  } else {
    ## hier ist der Threshold überschritten, also Sonne AN
## wenn die Sonne noch aus ist dann ist $VAR{$1} == 0 - sonst müssten wir keinen Timer starten
## Wenn wir schon einen Timer haben, starten wir natürlich keinen neuen
if (!$VAR{$1} and (get_Exec("$1_$2_timer_Sonne_an") == 0)) {
  set_Exec("$1_$2_timer_Sonne_an",60,'readingsupdate("$2","on",$1)');
  fhem("setreading $SELF DEBUG_$1_$2_timer_Sonne_an started");
}
## Allerdings müssen wir dann auch den eventuell laufenden Timer "Sonne aus" löschen
if (get_Exec("$1_$2_timer_Sonne_aus") > 0) {
  del_Exec("$1_$2_timer_Sonne_aus");
  fhem("setreading $SELF DEBUG_$1_$2_timer_Sonne_aus deleted");
}
  }
}
) ## Ende der Templatedefinition


## Definition einzelner DOIF-Blöcke mit Hilfe des Templates
##         $1  $2        $3             $4             $5             $6
##         Nr, Richtung, Sensor1Device, Sensor1Thresh, Sensor2Device, Sensor2Thresh
TPL_Sonne (1,Ost,Sensor_Eltako_Ost,27000,Sensor_Eltako_Ost,27000)
TPL_Sonne (2,West,Sensor_Eltako_West,27000,Sensor_Eltako_West,27000)
TPL_Sonne (3,Süd,Sensor_Eltako_Sued,27000,Sensor_Eltako_Sued,27000)
TPL_Sonne (4,SüdOst,Sensor_Eltako_Sued,25000,Sensor_Eltako_Ost,15000)
TPL_Sonne (5,SüdWest,Sensor_Eltako_Sued,27000,Sensor_Eltako_West,15000)

   FUUID      5ed49803-f33f-0759-b909-b7f02681c0e751b7
   MODEL      Perl
   NAME       DOIF_TEST_Sonne
   NOTIFYDEV  global,Sensor_Eltako_Sued,Sensor_Eltako_Ost,DOIF_IstEsEineHitzeWelle,Sensor_Eltako_West
   NR         534
   NTFY_ORDER 50-DOIF_TEST_Sonne
   STATE      Last Change: Ost Sonne weg
   TYPE       DOIF
   VERSION    22161 2020-06-11 12:49:48
   OLDREADINGS:
   READINGS:
     2020-06-18 10:53:19   DEBUG_1_Ost_timer_Sonne_an started
     2020-06-18 10:55:04   Device          Sensor_Eltako_West
     2020-06-17 22:07:04   Ost_Beschattungsposition GanzAuf
     2020-06-17 22:07:04   Ost_Sonne       off
     2020-06-17 22:06:13   Süd_Beschattungsposition GanzAuf
     2020-06-17 22:06:13   Süd_Sonne      off
     2020-06-17 22:05:19   West_Beschattungsposition GanzAuf
     2020-06-17 22:05:19   West_Sonne      off
     2020-06-18 10:53:19   block_01        executed
     2020-06-18 10:55:04   block_02        executed
     2020-06-18 10:53:21   block_03        executed
     2020-06-18 10:53:21   block_04        executed
     2020-06-18 10:55:04   block_05        executed
     2020-06-18 10:53:19   e_Sensor_Eltako_Ost_brightness 30002
     2020-06-18 10:53:21   e_Sensor_Eltako_Sued_brightness 30002
     2020-06-18 10:55:04   e_Sensor_Eltako_West_brightness 14976
     2020-06-18 10:56:04   error           in readingsupdate("SüdWest","on",5): Undefined subroutine &DOIF::readingsupdate called at (eval 7703032) line 1.

     2020-06-18 10:51:39   mode            enabled
     2020-06-17 22:07:04   state           Last Change: Ost Sonne weg
   Regex:
     accu:
     cond:
       DOIF_IstEsEineHitzeWelle:
         0:
           state      ^DOIF_IstEsEineHitzeWelle$:^state:
         1:
           state      ^DOIF_IstEsEineHitzeWelle$:^state:
         2:
           state      ^DOIF_IstEsEineHitzeWelle$:^state:
         3:
           state      ^DOIF_IstEsEineHitzeWelle$:^state:
         4:
           state      ^DOIF_IstEsEineHitzeWelle$:^state:
       Sensor_Eltako_Ost:
         0:
           brightness ^Sensor_Eltako_Ost$:^brightness:
         1:
         2:
         3:
           brightness ^Sensor_Eltako_Ost$:^brightness:
         4:
       Sensor_Eltako_Sued:
         0:
         1:
         2:
           brightness ^Sensor_Eltako_Sued$:^brightness:
         3:
           brightness ^Sensor_Eltako_Sued$:^brightness:
         4:
           brightness ^Sensor_Eltako_Sued$:^brightness:
       Sensor_Eltako_West:
         0:
         1:
           brightness ^Sensor_Eltako_West$:^brightness:
         2:
         3:
         4:
           brightness ^Sensor_Eltako_West$:^brightness:
   condition:
     0         
  if (
  (::ReadingValDoIf($hash,'Sensor_Eltako_Ost','brightness','','d') < 27000) and
  (::ReadingValDoIf($hash,'Sensor_Eltako_Ost','brightness','','d') < 27000) and
(::ReadingValDoIf($hash,'DOIF_IstEsEineHitzeWelle','state') eq "off")
  ) {
      if ($hash->{var}{1} and (get_Exec("1_Ost_timer_Sonne_aus") == 0)) {
  set_Exec("1_Ost_timer_Sonne_aus",60,'readingsupdate("Ost","off",1)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_1_Ost_timer_Sonne_aus started");
}
if (get_Exec("1_Ost_timer_Sonne_an") > 0) {
  del_Exec("1_Ost_timer_Sonne_an");
  fhem("setreading DOIF_TEST_Sonne DEBUG_1_Ost_timer_Sonne_an deleted");
}
  } else {
      if (!$hash->{var}{1} and (get_Exec("1_Ost_timer_Sonne_an") == 0)) {
  set_Exec("1_Ost_timer_Sonne_an",60,'readingsupdate("Ost","on",1)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_1_Ost_timer_Sonne_an started");
}
if (get_Exec("1_Ost_timer_Sonne_aus") > 0) {
  del_Exec("1_Ost_timer_Sonne_aus");
  fhem("setreading DOIF_TEST_Sonne DEBUG_1_Ost_timer_Sonne_aus deleted");
}
  }

     1         
  if (
  (::ReadingValDoIf($hash,'Sensor_Eltako_West','brightness','','d') < 27000) and
  (::ReadingValDoIf($hash,'Sensor_Eltako_West','brightness','','d') < 27000) and
(::ReadingValDoIf($hash,'DOIF_IstEsEineHitzeWelle','state') eq "off")
  ) {
      if ($hash->{var}{2} and (get_Exec("2_West_timer_Sonne_aus") == 0)) {
  set_Exec("2_West_timer_Sonne_aus",60,'readingsupdate("West","off",2)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_2_West_timer_Sonne_aus started");
}
if (get_Exec("2_West_timer_Sonne_an") > 0) {
  del_Exec("2_West_timer_Sonne_an");
  fhem("setreading DOIF_TEST_Sonne DEBUG_2_West_timer_Sonne_an deleted");
}
  } else {
      if (!$hash->{var}{2} and (get_Exec("2_West_timer_Sonne_an") == 0)) {
  set_Exec("2_West_timer_Sonne_an",60,'readingsupdate("West","on",2)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_2_West_timer_Sonne_an started");
}
if (get_Exec("2_West_timer_Sonne_aus") > 0) {
  del_Exec("2_West_timer_Sonne_aus");
  fhem("setreading DOIF_TEST_Sonne DEBUG_2_West_timer_Sonne_aus deleted");
}
  }

     2         
  if (
  (::ReadingValDoIf($hash,'Sensor_Eltako_Sued','brightness','','d') < 27000) and
  (::ReadingValDoIf($hash,'Sensor_Eltako_Sued','brightness','','d') < 27000) and
(::ReadingValDoIf($hash,'DOIF_IstEsEineHitzeWelle','state') eq "off")
  ) {
      if ($hash->{var}{3} and (get_Exec("3_Süd_timer_Sonne_aus") == 0)) {
  set_Exec("3_Süd_timer_Sonne_aus",60,'readingsupdate("Süd","off",3)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_3_Süd_timer_Sonne_aus started");
}
if (get_Exec("3_Süd_timer_Sonne_an") > 0) {
  del_Exec("3_Süd_timer_Sonne_an");
  fhem("setreading DOIF_TEST_Sonne DEBUG_3_Süd_timer_Sonne_an deleted");
}
  } else {
      if (!$hash->{var}{3} and (get_Exec("3_Süd_timer_Sonne_an") == 0)) {
  set_Exec("3_Süd_timer_Sonne_an",60,'readingsupdate("Süd","on",3)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_3_Süd_timer_Sonne_an started");
}
if (get_Exec("3_Süd_timer_Sonne_aus") > 0) {
  del_Exec("3_Süd_timer_Sonne_aus");
  fhem("setreading DOIF_TEST_Sonne DEBUG_3_Süd_timer_Sonne_aus deleted");
}
  }

     3         
  if (
  (::ReadingValDoIf($hash,'Sensor_Eltako_Sued','brightness','','d') < 25000) and
  (::ReadingValDoIf($hash,'Sensor_Eltako_Ost','brightness','','d') < 15000) and
(::ReadingValDoIf($hash,'DOIF_IstEsEineHitzeWelle','state') eq "off")
  ) {
      if ($hash->{var}{4} and (get_Exec("4_SüdOst_timer_Sonne_aus") == 0)) {
  set_Exec("4_SüdOst_timer_Sonne_aus",60,'readingsupdate("SüdOst","off",4)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_4_SüdOst_timer_Sonne_aus started");
}
if (get_Exec("4_SüdOst_timer_Sonne_an") > 0) {
  del_Exec("4_SüdOst_timer_Sonne_an");
  fhem("setreading DOIF_TEST_Sonne DEBUG_4_SüdOst_timer_Sonne_an deleted");
}
  } else {
      if (!$hash->{var}{4} and (get_Exec("4_SüdOst_timer_Sonne_an") == 0)) {
  set_Exec("4_SüdOst_timer_Sonne_an",60,'readingsupdate("SüdOst","on",4)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_4_SüdOst_timer_Sonne_an started");
}
if (get_Exec("4_SüdOst_timer_Sonne_aus") > 0) {
  del_Exec("4_SüdOst_timer_Sonne_aus");
  fhem("setreading DOIF_TEST_Sonne DEBUG_4_SüdOst_timer_Sonne_aus deleted");
}
  }

     4         
  if (
  (::ReadingValDoIf($hash,'Sensor_Eltako_Sued','brightness','','d') < 27000) and
  (::ReadingValDoIf($hash,'Sensor_Eltako_West','brightness','','d') < 15000) and
(::ReadingValDoIf($hash,'DOIF_IstEsEineHitzeWelle','state') eq "off")
  ) {
      if ($hash->{var}{5} and (get_Exec("5_SüdWest_timer_Sonne_aus") == 0)) {
  set_Exec("5_SüdWest_timer_Sonne_aus",60,'readingsupdate("SüdWest","off",5)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_5_SüdWest_timer_Sonne_aus started");
}
if (get_Exec("5_SüdWest_timer_Sonne_an") > 0) {
  del_Exec("5_SüdWest_timer_Sonne_an");
  fhem("setreading DOIF_TEST_Sonne DEBUG_5_SüdWest_timer_Sonne_an deleted");
}
  } else {
      if (!$hash->{var}{5} and (get_Exec("5_SüdWest_timer_Sonne_an") == 0)) {
  set_Exec("5_SüdWest_timer_Sonne_an",60,'readingsupdate("SüdWest","on",5)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_5_SüdWest_timer_Sonne_an started");
}
if (get_Exec("5_SüdWest_timer_Sonne_aus") > 0) {
  del_Exec("5_SüdWest_timer_Sonne_aus");
  fhem("setreading DOIF_TEST_Sonne DEBUG_5_SüdWest_timer_Sonne_aus deleted");
}
  }

   defs:
     tpl:
       TPL_Sonne 
{
  if (
  ([$3:brightness:d] < $4) and
  ([$5:brightness:d] < $6) and
([DOIF_IstEsEineHitzeWelle:state] eq "off")
  ) {
      if ($VAR{$1} and (get_Exec("$1_$2_timer_Sonne_aus") == 0)) {
  set_Exec("$1_$2_timer_Sonne_aus",60,'readingsupdate("$2","off",$1)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_$1_$2_timer_Sonne_aus started");
}
if (get_Exec("$1_$2_timer_Sonne_an") > 0) {
  del_Exec("$1_$2_timer_Sonne_an");
  fhem("setreading DOIF_TEST_Sonne DEBUG_$1_$2_timer_Sonne_an deleted");
}
  } else {
      if (!$VAR{$1} and (get_Exec("$1_$2_timer_Sonne_an") == 0)) {
  set_Exec("$1_$2_timer_Sonne_an",60,'readingsupdate("$2","on",$1)');
  fhem("setreading DOIF_TEST_Sonne DEBUG_$1_$2_timer_Sonne_an started");
}
if (get_Exec("$1_$2_timer_Sonne_aus") > 0) {
  del_Exec("$1_$2_timer_Sonne_aus");
  fhem("setreading DOIF_TEST_Sonne DEBUG_$1_$2_timer_Sonne_aus deleted");
}
  }
}

   helper:
     DEVFILTER  ^global$|^DOIF_IstEsEineHitzeWelle$|^Sensor_Eltako_Ost$|^Sensor_Eltako_Sued$|^Sensor_Eltako_West$
     NOTIFYDEV  global|DOIF_IstEsEineHitzeWelle|Sensor_Eltako_Ost|Sensor_Eltako_Sued|Sensor_Eltako_West
     event      brightness: 14976,14976,luminance: 14976 Lux
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev Sensor_Eltako_West
     triggerEvents:
       brightness: 14976
       14976
       luminance: 14976 Lux
     triggerEventsState:
       brightness: 14976
       state: 14976
       luminance: 14976 Lux
   internals:
   perlblock:
     0          block_01
     1          block_02
     2          block_03
     3          block_04
     4          block_05
   ptimer:
     1_Ost_timer_Sonne_an:
       name       1_Ost_timer_Sonne_an
       subname    readingsupdate("Ost","on",1)
       time       1592470459.65157
       hash:
     1_Ost_timer_Sonne_aus:
     2_West_timer_Sonne_an:
     3_Süd_timer_Sonne_an:
       name       3_Süd_timer_Sonne_an
       subname    readingsupdate("Süd","on",3)
       time       1592470461.8714
       hash:
     3_Süd_timer_Sonne_aus:
     4_SüdOst_timer_Sonne_an:
       name       4_SüdOst_timer_Sonne_an
       subname    readingsupdate("SüdOst","on",4)
       time       1592470441.68786
       hash:
     4_SüdOst_timer_Sonne_aus:
     5_SüdWest_timer_Sonne_an:
       name       5_SüdWest_timer_Sonne_an
       subname    readingsupdate("SüdWest","on",5)
       time       1592470564.87365
       hash:
     5_SüdWest_timer_Sonne_aus:
   readings:
     all         Sensor_Eltako_Ost:brightness DOIF_IstEsEineHitzeWelle:state Sensor_Eltako_West:brightness Sensor_Eltako_Sued:brightness
   trigger:
   uiTable:
     package    package ui_Table;
     shownostate 1
     table:
       0:
         0:
           0:
             0          package ui_Table;"Richtung"
         1:
           0:
             0          package ui_Table;"Sonne"
         2:
           0:
             0          package ui_Table;""
         3:
           0:
             0          package ui_Table;"Beschattungsposition"
         4:
           0:
             0          package ui_Table;"Letzte Änderung"
       1:
         0:
           0:
             0          package ui_Table; "Ost"
         1:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "Ost_Sonne", "")
         2:
           0:
             0          package ui_Table; ICON("weather_sun\@".(::ReadingsVal("DOIF_TEST_Sonne", "Ost_Sonne", "") eq "on" ? "yellow" : "grey"))
         3:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "Ost_Beschattungsposition", "")
         4:
           0:
             0          package ui_Table; ::ReadingsTimestamp("DOIF_TEST_Sonne", "Ost_Sonne", "")
       2:
         0:
           0:
             0          package ui_Table; "West"
         1:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "West_Sonne", "")
         2:
           0:
             0          package ui_Table; ICON("weather_sun\@".(::ReadingsVal("DOIF_TEST_Sonne", "West_Sonne", "") eq "on" ? "yellow" : "grey"))
         3:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "West_Beschattungsposition", "")
         4:
           0:
             0          package ui_Table; ::ReadingsTimestamp("DOIF_TEST_Sonne", "West_Sonne", "")
       3:
         0:
           0:
             0          package ui_Table; "Süd"
         1:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "Süd_Sonne", "")
         2:
           0:
             0          package ui_Table; ICON("weather_sun\@".(::ReadingsVal("DOIF_TEST_Sonne", "Süd_Sonne", "") eq "on" ? "yellow" : "grey"))
         3:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "Süd_Beschattungsposition", "")
         4:
           0:
             0          package ui_Table; ::ReadingsTimestamp("DOIF_TEST_Sonne", "Süd_Sonne", "")
       4:
         0:
           0:
             0          package ui_Table; "SüdOst"
         1:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "SüdOst_Sonne", "")
         2:
           0:
             0          package ui_Table; ICON("weather_sun\@".(::ReadingsVal("DOIF_TEST_Sonne", "SüdOst_Sonne", "") eq "on" ? "yellow" : "grey"))
         3:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "SüdOst_Beschattungsposition", "")
         4:
           0:
             0          package ui_Table; ::ReadingsTimestamp("DOIF_TEST_Sonne", "SüdOst_Sonne", "")
       5:
         0:
           0:
             0          package ui_Table; "SüdWest"
         1:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "SüdWest_Sonne", "")
         2:
           0:
             0          package ui_Table; ICON("weather_sun\@".(::ReadingsVal("DOIF_TEST_Sonne", "SüdWest_Sonne", "") eq "on" ? "yellow" : "grey"))
         3:
           0:
             0          package ui_Table; ::ReadingsVal("DOIF_TEST_Sonne", "SüdWest_Beschattungsposition", "")
         4:
           0:
             0          package ui_Table; ::ReadingsTimestamp("DOIF_TEST_Sonne", "SüdWest_Sonne", "")
     tc:
       0          style='font-size: large'
       1          style='font-size: large'
       2          style='font-size: large'
       3          style='font-size: large'
       4          style='font-size: large'
     td:
       0:
       1:
       2:
       3:
       4:
       5:
     tpl:
       TPL_line   
"$1"| ::ReadingsVal("DOIF_TEST_Sonne", "$1_Sonne", "")| ICON("weather_sun\@".(::ReadingsVal("DOIF_TEST_Sonne", "$1_Sonne", "") eq "on" ? "yellow" : "grey"))| ::ReadingsVal("DOIF_TEST_Sonne", "$1_Beschattungsposition", "")| ::ReadingsTimestamp("DOIF_TEST_Sonne", "$1_Sonne", "")

     tr:
   var:
Attributes:
   DbLogExclude .*
   uiTable    {
package ui_Table;           ## Package für uiTable-Funktionen
$TC{0..4} = "style='font-size: large'";

## Ausblenden des Status in der Statuszeile
$SHOWNOSTATE=1;
}

DEF TPL_line (
"$1"|
::ReadingsVal("$SELF", "$1_Sonne", "")|
ICON("weather_sun\@".(::ReadingsVal("$SELF", "$1_Sonne", "") eq "on" ? "yellow" : "grey"))|
::ReadingsVal("$SELF", "$1_Beschattungsposition", "")|
::ReadingsTimestamp("$SELF", "$1_Sonne", "")
)

"Richtung"|"Sonne"|""|"Beschattungsposition"|"Letzte Änderung"
TPL_line (Ost)
TPL_line (West)
TPL_line (Süd)
TPL_line (SüdOst)
TPL_line (SüdWest)

Damian

#12
Template-Definitionen müssen als erstes kommen und dann der Rest.

d. h. hier konkret: den subs-Block einfach hinter DEF TPL_Sonne verschieben.

Dann fallen dir weitere Fehler auf zu: $Richtung_Sonne, $Richtung_Beschattungsposition und [DOIF_IstEsEineHitzeWelle:Besch_Position]

DOIF-Syntax ist im subs-Block nicht erlaubt, d. h. [DOIF_IstEsEineHitzeWelle:Besch_Position] durch ReadingsVal ersetzen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

münster

Hallo Damian,

danke für das Modul. Ich bin gerade dabei, meine DOIF Wecker mit Hilfe von Templates zu generalisieren. Leider kann ich nur auf die ersten 9 Parameter zugreifen: $10 wird als $1 0 interpretiert. Gibt es einen Trick, wie ich auf $10 und höher zugreifen kann?

Vielen Dank

münster

Damian

#14
Zitat von: münster am 18 Juni 2020, 15:33:51
Hallo Damian,

danke für das Modul. Ich bin gerade dabei, meine DOIF Wecker mit Hilfe von Templates zu generalisieren. Leider kann ich nur auf die ersten 9 Parameter zugreifen: $10 wird als $1 0 interpretiert. Gibt es einen Trick, wie ich auf $10 und höher zugreifen kann?

Vielen Dank

münster

Wer braucht denn schon mehr als neun Parameter  :o

Neue Version hochgeladen  ;D
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

münster

Sehr nett. Danke.  :D

BTW, Weckzeit Mo - So: $1 ... $7, Rampenzeit: $8, Thermos: $9, Sender: $10, Licht-Szenen: $11, ...

moonsorrox

Frage zu den Rollladen Steuerungen, in welche Position fährt er denn wenn die zeitliche Beschattung aufgehoben wird.?
Könnte man das zusätzlich noch mit einem Block angeben.?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

#17
Ich habe das Beispiel aus dem ersten Post um ein Web-Interface erweitert (siehe https://forum.fhem.de/index.php/topic,112566.msg1069005.html#msg1069005)

defmod di_beschattung3 DOIF subs  {\
## Definition der FHEM-Widgets        \
                                                                                        @{$VAR{widget}}=split (/\| */,q(time|time|  textFieldNL|          select,on,off));;\
## Überschrift der Widgets\
                                                                                        @{$VAR{params}}=split (/\| */,q(von| bis|   Befehl|               aktiv));;\
## Überschrift der Texte\
@{$VAR{text}}=     split (/\| */,q(Szene|Thermostat|Sensor));;\
\
## Definition einzelner Datensätze pro Szene\
push (@{$VAR{sc}},[split (/\| */,q(Bad|                TH_Bad_HM|    Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_Bad 30|              on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Dachgeschoss|       TH_DG_HM|     Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_DG 30|               on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kueche|             TH_Kueche_HM| Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(09:00|14:00|R_Kueche 50|           on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_ost| TH_Kz_o_HM|   Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(09:00|14:00|R_Kinderzimmer1_O 30|  on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_sued|TH_Kz_o_HM|   Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_Kinderzimmer1_S 25|  on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_sued|TH_Kz_w_HM|   Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_Kinderzimmer2_S 25|  on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_west|TH_Kz_w_HM|   Sonne_w))]);; push (@{$VAR{scene}},[split (/\| */,q(15:30|21:00|R_Kinderzimmer2_W.* 25|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_sued|    TH_WZ_HM|     Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:30|21:00|R_W_S 25|              on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_west|    TH_WZ_HM|     Sonne_w))]);; push (@{$VAR{scene}},[split (/\| */,q(15:30|21:00|R_W_W[23] 25|          on))]);;\
\
## Bei Änderung der Definition werden alle erfoderlichen Readings erstellt und vorbelegt\
\
if ($::init_done) {\
    my @params=@{$VAR{params}};;\
my @scene=@{$VAR{scene}};;\
my @sc=@{$VAR{sc}};;\
    for (my $i=0;;$i < @sc;;$i++) {\
  for (my $j=0;;$j < @params;;$j++) {\
    set_Reading ($sc[$i][0].".".$params[$j],$scene[$i][$j]);;\
      }\
    }\
  }\
}\
\
DEF TPL_shutter ( ## Definition des Templates namens TPL_shutter\
shutter_$1 {  ## DOIF Block \
if ($7 eq "on") { ## wenn Szene aktiv\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$4-$5] and !$VAR{$1}) { ## Wenn die Zimmertemperatur über 24 und Sonne scheint innherhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\
    fhem_set($6);;  ## Fenster herunterfahren\
    $VAR{$1}=1;;         ## Merker setzen, dass Fenster bereits heruntergefahren wurde\
  }\
}\
}\
## Ende der Templatedefinition\
)\
reset {[00:01];;delete $VAR;;}    ## nachts alle Merker löschen\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$VAR{sc}},TPL_shutter($1$1,$1$2,$1$3,FOR(@{$VAR{params}},([$SELF:$1$1.$2],))))
attr di_beschattung3 room DOIF,test
attr di_beschattung3 uiTable {\
  $TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Parameter\
FOR (@{$VAR{text}},"$_"|)FOR (@{$VAR{params}},"$_"|)""\
\
## Pro Datensatz einer Beschattungs-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$1$1"|"$1$2"|"$1$3"|FOR(@{$VAR{params}},WID([$SELF:$1$1.$2],${$VAR{widget}}[$COUNT2])|)"")


Edit: Überarbeitung der Definition
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#18
Hier eine weitere generalisierte Beschattung-Steuerung mit: Texten, uiTable-Funktionen und Widgets in der Tabelle

defmod di_beschattung4 DOIF subs  {\
## Parameter\
@{$VAR{params}}=   split (/\| */,q(Szene|             Temperatur|Einstrahlung|Befehl|            Status|von|  bis| aktiv));;\
\
## Definition einzelner Datensätze pro Szene\
push (@{$VAR{sc}},[split (/\| */,q(Bad|                TH_Bad_HM|    Sonne_s|R_Bad 30|              off|12:00|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Dachgeschoss|       TH_DG_HM|     Sonne_s|R_DG 30|               off|12:00|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kueche|             TH_Kueche_HM| Sonne_s|R_Kueche 50|           off|09:00|14:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_ost| TH_Kz_o_HM|   Sonne_s|R_Kinderzimmer1_O 30|  off|09:00|14:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_sued|TH_Kz_o_HM|   Sonne_s|R_Kinderzimmer1_S 25|  off|12:00|23:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_sued|TH_Kz_w_HM|   Sonne_s|R_Kinderzimmer2_S 25|  off|12:00|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_west|TH_Kz_w_HM|   Sonne_w|R_Kinderzimmer2_W.* 25|off|15:30|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_sued|    TH_WZ_HM|     Sonne_s|R_W_S 25|              off|12:30|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_west|    TH_WZ_HM|     Sonne_w|R_W_W[23] 25|          off|15:30|21:00|on))]);;\
\
## Bei Änderung der Definition werden alle erfoderlichen Readings erstellt und vorbelegt\
\
if ($::init_done) {\
my @sc=@{$VAR{sc}};;\
my @params=@{$VAR{params}};;\
set_State("initialized");;\
    for (my $i=0;;$i < @sc;;$i++) {\
  for (my $j=4;;$j < @{$sc[$i]};;$j++) {\
    set_Reading ($sc[$i][0].".".$params[$j],$sc[$i][$j]);;\
      }\
    }\
  }\
\
sub reset_state {\
  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 \
if ($7 eq "on") { ## wenn Szene aktiv\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$5-$6] and get_Reading("$1.Status") eq "off") { ## Wenn die Zimmertemperatur über 24 und Sonne scheint innherhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\
fhem_set("$4");;  ## Fenster herunterfahren\
set_State("Szene: $1");;\
set_Reading("$1.Status","on",1);;\
   }\
}\
}\
## 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,[$SELF:$_$1.von],[$SELF:$_$1.bis],[$SELF:$_$1.aktiv]))
attr di_beschattung4 room Beschattung,DOIF
attr di_beschattung4 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")|WID([$SELF:$_$1.von],"time")|WID([$SELF:$_$1.bis],"time")|icon([$SELF:$_$1.Status],"fts_shutter_10","fts_shutter_80")|WID([$SELF:$_$1.aktiv],"select,on,off"))

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#19
Neue DOIF-Version wurde eingecheckt.

Ich werde demnächst eine Wiki-Seite zur "Automatisierung mit DOIF" beginnen, wo es vor allem um praxisrelavante Automatisierungsaufgaben geht. Insbesondere sollen dort generalisierte Lösungen darstellt werden, wie hier bereits gepostet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

#21
Ich musste deine Neuerungen erst einmal wirken lassen.
Es wird schon komplex - hat dafür aber enorme Vorteile.

Ich suche immer noch nach einer generalisierten Lösung für eine Treppenhausschaltung. Das Beispiel zum Modul 98_combine.pm ist interessant, aber ich würde es gerne mit einem DOIF umsetzen.

Würde das auch generalisiert in DOIF funktionieren?

Zitat von: justme1968 am 13 April 2020, 21:42:51
treppe:
  - ein timer der alle 10 sekunden zwischen aktiv und inaktiv wechselt. das wäre die zeisteuerung per at oder weekdaytimer
  - ein bewegungsmelder der sich durch klick aktivieren lässt, geht nach 5 sekunden wieder auf nomotion
  - ein schalter der sich durch klick ein- und ausschalten lässt

  - das ganze wird in einem combine device wie folgt kombiniert:
    - wenn der timer aktiv ist geht das licht auf 20%
    - wenn bei aktivem timer Bewegung erkannt wird geht das licht auf 50%
    - wenn der schalter eingeschaltet ist geht das licht immer auf 100%

Schalter und Dämmerung kann ich in deinem Wiki-Beispiel schon erkennen. Wobei jedoch für Dämmerung keine MinMax-Werte ausgewertet werden.
Und ich kann nicht erkennen, ob ein Reading genutzt wird oder ausschließlich den state?

Kannst du mir helfen?

moonsorrox

mir gefällt das mit der Beschattung im Beispiel di_beschattung4 sehr gut... wäre es möglich eine zweite Beschattungszeit einzubauen.
Ich habe das mit einem DOIF in Funktion, aber so sieht das noch besser aus.
Ich mache das wenn der Sonnenstand schon längst nicht mehr so ist wie im Ereignisszustand, damit die Rollläden dann etwas Licht ins Zimmer lassen und ich mache das noch zusätzlich über Temperatur.
Bin damit nur noch nicht ganz zufrieden, dass habe ich gestern gemerkt, als die Temperatur den Wert hatte aber keine Sonne da war und trotzdem beschattet wurde.

Bin da ständig dran um es zu verbessern, aber noch nicht die richtige Lösung gefunden.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: FunkOdyssey am 15 Juli 2020, 14:06:00
Ich musste deine Neuerungen erst einmal wirken lassen.
Es wird schon komplex - hat dafür aber enorme Vorteile.

Ich suche immer noch nach einer generalisierten Lösung für eine Treppenhausschaltung. Das Beispiel zum Modul 98_combine.pm ist interessant, aber ich würde es gerne mit einem DOIF umsetzen.

Würde das auch generalisiert in DOIF funktionieren?

Schalter und Dämmerung kann ich in deinem Wiki-Beispiel schon erkennen. Wobei jedoch für Dämmerung keine MinMax-Werte ausgewertet werden.
Und ich kann nicht erkennen, ob ein Reading genutzt wird oder ausschließlich den state?

Kannst du mir helfen?

Es stellt sich mir die Frage: Wie viele Treppenhäuser hast du? Unter Generalisierung verstehe ich eine bestimmte Steuerung mehrfach zu nutzen, indem man sie mit anderen Werten füttert. Bei einem Treppenhaus brauche ich eigentlich nichts zu generalisieren, da ich die Steuerung nur einmal nutze.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Ich habe es nur so genannt. Und ich bin hier vermutlich komplett offtopic.
Aber nahezu jede meiner Einschaltungen ist von diversen Faktoren abhängig.
Nicht nur das Treppenhaus.  ;D

Es sah hier für mich aus, als wären wir hier schon nah dran.
Aber ich denke noch einmal in Ruhe nach. Hat ja nicht wirklich etwas mit Generalisierung zu tun.

Damian

Zitat von: moonsorrox am 15 Juli 2020, 14:45:56
mir gefällt das mit der Beschattung im Beispiel di_beschattung4 sehr gut... wäre es möglich eine zweite Beschattungszeit einzubauen.
Ich habe das mit einem DOIF in Funktion, aber so sieht das noch besser aus.
Ich mache das wenn der Sonnenstand schon längst nicht mehr so ist wie im Ereignisszustand, damit die Rollläden dann etwas Licht ins Zimmer lassen und ich mache das noch zusätzlich über Temperatur.
Bin damit nur noch nicht ganz zufrieden, dass habe ich gestern gemerkt, als die Temperatur den Wert hatte aber keine Sonne da war und trotzdem beschattet wurde.

Bin da ständig dran um es zu verbessern, aber noch nicht die richtige Lösung gefunden.

Die Steuerung entspricht einer einfachen if-Abfrage, die kannst du wie bei jedem DOIF beliebig erweitern. Du musst nur auf die Reihenfolge der übergebenen Parameter achten ($1, $2, $3 usw.). Wenn du einen weiteren Parameter einfügst verschieben sich die darauf folgenden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: FunkOdyssey am 15 Juli 2020, 20:37:09
Ich habe es nur so genannt. Und ich bin hier vermutlich komplett offtopic.
Aber nahezu jede meiner Einschaltungen ist von diversen Faktoren abhängig.
Nicht nur das Treppenhaus.  ;D

Es sah hier für mich aus, als wären wir hier schon nah dran.
Aber ich denke noch einmal in Ruhe nach. Hat ja nicht wirklich etwas mit Generalisierung zu tun.

Du kannst natürlich auch nur für eine Steuerung die Parameter variabel halten, indem du indirekte Zeiten benutzt oder die Ausführungsbefehle in Readings ablegst, wie in diesem Beispiel https://forum.fhem.de/index.php/topic,111266.msg1069319.html#msg1069319

Im letzten Wiki-Automatisierungsbeispiel https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht werden gleich mehrere Aspekte berücksichtigt:

1. Generalisierung: eine neue "Szene" kann einfach durch Hinzufügen einer einzigen Zeile erzeugt werden

aber eben auch die

2. Visualisierung. Sie wird automatisch aufgrund der hinzugefügten Zeile generiert. Dabei werden dargestellt:

1) feste vorgegebene Parameter einer Szene (Befehle, Zeiten usw.)
2) dynamische Werte (hier Dämmerung)
3) aktueller Status einer Szene

und

4) jede Szene lässt sich über ein Select-Widget aktivieren/deaktivieren


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mumpitzstuff

Irgendwie ist die neue DOIF Version inkompatibel zur alten Version. Das Fernsehprogramm geht jetzt nicht mehr. Was muss man denn tun, damit es wieder geht?

Damian

Womöglich hängt es mit den Templates zusammen. Ich musste ein paar Auswertmechanismen ändern, die Version sollte aber kompatibel sein. Ich bräuchte genauere Infos, wo es klemmt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mumpitzstuff

#29
Es tritt beim Fernsehprogramm DOIF auf.

Das folgende sehe ich im Logfile:

2020.07.15 22:07:10 1: PERL WARNING: Possible precedence issue with control flow operator at (eval 475) line 1.
2020.07.15 22:07:10 1: stacktrace:
2020.07.15 22:07:10 1:     main::__ANON__                      called by (eval 475) (1)
2020.07.15 22:07:10 1:     (eval)                              called by ./FHEM/98_DOIF.pm (284)
2020.07.15 22:07:10 1:     main::DOIF_RegisterCell             called by ./FHEM/98_DOIF.pm (639)
2020.07.15 22:07:10 1:     main::DOIF_uiTable_def              called by ./FHEM/98_DOIF.pm (2627)
2020.07.15 22:07:10 1:     main::DOIF_Notify                   called by fhem.pl (3795)
2020.07.15 22:07:10 1:     main::CallFn                        called by fhem.pl (3715)
2020.07.15 22:07:10 1:     main::DoTrigger                     called by fhem.pl (665)
2020.07.15 22:07:10 1: PERL WARNING: Possible precedence issue with control flow operator at (eval 479) line 1.
2020.07.15 22:07:10 1: stacktrace:
2020.07.15 22:07:10 1:     main::__ANON__                      called by (eval 479) (1)
2020.07.15 22:07:10 1:     (eval)                              called by ./FHEM/98_DOIF.pm (284)
2020.07.15 22:07:10 1:     main::DOIF_RegisterCell             called by ./FHEM/98_DOIF.pm (639)
2020.07.15 22:07:10 1:     main::DOIF_uiTable_def              called by ./FHEM/98_DOIF.pm (2627)
2020.07.15 22:07:10 1:     main::DOIF_Notify                   called by fhem.pl (3795)
2020.07.15 22:07:10 1:     main::CallFn                        called by fhem.pl (3715)
2020.07.15 22:07:10 1:     main::DoTrigger                     called by fhem.pl (665)


Die Probleme traten direkt nach dem Aufruf von Update all bzw. shutdown restart auf.

mumpitzstuff

#30
Es liegt an der Funktion DOIF_DEF_TPL. Benenne ich diese um und rename DOIF_DEF_TPL_OLD zu DOIF_DEF_TPL, funktioniert alles wieder.

# parameter: device name, mode (next or prime), channel name (see xml data file), icon name (filename of channel logo)
DEF TPL_TV(showIcon("$4",undef,undef)|substr([$1:$2_$3_000_btime],0,5)|unfold([$1:$2_$3_000_title],[$1:$2_$3_000_stitle]."\n\n".[$1:$2_$3_000_desc])|substr([$1:$2_$3_001_btime],0,5)|unfold([$1:$2_$3_001_title],[$1:$2_$3_001_stitle]."\n\n".[$1:$2_$3_001_desc])|substr([$1:$2_$3_002_btime],0,5)|unfold([$1:$2_$3_002_title],[$1:$2_$3_002_stitle]."\n\n".[$1:$2_$3_002_desc]))

# parameter: device name, mode (next or prime), channel name (see xml data file), icon name (filename of channel logo), device name for set command, command
DEF TPL_TVSET(showIcon("$4","$5","$6")|substr([$1:$2_$3_000_btime],0,5)|unfold([$1:$2_$3_000_title],[$1:$2_$3_000_stitle]."\n\n".[$1:$2_$3_000_desc])|substr([$1:$2_$3_001_btime],0,5)|unfold([$1:$2_$3_001_title],[$1:$2_$3_001_stitle]."\n\n".[$1:$2_$3_001_desc])|substr([$1:$2_$3_002_btime],0,5)|unfold([$1:$2_$3_002_title],[$1:$2_$3_002_stitle]."\n\n".[$1:$2_$3_002_desc]))


Innerhalb der uiTable stört sich DOIF jetzt an den beiden Kommentaren über den DEF Definitionen. Entferne ich beide Kommentare, dann geht es auch mit der unveränderten DOIF Version wieder.


Damian

Zitat von: mumpitzstuff am 16 Juli 2020, 01:56:15
Es liegt an der Funktion DOIF_DEF_TPL. Benenne ich diese um und rename DOIF_DEF_TPL_OLD zu DOIF_DEF_TPL, funktioniert alles wieder.

# parameter: device name, mode (next or prime), channel name (see xml data file), icon name (filename of channel logo)
DEF TPL_TV(showIcon("$4",undef,undef)|substr([$1:$2_$3_000_btime],0,5)|unfold([$1:$2_$3_000_title],[$1:$2_$3_000_stitle]."\n\n".[$1:$2_$3_000_desc])|substr([$1:$2_$3_001_btime],0,5)|unfold([$1:$2_$3_001_title],[$1:$2_$3_001_stitle]."\n\n".[$1:$2_$3_001_desc])|substr([$1:$2_$3_002_btime],0,5)|unfold([$1:$2_$3_002_title],[$1:$2_$3_002_stitle]."\n\n".[$1:$2_$3_002_desc]))

# parameter: device name, mode (next or prime), channel name (see xml data file), icon name (filename of channel logo), device name for set command, command
DEF TPL_TVSET(showIcon("$4","$5","$6")|substr([$1:$2_$3_000_btime],0,5)|unfold([$1:$2_$3_000_title],[$1:$2_$3_000_stitle]."\n\n".[$1:$2_$3_000_desc])|substr([$1:$2_$3_001_btime],0,5)|unfold([$1:$2_$3_001_title],[$1:$2_$3_001_stitle]."\n\n".[$1:$2_$3_001_desc])|substr([$1:$2_$3_002_btime],0,5)|unfold([$1:$2_$3_002_title],[$1:$2_$3_002_stitle]."\n\n".[$1:$2_$3_002_desc]))


Innerhalb der uiTable stört sich DOIF jetzt an den beiden Kommentaren über den DEF Definitionen. Entferne ich beide Kommentare, dann geht es auch mit der unveränderten DOIF Version wieder.

ja, dann hat es zufällig funktioniert. DOIF-Kommentare immer mit doppelten Hashzeichen ## beginnen, es sei denn man befindet sich in einem Perlblock, dann kümmert sich der Perlinterpreter um die Kommentare, ## stört aber auch dort nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mumpitzstuff


kjmEjfu

Kann man eigentlich bei den Zeiten auch einen Zufallsaspekt reinbringen?

Wenn ich mir das Beispiel unter https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht anschaue, dann sind die Zeiten dort fix.

Aktuell, noch ohne das Template, nutze ich sowas für die Zeit
[?([06:15]-int(rand(900)))-([22:00]+int(rand(300)))]

Wäre praktisch, wenn man in dem obigen Beispiel sowas auch einfach in der Zeitspanne eintragen könnte
Migriere derzeit zu Home Assistant

Damian

Zitat von: kjmEjfu am 23 Juli 2020, 14:18:23
Kann man eigentlich bei den Zeiten auch einen Zufallsaspekt reinbringen?

Wenn ich mir das Beispiel unter https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht anschaue, dann sind die Zeiten dort fix.

Aktuell, noch ohne das Template, nutze ich sowas für die Zeit
[?([06:15]-int(rand(900)))-([22:00]+int(rand(300)))]

Wäre praktisch, wenn man in dem obigen Beispiel sowas auch einfach in der Zeitspanne eintragen könnte

Dann trage es einfach ein:

Zitatpush (@{$VAR{sc}},[split (/\| +/,q(Erdgeschoss| Daemmerung2| [?([06:15]-int(rand(900)))-([22:00]+int(rand(300)))]| Lampekueche,LampeFlur on| Lampekueche,LampeFlur off| 01-01| 12-31| off| on))]);;\


Du kannst den Funktionsaufruf rand()  auch in die if-Abfrage einbauen und nur die Zeiten übergeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

Hallo Damian,
ist zwar ein "alter" Thread, aber meine Frage passt trotzdem zum Titel:

ist es möglich, analog zu ui_table, TPL-Definitionen in eine Datei auszulagern? Für ui_table habe ich das schon verwendet, jetzt würde ich gerne für meine 19 Rolladen, von denen jeder ein DOIF hat zur "Zustandsberechnung", dieses so generalisieren, dass ich nur einmal den Code in einer Datei habe und in jedem DOIF dann nur noch die Definitionen für den jeweiligen Aktor, Fensterkontakt etc hinterlegt werden.?
Ich habe z.Zt. 3 verschiedene Aktoren (FS20-RSU, Homematic und Shelly), wobei die FS20-RSU eben "doof" sind und keine Rückmeldiungen geben, die anderen beiden schon, allerdings etwas unterschiedlich. Das, denke ich, bekomme ich per Generalisierung hin, nur müßte ich trotzdem den DEF TPL Teil in allen DOIFs drinhaben, was bei Änderungen aufwendig ist.

Ich hab schon ein wenig rumprobiert, allerdings ohne Erfolg, weshalb ich im Moment davon ausgehe: das geht nicht :'(
(Alle 19 Rollos in einem DOIF möchte ich auch nicht, da ich die Ergebnisse der einzelnen DOIF wiederum zur Anzeige in anderen verwende.)

Danke schon mal.


Sany

fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitat von: Sany am 25 November 2021, 16:58:50
Hallo Damian,
ist zwar ein "alter" Thread, aber meine Frage passt trotzdem zum Titel:

ist es möglich, analog zu ui_table, TPL-Definitionen in eine Datei auszulagern? Für ui_table habe ich das schon verwendet, jetzt würde ich gerne für meine 19 Rolladen, von denen jeder ein DOIF hat zur "Zustandsberechnung", dieses so generalisieren, dass ich nur einmal den Code in einer Datei habe und in jedem DOIF dann nur noch die Definitionen für den jeweiligen Aktor, Fensterkontakt etc hinterlegt werden.?
Ich habe z.Zt. 3 verschiedene Aktoren (FS20-RSU, Homematic und Shelly), wobei die FS20-RSU eben "doof" sind und keine Rückmeldiungen geben, die anderen beiden schon, allerdings etwas unterschiedlich. Das, denke ich, bekomme ich per Generalisierung hin, nur müßte ich trotzdem den DEF TPL Teil in allen DOIFs drinhaben, was bei Änderungen aufwendig ist.

Ich hab schon ein wenig rumprobiert, allerdings ohne Erfolg, weshalb ich im Moment davon ausgehe: das geht nicht :'(
(Alle 19 Rollos in einem DOIF möchte ich auch nicht, da ich die Ergebnisse der einzelnen DOIF wiederum zur Anzeige in anderen verwende.)

Danke schon mal.


Sany

Den Import-Befehl gibt es nur bei ui_table.

Poste mal ein Beispiel einer Definition, die du verallgemeinern willst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

ZitatDen Import-Befehl gibt es nur bei ui_table.
dann lag ich mit meiner Annahme ja richtig. Macht nix, ich hatte bisher auch den gesamten Code in jedem DOIF, mit entsprechenden Abweichungen. Aber große Teile sind identisch, was ich mit subs{} nutzen kann (die gehen ja auch auszulagern, das müßte ich mal versuchen. Allerdings habe ich in den subs teilweise direkte set_Readings und Variablen, das müßte ich dann per Parameter-Übergabe und Rückgaben lösen.

Andere frage noch, ginge so etwas mittels DEF TPL...

DEF TPL_irgendwas(

block1{
if($1 eq "FS20"){
if([$2:"pct"]{
mach was für A;
Ausfuehrung();
}
}
}

block2{
if($1 eq "SH25"){
if([$2:"level"]{
mach was für B;
Ausfuehrung();
}
}
}
block3{
if($1 eq "HM"){
if([$2:"pct"]{
mach was für C;
Ausfuehrung();
}
}
}

block99{
irgenwas, was unabhängig vom Gerätetyp immer ausgeführt wird
auch mit Parametern aus der Definition unten
}

) ## end DEF_TPL

subs
{
sub Ausfuehrung
{
...
...
}


} ##end subs

##              Typ   Auslöser
TPL_irgendwas (FS20, TriggerA)

## in einem weiteren DOIF der selbe Code mit
TPL_irgendwas (SH25, TriggerB)
## und im 3ten DOIF dann
TPL_irgendwas (HM, TriggerC)



Das sollten dann 3 DOIFs sein, abhängig von definierten Gerät (FS20/SH25/HM) wird aber nur der jeweilige Block ausgeführt. Bei weiteren  Blöcken müßten diese halt auch ein if($1 eq "xx") drumrum haben. Ich werde das mal so ausprobieren, komme aber nicht sofort dazu.

Fertigen Code gibt es noch nicht. Ich habe zwar alle Rollladen per DOIF gesteuert, das wollte ich aber in nächster Zeit neu auflegen, da ich noch nicht ganz zufrieden bin. Dann halt mit möglichst viel "Generalisierung".

Gruß

Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Wenn ich wieder etwas Zeit zum Programmieren finde, dann kann ich versuchen den Import-Befehl einzubauen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

also für mich ist das nicht nötig. Ich glaube, ich komme mit den gegebenen Möglichkeiten zurecht. Wenn Du es allerdings generell nützlich für die Generalisierung siehst dann freue ich, wenn es realisiert wird.

Gruß


Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitat von: Sany am 27 November 2021, 16:43:35
also für mich ist das nicht nötig. Ich glaube, ich komme mit den gegebenen Möglichkeiten zurecht. Wenn Du es allerdings generell nützlich für die Generalisierung siehst dann freue ich, wenn es realisiert wird.

ja, ich würde es dennoch nicht auf mehrere DOIFs verteilen, sondern in einem DOIF realisieren. Das dürfte die Pflege vereinfachen, da nur ein Device alles regelt.

Das Rezept lautet:

1) Man baut sich ein Template für die Steuerung für ein Szenarium in einem DOIF
2) Man definiert ein Array für seine Szenarien
3) Über einen FOR-Befehl wird über das Template für jedes Szenarium mit Hilfe des Arrays automatisch die Steuerung erstellt

Damit kann ein DOIF beliebig viele gleich aufgebaute Steuerungen (Szenarien) bedienen.

Damit man dann noch die Übersicht behält, kann man ebenfalls über einen FOR-Befehl die Visualisierung für alle Szenarien erstellen lassen

Hier habe ich am Beispiel aufgezeigt, wie das geht:

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF