Weihnachtsbeleuchtung mit Szenarien

Begonnen von Damian, 28 November 2020, 11:40:31

Vorheriges Thema - Nächstes Thema

Damian

Es wird mal wieder Zeit seine Lichterketten auszupacken und wie es sich gehört zu automatisieren :)

Hier ein Beispiel, bei dem man Lichtszenarien einfach durch Einfügen einer Zeile definieren kann. Sie lassen sich per GUI einzeln aktivieren bzw. deaktivieren, Aktoren können direkt geschaltet werden, Szenarien sind für einen Zeitraum begrenzbar.

defmod di_Weihnachtsbeleuchtung_szenen DOIF subs  {\
## Parameter    1             2                       3               4        5        6      7\
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv));;\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
push (@{$_sc},[("Tannenbaum","[{sunset(360)}-23:00]", "Tannenbaum",   "11-01", "01-31", "off", "on")]);;\
push (@{$_sc},[("Aussen",    "[{sunset(120)}-08:00]", "Aussenleuchte","11-01", "01-15", "off", "on")]);;\
push (@{$_sc},[("Kerzen",    "[{sunset()}-23:05]",    "Kerzen",       "12-01", "01-01", "off", "on")]);;\
push (@{$_sc},[("Tisch",     "[{sunset()}-23:00]",    "Tisch",        "12-01", "01-01", "off", "on")]);;\
\
## 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++) {\
    for (my $j=5;;$j < @{$_params};;$j++) { ## Parameter 6 und 7 werden als Reading angelegt\
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);;\
    }\
  }\
}\
} ## end of subs\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis\
                ##            $1    $2         $3    $4  $5\
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {\
    if ($2) {\
      fhem_set("$3 on");;\
      set_State("Szene: $1");;\
      set_Reading("$1.Status","on",1);;\
    } else {\
      fhem_set ("$3 off");;\
      set_Reading("$1.Status","off",1);;\
    }\
  }\
} ## Ende des light-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
attr di_Weihnachtsbeleuchtung_szenen room Licht,test2
attr di_Weihnachtsbeleuchtung_szenen uiTable {\
  package ui_Table;;\
  $TC{1..10}="style='padding-left: 5px;; padding-right: 5px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
"Szene"|"Zeitspanne"|"von"|"bis"|"Aktor"|"Status"|"aktiv"\
FOR (@{$_sc},"$_$1"|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state])|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo Damian,

vielen Dank. Das habe ich gleich mal ausprobiert.
Ich liebe DOIF immer mehr, da ich damit vieles in einem Device (ohne zusätzliches Notify etc.) abhandeln kann.
Zusätzlich bekommt man damit auch noch eine schönere Übersicht.

Den Code durchblicke ich leider momentan noch nicht, aber - wenn ich Zeit habe - werde ich mir das zu Gemüte führen.

Und ich hätte natürlich noch ein paar Fragen bzw. Anmerkungen:
- Wenn ich die Szene mit einem Leerzeichen benenne, funktioniert die Spalte "aktiv" nicht.
  Dort steht dann z.B. "Terrasse Ost Früh.aktiv" statt der Auswahl für "on/off".
  Natürlich kann ich auch die Szene umbenennen in "Terrasse_Ost-Früh"  ;)
- Wäre es möglich bei der Szene ein Icon einzublenden?
  Meine Frau liebt so was.

Alles in allem, ein tolles Ding, das wieder zeigt, was alles mit DOIF möglich ist.
Danke!

lg, Gerhard

Damian

Ich habe einen weiteren Parameter Nr. 8 für ein Icon hinzugefügt. Szenenname wird für Readings und Template-Name benutzt, da dürfen keine Leerzeichen vorkommen.

defmod di_Weihnachtsbeleuchtung_szenen DOIF subs  {\
## Parameter    1             2                       3               4        5        6      7     8\
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon));;\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
push (@{$_sc},[("Tannenbaum","[{sunset(360)}-23:00]", "Tannenbaum",   "11-01", "01-31", "off", "off", "christmas_tree")]);;\
push (@{$_sc},[("Aussen",    "[{sunset(120)}-08:00]", "Aussenleuchte","11-01", "01-15", "off", "off", "light_wall_3")]);;\
push (@{$_sc},[("Kerzen",    "[{sunset()}-23:05]",    "Kerzen",       "12-01", "01-01", "off", "off", "hue_room_living")]);;\
push (@{$_sc},[("Tisch",     "[{sunset()}-23:00]",    "Tisch",        "12-01", "01-01", "off", "off", "light_dinner_table")]);;\
\
\
\
## 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++) {\
    for (my $j=5;;$j < @{$_params};;$j++) { ## Parameter 6 und 7 werden als Reading angelegt\
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);;\
    }\
  }\
}\
} ## end of subs\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis\
                ##            $1    $2         $3    $4  $5\
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {\
    if ($2) {\
      fhem_set("$3 on");;\
      set_State("Szene: $1");;\
      set_Reading("$1.Status","on",1);;\
    } else {\
      fhem_set ("$3 off");;\
      set_Reading("$1.Status","off",1);;\
    }\
  }\
} ## Ende des light-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
attr di_Weihnachtsbeleuchtung_szenen room Licht,test2
attr di_Weihnachtsbeleuchtung_szenen uiTable {\
  package ui_Table;;\
  $TC{1..10}="style='padding-left: 5px;; padding-right: 5px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
"Szene"|"Zeitspanne"|"von"|"bis"|"Aktor"|"Status"|"aktiv"\
FOR (@{$_sc},"$_$1"|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state],"$_$8")|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Man kann beliebige Parameter definieren, die man dann auswertet:

z. B. weiterer Text (Parameter Nr. 9)

@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon Text));
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt
push (@{$_sc},[("Tannenbaum","[{sunset(360)}-23:00]", "Tannenbaum",   "11-01", "01-31", "off", "off", "christmas_tree","grüner Tannenbaum")]);
....

Die Anzeige kann man ebenfalls beliebig konfigurieren, z. B.:

"Aktor"|"Szene"|"Status"|"aktiv"
FOR (@{$_sc},switch ([$_$3:state],"$_$8")|"$_$9"|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))



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

gestein

Toll. Danke.

Eine Bitte noch:
Wenn ich ein Icon neben dem Szenen-Namen haben möchte, was muss ich dann in der uiTable ändern?
Denn wenn ich z.B. das folgende schreibe:
{
  package ui_Table;
  $TC{1..10}="style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'";
}
"Szene"|"Zeitspanne"|"von"|"bis"|"Aktor"|"Status"|"aktiv"
FOR (@{$_sc},icon("$_$8")|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state],"$_$8")|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))

kommt die Fehlermeldung: no trigger reading in widget: icon("christmas_tree")

Was müsste ich da schreiben, um das Icon und daneben den Szenen-Namen zu bekommen?

Vielen Dank im Voraus
liebe Grüße
Gerhard

Damian

Zitat von: gestein am 07 Dezember 2020, 23:38:40

Was müsste ich da schreiben, um das Icon und daneben den Szenen-Namen zu bekommen?

Vielen Dank im Voraus
liebe Grüße
Gerhard

statt icon ICON siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Icon-Darstellung_mit_Hilfe_der_Funktion_ICON
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo,

Danke!
Das klappt nun auch.
FOR (@{$_sc},ICON("$_$8")." "."$_$1"|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state])|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))

lg, Gerhard

gestein

#7
Hallo Damian,

ich habe das DOIF nun in Betrieb, aber es läuft nicht ganz so wie gewünscht.
Insgesamt habe ich 8 Einträge, von denen zwei noch auf deaktiviert sind.

1) 4 von den Szenen funktionieren, die beiden deaktivierten werden nicht aufgerufen (das muss ja auch so sein), die beiden letzten werden aber auch nicht ausgeführt ("Stiege" und "Stiege-Frueh").
2) Es werden bei mir insgesamt 56 readings für Timer angelegt.
    Stimmt das so?

In der Funktion "TPL_light" habe ich ein paar logs eingebaut.
Heute Früh waren dann die folgenden Einträge im log-File:
2020.12.09 05:45:01.108 1: Weihnachts-DOIF: true: Terrasse_Ost-Frueh.Status, ::DOIF_time(HASH(0x8d7f210),8,9,3,05:45:01), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31
2020.12.09 05:45:01.203 1: Weihnachts-DOIF: true: Terrasse_West-Frueh.Status, ::DOIF_time(HASH(0x8d7f210),20,21,3,05:45:01), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-01
2020.12.09 07:57:49.118 1: Weihnachts-DOIF: false: Terrasse_Ost-Frueh.Status, ::DOIF_time(HASH(0x8d7f210),10,11,3,07:57:49), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31
2020.12.09 07:57:49.186 1: Weihnachts-DOIF: false: Terrasse_West-Frueh.Status, ::DOIF_time(HASH(0x8d7f210),22,23,3,07:57:49), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-01



Hier ein List des Devices (die Zeile "Log 1, "Weihnachts-DOIF: SELF=$SELF, $1.Status, $2, $3, $4, $5, $md";" habe ich erst Zumittag eingefügt):
Internals:
   DEF        subs  {
## Parameter    1             2                       3               4        5        6      7     8
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon));
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3601)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_West",    "[{sunset(-1801)}-23:06]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",       "12-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_West-Frueh",     "[05:47-{sunrise(3602)}]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",        "12-01", "01-01", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Krippe",    "[{sunset(-1801)}-23:07]",    "Test",       "12-01", "01-31", "on", "on", "krippe")]);
push (@{$_sc},[("Krippe-Frueh",     "[05:48-{sunrise(3603)}]",    "Test",        "12-01", "01-01", "on", "on"), "krippe"]);
push (@{$_sc},[("Stiege",    "[{sunset(-1802)}-23:08]",    "MQTT2_shellyplug_s_EAE605",       "12-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Stiege-Frueh",     "[05:49-{sunrise(3604)}]",    "MQTT2_shellyplug_s_EAE605",        "12-01", "01-01", "on", "on", "christmas_lights")]);

## 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++) {
    for (my $j=5;$j < @{$_params};$j++) { ## Parameter 6 und 7 werden als Reading angelegt
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);
    }
  }
}
} ## end of subs

DEF TPL_light ( ## Definition des Templates namens TPL_light
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis
                ##            $1    $2         $3    $4  $5
  Log 1, "Weihnachts-DOIF: SELF=$SELF, $1.Status, $2, $3, $4, $5, $md";
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: $1.Status, $2, $3, $4, $5";
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: $1.Status, $2, $3, $4, $5";
    }
  }
} ## Ende des light-Blocks
) ## Ende der Templatedefinition

## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
   DOIFDEV    ^global$|^Test$|^MQTT2_shellyplug_s_EAE605$|^MQTT2_shellyswitch25_68C63AFB9B27_CH2$|^di_Weihnachtsbeleuchtung_szenen$|^MQTT2_shellyswitch25_E098068D28BC_CH2$
   FUUID      5fc403f2-f33f-0b7a-ef32-d5354fbb0b303c93
   FVERSION   98_DOIF.pm:0.232350/2020-11-25
   MODEL      Perl
   NAME       di_Weihnachtsbeleuchtung_szenen
   NR         1826
   NTFY_ORDER 50-di_Weihnachtsbeleuchtung_szenen
   STATE      initialized
   TYPE       DOIF
   VERSION    23235 2020-11-25 22:42:28
   OLDREADINGS:
   READINGS:
     2020-12-09 10:47:42   Krippe-Frueh.Status on
     2020-12-09 10:47:42   Krippe-Frueh.aktiv on
     2020-12-09 10:47:42   Krippe-Frueh.icon krippe
     2020-12-09 10:47:42   Krippe.Status   on
     2020-12-09 10:47:42   Krippe.aktiv    on
     2020-12-09 10:47:42   Krippe.icon     krippe
     2020-12-09 10:47:42   Stiege-Frueh.Status on
     2020-12-09 10:47:42   Stiege-Frueh.aktiv on
     2020-12-09 10:47:42   Stiege-Frueh.icon christmas_lights
     2020-12-09 10:47:42   Stiege.Status   on
     2020-12-09 10:47:42   Stiege.aktiv    on
     2020-12-09 10:47:42   Stiege.icon     christmas_lights
     2020-12-09 10:47:42   Terrasse_Ost-Frueh.Status on
     2020-12-09 10:47:42   Terrasse_Ost-Frueh.aktiv on
     2020-12-09 10:47:42   Terrasse_Ost-Frueh.icon christmas_lights
     2020-12-09 10:47:42   Terrasse_Ost.Status on
     2020-12-09 10:47:42   Terrasse_Ost.aktiv on
     2020-12-09 10:47:42   Terrasse_Ost.icon christmas_lights
     2020-12-09 10:47:42   Terrasse_West-Frueh.Status on
     2020-12-09 10:47:42   Terrasse_West-Frueh.aktiv on
     2020-12-09 10:47:42   Terrasse_West-Frueh.icon christmas_lights
     2020-12-09 10:47:42   Terrasse_West.Status on
     2020-12-09 10:47:42   Terrasse_West.aktiv on
     2020-12-09 10:47:42   Terrasse_West.icon christmas_lights
     2020-12-09 10:47:42   state           initialized
     2020-12-09 10:47:42   timer_01_c01    09.12.2020 16:06:48
     2020-12-09 10:47:42   timer_02_c01    09.12.2020 22:00:00
     2020-12-09 10:47:42   timer_03_c01    09.12.2020 16:06:48
     2020-12-09 10:47:42   timer_04_c01    09.12.2020 22:00:00
     2020-12-09 10:47:42   timer_05_c01    09.12.2020 16:06:48
     2020-12-09 10:47:42   timer_06_c01    09.12.2020 22:00:00
     2020-12-09 10:47:42   timer_07_c01    09.12.2020 16:06:48
     2020-12-09 10:47:42   timer_08_c01    09.12.2020 22:00:00
     2020-12-09 10:47:42   timer_09_c02    10.12.2020 05:46:00
     2020-12-09 10:47:42   timer_10_c02    10.12.2020 07:58:45
     2020-12-09 10:47:42   timer_11_c02    10.12.2020 05:46:00
     2020-12-09 10:47:42   timer_12_c02    10.12.2020 07:58:45
     2020-12-09 10:47:42   timer_13_c02    10.12.2020 05:46:00
     2020-12-09 10:47:42   timer_14_c02    10.12.2020 07:58:45
     2020-12-09 10:47:42   timer_15_c02    10.12.2020 05:46:00
     2020-12-09 10:47:42   timer_16_c02    10.12.2020 07:58:45
     2020-12-09 10:47:42   timer_17_c03    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_18_c03    09.12.2020 23:06:00
     2020-12-09 10:47:42   timer_19_c03    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_20_c03    09.12.2020 23:06:00
     2020-12-09 10:47:42   timer_21_c03    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_22_c03    09.12.2020 23:06:00
     2020-12-09 10:47:42   timer_23_c03    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_24_c03    09.12.2020 23:06:00
     2020-12-09 10:47:42   timer_25_c04    10.12.2020 05:47:00
     2020-12-09 10:47:42   timer_26_c04    10.12.2020 07:58:46
     2020-12-09 10:47:42   timer_27_c04    10.12.2020 05:47:00
     2020-12-09 10:47:42   timer_28_c04    10.12.2020 07:58:46
     2020-12-09 10:47:42   timer_29_c04    10.12.2020 05:47:00
     2020-12-09 10:47:42   timer_30_c04    10.12.2020 07:58:46
     2020-12-09 10:47:42   timer_31_c04    10.12.2020 05:47:00
     2020-12-09 10:47:42   timer_32_c04    10.12.2020 07:58:46
     2020-12-09 10:47:42   timer_33_c05    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_34_c05    09.12.2020 23:07:00
     2020-12-09 10:47:42   timer_35_c05    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_36_c05    09.12.2020 23:07:00
     2020-12-09 10:47:42   timer_37_c05    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_38_c05    09.12.2020 23:07:00
     2020-12-09 10:47:42   timer_39_c05    09.12.2020 16:06:47
     2020-12-09 10:47:42   timer_40_c05    09.12.2020 23:07:00
     2020-12-09 10:47:42   timer_41_c06    10.12.2020 05:48:00
     2020-12-09 10:47:42   timer_42_c06    10.12.2020 07:58:47
     2020-12-09 10:47:42   timer_43_c06    10.12.2020 05:48:00
     2020-12-09 10:47:42   timer_44_c06    10.12.2020 07:58:47
     2020-12-09 10:47:42   timer_45_c06    10.12.2020 05:48:00
     2020-12-09 10:47:42   timer_46_c06    10.12.2020 07:58:47
     2020-12-09 10:47:42   timer_47_c06    10.12.2020 05:48:00
     2020-12-09 10:47:42   timer_48_c06    10.12.2020 07:58:47
     2020-12-09 10:47:42   timer_49_c07    09.12.2020 16:06:46
     2020-12-09 10:47:42   timer_50_c07    09.12.2020 23:08:00
     2020-12-09 10:47:42   timer_51_c07    09.12.2020 16:06:46
     2020-12-09 10:47:42   timer_52_c07    09.12.2020 23:08:00
     2020-12-09 10:47:42   timer_53_c07    09.12.2020 16:06:46
     2020-12-09 10:47:42   timer_54_c07    09.12.2020 23:08:00
     2020-12-09 10:47:42   timer_55_c07    09.12.2020 16:06:46
     2020-12-09 10:47:42   timer_56_c07    09.12.2020 23:08:00
   Regex:
     accu:
     uiTable:
       MQTT2_shellyplug_s_EAE605:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_7_4_0_0:
           state      ^MQTT2_shellyplug_s_EAE605$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_8_4_0_0:
           state      ^MQTT2_shellyplug_s_EAE605$:^state:
       MQTT2_shellyswitch25_68C63AFB9B27_CH2:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_4_0_0:
           state      ^MQTT2_shellyswitch25_68C63AFB9B27_CH2$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_4_0_0:
           state      ^MQTT2_shellyswitch25_68C63AFB9B27_CH2$:^state:
       MQTT2_shellyswitch25_E098068D28BC_CH2:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
       Test:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_5_4_0_0:
           state      ^Test$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_6_4_0_0:
           state      ^Test$:^state:
       di_Weihnachtsbeleuchtung_szenen:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_5_0_0:
           Terrasse_Ost.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_6_0_0:
           Terrasse_Ost.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_5_0_0:
           Terrasse_Ost-Frueh.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_6_0_0:
           Terrasse_Ost-Frueh.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_5_0_0:
           Terrasse_West.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_West.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_6_0_0:
           Terrasse_West.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_West.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_5_0_0:
           Terrasse_West-Frueh.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_West-Frueh.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_6_0_0:
           Terrasse_West-Frueh.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_West-Frueh.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_5_5_0_0:
           Krippe.Status ^di_Weihnachtsbeleuchtung_szenen$:^Krippe.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_5_6_0_0:
           Krippe.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Krippe.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_6_5_0_0:
           Krippe-Frueh.Status ^di_Weihnachtsbeleuchtung_szenen$:^Krippe-Frueh.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_6_6_0_0:
           Krippe-Frueh.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Krippe-Frueh.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_7_5_0_0:
           Stiege.Status ^di_Weihnachtsbeleuchtung_szenen$:^Stiege.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_7_6_0_0:
           Stiege.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Stiege.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_8_5_0_0:
           Stiege-Frueh.Status ^di_Weihnachtsbeleuchtung_szenen$:^Stiege-Frueh.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_8_6_0_0:
           Stiege-Frueh.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Stiege-Frueh.aktiv:
   condition:
     0                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Terrasse_Ost.Status, ::DOIF_time($hash,0,1,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv') eq "on" and ($md ge "11-01" or $md le "01-31")) {
    if (::DOIF_time($hash,2,3,$wday,$hms)) {
      fhem_set("MQTT2_shellyswitch25_E098068D28BC_CH2 on");
      set_State("Szene: Terrasse_Ost");
      set_Reading("Terrasse_Ost.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Terrasse_Ost.Status, ::DOIF_time($hash,4,5,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31";
    } else {
      fhem_set ("MQTT2_shellyswitch25_E098068D28BC_CH2 off");
      set_Reading("Terrasse_Ost.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Terrasse_Ost.Status, ::DOIF_time($hash,6,7,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31";
    }
  }

     1                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Terrasse_Ost-Frueh.Status, ::DOIF_time($hash,8,9,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.aktiv') eq "on" and ($md ge "11-01" or $md le "01-31")) {
    if (::DOIF_time($hash,10,11,$wday,$hms)) {
      fhem_set("MQTT2_shellyswitch25_E098068D28BC_CH2 on");
      set_State("Szene: Terrasse_Ost-Frueh");
      set_Reading("Terrasse_Ost-Frueh.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Terrasse_Ost-Frueh.Status, ::DOIF_time($hash,12,13,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31";
    } else {
      fhem_set ("MQTT2_shellyswitch25_E098068D28BC_CH2 off");
      set_Reading("Terrasse_Ost-Frueh.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Terrasse_Ost-Frueh.Status, ::DOIF_time($hash,14,15,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31";
    }
  }

     2                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Terrasse_West.Status, ::DOIF_time($hash,16,17,$wday,$hms), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-31, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_West.aktiv') eq "on" and ($md ge "12-01" or $md le "01-31")) {
    if (::DOIF_time($hash,18,19,$wday,$hms)) {
      fhem_set("MQTT2_shellyswitch25_68C63AFB9B27_CH2 on");
      set_State("Szene: Terrasse_West");
      set_Reading("Terrasse_West.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Terrasse_West.Status, ::DOIF_time($hash,20,21,$wday,$hms), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-31";
    } else {
      fhem_set ("MQTT2_shellyswitch25_68C63AFB9B27_CH2 off");
      set_Reading("Terrasse_West.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Terrasse_West.Status, ::DOIF_time($hash,22,23,$wday,$hms), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-31";
    }
  }

     3                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Terrasse_West-Frueh.Status, ::DOIF_time($hash,24,25,$wday,$hms), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-01, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_West-Frueh.aktiv') eq "on" and ($md ge "12-01" or $md le "01-01")) {
    if (::DOIF_time($hash,26,27,$wday,$hms)) {
      fhem_set("MQTT2_shellyswitch25_68C63AFB9B27_CH2 on");
      set_State("Szene: Terrasse_West-Frueh");
      set_Reading("Terrasse_West-Frueh.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Terrasse_West-Frueh.Status, ::DOIF_time($hash,28,29,$wday,$hms), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-01";
    } else {
      fhem_set ("MQTT2_shellyswitch25_68C63AFB9B27_CH2 off");
      set_Reading("Terrasse_West-Frueh.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Terrasse_West-Frueh.Status, ::DOIF_time($hash,30,31,$wday,$hms), MQTT2_shellyswitch25_68C63AFB9B27_CH2, 12-01, 01-01";
    }
  }

     4                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Krippe.Status, ::DOIF_time($hash,32,33,$wday,$hms), Test, 12-01, 01-31, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Krippe.aktiv') eq "on" and ($md ge "12-01" or $md le "01-31")) {
    if (::DOIF_time($hash,34,35,$wday,$hms)) {
      fhem_set("Test on");
      set_State("Szene: Krippe");
      set_Reading("Krippe.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Krippe.Status, ::DOIF_time($hash,36,37,$wday,$hms), Test, 12-01, 01-31";
    } else {
      fhem_set ("Test off");
      set_Reading("Krippe.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Krippe.Status, ::DOIF_time($hash,38,39,$wday,$hms), Test, 12-01, 01-31";
    }
  }

     5                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Krippe-Frueh.Status, ::DOIF_time($hash,40,41,$wday,$hms), Test, 12-01, 01-01, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Krippe-Frueh.aktiv') eq "on" and ($md ge "12-01" or $md le "01-01")) {
    if (::DOIF_time($hash,42,43,$wday,$hms)) {
      fhem_set("Test on");
      set_State("Szene: Krippe-Frueh");
      set_Reading("Krippe-Frueh.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Krippe-Frueh.Status, ::DOIF_time($hash,44,45,$wday,$hms), Test, 12-01, 01-01";
    } else {
      fhem_set ("Test off");
      set_Reading("Krippe-Frueh.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Krippe-Frueh.Status, ::DOIF_time($hash,46,47,$wday,$hms), Test, 12-01, 01-01";
    }
  }

     6                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Stiege.Status, ::DOIF_time($hash,48,49,$wday,$hms), MQTT2_shellyplug_s_EAE605, 12-01, 01-31, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Stiege.aktiv') eq "on" and ($md ge "12-01" or $md le "01-31")) {
    if (::DOIF_time($hash,50,51,$wday,$hms)) {
      fhem_set("MQTT2_shellyplug_s_EAE605 on");
      set_State("Szene: Stiege");
      set_Reading("Stiege.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Stiege.Status, ::DOIF_time($hash,52,53,$wday,$hms), MQTT2_shellyplug_s_EAE605, 12-01, 01-31";
    } else {
      fhem_set ("MQTT2_shellyplug_s_EAE605 off");
      set_Reading("Stiege.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Stiege.Status, ::DOIF_time($hash,54,55,$wday,$hms), MQTT2_shellyplug_s_EAE605, 12-01, 01-31";
    }
  }

   days:
   defs:
     tpl:
       TPL_light    light_$1 {                          Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, $1.Status, $2, $3, $4, $5, $md";
  if ([?di_Weihnachtsbeleuchtung_szenen:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: $1.Status, $2, $3, $4, $5";
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: $1.Status, $2, $3, $4, $5";
    }
  }

   helper:
     DEVFILTER  ^global$|^Test$|^MQTT2_shellyplug_s_EAE605$|^MQTT2_shellyswitch25_68C63AFB9B27_CH2$|^di_Weihnachtsbeleuchtung_szenen$|^MQTT2_shellyswitch25_E098068D28BC_CH2$
     NOTIFYDEV  global|Test|MQTT2_shellyplug_s_EAE605|MQTT2_shellyswitch25_68C63AFB9B27_CH2|di_Weihnachtsbeleuchtung_szenen|MQTT2_shellyswitch25_E098068D28BC_CH2
     globalinit 1
     last_timer 56
     sleeptimer -1
     bm:
       DOIF_Get:
         cnt        4
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        09.12. 10:47:44
         max        4.31537628173828e-05
         tot        0.000144004821777344
         mAr:
           HASH(0x8d7f210)
           di_Weihnachtsbeleuchtung_szenen
           ?
       DOIF_Notify:
         cnt        32013
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        09.12. 13:12:54
         max        0.0977201461791992
         tot        24.7185292243958
         mAr:
           HASH(0x8d7f210)
           HASH(0x9149278)
       DOIF_Set:
         cnt        11
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        09.12. 10:47:44
         max        0.000296831130981445
         tot        0.00136470794677734
         mAr:
           HASH(0x8d7f210)
           di_Weihnachtsbeleuchtung_szenen
           ?
   interval:
     0          -1
     1          0
     10         -1
     11         10
     12         -1
     13         12
     14         -1
     15         14
     16         -1
     17         16
     18         -1
     19         18
     2          -1
     20         -1
     21         20
     22         -1
     23         22
     24         -1
     25         24
     26         -1
     27         26
     28         -1
     29         28
     3          2
     30         -1
     31         30
     32         -1
     33         32
     34         -1
     35         34
     36         -1
     37         36
     38         -1
     39         38
     4          -1
     40         -1
     41         40
     42         -1
     43         42
     44         -1
     45         44
     46         -1
     47         46
     48         -1
     49         48
     5          4
     50         -1
     51         50
     52         -1
     53         52
     54         -1
     55         54
     6          -1
     7          6
     8          -1
     9          8
   intervalfunc:
   localtime:
     0          1607526408
     1          1607547600
     10         1607575560
     11         1607583525
     12         1607575560
     13         1607583525
     14         1607575560
     15         1607583525
     16         1607526407
     17         1607551560
     18         1607526407
     19         1607551560
     2          1607526408
     20         1607526407
     21         1607551560
     22         1607526407
     23         1607551560
     24         1607575620
     25         1607583526
     26         1607575620
     27         1607583526
     28         1607575620
     29         1607583526
     3          1607547600
     30         1607575620
     31         1607583526
     32         1607526407
     33         1607551620
     34         1607526407
     35         1607551620
     36         1607526407
     37         1607551620
     38         1607526407
     39         1607551620
     4          1607526408
     40         1607575680
     41         1607583527
     42         1607575680
     43         1607583527
     44         1607575680
     45         1607583527
     46         1607575680
     47         1607583527
     48         1607526406
     49         1607551680
     5          1607547600
     50         1607526406
     51         1607551680
     52         1607526406
     53         1607551680
     54         1607526406
     55         1607551680
     6          1607526408
     7          1607547600
     8          1607575560
     9          1607583525
   perlblock:
     0          light_Terrasse_Ost
     1          light_Terrasse_West
     2          light_Terrasse_West
     3          light_Krippe
     4          light_Krippe
     5          light_Stiege
     6          light_Stiege
   realtime:
     0          16:06:48
     1          22:00:00
     10         05:46:00
     11         07:58:45
     12         05:46:00
     13         07:58:45
     14         05:46:00
     15         07:58:45
     16         16:06:47
     17         23:06:00
     18         16:06:47
     19         23:06:00
     2          16:06:48
     20         16:06:47
     21         23:06:00
     22         16:06:47
     23         23:06:00
     24         05:47:00
     25         07:58:46
     26         05:47:00
     27         07:58:46
     28         05:47:00
     29         07:58:46
     3          22:00:00
     30         05:47:00
     31         07:58:46
     32         16:06:47
     33         23:07:00
     34         16:06:47
     35         23:07:00
     36         16:06:47
     37         23:07:00
     38         16:06:47
     39         23:07:00
     4          16:06:48
     40         05:48:00
     41         07:58:47
     42         05:48:00
     43         07:58:47
     44         05:48:00
     45         07:58:47
     46         05:48:00
     47         07:58:47
     48         16:06:46
     49         23:08:00
     5          22:00:00
     50         16:06:46
     51         23:08:00
     52         16:06:46
     53         23:08:00
     54         16:06:46
     55         23:08:00
     6          16:06:48
     7          22:00:00
     8          05:46:00
     9          07:58:45
   time:
     0          {sunset(-1800)}
     1          22:00:00
     10         05:46:00
     11         {sunrise(3601)}
     12         05:46:00
     13         {sunrise(3601)}
     14         05:46:00
     15         {sunrise(3601)}
     16         {sunset(-1801)}
     17         23:06:00
     18         {sunset(-1801)}
     19         23:06:00
     2          {sunset(-1800)}
     20         {sunset(-1801)}
     21         23:06:00
     22         {sunset(-1801)}
     23         23:06:00
     24         05:47:00
     25         {sunrise(3602)}
     26         05:47:00
     27         {sunrise(3602)}
     28         05:47:00
     29         {sunrise(3602)}
     3          22:00:00
     30         05:47:00
     31         {sunrise(3602)}
     32         {sunset(-1801)}
     33         23:07:00
     34         {sunset(-1801)}
     35         23:07:00
     36         {sunset(-1801)}
     37         23:07:00
     38         {sunset(-1801)}
     39         23:07:00
     4          {sunset(-1800)}
     40         05:48:00
     41         {sunrise(3603)}
     42         05:48:00
     43         {sunrise(3603)}
     44         05:48:00
     45         {sunrise(3603)}
     46         05:48:00
     47         {sunrise(3603)}
     48         {sunset(-1802)}
     49         23:08:00
     5          22:00:00
     50         {sunset(-1802)}
     51         23:08:00
     52         {sunset(-1802)}
     53         23:08:00
     54         {sunset(-1802)}
     55         23:08:00
     6          {sunset(-1800)}
     7          22:00:00
     8          05:46:00
     9          {sunrise(3601)}
   timeCond:
     0          0
     1          0
     10         1
     11         1
     12         1
     13         1
     14         1
     15         1
     16         2
     17         2
     18         2
     19         2
     2          0
     20         2
     21         2
     22         2
     23         2
     24         3
     25         3
     26         3
     27         3
     28         3
     29         3
     3          0
     30         3
     31         3
     32         4
     33         4
     34         4
     35         4
     36         4
     37         4
     38         4
     39         4
     4          0
     40         5
     41         5
     42         5
     43         5
     44         5
     45         5
     46         5
     47         5
     48         6
     49         6
     5          0
     50         6
     51         6
     52         6
     53         6
     54         6
     55         6
     6          0
     7          0
     8          1
     9          1
   timer:
     0          0
     1          0
     10         0
     11         0
     12         0
     13         0
     14         0
     15         0
     16         0
     17         0
     18         0
     19         0
     2          0
     20         0
     21         0
     22         0
     23         0
     24         0
     25         0
     26         0
     27         0
     28         0
     29         0
     3          0
     30         0
     31         0
     32         0
     33         0
     34         0
     35         0
     36         0
     37         0
     38         0
     39         0
     4          0
     40         0
     41         0
     42         0
     43         0
     44         0
     45         0
     46         0
     47         0
     48         0
     49         0
     5          0
     50         0
     51         0
     52         0
     53         0
     54         0
     55         0
     6          0
     7          0
     8          0
     9          0
   timers:
     0           0  1  2  3  4  5  6  7
     1           8  9  10  11  12  13  14  15
     2           16  17  18  19  20  21  22  23
     3           24  25  26  27  28  29  30  31
     4           32  33  34  35  36  37  38  39
     5           40  41  42  43  44  45  46  47
     6           48  49  50  51  52  53  54  55
   triggertime:
     1607526406:
       localtime  1607526406
       hash:
     1607526407:
       localtime  1607526407
       hash:
     1607526408:
       localtime  1607526408
       hash:
     1607547600:
       localtime  1607547600
       hash:
     1607551560:
       localtime  1607551560
       hash:
     1607551620:
       localtime  1607551620
       hash:
     1607551680:
       localtime  1607551680
       hash:
     1607575560:
       localtime  1607575560
       hash:
     1607575620:
       localtime  1607575620
       hash:
     1607575680:
       localtime  1607575680
       hash:
     1607583525:
       localtime  1607583525
       hash:
     1607583526:
       localtime  1607583526
       hash:
     1607583527:
       localtime  1607583527
       hash:
   uiTable:
     dev        di_Weihnachtsbeleuchtung_szenen
     package    package ui_Table;
     reading    Stiege-Frueh.aktiv
     table:
       0:
         0:
           0:
             0          package ui_Table;"Szene"
         1:
           0:
             0          package ui_Table;"Zeitspanne"
         2:
           0:
             0          package ui_Table;"von"
         3:
           0:
             0          package ui_Table;"bis"
         4:
           0:
             0          package ui_Table;"Aktor"
         5:
           0:
             0          package ui_Table;"Status"
         6:
           0:
             0          package ui_Table;"aktiv"
       1:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost"
         1:
           0:
             0          package ui_Table;"[{sunset(-1800)}-22:00]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv')
       2:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost-Frueh"
         1:
           0:
             0          package ui_Table;"[05:46-{sunrise(3601)}]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.aktiv')
       3:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_West"
         1:
           0:
             0          package ui_Table;"[{sunset(-1801)}-23:06]"
         2:
           0:
             0          package ui_Table;"12-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_68C63AFB9B27_CH2','state')),'','MQTT2_shellyswitch25_68C63AFB9B27_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_West.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_West.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_West.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_West.aktiv')
       4:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_West-Frueh"
         1:
           0:
             0          package ui_Table;"[05:47-{sunrise(3602)}]"
         2:

Damian

Normalerweise sollten zwei Timer pro Szenario entstehen also 8*2=16

Kommentiere alle Szenarien bis auf eins aus, drücke auf modify und dann schaust du was passiert.


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

gestein

#9
Wenn ich nur einen Eintrag habe
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
dann bekomme ich 8 Timer:
timer_01_c01 10.12.2020 16:06:49
timer_02_c01 09.12.2020 22:00:00
timer_03_c01 10.12.2020 16:06:49
timer_04_c01 09.12.2020 22:00:00
timer_05_c01 10.12.2020 16:06:49
timer_06_c01 09.12.2020 22:00:00
timer_07_c01 10.12.2020 16:06:49
timer_08_c01 09.12.2020 22:00:00


bei 2 Einträgen dann 16 Timer, bei 3 Einträgen 24 Timer usw.
Wenn ich aber die 2 Einträge für den selben Aktor nehme, dann bekomme ich nur 8 Einträge.
Sobald ich einen 2. Aktor dazu nehme, dann sind es 3x8 Einträge.
Bei 2 gleichen Aktoren und je 2 Einträgen sind es 24 Timer.

Darum sind es auch bei 8 Einträgen nur 7x8 Timer, weil ich ja je 2 Einträge für einen Aktor anlege (in der Früh und am Abend).

Hilft das was?

lg, Gerhard

Damian

Dann poste noch mal ein list mit einem Eintrag.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Bitte sehr. Hier mit dem Eintrag:
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
Internals:
   DEF        subs  {
## Parameter    1             2                       3               4        5        6      7     8
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon));
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3601)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Terrasse_West",    "[{sunset(-1801)}-23:06]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",       "12-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Terrasse_West-Frueh",     "[05:47-{sunrise(3602)}]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",        "12-01", "01-01", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Krippe",    "[{sunset(-1801)}-23:07]",    "Test",       "12-01", "01-31", "on", "on", "krippe")]);
#push (@{$_sc},[("Krippe-Frueh",     "[05:48-{sunrise(3603)}]",    "Test",        "12-01", "01-01", "on", "on"), "krippe"]);
#push (@{$_sc},[("Stiege",    "[{sunset(-1802)}-23:08]",    "MQTT2_shellyplug_s_EAE605",       "12-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Stiege-Frueh",     "[05:49-{sunrise(3604)}]",    "MQTT2_shellyplug_s_EAE605",        "12-01", "01-01", "on", "on", "christmas_lights")]);

## 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++) {
    for (my $j=5;$j < @{$_params};$j++) { ## Parameter 6 und 7 werden als Reading angelegt
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);
    }
  }
}
} ## end of subs

DEF TPL_light ( ## Definition des Templates namens TPL_light
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis
                ##            $1    $2         $3    $4  $5
  Log 1, "Weihnachts-DOIF: SELF=$SELF, $1.Status, $2, $3, $4, $5, $md";
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: $1.Status, $2, $3, $4, $5";
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: $1.Status, $2, $3, $4, $5";
    }
  }
} ## Ende des light-Blocks
) ## Ende der Templatedefinition

## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
   FUUID      5fc403f2-f33f-0b7a-ef32-d5354fbb0b303c93
   FVERSION   98_DOIF.pm:0.232350/2020-11-25
   MODEL      Perl
   NAME       di_Weihnachtsbeleuchtung_szenen
   NOTIFYDEV  MQTT2_shellyswitch25_E098068D28BC_CH2,global,di_Weihnachtsbeleuchtung_szenen
   NR         1826
   NTFY_ORDER 50-di_Weihnachtsbeleuchtung_szenen
   STATE      initialized
   TYPE       DOIF
   VERSION    23235 2020-11-25 22:42:28
   OLDREADINGS:
   READINGS:
     2020-12-09 21:33:16   Terrasse_Ost.Status on
     2020-12-09 21:33:16   Terrasse_Ost.aktiv on
     2020-12-09 21:33:16   Terrasse_Ost.icon christmas_lights
     2020-12-09 21:33:16   state           initialized
     2020-12-09 21:33:16   timer_01_c01    10.12.2020 16:06:49
     2020-12-09 21:33:16   timer_02_c01    09.12.2020 22:00:00
     2020-12-09 21:33:16   timer_03_c01    10.12.2020 16:06:49
     2020-12-09 21:33:16   timer_04_c01    09.12.2020 22:00:00
     2020-12-09 21:33:16   timer_05_c01    10.12.2020 16:06:49
     2020-12-09 21:33:16   timer_06_c01    09.12.2020 22:00:00
     2020-12-09 21:33:16   timer_07_c01    10.12.2020 16:06:49
     2020-12-09 21:33:16   timer_08_c01    09.12.2020 22:00:00
   Regex:
     accu:
     uiTable:
       MQTT2_shellyswitch25_E098068D28BC_CH2:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
       di_Weihnachtsbeleuchtung_szenen:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_5_0_0:
           Terrasse_Ost.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_6_0_0:
           Terrasse_Ost.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost.aktiv:
   condition:
     0                                    Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, Terrasse_Ost.Status, ::DOIF_time($hash,0,1,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31, $md";
  if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv') eq "on" and ($md ge "11-01" or $md le "01-31")) {
    if (::DOIF_time($hash,2,3,$wday,$hms)) {
      fhem_set("MQTT2_shellyswitch25_E098068D28BC_CH2 on");
      set_State("Szene: Terrasse_Ost");
      set_Reading("Terrasse_Ost.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: Terrasse_Ost.Status, ::DOIF_time($hash,4,5,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31";
    } else {
      fhem_set ("MQTT2_shellyswitch25_E098068D28BC_CH2 off");
      set_Reading("Terrasse_Ost.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: Terrasse_Ost.Status, ::DOIF_time($hash,6,7,$wday,$hms), MQTT2_shellyswitch25_E098068D28BC_CH2, 11-01, 01-31";
    }
  }

   days:
   defs:
     tpl:
       TPL_light    light_$1 {                          Log 1, "Weihnachts-DOIF: SELF=di_Weihnachtsbeleuchtung_szenen, $1.Status, $2, $3, $4, $5, $md";
  if ([?di_Weihnachtsbeleuchtung_szenen:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
  Log 1, "Weihnachts-DOIF: true: $1.Status, $2, $3, $4, $5";
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
  Log 1, "Weihnachts-DOIF: false: $1.Status, $2, $3, $4, $5";
    }
  }

   helper:
     DEVFILTER  ^global$|^di_Weihnachtsbeleuchtung_szenen$|^MQTT2_shellyswitch25_E098068D28BC_CH2$
     NOTIFYDEV  global|di_Weihnachtsbeleuchtung_szenen|MQTT2_shellyswitch25_E098068D28BC_CH2
     globalinit 1
     last_timer 8
     sleeptimer -1
     bm:
       DOIF_Get:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        09.12. 21:33:18
         max        7.48634338378906e-05
         tot        7.48634338378906e-05
         mAr:
           HASH(0x8d7f210)
           di_Weihnachtsbeleuchtung_szenen
           ?
       DOIF_Notify:
         cnt        3
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        09.12. 21:33:16
         max        0.000104188919067383
         tot        0.000145196914672852
         mAr:
           HASH(0x8d7f210)
           HASH(0xdd9898)
       DOIF_Set:
         cnt        5
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        09.12. 21:33:18
         max        0.000327825546264648
         tot        0.000710010528564453
         mAr:
           HASH(0x8d7f210)
           di_Weihnachtsbeleuchtung_szenen
           ?
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
     6          -1
     7          6
   intervalfunc:
   localtime:
     0          1607612809
     1          1607547600
     2          1607612809
     3          1607547600
     4          1607612809
     5          1607547600
     6          1607612809
     7          1607547600
   perlblock:
     0          light_Terrasse_Ost
   realtime:
     0          16:06:49
     1          22:00:00
     2          16:06:49
     3          22:00:00
     4          16:06:49
     5          22:00:00
     6          16:06:49
     7          22:00:00
   time:
     0          {sunset(-1800)}
     1          22:00:00
     2          {sunset(-1800)}
     3          22:00:00
     4          {sunset(-1800)}
     5          22:00:00
     6          {sunset(-1800)}
     7          22:00:00
   timeCond:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   timers:
     0           0  1  2  3  4  5  6  7
   triggertime:
     1607547600:
       localtime  1607547600
       hash:
     1607612809:
       localtime  1607612809
       hash:
   uiTable:
     dev        di_Weihnachtsbeleuchtung_szenen
     package    package ui_Table;
     reading    Terrasse_Ost.aktiv
     table:
       0:
         0:
           0:
             0          package ui_Table;"Szene"
         1:
           0:
             0          package ui_Table;"Zeitspanne"
         2:
           0:
             0          package ui_Table;"von"
         3:
           0:
             0          package ui_Table;"bis"
         4:
           0:
             0          package ui_Table;"Aktor"
         5:
           0:
             0          package ui_Table;"Status"
         6:
           0:
             0          package ui_Table;"aktiv"
       1:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost"
         1:
           0:
             0          package ui_Table;"[{sunset(-1800)}-22:00]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv')
     tc:
       1          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       10         style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       2          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       3          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       4          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       5          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       6          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       7          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       8          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       9          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
     td:
       0:
       1:
     tr:
   var:
     params:
       Szene
       Zeitspanne
       Aktor
       von
       bis
       Status
       aktiv
       icon
     sc:
       ARRAY(0x1b9c4918)
Attributes:
   icon       christmas_tree_2
   room       Weihnachten
   uiTable    {
  package ui_Table;
  $TC{1..10}="style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'";
}
"Szene"|"Zeitspanne"|"von"|"bis"|"Aktor"|"Status"|"aktiv"
FOR (@{$_sc},ICON("$_$8")." "."$_$1"|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state])|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))

Damian

OK.

Die zusätzlichen Timer hast du dir durch die Logs eingebaut:

z. B.:

Log 1, "Weihnachts-DOIF: true: $1.Status, $2, $3, $4, $5";

$2 entspricht [{sunset(-1800)}-22:00]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo,

das ist echt ärgerlich. Tut mir leid. Dass dadurch Timer erstellt werden, dessen war ich mir überhaupt nicht bewußt.
Die logs sind wieder draussen.

Anscheinend gibt es aber trotzdem noch ein Thema mit der Anzahl der Timer.
Wenn ich nur eine Szene erstelle, dann werden nun 2 Timer erstellt.
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
Führt zu den beiden folgenden Timern:
timer_01_c01 10.12.2020 16:06:49
timer_02_c01 10.12.2020 22:00:00


Bei einer zweiten Szene mit dem gleichen Aktor werden aber auch nur 2 Timer erstellt:
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);

timer_01_c01 10.12.2020 16:06:49
timer_02_c01 10.12.2020 22:00:00


Bei einer dritten Szene mit einem neuen Aktor werden dann 6 Timer angelegt:
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_West",    "[{sunset(-1800)}-23:06]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",       "12-01", "01-31", "on", "on", "christmas_lights")]);

timer_01_c01 10.12.2020 16:06:49
timer_02_c01 10.12.2020 22:00:00
timer_03_c02 10.12.2020 05:46:00
timer_04_c02 10.12.2020 07:58:44
timer_05_c03 10.12.2020 16:06:49
timer_06_c03 10.12.2020 23:06:00


Und wenn ich 3 Szenen mit dem jeweils gleichen Aktor anlege, dann habe ich auch nur 2 Timer:
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh2",    "[11:47-12:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);

timer_01_c01 10.12.2020 16:06:49
timer_02_c01 10.12.2020 22:00:00


Im Endeffekt kann man das aber durch z.B. einer Dummy-Szene mit einem Dummy-Aktor abfangen.

Ich hoffe, ich habe nicht noch einen Fehler eingebaut.
lg, Gerhard

Damian

Vielleicht hast du sie nur nicht gesehen. Sonst mit F5 Browser aktualisieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

#15
Wenn ich die DEF ändere, wird die Seite neu geladen und auch ein F5/Aktualisieren hilft nix.

Ich habe testweise mal 4 Szenen mit unterschiedlicher Anfangszeit, aber dem gleichen Aktuator, angelegt:
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh2",    "[05:47-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh3",    "[05:48-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);


Damit habe ich dann 2 Timer, auch in einem list.
Internals:
   DEF        subs  {
## Parameter    1             2                       3               4        5        6      7     8
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon));
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt
push (@{$_sc},[("Terrasse_Ost","[{sunset(-1800)}-22:00]", "MQTT2_shellyswitch25_E098068D28BC_CH2",   "11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh",    "[05:46-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh2",    "[05:47-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost-Frueh3",    "[05:48-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Terrasse_West",    "[{sunset(-1800)}-23:06]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",       "12-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Terrasse_West-Frueh",     "[05:47-{sunrise(3600)}]",    "MQTT2_shellyswitch25_68C63AFB9B27_CH2",        "12-01", "01-01", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Krippe",    "[{sunset(-1800)}-23:07]",    "Test",       "12-01", "01-31", "on", "on", "krippe")]);
#push (@{$_sc},[("Krippe-Frueh",     "[05:48-{sunrise(3600)}]",    "Test",        "12-01", "01-01", "on", "on"), "krippe"]);
#push (@{$_sc},[("Stiege",    "[{sunset(-1800)}-23:08]",    "MQTT2_shellyplug_s_EAE605",       "12-01", "01-31", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Stiege-Frueh",     "[05:49-{sunrise(3600)}]",    "MQTT2_shellyplug_s_EAE605",        "12-01", "01-01", "on", "on", "christmas_lights")]);
#push (@{$_sc},[("Test",     "[05:50-{sunrise(3600)}]",    "MQTT2_shellyplug_s_EAE605_temp",        "12-01", "01-01", "off", "off", "christmas_lights")]);

## 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++) {
    for (my $j=5;$j < @{$_params};$j++) { ## Parameter 6 und 7 werden als Reading angelegt
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);
    }
  }
}
} ## end of subs

DEF TPL_light ( ## Definition des Templates namens TPL_light
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis
                ##            $1    $2         $3    $4  $5
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
    }
  }
} ## Ende des light-Blocks
) ## Ende der Templatedefinition

## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
   FUUID      5fc403f2-f33f-0b7a-ef32-d5354fbb0b303c93
   FVERSION   98_DOIF.pm:0.232350/2020-11-25
   MODEL      Perl
   NAME       di_Weihnachtsbeleuchtung_szenen
   NOTIFYDEV  global,MQTT2_shellyswitch25_E098068D28BC_CH2,di_Weihnachtsbeleuchtung_szenen
   NR         1826
   NTFY_ORDER 50-di_Weihnachtsbeleuchtung_szenen
   STATE      initialized
   TYPE       DOIF
   VERSION    23235 2020-11-25 22:42:28
   OLDREADINGS:
   READINGS:
     2020-12-10 08:39:54   Terrasse_Ost-Frueh.Status on
     2020-12-10 08:39:54   Terrasse_Ost-Frueh.aktiv on
     2020-12-10 08:39:54   Terrasse_Ost-Frueh.icon christmas_lights
     2020-12-10 08:39:54   Terrasse_Ost-Frueh2.Status on
     2020-12-10 08:39:54   Terrasse_Ost-Frueh2.aktiv on
     2020-12-10 08:39:54   Terrasse_Ost-Frueh2.icon christmas_lights
     2020-12-10 08:39:54   Terrasse_Ost-Frueh3.Status on
     2020-12-10 08:39:54   Terrasse_Ost-Frueh3.aktiv on
     2020-12-10 08:39:54   Terrasse_Ost-Frueh3.icon christmas_lights
     2020-12-10 08:39:54   Terrasse_Ost.Status on
     2020-12-10 08:39:54   Terrasse_Ost.aktiv on
     2020-12-10 08:39:54   Terrasse_Ost.icon christmas_lights
     2020-12-10 08:39:54   state           initialized
     2020-12-10 08:39:54   timer_01_c01    10.12.2020 16:06:49
     2020-12-10 08:39:54   timer_02_c01    10.12.2020 22:00:00
   Regex:
     accu:
     uiTable:
       MQTT2_shellyswitch25_E098068D28BC_CH2:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_4_0_0:
           state      ^MQTT2_shellyswitch25_E098068D28BC_CH2$:^state:
       di_Weihnachtsbeleuchtung_szenen:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_5_0_0:
           Terrasse_Ost.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_6_0_0:
           Terrasse_Ost.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_5_0_0:
           Terrasse_Ost-Frueh.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_6_0_0:
           Terrasse_Ost-Frueh.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_5_0_0:
           Terrasse_Ost-Frueh2.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh2.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_6_0_0:
           Terrasse_Ost-Frueh2.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh2.aktiv:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_5_0_0:
           Terrasse_Ost-Frueh3.Status ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh3.Status:
         di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_6_0_0:
           Terrasse_Ost-Frueh3.aktiv ^di_Weihnachtsbeleuchtung_szenen$:^Terrasse_Ost-Frueh3.aktiv:
   condition:
     0                                    if (::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv') eq "on" and ($md ge "11-01" or $md le "01-31")) {
    if (::DOIF_time($hash,0,1,$wday,$hms)) {
      fhem_set("MQTT2_shellyswitch25_E098068D28BC_CH2 on");
      set_State("Szene: Terrasse_Ost");
      set_Reading("Terrasse_Ost.Status","on",1);
    } else {
      fhem_set ("MQTT2_shellyswitch25_E098068D28BC_CH2 off");
      set_Reading("Terrasse_Ost.Status","off",1);
    }
  }

   days:
   defs:
     tpl:
       TPL_light    light_$1 {                          if ([?di_Weihnachtsbeleuchtung_szenen:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
    }
  }

   helper:
     DEVFILTER  ^global$|^di_Weihnachtsbeleuchtung_szenen$|^MQTT2_shellyswitch25_E098068D28BC_CH2$
     NOTIFYDEV  global|di_Weihnachtsbeleuchtung_szenen|MQTT2_shellyswitch25_E098068D28BC_CH2
     globalinit 1
     last_timer 2
     sleeptimer -1
     bm:
       DOIF_Get:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        10.12. 08:39:55
         max        4.69684600830078e-05
         tot        6.58035278320312e-05
         mAr:
           HASH(0x8d7f210)
           di_Weihnachtsbeleuchtung_szenen
           ?
       DOIF_Notify:
         cnt        3
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        10.12. 08:39:54
         max        0.000100135803222656
         tot        0.000129222869873047
         mAr:
           HASH(0x8d7f210)
           HASH(0xdd9898)
       DOIF_Set:
         cnt        8
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        10.12. 08:39:59
         max        0.000336170196533203
         tot        0.00107836723327637
         mAr:
           HASH(0x8d7f210)
           di_Weihnachtsbeleuchtung_szenen
           ?
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1607612809
     1          1607634000
   perlblock:
     0          light_Terrasse_Ost
   realtime:
     0          16:06:49
     1          22:00:00
   time:
     0          {sunset(-1800)}
     1          22:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1607612809:
       localtime  1607612809
       hash:
     1607634000:
       localtime  1607634000
       hash:
   uiTable:
     dev        di_Weihnachtsbeleuchtung_szenen
     package    package ui_Table;
     reading    Terrasse_Ost-Frueh3.aktiv
     table:
       0:
         0:
           0:
             0          package ui_Table;"Szene"
         1:
           0:
             0          package ui_Table;"Zeitspanne"
         2:
           0:
             0          package ui_Table;"von"
         3:
           0:
             0          package ui_Table;"bis"
         4:
           0:
             0          package ui_Table;"Aktor"
         5:
           0:
             0          package ui_Table;"Status"
         6:
           0:
             0          package ui_Table;"aktiv"
       1:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost"
         1:
           0:
             0          package ui_Table;"[{sunset(-1800)}-22:00]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_1_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost.aktiv')
       2:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost-Frueh"
         1:
           0:
             0          package ui_Table;"[05:46-{sunrise(3600)}]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_2_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh.aktiv')
       3:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost-Frueh2"
         1:
           0:
             0          package ui_Table;"[05:47-{sunrise(3600)}]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh2.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh2.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_3_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh2.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh2.aktiv')
       4:
         0:
           0:
             0          package ui_Table;ICON("christmas_lights")
             1          package ui_Table;" "
             2          package ui_Table;"Terrasse_Ost-Frueh3"
         1:
           0:
             0          package ui_Table;"[05:48-{sunrise(3600)}]"
         2:
           0:
             0          package ui_Table;"11-01"
         3:
           0:
             0          package ui_Table;"01-31"
         4:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_4_0_0',switch (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_E098068D28BC_CH2','state')),'','MQTT2_shellyswitch25_E098068D28BC_CH2','state')
         5:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_5_0_0',icon(::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh3.Status')),'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh3.Status')
         6:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'di_Weihnachtsbeleuchtung_szenen_uiTable_c_4_6_0_0',::ReadingValDoIf($hash,'di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh3.aktiv'),"","select,on,off",'','di_Weihnachtsbeleuchtung_szenen','Terrasse_Ost-Frueh3.aktiv')
     tc:
       1          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       10         style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       2          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       3          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       4          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       5          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       6          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       7          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       8          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
       9          style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'
     td:
       0:
       1:
       2:
       3:
       4:
     tr:
   var:
     params:
       Szene
       Zeitspanne
       Aktor
       von
       bis
       Status
       aktiv
       icon
     sc:
       ARRAY(0x1e34ec00)
       ARRAY(0x233d6e98)
       ARRAY(0x23102718)
       ARRAY(0x233adc98)
Attributes:
   icon       christmas_tree_2
   room       Weihnachten
   uiTable    {
  package ui_Table;
  $TC{1..10}="style='padding-left: 5px; padding-right: 5px; padding-top: 3px; padding-bottom: 3px;' align='center'";
}
"Szene"|"Zeitspanne"|"von"|"bis"|"Aktor"|"Status"|"aktiv"
FOR (@{$_sc},ICON("$_$8")." "."$_$1"|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state])|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))


Wenn ich noch eine Dummy-Szene mit einem anderen Aktuator am Ende hinzufüge, dann werden alle Timer richtig angelegt.
Zumindest scheinen nicht alle Timer für Szenen mit gleichen Aktuator angelegt zu werden.

Klappt das denn bei Dir?
lg, Gerhard

Damian

Es liegt nicht am Aktor ($3), sondern am Definitionsnamen der Szenen ($1):

Du solltest statt Minus ein Unterstrich nehmen:

push (@{$_sc},[("Terrasse_Ost_Frueh",    "[05:46-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost_Frueh2",    "[05:47-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);
push (@{$_sc},[("Terrasse_Ost_Frueh3",    "[05:48-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);


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

gestein

Echt?
Dann bin ich natürlich wieder voll ins Fettnäpfchen. Wieso musste ich auch ausgerechnet das Minus nehmen?

Mit dem Szenen-Namen ist es eh nicht einfach: keine Umlaute, keine Abstände, kein "-" ...

Habe die Szenen umbenannt und siehe da, die 8x2 Timer sind da.

Damit sollte nun alles geklärt sein.
Vielen herzlichen Dank für Deine Unterstützung!
lg, Gerhard

gestein

Soweit funktioniert das nun wunderbar.
Ist viel übersichtlicher als vorher mit den diversen at.

Wäre es noch möglich in der uiTable statt der Definition der Zeitspanne (also z.B. "[{sunset(-1800)}-22:00]") die wirklichen Zeiten aus den Timern anzuzeigen?
Am besten wäre natürlich nur die Zeiten zu sehen - ohne das Datum (z.B. "16:06 - 22:00").

Leider kenne ich mich mit den uiTable-Codes noch gar nicht aus.
Könnte mir vielleicht jemand einen Tipp geben, möchte nicht wieder in die diversen Fallen stolpern und dann Damian damit beschäftigen ;)

Danke im Voraus
lg, Gerhard

meier81

Zitat von: Damian am 07 Dezember 2020, 18:07:56
Ich habe einen weiteren Parameter Nr. 8 für ein Icon hinzugefügt. Szenenname wird für Readings und Template-Name benutzt, da dürfen keine Leerzeichen vorkommen.

Hallo,

ich habe ein Problem bzw. noch eine Frage. Als erstes habe ich das Problem wenn ich das DOIF exakt genauso wie in der Vorlage anlege sieht soweit alles super aus, fange ich jetzt an die Vorlage anzupassen an mein System gibt es ein Anzeigeproblem mit dem Symbol. Ich habe hier bei mir Steckdosen die über MQTT angesteuert werden, die Definition sieht z.B. so aus:

defmod Steckdose_1 MQTT_DEVICE
attr Steckdose_1 userattr room_map structexclude
attr Steckdose_1 IODev MQTT
attr Steckdose_1 alias Weihnachtsbeleuchtung 1
attr Steckdose_1 event-on-change-reading .*
attr Steckdose_1 eventMap ON:on OFF:off
attr Steckdose_1 group Steckdosen
attr Steckdose_1 icon hue_filled_outlet
attr Steckdose_1 publishSet ON OFF cmnd/steckdose_1/POWER
attr Steckdose_1 room Erdgeschoß->Wohnzimmer,Testbereich->Testdevices
attr Steckdose_1 subscribeReading_LWT tele/steckdose_1/LWT
attr Steckdose_1 subscribeReading_TELEMETRY tele/steckdose_1/SENSOR
attr Steckdose_1 subscribeReading_state stat/steckdose_1/POWER


Sobald ich jetzt das DOIF anpasse, hab es mal so geändert:

push (@{$_sc},[("Tannenbaum","[{sunset(360)}-23:00]", "Steckdose_1",   "11-01", "01-31", "off", "off", "christmas_tree")]);;\

funktioniert die Verlinkung zum Device nicht, ist aber klar da die Szene noch "Tannenbaum" heißt, aber das Statusicon verschwindet und ich kann dementsprechend hier auch nicht mehr draufklicken.

Lege ich einen Dummy an der "Tannebaum" heißt und lasse das DOIF "original", geht dies ohne Probleme.

Zudem hätte ich noch eine Frage zur Zeitspanne: Ich würde dort gerne auch "andere" Bedingungen wie nur die Zeit verwenden, z.B. Helligkeit < 50. Habe das zur Zeit bei mir in einem DOIF als Beispiel so definiert:

defmod di_Weihnachtsbeleuchtung DOIF ## Morgens Anschalten\
([06:00])\
   (set Weihnachtsbeleuchtung on)\
## Morgens Ausschalten\
DOELSEIF ([Wetterstation:brightness] > 5000)\
   (set Weihnachtsbeleuchtung off)\
## Abends anschalten\
DOELSEIF ([Wetterstation:brightness] < 500 and [15:00-18:00])\
   (set Weihnachtsbeleuchtung on)\
## Abends ausschalten\
DOELSEIF ([22:00])\
   (set Weihnachtsbeleuchtung off)
attr di_Weihnachtsbeleuchtung cmdState on|off|on|off
attr di_Weihnachtsbeleuchtung icon helper_doif


Lässt sich das einigermaßen "einfach" mit deinem DOIF umsetzen oder kann ich da deine Vorlage für meine Zwecke nicht verwenden.

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Damian

#20
Hier ein Beispiel mit Dämmerung, siehe auch: https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht

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:00])", "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-09:00]",                      "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:05]",                      "Aussenbeleuchtung on",     "Aussenbeleuchtung off")]);;\
push (@{$_sc},[("Tannenbaum", "$SELF:Dunkelheit", "([06:25-00:00])",                    "Tanne on",                 "Tanne off")]);;\
push (@{$_sc},[("Keller",     "$SELF:Dunkelheit", "([10:05-21:55:30])",                 "Keller on",                "Keller off")]);;\
\
## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
if ($::init_done) {\
  fhem("deletereading $SELF .*");;\
  set_State("initialized");;\
  set_Reading ("Dunkelheit","on");;\
  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 Beschattung-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..10}="style='padding-left: 5px;; padding-right: 5px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Parameter\
"Szene"|"Dämmerung"|"Zeitspanne"|"Status"|"ausgeführt"|"aktiv"\
\
## Pro Datensatz einer Beschattungs-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"))


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

gestein

Hallo,

mein DOIF schaltet trotzdem immer ein/aus, obwohl der Datumsbereich von "11-01" bis "01-31"geht und wir mittlerweile Februar haben.
Da sollte eigentlich nichts mehr einschalten.
Die Timer werden aber trotzdem angelegt.

