Kopplung von Fernbedienungen und Aktoren - Fehler beim FHEM start

Begonnen von hajo23, 19 März 2025, 22:01:30

Vorheriges Thema - Nächstes Thema

hajo23

Hi,

ich habe mir dieses doif für die Kopplung von Fernbedienungen und Aktoren erstellt. Grundsätzlich funktioniert es, aber bei einem Restart von FHEM werden alle Zeilen (Tastenpaare) doppelt angelegt. Hat jemand dafür eine Erklärung?

defmod di_Fernbedienung_Buero DOIF subs  {\
  ##              Taste  Fernbedienung1  Fernbedienung2  Aktor                  Icon\
  push (@{$_sc}, ["12",  "FS20_05a700",  "FS20_a01f00",  "BueroTischLampe",     "light_office_desk"]);;\
  push (@{$_sc}, ["34",  "FS20_a01f01",  "FS20_05a701",  "BuerodeckenStrahler", "light_ceiling"]);;\
  push (@{$_sc}, ["56",  "FS20_a01f02",  "FS20_05a702",  "BueroTischStrahler",  "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++) { \
      set_Reading ($_sc[$i][0].".Status","off");;\
    }\
  }\
  sub setstates {\
    my ($t,$fb1, $fb2, $state)=@_;;\
    fhem("setstate ".$fb1." ".$state);;\
    fhem("setstate ".$fb2." ".$state);;\
    set_Reading("$t.Status",$state,1);;\
  }\
} ## end of subs\
\
DEF TPL_Buero (\
  Taste_$1 { ## Parameter: Taste Fernbedienung1 Fernbedienung2 Aktor Icon\
if ([$2:?on] or [$3:?on] or [$2:?dimup] or [$3:?dimup]) {\
  set_Reading("$1.Status","on",1);;\
  fhem_set"$4 on";;\
}\
else {\
  set_Reading("$1.Status","off",1);;\
  fhem_set"$4 off";;\
}\
  }\
  follow_$1 {\
    if ([$4]) {\
      setstates("$1","$2","$3",[?$4]);; \
    }\
  }\
  init_follow {\
    setstates("$1","$2","$3",[?$4]);;\
  }\
)\
FOR (@{$_sc},TPL_Buero($_$1,$_$2,$_$3,$_$4,$_$5))
attr di_Fernbedienung_Buero alias Fernbedienung Büro
attr di_Fernbedienung_Buero devStateIcon 1.on:li_wht_on:1.off 1.off:li_wht_off:1.on\
2.on:li_wht_on:2.off 2.off:li_wht_off:2.on\
3.on:li_wht_on:3.off 3.off:li_wht_off:3.on\

attr di_Fernbedienung_Buero disable 0
attr di_Fernbedienung_Buero group Fernbedienung
attr di_Fernbedienung_Buero readingList 12.Status 34.Status 56.Status
attr di_Fernbedienung_Buero room Buero
attr di_Fernbedienung_Buero setList 12.Status:on,off 34.Status:on,off on3:on,off
attr di_Fernbedienung_Buero stateFormat 1:12.Status\
2:34.Status\
3:56.Status
attr di_Fernbedienung_Buero uiTable {  \
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;;;; padding-right: 2px;;;;' align='center'";;\
\
}\
"Tasten"|"Aktor"|"Status"|"ausgeführt"\
FOR (@{$VAR{sc}},"$_$1"|ICON("$_$5")|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0))

setstate di_Fernbedienung_Buero 1:on\
2:off\
3:off
setstate di_Fernbedienung_Buero 2025-03-19 21:38:41 12.Status on
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 34.Status off
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 56.Status off
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 Device BuerodeckenStrahler
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 block_follow_34 executed
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 block_follow_56 executed
setstate di_Fernbedienung_Buero 2025-03-19 21:38:41 block_init_follow executed
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 e_BueroTischStrahler_STATE off
setstate di_Fernbedienung_Buero 2025-03-19 21:38:51 e_BuerodeckenStrahler_STATE off
setstate di_Fernbedienung_Buero 2025-03-19 21:36:29 state initialized


Damian

$_sc ist in Wirklichkeit eine Variable des Hashes des Devices. Die lebt solange, wie der Hash des Devices existiert. Mit delete $_sc; vor den push-Zeilen solltest du sie als erstes löschen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hajo23

Danke dir. Ich hatte angenommen, dass nach einem Neustart keine Variablen vorhanden sind.

Für mich sieht es so aus, als würde der Teil doppelt durchlaufen. Deine Lösung funktioniert dann natürlich, weil beim zweiten Durchlauf der Teil des ersten Durchlaufs wieder gelöscht wird.

Damian

Nach einem kompletten Neustart sollte es nicht passieren. Das kann eigentlich nur bei defmod zur Laufzeit passieren, wenn der hash-Pointer des Devices sich nicht geändert hast. Dass das Modul zwei mal den sub-Block abarbeitet, kann ich mir nicht vorstellen, zumal die Funktionalität nicht neu ist. Du kannst set_Reading ("zaehler",++$_zaehler); in subs einbauen und schauen nach dem Neustart was im Reading zaehler steht. Ich hoffe man kann auf eine nicht initialisierte hash-Variable eins drauf addieren - kann es gerade nicht testen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hajo23

Ich habe einen Log in subs eingebaut. Es sind nach Neustart 2 Log-Einträge. Dagegen gibt es bei defmod nur einen. Ich habe das auf zwei verschiedenen FHEM Servern getestet. Einer der beiden hat auch den aktuellen Stand. Bei beiden habe ich das selbe Ergebnis erhalten. Es kommt aber noch besser: ein gleiches zweites doif nur mit anderen Fernbedienungen und Aktoren, verhält sich nicht so. Hier wird subs nur einmal durchlaufen.


Damian

Bei mir sieht nach dem Neustart diese Definition so aus:
defmod di_subs DOIF subs {set_Reading ("zaehler",++$_zaehler);;}

setstate di_subs initialized
setstate di_subs 2025-03-20 17:30:54 mode enabled
setstate di_subs 2025-03-20 17:30:54 state initialized
setstate di_subs 2025-03-20 17:31:12 zaehler 1

Dieses Device wird also nur einmal ausgeführt.

Dann musst bei dir durch Ausdünnen des Codes versuchen die Ursache herauszufinden.


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

hajo23

Damit komme ich nicht weiter:
defmod di_Fernbedienung_Buero DOIF subs  {\
  delete $_sc;;\
  ## Log(1, "di_Fernbedienung Buero subs");;\
  set_Reading ("zaehler",++$_zaehler);;\
  ##              Taste  Fernbedienung1  Fernbedienung2  Aktor                  Icon\
 ## push (@{$_sc}, ["12",  "FS20_05a700",  "FS20_a01f00",  "BueroTischLampe",     "light_office_desk"]);;\
  push (@{$_sc}, ["34",  "FS20_a01f01",  "FS20_05a701",  "BuerodeckenStrahler", "light_ceiling"]);;\
 ## push (@{$_sc}, ["56",  "FS20_a01f02",  "FS20_05a702",  "BueroTischStrahler",  "light_dinner_table"]);;\
  \
  ## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
  ##if ($::init_done) {\
    ##fhem("deletereading $SELF (?!zaehler).*");;\
    ##set_State("initialized");;\
    ##for (my $i=0;;$i < @{$_sc};;$i++) {    \
      ##set_Reading ($_sc[$i][0].".Status","off");;\
    ##}\
  ##}\
  ##sub setstates {\
    ##my ($t,$fb1, $fb2, $state)=@_;;\
    ##fhem("setstate ".$fb1." ".$state);;\
    ##fhem("setstate ".$fb2." ".$state);;\
    ##set_Reading("$t.Status",$state,1);;\
  ##}\
} ## end of subs\
\
DEF TPL_Buero (\
  Taste_$1 { ## Parameter: Taste Fernbedienung1 Fernbedienung2 Aktor Icon\
    ##if ([$2:?on] or [$3:?on] or [$2:?dimup] or [$3:?dimup]) {\
      ##set_Reading("$1.Status","on",1);;\
      ##fhem_set"$4 on";;\
    ##}\
    ##else {\
      ##set_Reading("$1.Status","off",1);;\
      ##fhem_set"$4 off";;\
    ##}\
  }\
  ##follow_$1 {\
    ##if ([$4]) {\
      ##setstates("$1","$2","$3",[?$4]);;    \
    ##}\
  ##}\
  ##init_follow {\
    ##setstates("$1","$2","$3",[?$4]);;\
  ##}\
)\
FOR (@{$_sc},TPL_Buero($_$1,$_$2,$_$3,$_$4,$_$5))
attr di_Fernbedienung_Buero alias Fernbedienung Büro
attr di_Fernbedienung_Buero devStateIcon 1.on:li_wht_on:1.off 1.off:li_wht_off:1.on\
2.on:li_wht_on:2.off 2.off:li_wht_off:2.on\
3.on:li_wht_on:3.off 3.off:li_wht_off:3.on\

attr di_Fernbedienung_Buero disable 0
attr di_Fernbedienung_Buero group Fernbedienung
attr di_Fernbedienung_Buero readingList 12.Status 34.Status 56.Status
attr di_Fernbedienung_Buero room Buero
attr di_Fernbedienung_Buero setList 12.Status:on,off 34.Status:on,off on3:on,off
attr di_Fernbedienung_Buero stateFormat 1:12.Status\
2:34.Status\
3:56.Status
attr di_Fernbedienung_Buero uiTable {  \
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;;;; padding-right: 2px;;;;' align='center'";;\
\
}\
"Tasten"|"Aktor"|"Status"|"ausgeführt"\
FOR (@{$VAR{sc}},"$_$1"|ICON("$_$5")|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0))\


setstate di_Fernbedienung_Buero 1:12.Status\
2:34.Status\
3:56.Status
setstate di_Fernbedienung_Buero 2025-03-20 23:41:54 mode enabled
setstate di_Fernbedienung_Buero 2025-03-20 23:41:54 state initialized
setstate di_Fernbedienung_Buero 2025-03-21 00:11:35 zaehler 2
Ich habe die Konfiguration dann ein zweites Mal hinzugefügt:
defmod test_doif DOIF subs  {\
  delete $_sc;;\
  set_Reading ("zaehler",++$_zaehler);;\
  ##              Taste  Fernbedienung1  Fernbedienung2  Aktor              Icon\
  push (@{$_sc}, ["12",  "FS20_05a700",  "FS20_a01f00",  "BueroTischLampe", "light_office_desk"]);;\
  push (@{$_sc}, ["34",  "FS20_05a701",  "FS20_a01f01",  "BuerodeckenStrahler", "light_ceiling"]);;\
  push (@{$_sc}, ["56",  "FS20_05a702",  "FS20_a01f02",  "BueroTischStrahler", "light_dinner_table"]);;\
  \
  ## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
  if ($::init_done) {\
    fhem("deletereading $SELF (?!zaehler).*");;\
    set_State("initialized");;\
    for (my $i=0;;$i < @{$_sc};;$i++) {    \
        set_Reading ($_sc[$i][0].".Status","off");;\
    }\
  }\
  sub setstates {\
    my ($t,$fb1, $fb2, $state)=@_;;\
    fhem("setstate ".$fb1." ".$state);;\
    fhem("setstate ".$fb2." ".$state);;\
    set_Reading("$t.Status",$state,1);;\
   }\
} ## end of subs\
\
DEF TPL_Kopplung (\
  Taste_$1 { ## Parameter: Taste Fernbedienung1 Fernbedienung2 Aktor Icon\
    ##if ( ([$2:?on] or [$3:?on] eq "on") or ([$2:?dimup] or [$3:?dimup] eq "dimup")) {\
    if ([$2:?on] or [$3:?on] or [$2:?dimup] or [$3:?dimup]) {\
      set_Reading("$1.Status","on",1);;\
      fhem_set"$4 on";;\
    }\
    else {\
      set_Reading("$1.Status","off",1);;\
      fhem_set"$4 off";;\
    }\
  }\
  follow_$1 {\
    if ([$4]) {\
      setstates("$1","$2","$3",[?$4]);;\
    }\
  }\
  init_follow {\
    setstates("$1","$2","$3",[?$4]);;\
  }\
)\
FOR (@{$_sc},TPL_Kopplung($_$1,$_$2,$_$3,$_$4,$_$5));;
attr test_doif devStateIcon 1.on:li_wht_on:1.off 1.off:li_wht_off:1.on\
2.on:li_wht_on:2.off 2.off:li_wht_off:2.on\
3.on:li_wht_on:3.off 3.off:li_wht_off:3.on
attr test_doif group DOIF
attr test_doif readingList 12.Status 34.Status 56.Status
attr test_doif room Buero
attr test_doif setList 12.Status:on,off 34.Status:on,off on3:on,off
attr test_doif stateFormat 1:12.Status\
2:34.Status\
3:56.Status
attr test_doif uiTable {  \
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;;;; padding-right: 2px;;;;' align='center'";;\
\
}\
"Tasten"|"Aktor"|"Status"|"ausgeführt"\
FOR (@{$VAR{sc}},"$_$1"|ICON("$_$5")|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0))

setstate test_doif 1:???\
2:off\
3:???
setstate test_doif 2025-03-21 00:11:38 12.Status ???
setstate test_doif 2025-03-21 00:11:38 34.Status off
setstate test_doif 2025-03-21 00:11:38 56.Status ???
setstate test_doif 2025-03-21 00:11:09 Device BuerodeckenStrahler
setstate test_doif 2025-03-21 00:11:04 block_Taste_34 executed
setstate test_doif 2025-03-21 00:11:09 block_follow_34 executed
setstate test_doif 2025-03-21 00:11:38 block_init_follow executed
setstate test_doif 2025-03-21 00:11:09 e_BuerodeckenStrahler_STATE off
setstate test_doif 2025-03-21 00:11:04 e_FS20_05a701_events off
setstate test_doif 2025-03-21 00:10:55 state initialized
setstate test_doif 2025-03-21 00:11:35 zaehler 1
Warum es nur bei der ersten Instanz auftriit, werde ich so nicht herausfinden können. Selbst wenn ich die erste Instanz auf disable stelle, wird subs in der zweiten trotzdem nur einmal durchlaufen.

Damian

Was passiert, wenn du das erste (defekte) löschts und dann unter einem neuen Namen neu definierst?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hajo23

Hatte das Defekte noch zum Einzeiler gemacht.
subs {set_Reading ("zaehler",++$_zaehler)}Es wurde trotzdem doppelt durchlaufen.

Jetzt habe ich das Defekte gelöscht und gleich danach einen Restart gemacht. Der Fehler ist nun auch bei manchen anderen Instanzen vorhanden.


defmod di_Fernbedienung_Buero_2 DOIF subs  {\
  delete $_sc;;\
  set_Reading ("zaehler",++$_zaehler);;\
  ##              Taste  Fernbedienung1  Fernbedienung2  Aktor              Icon\
  push (@{$_sc}, ["12",  "FS20_05a700",  "FS20_a01f00",  "BueroTischLampe", "light_office_desk"]);;\
  push (@{$_sc}, ["34",  "FS20_05a701",  "FS20_a01f01",  "BuerodeckenStrahler", "light_ceiling"]);;\
  push (@{$_sc}, ["56",  "FS20_05a702",  "FS20_a01f02",  "BueroTischStrahler", "light_dinner_table"]);;\
  \
  ## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
  if ($::init_done) {\
    fhem("deletereading $SELF (?!zaehler).*");;\
    set_State("initialized");;\
    for (my $i=0;;$i < @{$_sc};;$i++) { \
        set_Reading ($_sc[$i][0].".Status","off");;\
}\
  }\
  sub setstates {\
    my ($t,$fb1, $fb2, $state)=@_;;\
    fhem("setstate ".$fb1." ".$state);;\
    fhem("setstate ".$fb2." ".$state);;\
    set_Reading("$t.Status",$state,1);;\
   }\
} ## end of subs\
\
DEF TPL_Kopplung (\
  Taste_$1 { ## Parameter: Taste Fernbedienung1 Fernbedienung2 Aktor Icon\
    if (([$2:?on] or [$3:?on] or [$2:?dimup] or [$3:?dimup]) and ([$4] eq "off")) {\
  set_Reading("$1.Status","on",1);;\
  fhem_set"$4 on";;\
}\
elsif (([$2:?off] or [$3:?off] or [$2:?dimdown] or [$3:?dimdown]) and ([$4] eq "on")) {\
  set_Reading("$1.Status","off",1);;\
  fhem_set"$4 off";;\
}\
  }\
  follow_$1 {\
    if ([$4]) {\
      setstates("$1","$2","$3",[?$4]);;\
}\
  }\
  init_follow {\
    setstates("$1","$2","$3",[?$4]);;\
  }\
)\
FOR (@{$_sc},TPL_Kopplung($_$1,$_$2,$_$3,$_$4,$_$5));;
attr di_Fernbedienung_Buero_2 alias Fernbedienung Büro
attr di_Fernbedienung_Buero_2 disable 0
attr di_Fernbedienung_Buero_2 group Fernbedienung
attr di_Fernbedienung_Buero_2 icon hue_room_office
attr di_Fernbedienung_Buero_2 room Buero
attr di_Fernbedienung_Buero_2 uiState {  \
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;;;; padding-right: 2px;;;;' align='center'";;\
\
}\
"Tasten"|"Aktor"|"Status"|"ausgeführt"\
FOR (@{$VAR{sc}},"$_$1"|ICON("$_$5")|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0))

setstate di_Fernbedienung_Buero_2 initialized
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:35 12.Status on
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 34.Status off
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 56.Status off
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 Device BuerodeckenStrahler
setstate di_Fernbedienung_Buero_2 2025-03-21 21:04:23 block_Taste_12 executed
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 block_Taste_34 executed
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 block_Taste_56 executed
setstate di_Fernbedienung_Buero_2 2025-03-21 21:04:23 block_follow_12 executed
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 block_follow_34 executed
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 block_follow_56 executed
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:35 block_init_follow executed
setstate di_Fernbedienung_Buero_2 2025-03-21 21:04:23 e_BueroTischLampe_STATE on
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 e_BueroTischStrahler_STATE off
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:42 e_BuerodeckenStrahler_STATE off
setstate di_Fernbedienung_Buero_2 2025-03-21 21:04:23 e_FS20_05a700_events on
setstate di_Fernbedienung_Buero_2 2025-03-21 21:04:25 e_FS20_05a701_events off
setstate di_Fernbedienung_Buero_2 2025-03-21 17:58:55 e_FS20_05a702_events on
setstate di_Fernbedienung_Buero_2 2025-03-21 04:36:39 state initialized
setstate di_Fernbedienung_Buero_2 2025-03-21 22:01:33 zaehler 2

Habe das Gelöschte neu angelegt:
defmod di_Fernbedienung_Buero_3 DOIF subs {set_Reading ("zaehler",++$_zaehler)}
attr di_Fernbedienung_Buero_3 disable 0
attr di_Fernbedienung_Buero_3 group Fernbedienung
attr di_Fernbedienung_Buero_3 room Buero

setstate di_Fernbedienung_Buero_3 initialized
setstate di_Fernbedienung_Buero_3 2025-03-21 22:09:16 mode enabled
setstate di_Fernbedienung_Buero_3 2025-03-21 22:09:16 state initialized
setstate di_Fernbedienung_Buero_3 2025-03-21 22:09:57 zaehler 2

eine weitere Instanz:
defmod di_Fernbedienung_Schlafzimmer DOIF subs  {\
  ##delete $_sc;;\
  set_Reading ("zaehler",++$_zaehler);;\
  ##              Taste  Fernbedienung1  Fernbedienung2  Aktor              Icon\
  push (@{$_sc}, ["12",  "FS20_0a5a00",  "FS20_aa4300",  "SchlafzimmerBettLinks", "hue_filled_white_e27_b22"]);;\
  push (@{$_sc}, ["34",  "FS20_0a5a01",  "FS20_aa4301",  "SchlafzimmerBettRechts", "hue_filled_white_e27_b22"]);;\
  push (@{$_sc}, ["56",  "FS20_0a5a02",  "FS20_aa4302",  "AnkleideDose", "light_cabinet"]);;\
  \
  ## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
  if ($::init_done) {\
    fhem("deletereading $SELF (?!zaehler).*");;\
    set_State("initialized");;\
    for (my $i=0;;$i < @{$_sc};;$i++) { \
        set_Reading ($_sc[$i][0].".Status","off");;\
}\
  }\
  sub setstates {\
    my ($t,$fb1, $fb2, $state)=@_;;\
    fhem("setstate ".$fb1." ".$state);;\
    fhem("setstate ".$fb2." ".$state);;\
    set_Reading("$t.Status",$state,1);;\
   }\
} ## end of subs\
\
DEF TPL_Kopplung (\
  Taste_$1 { ## Parameter: Taste Fernbedienung1 Fernbedienung2 Aktor Icon\
    if (([$2:?on] or [$3:?on] or [$2:?dimup] or [$3:?dimup]) and ([$4] eq "off")) {\
      set_Reading("$1.Status","on",1);;\
      fhem_set"$4 on";;\
    }\
    elsif (([$2:?off] or [$3:?off] or [$2:?dimdown] or [$3:?dimdown]) and ([$4] eq "on")) {\
      set_Reading("$1.Status","off",1);;\
      fhem_set"$4 off";;\
    }\
  }\
  follow_$1 {\
    if ([$4]) {\
      setstates("$1","$2","$3",[?$4]);; \
    }\
  }\
  init_follow {\
    setstates("$1","$2","$3",[?$4]);;\
  }\
)\
FOR (@{$_sc},TPL_Kopplung($_$1,$_$2,$_$3,$_$4,$_$5));;
attr di_Fernbedienung_Schlafzimmer alias Fernbedienung
attr di_Fernbedienung_Schlafzimmer group FB FS20S8-3 Schlafzimmer
attr di_Fernbedienung_Schlafzimmer icon hue_room_bedroom
attr di_Fernbedienung_Schlafzimmer room Schlafzimmer,doif_ntfy
attr di_Fernbedienung_Schlafzimmer uiState {  \
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;;;; padding-right: 2px;;;;' align='center'";;\
\
}\
"Tasten"|"Aktor"|"Status"|"ausgeführt"\
FOR (@{$VAR{sc}},"$_$1"|ICON("$_$5")|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0))

setstate di_Fernbedienung_Schlafzimmer initialized
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:06 12.Status off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:07 34.Status off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:03 56.Status off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:07 Device SchlafzimmerBettRechts
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:06 block_Taste_12 executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:07 block_Taste_34 executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:03 block_Taste_56 executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:06 block_follow_12 executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:07 block_follow_34 executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:03 block_follow_56 executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:09:59 block_init_follow executed
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:03 e_AnkleideDose_STATE off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 05:03:23 e_FS20_0a5a00_events off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:06 e_SchlafzimmerBettLinks_STATE off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:10:07 e_SchlafzimmerBettRechts_STATE off
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 04:40:21 state initialized
setstate di_Fernbedienung_Schlafzimmer 2025-03-21 22:09:52 zaehler 1


und noch eine:
defmod di_Fernbedienung_Wohnzimmer DOIF subs  {\
  delete $_sc;;\
  set_Reading ("zaehler",++$_zaehler);;\
  ##              Taste         Fernbedienung1  Fernbedienung2  Aktor                 Long                   Icon\
  push (@{$_sc}, ["1_HiFi",    "FS20_70c500",  "FS20_16a800",  "WohnzimerDose6",      "testdummy",           "rc_AUDIO"]);;\
  push (@{$_sc}, ["2_Anlage",  "FS20_70c501",  "FS20_fd2209",  "WohnzimerDose3",      "testdummy",           "ge_wht_steckdose"]);;\
  push (@{$_sc}, ["3_Flaeche", "FS20_70c502",  "FS20_70c502",  "WohnzimmerStrahler1", "WohnzimmerStrahler2", "light_ceiling"]);;\
  push (@{$_sc}, ["4_Tank",    "FS20_70c503",  "FS20_fd2208",  "WohnzimmerTank",      "testdummy",           "ge_wht_steckdose"]);;\
  push (@{$_sc}, ["5",         "FS20_70c504",  "FS20_16a801",  "WohnzimmerStrahler2", "testdummy",           "light_downlight"]);;\
  push (@{$_sc}, ["6_Ofen",    "FS20_70c505",  "FS20_16a802",  "WohnzimerDose4",      "testdummy",           "ge_wht_steckdose"]);;\
  push (@{$_sc}, ["7_TV",      "FS20_70c506",  "FS20_fd2200",  "WohnzimerDose5",      "testdummy",           "svgs/solid/tv"]);;\
  push (@{$_sc}, ["8_Globus",  "FS20_70c507",  "FS20_fd22f0",  "HS100_WLAN4",         "testdummy",           "svgs/brands/chromecast"]);;\
  ## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
  if ($::init_done) {\
    fhem("deletereading $SELF (?!zaehler).*");;\
    set_State("initialized");;\
    for (my $i=0;;$i < @{$_sc};;$i++) { \
      set_Reading ($_sc[$i][0].".Status","off");;\
    }\
  }\
  sub setstates {\
    my ($t,$fb1, $fb2, $state)=@_;;\
    fhem("setstate ".$fb1." ".$state);;\
    fhem("setstate ".$fb2." ".$state);;\
    set_Reading("$t.Status",$state,1);;\
  }\
} ## end of subs\
\
DEF TPL_Kopplung (\
  Taste_$1 { ## Parameter: Taste Fernbedienung1 Fernbedienung2 Aktor Icon\
    my $c = "";;\
if (length("$5") > 1) {\
      $c = "$4,$5";;\
    } else {\
      $c = "$4";;\
    }\
set_Reading("$1.Long",$c,1);;\
    if (([$2:?on] or [$3:?on]) and [$4] eq "off") {\
      set_Reading("$1.Status","on",1);;\
      fhem_set"$4 on";;\
    }\
    elsif (([$2:?dimup] or [$3:?dimup]) and (([$4] eq "off") or ([$5] eq "off"))) {\
      set_Reading("$1.Status","on",1);;\
      fhem_set"$c on";;\
    }\
    elsif (([$2:?off] or [$3:?off]) and ([$4] eq "on")) {\
      set_Reading("$1.Status","off",1);;\
      fhem_set"$4 off";;\
    }\
    elsif (([$2:?dimdown] or [$3:?dimdown]) and (([$4] eq "on") or ([$5] eq "on"))) {\
      set_Reading("$1.Status","off",1);;\
      fhem_set"$c off";;\
    }\
  }\
  follow_$1 {\
    if ([$4]) {\
      setstates("$1","$2","$3",[?$4]);; \
    }\
  }\
  init_follow {\
    setstates("$1","$2","$3",[?$4]);;\
  }\
)\
FOR (@{$_sc},TPL_Kopplung($_$1,$_$2,$_$3,$_$4,$_$5,$_$6));;
attr di_Fernbedienung_Wohnzimmer comment WohnzimerDose3      : Anlage\
WohnzimerDose4      : Ofen\
WohnzimerDose5      : TV\
WohnzimerDose6      : Hifi\
WohnzimmerTank      : Fussboden\
WohnzimmerStrahler2 : Hifi
attr di_Fernbedienung_Wohnzimmer disable 0
attr di_Fernbedienung_Wohnzimmer group FB
attr di_Fernbedienung_Wohnzimmer icon scene_livingroom
attr di_Fernbedienung_Wohnzimmer room Wohnzimmer
attr di_Fernbedienung_Wohnzimmer uiState {  \
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;;;; padding-right: 2px;;;;' align='center'";;\
\
}\
"Tasten"|"Aktor"|"Status"|"ausgeführt"\
FOR (@{$VAR{sc}},"$_$1"|ICON("$_$6")|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0))

setstate di_Fernbedienung_Wohnzimmer initialized
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 1_HiFi.Long WohnzimerDose6,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 1_HiFi.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 2_Anlage.Long WohnzimerDose3,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 2_Anlage.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 3_Flaeche.Long WohnzimmerStrahler1,WohnzimmerStrahler2
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 3_Flaeche.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:10 4_Tank.Long WohnzimmerTank,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:10 4_Tank.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 5.Long WohnzimmerStrahler2,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 5.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 6_Ofen.Long WohnzimerDose4,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 6_Ofen.Status on
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 7_TV.Long WohnzimerDose5,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 7_TV.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:17:32 8_Globus.Long HS100_WLAN4,testdummy
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:17:32 8_Globus.Status off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:17:32 Device HS100_WLAN4
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 block_Taste_1_HiFi executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 block_Taste_2_Anlage executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 block_Taste_3_Flaeche executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:10 block_Taste_4_Tank executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 block_Taste_5 executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 block_Taste_6_Ofen executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 block_Taste_7_TV executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:17:32 block_Taste_8_Globus executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 block_follow_1_HiFi executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 block_follow_2_Anlage executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 block_follow_3_Flaeche executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:10 block_follow_4_Tank executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 block_follow_5 executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 block_follow_6_Ofen executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 block_follow_7_TV executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:17:32 block_follow_8_Globus executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:09:59 block_init_follow executed
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 21:34:52 e_FS20_70c503_events off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:17:32 e_HS100_WLAN4_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 e_WohnzimerDose3_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 e_WohnzimerDose4_STATE on
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:08 e_WohnzimerDose5_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 e_WohnzimerDose6_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 e_WohnzimmerStrahler1_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:09 e_WohnzimmerStrahler2_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:10:10 e_WohnzimmerTank_STATE off
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 21:34:00 state initialized
setstate di_Fernbedienung_Wohnzimmer 2025-03-21 22:09:52 zaehler 2

Damian

Dann muss ich mir den Programmcode im DOIF anschauen, wie so etwas zustande kommen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF