FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: abc2006 am 07 Februar 2021, 19:47:34

Titel: DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: abc2006 am 07 Februar 2021, 19:47:34
Hi,
ich brauch leider schon wieder Hilfe:

Ich habe ein DOIF im perl-Modus, welches mein Garagenlicht schaltet:
Dieses reagiert leider seit ein paar Tagen nicht mehr auf meinen Bewegungsmelder.
Ich habe mein Logging größer umgebaut und die Räume sortiert. An KNX und dem BWM war ich nicht dran.
In diesem DOIF befinden sich zwei Blöcke (long und short), die über Taster getriggert werden.
Die Taster setzen [$SELF:steuern], daraufhin reagiert das DOIF und schaltet das Licht ein. Das funktioniert soweit - Allerdings bin ich auf die Problematik nur aufmerksam geworden, weil das Licht nicht mehr ausging.

Ich poste in diesem Beitrag erstmal die Kurzversion mit den Minimal-Configs,
und häng dann unten gerne noch die kompletten Configs an.

Hier ein minimal-DOIF, welches nichts weiter tun soll, als eine Logmeldung auszugeben, wenn der Bewegungsmelder *irgendwas* tut:

Internals:
   CFGFN     
   DEF        debug{
my $val = [gendev_BWM_Garage:status];
Log3("$SELF", 1,"DF_perl: gendev_Garage: $val");
}
   FUUID      60203350-f33f-4040-e908-03716167e3ca8a76
   MODEL      Perl
   NAME       DF_perl
   NOTIFYDEV  global,gendev_BWM_Garage
   NR         950
   NTFY_ORDER 50-DF_perl
   STATE      initialized
   TYPE       DOIF
   VERSION    23640 2021-01-30 10:49:48
   READINGS:
     2021-02-07 19:37:24   mode            enabled
     2021-02-07 19:37:24   state           initialized
   Regex:
     accu:
     cond:
       gendev_BWM_Garage:
         0:
           status     ^gendev_BWM_Garage$:^status:
   condition:
     0         
my $val = ::ReadingValDoIf($hash,'gendev_BWM_Garage','status');
Log3("DF_perl", 1,"DF_perl: gendev_Garage: $val");

   helper:
     DEVFILTER  ^global$|^gendev_BWM_Garage$
     NOTIFYDEV  global|gendev_BWM_Garage
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          debug
   readings:
     all         gendev_BWM_Garage:status
   uiTable:
Attributes:


Proof of Work:
> set DF_perl debug
2021.02.07 19:40:05.094 1: DF_perl: gendev_Garage: off


So. Jetzt hab ich ein Event von meinem Bewegungsmelder:

2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage status: on

und es passiert: nichts.
Events: gendev_BWM_Garage:status ==> vorhanden
2021-02-07 19:41:18.900 KNX KNX100.I01_BWM_Flur_EG bwm-brightness: 6.84 lux
2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage Garage_HZG_presence: on
2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage status: on
2021-02-07 19:41:23.570 KNX KNX101.I01_BWM_Garage bwm-presence: on
2021-02-07 19:41:23.864 KNX KNX101.I01_BWM_Garage bwm-brightness: 80.88 lux


Log: Im fraglichen Zeitraum ==> keine Ausgabe
2021.02.07 19:40:24.944 3: DbLog logdb -> INFO - 81 of 84 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:40:54.947 3: DbLog logdb -> INFO - 85 of 87 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:41:24.958 3: DbLog logdb -> INFO - 107 of 112 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:41:54.964 3: DbLog logdb -> INFO - 93 of 96 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:42:24.976 3: DbLog logdb -> INFO - 88 of 90 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP



Ich hab doch bestimmt nur wieder irgendwo einen kleinen Fehler drin... Aber ich suche seit Tagen und finde nix ...

Danke fürs mitgucken,
Stephan
Titel: Antw:DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: abc2006 am 07 Februar 2021, 19:49:45
Hier noch die ganze config:

Doif, das die Bewegungsmelder der Garage zusammenfasst und einen "status" liefert:

Internals:
   DEF        ([KNX101.I01_BWM_Garage:bwm-status] eq "on"
|| [KNX102.I01_BWM_Garage_Tor:bwm-status] eq "on"
|| [KNX101.I01_BWM_Garage:bwm-presence] eq "on"
|| [KNX102.I01_BWM_Garage_Tor:bwm-presence] eq "on"
)
(
## sammele nur die Werte
)

   FUUID      5c844712-f33f-4040-a278-1a76e628d63573d3
   MODEL      FHEM
   NAME       gendev_BWM_Garage
   NOTIFYDEV  KNX101.I01_BWM_Garage,global,KNX102.I01_BWM_Garage_Tor,gendev_BWM_Garage
   NR         329
   NTFY_ORDER 50-gendev_BWM_Garage
   STATE      off
   TYPE       DOIF
   VERSION    23640 2021-01-30 10:49:48
   READINGS:
     2021-02-07 19:44:45   Device          KNX102.I01_BWM_Garage_Tor
     2021-02-07 19:43:30   Garage_HZG_presence off
     2021-02-07 19:41:32   Garage_HZG_status off
     2021-02-07 19:44:45   Garage_Tor_presence off
     2021-02-07 19:36:05   Garage_Tor_status off
     2021-02-07 19:41:32   cmd             1
     2021-02-07 19:41:32   cmd_event       KNX101.I01_BWM_Garage
     2021-02-07 19:41:32   cmd_nr          1
     2021-02-07 19:43:30   e_KNX101.I01_BWM_Garage_bwm-presence off
     2021-02-07 19:41:32   e_KNX101.I01_BWM_Garage_bwm-status off
     2021-02-07 19:44:45   e_KNX102.I01_BWM_Garage_Tor_bwm-presence off
     2021-02-07 19:36:05   mode            enabled
     2021-02-07 19:41:32   state           cmd_1
     2021-02-07 19:43:30   status          off
   Regex:
     accu:
     cond:
       KNX101.I01_BWM_Garage:
         0:
           bwm-presence ^KNX101.I01_BWM_Garage$:^bwm-presence:
           bwm-status ^KNX101.I01_BWM_Garage$:^bwm-status:
       KNX102.I01_BWM_Garage_Tor:
         0:
           bwm-presence ^KNX102.I01_BWM_Garage_Tor$:^bwm-presence:
           bwm-status ^KNX102.I01_BWM_Garage_Tor$:^bwm-status:
     event_Readings:
       KNX101.I01_BWM_Garage:
         Garage_HZG_presence:
           bwm-presence ^KNX101.I01_BWM_Garage$:^bwm-presence:
         Garage_HZG_status:
           bwm-status ^KNX101.I01_BWM_Garage$:^bwm-status:
       KNX102.I01_BWM_Garage_Tor:
         Garage_Tor_presence:
           bwm-presence ^KNX102.I01_BWM_Garage_Tor$:^bwm-presence:
         Garage_Tor_status:
           bwm-status ^KNX102.I01_BWM_Garage_Tor$:^bwm-status:
       gendev_BWM_Garage:
         status:
           Garage_HZG_presence ^gendev_BWM_Garage$:^Garage_HZG_presence:
           Garage_HZG_status ^gendev_BWM_Garage$:^Garage_HZG_status:
           Garage_Tor_presence ^gendev_BWM_Garage$:^Garage_Tor_presence:
           Garage_Tor_status ^gendev_BWM_Garage$:^Garage_Tor_status:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-status') eq "on"  || ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-status') eq "on"  || ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-presence') eq "on"  || ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-presence') eq "on"
   do:
     0:
       0           
     1:
   event_Readings:
     Garage_HZG_presence  ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-presence')
     Garage_HZG_status  ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-status')
     Garage_Tor_presence  ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-presence')
     Garage_Tor_status  ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-status')
     status      {if(::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_HZG_status') eq "on"    ||::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_Tor_status') eq "on"    ||::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_HZG_presence') eq "on"    ||::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_Tor_presence') eq "on") {return "on"} else {return "off"} }
   helper:
     DEVFILTER  ^global$|^KNX102.I01_BWM_Garage_Tor$|^gendev_BWM_Garage$|^KNX101.I01_BWM_Garage$
     NOTIFYDEV  global|KNX102.I01_BWM_Garage_Tor|gendev_BWM_Garage|KNX101.I01_BWM_Garage
     event      bwm-presence: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   KNX101.I01_BWM_Garage
     timerevent bwm-status: off
     triggerDev KNX102.I01_BWM_Garage_Tor
     timerevents:
       bwm-status: off
     timereventsState:
       bwm-status: off
     triggerEvents:
       bwm-presence: off
     triggerEventsState:
       bwm-presence: off
   internals:
   readings:
     all         KNX101.I01_BWM_Garage:bwm-status KNX102.I01_BWM_Garage_Tor:bwm-status KNX101.I01_BWM_Garage:bwm-presence KNX102.I01_BWM_Garage_Tor:bwm-presence
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   event-on-change-reading Garage.*,status
   event_Readings Garage_HZG_status: [KNX101.I01_BWM_Garage:bwm-status],