Anscheinend greift da die Abfrage in der Definition nicht. Aber warum nicht?
if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {

Das push in der Definition sieht so aus:
push (@{$_sc},[("Terrasse_Ost",  "[{sunset(-1800)}-20:45]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);


Danke für jeden Hinweis. Ich find einfach den Fehler nicht.
lg, Gerhard

Adimarantis

#22
Hab jetzt den thread nicht weiter durchgelesen, aber ein ähnliches Problem mit meiner Weihnachtsbeleuchtung gehabt.

Meine Lösung dafür (November bis Januar) schaut so aus:
(([{sunset("REAL",0,"15:00","23:00")}] or [6:30|12345]) and ($month>10 || $month<2) ) (set Aussensteckdose on, set Shelly_Balkon on)
DOELSEIF (([23:01] or [{sunrise("REAL",900,"6:35","9:00")}]) and ($month>10 || $month<2)) (set Aussensteckdose off, set Shelly_Balkon off)


Gruß,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Damian

Zitat von: gestein am 03 Februar 2021, 17:01:55
Hallo,

mein DOIF schaltet trotzdem immer ein/aus, obwohl der Datumsbereich von "11-01" bis "01-31"geht und wir mittlerweile Februar haben.
Da sollte eigentlich nichts mehr einschalten.
Die Timer werden aber trotzdem angelegt.

Anscheinend greift da die Abfrage in der Definition nicht. Aber warum nicht?
if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {

Das push in der Definition sieht so aus:
push (@{$_sc},[("Terrasse_Ost",  "[{sunset(-1800)}-20:45]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);


Danke für jeden Hinweis. Ich find einfach den Fehler nicht.
lg, Gerhard

Poste mal list deiner aktuelle Definition, damit ich es bei mir nachstellen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo Damian,

Hier meine Definition.
defmod di_Weihnachtsbeleuchtung_szenen DOIF subs  {\
## Parameter    1             2                       3               4        5        6      7     8\
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon));;\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
push (@{$_sc},[("Terrasse_Ost",  "[{sunset(-1800)}-20:45]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Terrasse_Ost2", "[06:00-{sunrise(3600)}]", "MQTT2_shellyswitch25_E098068D28BC_CH2","11-01", "01-31", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Terrasse_West", "[{sunset(-1800)}-23:06]", "MQTT2_shellyswitch25_68C63AFB9B27_CH2","12-01", "01-31", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Terrasse_West2","[05:45-{sunrise(3600)}]", "MQTT2_shellyswitch25_68C63AFB9B27_CH2","12-01", "01-01", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Geländer",      "[{sunset(-1800)}-23:08]", "MQTT2_shellyplug_s_EAE605",            "12-01", "01-31", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Geländer2",     "[05:45-{sunrise(3600)}]", "MQTT2_shellyplug_s_EAE605",            "12-01", "01-01", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Schlafzimmer_Lichterdecke1",      "[{sunset(-1800)}-20:45]", "MQTT2_shelly1pm_8CAAB5056CA8", "12-01", "01-31", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Schlafzimmer_Lichterdecke12",     "[06:00-{sunrise(3600)}]", "MQTT2_shelly1pm_8CAAB5056CA8", "12-01", "01-01", "on", "on", "christmas_lights")]);;\
push (@{$_sc},[("Schlafzimmer_Lichterdecke2",      "[{sunset(-1800)}-20:45]", "MQTT2_shellyplug_s_EF28FB",    "12-01", "01-31", "on", "off", "christmas_lights")]);;\
push (@{$_sc},[("Schlafzimmer_Lichterdecke22",     "[06:00-{sunrise(3600)}]", "MQTT2_shellyplug_s_EF28FB",    "12-01", "01-01", "on", "off", "christmas_lights")]);;\
push (@{$_sc},[("Wohnzimmer_Weihnacht",      "[{sunset(-1800)}-20:45]", "strWZ.Weihnacht_Athmos",    "12-01", "01-31", "on", "off", "christmas_santa")]);;\
push (@{$_sc},[("Wohnzimmer_Weihnacht2",     "[06:00-{sunrise(3600)}]", "strWZ.Weihnacht_Athmos",    "12-01", "01-01", "on", "off", "christmas_santa")]);;\
\
## 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++) {\
    for (my $j=5;;$j < @{$_params};;$j++) { ## Parameter 6 und 7 werden als Reading angelegt\
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);;\
    }\
  }\
}\
} ## end of subs\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis\
                ##            $1    $2         $3    $4  $5\
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {\
    if ($2) {\
      fhem_set("$3 on");;\
      set_State("Szene: $1");;\
      set_Reading("$1.Status","on",1);;\
    } else {\
      fhem_set ("$3 off");;\
      set_Reading("$1.Status","off",1);;\
    }\
  }\
} ## Ende des light-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
attr di_Weihnachtsbeleuchtung_szenen icon christmas_tree_2
attr di_Weihnachtsbeleuchtung_szenen room Weihnachten
attr di_Weihnachtsbeleuchtung_szenen uiTable {\
  package ui_Table;;\
  $TC{1..10}="style='padding-left: 5px;; padding-right: 5px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
"Szene"|"Zeitspanne"|"von"|"bis"|"Aktor"|"Status"|"aktiv"\
FOR (@{$_sc},ICON("$_$8")." "."$_$1"|"$_$2"|"$_$4"|"$_$5"|switch ([$_$3:state])|icon([$SELF:$_$1.Status])|WID([$SELF:$_$1.aktiv],"select,on,off"))


Vielen Dank schon mal!
lg, Gerhard

Damian

Bei mir funktioniert folgende Definition korrekt:

Internals:
   CFGFN     
   DEF        subs  {
## Parameter    1             2                       3               4        5        6      7     8
@{$_params}=(qw(Szene         Zeitspanne              Aktor           von      bis      Status aktiv icon));
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt
push (@{$_sc},[("Terrasse_Ost",  "[23:41-23:42]", "bla","11-01", "01-31", "on", "on", "christmas_lights")]);

## 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++) {
    for (my $j=5;$j < @{$_params};$j++) { ## Parameter 6 und 7 werden als Reading angelegt
      set_Reading ($_sc[$i][0].".".$_params[$j],$_sc[$i][$j]);
    }
  }
}
} ## end of subs

DEF TPL_light ( ## Definition des Templates namens TPL_light
light_$1 {      ## Parameter: Szene Zeitspanne Aktor von bis
                ##            $1    $2         $3    $4  $5
  if ([?$SELF:$1.aktiv] eq "on" and ($md ge "$4" or $md le "$5")) {
    if ($2) {
      fhem_set("$3 on");
      set_State("Szene: $1");
      set_Reading("$1.Status","on",1);
    } else {
      fhem_set ("$3 off");
      set_Reading("$1.Status","off",1);
    }
  }
} ## Ende des light-Blocks
) ## Ende der Templatedefinition

## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,$_$4,$_$5))
   FUUID      601dc643-f33f-c0d4-8053-48c092014fe038e4
   MODEL      Perl
   NAME       di_Weihnachtsbeleuchtung_szenen
   NOTIFYDEV  global,di_Weihnachtsbeleuchtung_szenen,bla
   NR         4843
   NTFY_ORDER 50-di_Weihnachtsbeleuchtung_szenen
   STATE      initialized
   TYPE       DOIF
   VERSION    22913 2020-10-04 21:46:02
   OLDREADINGS:
   READINGS:
     2021-02-05 23:40:16   Terrasse_Ost.Status on
     2021-02-05 23:40:16   Terrasse_Ost.aktiv on
     2021-02-05 23:40:16   Terrasse_Ost.icon christmas_lights
     2021-02-05 23:41:00   block_light_Terrasse_Ost executed
     2021-02-05 23:40:16   state           initialized
     2021-02-05 23:40:16   timer_01_c01    05.02.2021 23:41:00
     2021-02-05 23:40:16   timer_02_c01    05.02.2021 23:42:00


Um 23:41:00 wurde der Block ausgeführt: block_light_Terrasse_Ost executed, der Status des Moduls hat sich aber nicht geändert: initialized, der Dummy bla wurde nicht geschaltet.

Zuvor hatte ich als Grenze 02-31 angegeben, dort wurde der Dummy auch entsprechend ein- und ausgeschaltet - ich kann kein Fehlverhalten bei dieser Definition feststellen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo Damian,

vielen Dank für Deine Hilfe.
Ich bin bei meiner Definition fast verzweifelt. Auch ein Neustart hat nichts geändert.
Daher habe ich vorgestern das DOIF gelöscht, fhem neu gestartet, DOIF neu angelegt - und was soll ich sagen? Es funktioniert.
Schön blöd eigentlich. Was der Fehler war, weiß ich nicht.

Aber es klappt nun. Danke!
lg, Gerhard


Damian

#27
Zitat von: gestein am 09 Februar 2021, 09:32:00
Hallo Damian,

vielen Dank für Deine Hilfe.
Ich bin bei meiner Definition fast verzweifelt. Auch ein Neustart hat nichts geändert.
Daher habe ich vorgestern das DOIF gelöscht, fhem neu gestartet, DOIF neu angelegt - und was soll ich sagen? Es funktioniert.
Schön blöd eigentlich. Was der Fehler war, weiß ich nicht.

Aber es klappt nun. Danke!
lg, Gerhard

Eine unschöne Sache ist bei der Lösung die Abfrage der Zeiträume, sie funktioniert nur, wenn der erste Zeitpunkt eine "größere" Datumsangabe beinhaltet als der zweite Zeitpunkt.

Wenn man z. B. 01-01 bis 03-01 haben wollte

dann funktioniert schon die Abfrage  ($md ge "$4" or $md le "$5") nicht,

dann müsste man vielmehr abfragen ($md ge "$4" and $md le "$5")

D. h. der Perlcode ist nicht universell verwendbar.

Ich will zukünftig in DOIF Tageszeiträume einbauen damit solche Abfragen immer funktionieren, z. B. [11-01 to 01-31] oder eben [01-01 to 03-01].

Meine aktuelle Lösung beinhaltet z. Zt. keine Zeitraumangaben und sie hat nun drei Zustände on/off/auto:

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:00])", "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-09:00]",                      "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:05]",                      "Aussenbeleuchtung on",     "Aussenbeleuchtung off")]);;\
push (@{$_sc},[("Tannenbaum", "$SELF:Dunkelheit", "([06:25-00:00])",                    "Tanne on",                 "Tanne off")]);;\
push (@{$_sc},[("Keller",     "$SELF:Dunkelheit", "([10:05-21:55:30])",                 "Keller on",                "Keller off")]);;\
\
## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
if ($::init_done) {\
  fhem("deletereading $SELF .*");;\
  set_State("initialized");;\
  set_Reading ("Dunkelheit","on");;\
  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..10}="style='padding-left: 5px;; padding-right: 5px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Parameter\
"Szene"|"Dämmerung"|"Zeitspanne"|"Status"|"ausgeführt"|"aktiv"\
\
## Pro Datensatz einer Beschattungs-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"))


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

gestein

#28
Ja, das hatte ich auch schon bemerkt.
Momentan habe ich testweise eine Funktion "check_date_range" eingebaut, die die Zeiträume prüft.
Also so was:
sub check_date_range {
  my ($md, $date1,$date2)=@_;
Log 1,"di_Licht_all:check_dates $md;$date1,$date2;";

if("$date1" gt "$date2") {
return ("$md" ge "$date1" and "$md" le "$date2");
}
return ("$md" ge "$date1" or "$md" le "$date2")
}


Sobald ich sicher bin, dass das funktioniert, wollte ich das Thema auch hier ansprechen  ;)
Eine direkte Abfrage im DOIF wäre aber sicherlich besser.

Eine Frage bitte noch:
Könnte man den Datumsbereich auch in deutscher Notation angeben?

lg, Gerhard

Damian

Zitat von: gestein am 09 Februar 2021, 11:06:09
Ja, das hatte ich auch schon bemerkt.
Momentan habe ich testweise eine Funktion "check_date_range" eingebaut, die die Zeiträume prüft.
Also so was:
sub check_date_range {
  my ($md, $date1,$date2)=@_;
Log 1,"di_Licht_all:check_dates $md;$date1,$date2;";

if("$date1" gt "$date2") {
return ("$md" ge "$date1" and "$md" le "$date2");
}
return ("$md" ge "$date1" or "$md" le "$date2")
}


Sobald ich sicher bin, dass das funktioniert, wollte ich das Thema auch hier ansprechen  ;)
Eine direkte Abfrage im DOIF wäre aber sicherlich besser.

Eine Frage bitte noch:
Könnte man den Datumsbereich auch in deutscher Notation angeben?

lg, Gerhard

Warum nicht :)

Das deutsche Format hat einen entscheidenden Nachteil, du kannst Datumsvergleiche mit Tag und Monat nicht mit gt, lt usw. vergleichen, weil der Monat höherwertiger ist als der Tag
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Da man jedes Jahr auf´s Neue die Lichterketten aus der Kiste kramt, ist dieses Thema ja immer wieder aktuell :)

Für diesen Zweck habe ich meine Szenarien über die WEB-Oberfläche ein- und ausschaltbar um die Weihnachtsbeleuchtung erweitert. So kann ich jedes Jahr die Weihnachtsszenarien aktivieren und andere wieder deaktivieren. Das scheint mir praktikabler zu sein, als sich auf bestimmte Tage im Jahr festzulegen, wie in den vorherigen Beispielen.

Meine aktuelle Lösung sieht wie folgt aus. Daemmerung2 bzw. Dunkelheit sind DOIF´s, die abhängig von der Helligkeit wahr/unwahr werden.

Wer keinen Helligkeitssensor hat, der kann sich seine Dämmerung selbst definieren:

defmod Daemmerung DOIF init {set_State([{sunset()}-{sunrise()}])}

Und hier der komplette Code für die Lichtszenarien:

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"];;\
push @{$_sc},["Weihnachtsbeleuchtung","Daemmerung2","[16:00-09:00]",                  "Terrasse,Schuppen on",     "Terrasse,Schuppen 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;; padding-top: 2px;; padding-bottom: 2px;;' align='center'";;\
  $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"))


Hier gibt's den Wiki-Eintrag dazu:
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

kjmEjfu

Ich habe es mal etwas erweitert, damit man mit einem Brightness-Wert arbeiten kann, aber nicht bei jeder kleinen Änderung direkt in hektisches ein-/ausschalten verfallen wird. Außerdem noch einen Zufallswert, damit die Schaltzeit etwas variiert.