Garage_Tor_status: [KNX102.I01_BWM_Garage_Tor:bwm-status],
Garage_HZG_presence: [KNX101.I01_BWM_Garage:bwm-presence],
Garage_Tor_presence: [KNX102.I01_BWM_Garage_Tor:bwm-presence],
status: {if([$SELF:Garage_HZG_status] eq "on"
  ||[$SELF:Garage_Tor_status] eq "on"
  ||[$SELF:Garage_HZG_presence] eq "on"
  ||[$SELF:Garage_Tor_presence] eq "on")
{return "on"} else {return "off"}
}
   room       Generic Devices,_types->doif,garage
   stateFormat status


DOIF, welches den Status auswerten soll (short und long, per Taster getriggert, funktionieren.
Sollte ich oben noch reinschreiben, kommt gleich

Internals:
   DEF        short{
if ([$SELF:steuern] eq "short")
{
if ([?gendev_Leuchte_Garage:status] =~ /^off/)
{
fhem_set("gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage_hand_short", 300, 'fhem_set("gendev_Leuchte_Garage off")');
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 300 Sekunden");
}
elsif([?gendev_Leuchte_Garage:status] =~ /^on/)
{
    fhem_set("gendev_Leuchte_Garage off");
del_Exec("tmr_Leuchte_Garage_hand_short");
del_Exec("tmr_Leuchte_Garage_hand_long");
del_Exec("tmr_Leuchte_Garage_auto");
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht ausgeschaltet, alle timer gelöscht");
}
}
}
long{
if ([$SELF:steuern] eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 3600 Sekunden");
set_Exec("tmr_Leuchte_Garage_hand_long", 3600, 'fhem_set("gendev_Leuchte_Garage off")');
}
}

bwm{
if([gendev_BWM_Garage:status] eq "on" && get_Exec("tmr_Leuchte_Garage_hand_long") < 120 && [$SELF:steuern:sec] > 3)
{
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Einschaltanforderung vom BWM. Schalte Licht ein.");
fhem_set("gendev_Leuchte_Garage on");
if([?BMS:1_SOC_BMS_total:d] > 80)
{
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie über 80%. Ausschaltverzögerung 600 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 600, 'fhem_set("gendev_Leuchte_Garage off")');
} else {
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie unter 80%. Ausschaltverzögerung 30 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
}
}
}
debug{
my $val = [gendev_BWM_Garage:status];
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: $val");
}
   FUUID      5f68dd9f-f33f-4040-d474-bccf6869a8e623a0
   MODEL      Perl
   NAME       DF_BWM_Garage_perl
   NOTIFYDEV  gendev_BWM_Garage,DF_BWM_Garage_perl,global
   NR         524
   NTFY_ORDER 50-DF_BWM_Garage_perl
   STATE      initialized
   TYPE       DOIF
   VERSION    23640 2021-01-30 10:49:48
   READINGS:
     2021-02-07 19:35:21   block_bwm       executed
     2021-02-07 19:35:21   block_long      executed
     2021-02-07 19:35:21   block_short     executed
     2021-02-07 19:35:21   e_DF_BWM_Garage_perl_steuern short
     2021-02-07 19:35:05   mode            enabled
     2021-02-07 19:35:05   state           initialized
     2021-02-07 19:35:21   steuern         short
   Regex:
     accu:
     cond:
       DF_BWM_Garage_perl:
         0:
           steuern    ^DF_BWM_Garage_perl$:^steuern:
         1:
           steuern    ^DF_BWM_Garage_perl$:^steuern:
         2:
           steuern    ^DF_BWM_Garage_perl$:^steuern:
         3:
       gendev_BWM_Garage:
         2:
           status     ^gendev_BWM_Garage$:^status:
         3:
           status     ^gendev_BWM_Garage$:^status:
   condition:
     0         
if (::ReadingValDoIf($hash,'DF_BWM_Garage_perl','steuern') eq "short")
{
if (::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^off/)
{
fhem_set("gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage_hand_short", 300, 'fhem_set("gendev_Leuchte_Garage off")');
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 300 Sekunden");
}
elsif(::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^on/)
{
    fhem_set("gendev_Leuchte_Garage off");
del_Exec("tmr_Leuchte_Garage_hand_short");
del_Exec("tmr_Leuchte_Garage_hand_long");
del_Exec("tmr_Leuchte_Garage_auto");
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht ausgeschaltet, alle timer gelöscht");
}
}

     1         
if (::ReadingValDoIf($hash,'DF_BWM_Garage_perl','steuern') eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 3600 Sekunden");
set_Exec("tmr_Leuchte_Garage_hand_long", 3600, 'fhem_set("gendev_Leuchte_Garage off")');
}

     2         
if(::ReadingValDoIf($hash,'gendev_BWM_Garage','status') eq "on" && get_Exec("tmr_Leuchte_Garage_hand_long") < 120 && ::ReadingSecDoIf('DF_BWM_Garage_perl','steuern') > 3)
{
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Einschaltanforderung vom BWM. Schalte Licht ein.");
fhem_set("gendev_Leuchte_Garage on");
if(::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') > 80)
{
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie über 80%. Ausschaltverzögerung 600 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 600, 'fhem_set("gendev_Leuchte_Garage off")');
} else {
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie unter 80%. Ausschaltverzögerung 30 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
}
}

     3         
my $val = ::ReadingValDoIf($hash,'gendev_BWM_Garage','status');
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: $val");

   helper:
     DEVFILTER  ^global$|^gendev_BWM_Garage$|^DF_BWM_Garage_perl$
     NOTIFYDEV  global|gendev_BWM_Garage|DF_BWM_Garage_perl
     event      steuern: short
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev DF_BWM_Garage_perl
     triggerEvents:
       steuern: short
       e_DF_BWM_Garage_perl_steuern: short
       block_short: executed
       block_long: executed
       block_bwm: executed
     triggerEventsState:
       steuern: short
       e_DF_BWM_Garage_perl_steuern: short
       block_short: executed
       block_long: executed
       block_bwm: executed
   internals:
   perlblock:
     0          short
     1          long
     2          bwm
     3          debug
   ptimer:
     tmr_Leuchte_Garage_hand_long:
   readings:
     all         DF_BWM_Garage_perl:steuern gendev_BWM_Garage:status
   trigger:
   uiTable:
Attributes:
   room       garage,x_devel
   verbose    5

Titel: Antw:DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: abc2006 am 07 Februar 2021, 20:00:53
Bin grade nochmal über "checkReadingEvent" gefallen.
So funktionierts:
debug{
my $val1 = ["gendev_BWM_Garage:status"];## zum triggern
my $val = [gendev_BWM_Garage:status];## ich brauch aber den Wert
Log3("$SELF", 1,"DF_perl: gendev_Garage: $val");
}


Aber warum geht denn dann das hier:
short{
if ([$SELF:steuern] eq "short")

Ich versteh es nicht...
Titel: Antw:DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: Damian am 07 Februar 2021, 20:14:54
Verstehe ich nicht.

Mit

setreading test status 30

Wir das hier korrekt getriggert:

Internals:
   CFGFN     
   DEF        {set_State([test:status])}
   FUUID      60203b85-f33f-c0d4-6199-24bbd685d5b757d7
   MODEL      Perl
   NAME       di_status
   NOTIFYDEV  global,test
   NR         5057
   NTFY_ORDER 50-di_status
   STATE      30
   TYPE       DOIF
   VERSION    22913 2020-10-04 21:46:02
   READINGS:
     2021-02-07 20:12:19   Device          test
     2021-02-07 20:12:19   block_01        executed
     2021-02-07 20:12:19   e_test_status   30
     2021-02-07 20:12:05   mode            enabled
     2021-02-07 20:12:19   state           30
Titel: Antw:DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: abc2006 am 07 Februar 2021, 20:36:29
Okay, danke, das war ein guter Tipp.
Mit
setreading gendev_BWM_Garage status on
funktioniert es bei mir auch.

Dann bleibt die Frage:
Wo ist der unterschied zwischen diesen zwei Zeilen im Eventmonitor?

2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage status: on
2021-02-07 20:24:30.301 DOIF gendev_BWM_Garage status: on



Die erste hab ich erzeugt, indem ich vor dem BWM rumgesprungen bin.
Die zweite hab ich mit setreading gendev_BWM_Garage status on erzeugt.


Kann es da einen Unterschied geben?
Titel: Antw:DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: Damian am 07 Februar 2021, 21:05:53
Keine Ahnung.
Titel: Antw:DOIF im perl-Modus funktioniert "plötzlich" nicht mehr
Beitrag von: abc2006 am 07 Februar 2021, 21:49:07
Ich kann es heute nicht reproduzieren. Also bei der gegebenen Kombination tritt es wohl reproduzierbar auf, aber ich kann keinen Testcase bauen, der sich identisch verhält.
Mal schlafen, vllt morgen nochmal.