defmod di_Licht_all DOIF subs  {\
## Ein Szenario wird durch Hinzufügen einer Definitionszeile erstellt\
##              Szene               Daemmerungssensor               Schwellwert_ein   Schwellwert_aus     Zeitspanne         Zufallswert     Einschaltbefehl                Ausschaltbefehl\
push (@{$_sc},["Weihnachten_1",   "Sensor_Aussen_1",                "180",            "210",              "[07:00-22:15]",   "5",            "Steckdose_Aussen_1 on",       "Steckdose_Aussen_1 off"]);;\
push (@{$_sc},["Weihnachten_2",   "Sensor_Aussen_2",                "180",            "210",              "[07:00-22:15]",   "0",            "Steckdose_Aussen_2 on",       "Steckdose_Aussen_2 off"]);;\
\
## Bei Änderung der Definition werden erforderliche 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   Daemmerungssensor  Schwellwert_ein   Schwellwert_aus      Zeitspanne   Zufallswert    on  off
                ##            $1      $2                 $3                $4                    $5           $6             $7  $8
  if ([$SELF:$1.aktiv] eq "auto") {
    if (($5) and ([$2:control:d] < $3) and ([$SELF:$1.Status] ne "on")) {
  if (get_Exec("$1_off")) {
del_Exec("$1_off");
  } else {
        set_Exec("$1_on",rand($6),'fhem_set($7)');
        set_Reading("$1.Status","on",1);
  }
    } elsif ((([$2:control:d] > $4) or !($5)) and ([$SELF:$1.Status] ne "off")) {
  if (get_Exec("$1_on")) {
del_Exec("$1_on");
  } else {
        set_Exec("$1_off",rand($6),'fhem_set($8)');
        set_Reading("$1.Status","off",1);
  }
    }
  }
} ## Ende des light-Blocks

active_$1 {
  if (([$SELF:$1.aktiv] eq "on") and ([$SELF:$1.Status] ne "on")) {
    fhem_set ($7);
    set_Reading("$1.Status","on",1);
  }
  if (([$SELF:$1.aktiv] eq "off") and ([$SELF:$1.Status] ne "off")) {
    fhem_set ($8);
    set_Reading("$1.Status","off",1);
  }
} ## Ende des active-Blocks
) ## Ende der Templatedefinition
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5","$_$6","$_$7","$_$8"))
attr di_Licht_all_new group Logik
attr di_Licht_all_new room Homematic
attr di_Licht_all_new 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"|"$_$3 - $_$4"|"$_$5"|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0)|WID([$SELF:$_$1.aktiv],"select,auto,on,off"))


Migriere derzeit zu Home Assistant

Damian

Zitat von: kjmEjfu am 30 November 2021, 10:52:10
Ich habe es mal etwas erweitert, damit man mit einem Brightness-Wert arbeiten kann, aber nicht bei jeder kleinen Änderung direkt in hektisches ein-/ausschalten verfallen wird. Außerdem noch einen Zufallswert, damit die Schaltzeit etwas variiert.

Schön, wenn du in der Lage warst, den Code anzupassen.

Ich habe bei mir verschiedene Dämmerungsstufen über separate DOIFs definiert. Die passende Dämmerungsstufe gebe ich dann unter Daemmerungssensor an.

Wenn mir eine Dämmerungsstufe zu hell oder zu dunkel wäre, dann könnte ich sie außerhalb des Codes anpassen.

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

gestein

Hallo,

ich hätte noch 2 Fragen bzw. Bitten zu dem DOIF:
1) Wie könnte man die Schaltzustände "Status" mit den wirklichen Zuständen der Lampen angleichen?
   Meine Frau schaltet manchmal die Beleuchtung manuell ein bzw. aus.
   Ist war nur Kosmetik, aber immerhin.
2) Wie könnte man die Lampensymbole schaltbar machen?

Im Prinzip könnte ich da schon was selbst probieren, aber bei den 2 Themen bräuchte ich bitte einen kleinen Schupser in die richtige Richung ;-)

Danke, lg, Gerhard

Damian

Dazu müsste man in der ui_Table-Definition statt icon([$SELF:$_$1.Status] die switch-Funktion mit der Lampe angeben siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Schaltbares_Icon_mit_Hilfe_der_Funktion_switch

In meinem Beispiel funktioniert das nicht, weil ich pro Szenario nicht nur ein Device vorgesehen habe, sondern auch mehrere.

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

moonsorrox

Für mein Verständnis, was bedeutet denn Auto ist das in Zusammenhang mit dem Dämmerungssensor zu verstehen.
Die Beleuchtung ist dann "on" wenn der Dämmerungssensor auch sagt "on"
Dann "off" ist normal klar bedeutet es geht gar nicht "Ein" obwohl der Dämmerungssensor sagt "on"

Denn auch auf dem Bild ist bei allen der Dämmerungssensor auf  "on"
Dann habe ich gesehen im Code du hast 2 Dämmerungssensoren, "Dämmerung2" und "Dunkelheit" wie ist das zu verstehen.

Ich möchte das gerne mal nachbauen muss aber erst einmal die Logik dahinter verstehen, denn du hast ja auch Zeitangaben das würde doch eigentlich ausreichen.
Es ist wohl auch nicht "nur" eine Weihnachtsbeleuchtung sondern wird auch sonst als Szenario genutzt..?
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

#36
Pro Szenario wird eine Bedingung erstellt der Art (verglichen mit FHEM-Modus):

([Daemmerung] eq "on" and [von-bis]) (set etwas on) DOELSE (set etwas off)

D. h. in der vorgegebenen Zeitspanne wenn es dunkel wird etwas einschalten, wenn es hell wird oder wenn die bis-Zeit erreicht wird ausschalten.

Dämmerung ist ein on/off-Dämmerungssensor, entweder hat man einen solchen oder man baut sich einen solchen oder mehrere mit separaten DOIFs für verschiedene Helligkeitsstufen.

on ist dauerhaft on, off ist dauerhaft off, auto ist automatisch, das sollte logisch sein. Wenn ich ein Szenario deaktivieren will, dann setze ich es auf off, sonst stelle ich es auf auto, on ist nice to have.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

Vielen Dank Damian, das ist sehr gut dargestellt und die Szenarien erklärt.
Ich gehe bei vielen Dummys ähnlich vor mit dem Status, entweder Dämmerung, oder Ein, oder Aus

So kann ich aber mal probieren meine gesamten DOIFs zu überarbeiten und alles in dem einen unter zu bringen mit den verschiedenen Möglichkeiten, mal schauen ob ich das so hinbekomme, wie ich es haben möchte... ;-))
Danke
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 17 Dezember 2021, 22:27:49
Vielen Dank Damian, das ist sehr gut dargestellt und die Szenarien erklärt.
Ich gehe bei vielen Dummys ähnlich vor mit dem Status, entweder Dämmerung, oder Ein, oder Aus

So kann ich aber mal probieren meine gesamten DOIFs zu überarbeiten und alles in dem einen unter zu bringen mit den verschiedenen Möglichkeiten, mal schauen ob ich das so hinbekomme, wie ich es haben möchte... ;-))
Danke

Ein weiterer Vorteil bei diesem Codeschnipsel ist, dass beim Setzen einer Szene auf off gleichzeitig die Aktoren ausgeschaltet werden, beim Setzen auf auto werden die Aktoren auf on gesetzt, wenn die Bedingung stimmt, man muss also nicht bis zum nächsten Ereignis warten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teufelchen

Vielen Dank Damian,

das verschafft mir wesentlich mehr Übersichtlichkeit und auch das deaktivieren nach Weihnachten wird erleichtert.

Noch zwei Fragen:
Kann es statt der Uhrzeit auch eine andere Bedingung sein, die dann wahr oder falsch ist?
Oder muss ich noch etwas beachten?
(([Anwesenheit] eq "present"
and (([05:00-12:00|AT] and [05:00-12:00|Mo]) or [05:30-12:00|AT] or [06:30-21:45] or [21:45-22:30|MWE] or [TVs] ne "absent"))
or (([05:00-06:00|AT] or [06:00-22:30]) and ([Rollo_Kueche] eq "open"))


Mein Helligkeitsdummy liefert die Werte "hell" und "dunkel", reicht es den folgenden Teil
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "on") {\

zu ersetzen durch:
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "dunkel") {\

und noch das Icon für die Webansicht zu ergänzen:
(@{$VAR{sc}},"$_$1"|icon([$_$2],"weather_sun\@yellow","light_question\@DarkOrange","hell","dunkel")|"$_$3"|

Oder doch lieber ein zusätzliches Userreading mit on/off im Dummy erstellen und dann bei Sensor auf dieses Reading verweisen?

Danke


Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

Damian

Zitat von: teufelchen am 21 Dezember 2021, 14:40:27
Vielen Dank Damian,

das verschafft mir wesentlich mehr Übersichtlichkeit und auch das deaktivieren nach Weihnachten wird erleichtert.

Noch zwei Fragen:
Kann es statt der Uhrzeit auch eine andere Bedingung sein, die dann wahr oder falsch ist?
Oder muss ich noch etwas beachten?
(([Anwesenheit] eq "present"
and (([05:00-12:00|AT] and [05:00-12:00|Mo]) or [05:30-12:00|AT] or [06:30-21:45] or [21:45-22:30|MWE] or [TVs] ne "absent"))
or (([05:00-06:00|AT] or [06:00-22:30]) and ([Rollo_Kueche] eq "open"))


Mein Helligkeitsdummy liefert die Werte "hell" und "dunkel", reicht es den folgenden Teil
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "on") {\

zu ersetzen durch:
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "dunkel") {\

und noch das Icon für die Webansicht zu ergänzen:
(@{$VAR{sc}},"$_$1"|icon([$_$2],"weather_sun\@yellow","light_question\@DarkOrange","hell","dunkel")|"$_$3"|

Oder doch lieber ein zusätzliches Userreading mit on/off im Dummy erstellen und dann bei Sensor auf dieses Reading verweisen?

Danke

In die Bedingung kannst du alles reinpacken, was du willst. Du kannst die Tabelle erweitern, wie es  @kjmEjfu gemacht hat, dann musst du ggf. die Parameter $1,$2,$3,usw. anpassen.  Ob du über Userreading on/off abbildest oder über ein separates DOIF  oder über DOIF_Readings oder ob du auf hell/dunkel abfragst oder ... ist dir überlassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teufelchen

Zitat von: Damian am 21 Dezember 2021, 16:45:16
In die Bedingung kannst du alles reinpacken, was du willst. Du kannst die Tabelle erweitern, wie es  @kjmEjfu gemacht hat, dann musst du ggf. die Parameter $1,$2,$3,usw. anpassen.  Ob du über Userreading on/off abbildest oder über ein separates DOIF  oder über DOIF_Readings oder ob du auf hell/dunkel abfragst oder ... ist dir überlassen.

Danke.

Meine Weihnachtsbeleuchtung habe ich mit günstigen 433 mHz Funksteckdosen realisiert.
Oftmals reicht aber ein Befehl nicht für eine Schaltung, so dass ich bisher den Einbefehl 2 mal und den Ausbefehl 4 mal im Abstand von 15 Sekunden Sekunde schicke und habe damit sehr gute Erfahrungen.
attr xyz repeatcmd 15:15
attr xyz repeatsame 2:4

Mehrfach den Befehl schicken, kann ich ja wenn ich die entsprechende Zeile mehrfach aufführe.
Wie baue ich noch zusätzlich die verzögerte Wiederholung ein?
Im Beispiel zum Abfall-Modul habe ich folgendes gefunden, weiß aber nicht wie ich das anpasse:
## Beim Start, um 02:00 Uhr und 08:00 Uhr wird zeitverzögert die obige Funktion 'update' aufgerufen\
init {[02:00];;[08:00];;set_Exec("Timer",60,'update()');;\

Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

Damian

set_Exec ist schon die richtige Funktion:

hier findest du Beispiele zur Wiederholung in einem bestimmten Abstand:

https://fhem.de/commandref_DE.html#DOIF_set_Exec
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF