gelöst: Perl-Modus Timer wird nicht überschrieben

Begonnen von abc2006, 21 September 2020, 20:26:50

Vorheriges Thema - Nächstes Thema

abc2006

Hallo,
ich habe hier ein DOIF im Perl-Modus:
Internals:
   DEF        short{
if ([$SELF:steuern] eq "short")
{
if ([?gendev_Leuchte_Garage:status] =~ /^off/)
{
fhem_set("gendev_Leuchte_Garage on");
set_Reading("debug_leuchte_short_on",1,1);
}
elsif([?gendev_Leuchte_Garage:status] =~ /^on/)
{
fhem_set("gendev_Leuchte_Garage off");
set_Reading("debug_leuchte_short_off",1,1);
}
}
}
long{
if ([$SELF:steuern] eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
set_Reading("debug_leuchte_long_a",1,1);
if([?BMS:1_SOC_BMS_total:d] < 98)
{
set_Exec("tmr_Leuchte_Garage", 3600, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_long_b",1,1);
}
}
}
bwm{
if([$SELF:steuern] eq "BWM")
{
fhem_set("gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_bwm",1,1);
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_Aktor_Leuchte_Garage_Decke test $timeleft");
}
}
off{
if ([BMS:1_SOC_BMS_total:d] < 98 && get_Exec("tmr_Leuchte_Garage") == 0 && [?gendev_Leuchte_Garage:status] =~ /^on/)
{
set_Exec("tmr_Leuchte_Garage_vorwarn_off",1,'fhem_set("gendev_Leuchte_Garage off")');
set_Exec("tmr_Leuchte_Garage_vorwarn_on",2,'fhem_set("gendev_Leuchte_Garage on")');
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_auto_off",1,1);
}


}
   FUUID      5d6ce8ab-f33f-4040-83db-c0f25756ff42a380
   MODEL      Perl
   NAME       DF_Aktor_Leuchte_Garage_Decke
   NOTIFYDEV  global,BMS,DF_Aktor_Leuchte_Garage_Decke
   NR         482
   NTFY_ORDER 50-DF_Aktor_Leuchte_Garage_Decke
   STATE      off
   TYPE       DOIF
   VERSION    22030 2020-05-25 14:10:16
   READINGS:
     2020-09-21 20:18:14   Device          BMS
     2020-09-21 20:16:48   block_bwm       executed
     2020-09-21 20:16:48   block_long      executed
     2020-09-21 20:18:14   block_off       executed
     2020-09-21 20:16:48   block_short     executed
     2020-09-21 20:13:19   debug_leuchte_auto_off 1
     2020-09-06 16:50:58   debug_leuchte_bwm 1
     2020-08-15 22:07:33   debug_leuchte_long_a 1
     2020-08-15 22:07:33   debug_leuchte_long_b 1
     2020-09-06 16:12:05   debug_leuchte_short_off 1
     2020-08-16 12:08:30   debug_leuchte_short_on 1
     2020-09-21 20:12:12   debug_leuchte_status 1
     2020-09-21 20:18:14   e_BMS_1_SOC_BMS_total 77.6
     2020-09-21 20:16:48   e_DF_Aktor_Leuchte_Garage_Decke_steuern BWM
     2020-09-21 20:13:16   mode            enabled
     2020-09-21 20:16:48   steuern         BWM
     2020-09-21 20:16:48   test            299.999599933624
     2020-09-21 20:13:19   timer_tmr_Leuchte_Garage 21.09.2020 20:18:19
   Regex:
     accu:
     cond:
       BMS:
         0:
         1:
         2:
         3:
           1_SOC_BMS_total ^BMS$:^1_SOC_BMS_total:
       DF_Aktor_Leuchte_Garage_Decke:
         0:
           steuern    ^DF_Aktor_Leuchte_Garage_Decke$:^steuern:
         1:
           steuern    ^DF_Aktor_Leuchte_Garage_Decke$:^steuern:
         2:
           steuern    ^DF_Aktor_Leuchte_Garage_Decke$:^steuern:
         3:
   condition:
     0         
if (::ReadingValDoIf($hash,'DF_Aktor_Leuchte_Garage_Decke','steuern') eq "short")
{
if (::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^off/)
{
fhem_set("gendev_Leuchte_Garage on");
set_Reading("debug_leuchte_short_on",1,1);
}
elsif(::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^on/)
{
fhem_set("gendev_Leuchte_Garage off");
set_Reading("debug_leuchte_short_off",1,1);
}
}

     1         
if (::ReadingValDoIf($hash,'DF_Aktor_Leuchte_Garage_Decke','steuern') eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
set_Reading("debug_leuchte_long_a",1,1);
if(::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') < 98)
{
set_Exec("tmr_Leuchte_Garage", 3600, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_long_b",1,1);
}
}

     2         
if(::ReadingValDoIf($hash,'DF_Aktor_Leuchte_Garage_Decke','steuern') eq "BWM")
{
fhem_set("gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_bwm",1,1);
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_Aktor_Leuchte_Garage_Decke test $timeleft");
}

     3         
if (::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') < 98 && get_Exec("tmr_Leuchte_Garage") == 0 && ::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^on/)
{
set_Exec("tmr_Leuchte_Garage_vorwarn_off",1,'fhem_set("gendev_Leuchte_Garage off")');
set_Exec("tmr_Leuchte_Garage_vorwarn_on",2,'fhem_set("gendev_Leuchte_Garage on")');
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_auto_off",1,1);
}



   helper:
     DEVFILTER  ^global$|^DF_Aktor_Leuchte_Garage_Decke$|^BMS$
     NOTIFYDEV  global|DF_Aktor_Leuchte_Garage_Decke|BMS
     event      1_SOC_BMS_total: 77.6
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev BMS
     triggerEvents:
       1_SOC_BMS_total: 77.6
     triggerEventsState:
       1_SOC_BMS_total: 77.6
   internals:
   perlblock:
     0          short
     1          long
     2          bwm
     3          off
   ptimer:
     tmr_Leuchte_Garage:
       name       tmr_Leuchte_Garage
       subname    fhem_set("gendev_Leuchte_Garage off")
       time       1600712299.457
       hash:
     tmr_Leuchte_Garage_vorwarn_off:
       name       tmr_Leuchte_Garage_vorwarn_off
       subname    fhem_set("gendev_Leuchte_Garage off")
       time       1600712000.45669
       hash:
     tmr_Leuchte_Garage_vorwarn_on:
       name       tmr_Leuchte_Garage_vorwarn_on
       subname    fhem_set("gendev_Leuchte_Garage on")
       time       1600712001.45687
       hash:
   readings:
     all         DF_Aktor_Leuchte_Garage_Decke:steuern BMS:1_SOC_BMS_total
   trigger:
   uiTable:
Attributes:
   group      intelligente_steuerung
   room       _doif,KNX,Solar_PV
   verbose    5

Aufgabe ist, das Garagenlicht einzuschalten, je nach gewählter option.
Konkret geht es mir um den bwm{}-Abschnitt.
Wenn der BWM eine Bewegung erkennt, setzt er das reading "steuern" auf "BWM".
(setreading DF_Aktor_Leuchte_Garage_Decke steuern BWM)
Daraufhin schaltet das DOIF das Licht für 5 Minuten ein.
Wenn der BWM noch eine Bewegung erkennt, und das reading "steuern" erneut mit "BWM" triggert, wird der Timer nicht überschrieben, d.h. egal wie viel ich mich bewege, ich stehe nach 5 Minuten im dunkeln.

Um das zu testen, habe ich ein test-DOIF angelegt:

Internals:
   CFGFN     
   DEF        bwm{
if([$SELF:steuern] eq "BWM")
{
fhem_set("testtemp 12");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set testtemp 12")');
set_Reading("debug_leuchte_bwm",1,1);
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_timertest test $timeleft");
}
}
   FUUID      5f68dd9f-f33f-4040-d474-bccf6869a8e623a0
   MODEL      Perl
   NAME       DF_timertest
   NOTIFYDEV  global,DF_timertest
   NR         541180
   NTFY_ORDER 50-DF_timertest
   STATE      initialized
   TYPE       DOIF
   VERSION    22030 2020-05-25 14:10:16
   READINGS:
     2020-09-21 20:10:30   block_bwm       executed
     2020-09-21 20:10:30   debug_leuchte_bwm 1
     2020-09-21 20:10:30   debug_neu       299.999609947205
     2020-09-21 20:10:30   e_DF_timertest_steuern BWM
     2020-09-21 20:10:24   mode            enabled
     2020-09-21 19:06:40   showtemp        nix
     2020-09-21 19:06:39   state           initialized
     2020-09-21 20:10:30   steuern         BWM
     2020-09-21 20:10:30   test            299.999609947205
   Regex:
     accu:
     cond:
       DF_timertest:
         0:
           steuern    ^DF_timertest$:^steuern:
   condition:
     0         
if(::ReadingValDoIf($hash,'DF_timertest','steuern') eq "BWM")
{
fhem_set("testtemp 12");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set testtemp 12")');
set_Reading("debug_leuchte_bwm",1,1);
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_timertest test $timeleft");
}

   helper:
     DEVFILTER  ^global$|^DF_timertest$
     NOTIFYDEV  global|DF_timertest
     event      steuern: BWM
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev DF_timertest
     triggerEvents:
       steuern: BWM
       e_DF_timertest_steuern: BWM
       timer_tmr_Leuchte_Garage: 21.09.2020 20:15:30
       debug_leuchte_bwm: 1
       debug_neu: 299.999609947205
       test: 299.999609947205
       block_bwm: executed
     triggerEventsState:
       steuern: BWM
       e_DF_timertest_steuern: BWM
       timer_tmr_Leuchte_Garage: 21.09.2020 20:15:30
       debug_leuchte_bwm: 1
       debug_neu: 299.999609947205
       test: 299.999609947205
       block_bwm: executed
   internals:
   perlblock:
     0          bwm
   ptimer:
     tmr_Leuchte_Garage:
       name       tmr_Leuchte_Garage
       subname    fhem("set testtemp 12")
       time       1600712130.74961
       hash:
   readings:
     all         DF_timertest:steuern
   trigger:
   uiTable:
Attributes:
   room       x_devel


Was soll ich sagen....(setreading DF_timertest steuern BWM) und es funktioniert einwandfrei.
Hat jemand ne Idee, warum das große DOIF nicht funktioniert, das kleine aber schon?

In diesem Zusammenhang gleich noch eine Frage:
Im Abschnitt "off" habe ich als Bedingung && get_Exec("tmr_Leuchte_Garage") == 0 &&
Laut dem Reading "test" ergibt get_Exec("tmr_Leuchte_Garage")  299.999609947205. Warum schaltet das DOIF trotzdem?

Vielleicht ist es auch schon ein bisschen spät ... Danke für eure Denkanstöße!

Viele Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

abc2006

So,
habe herausgefunden, dass das Problem damit zusammenzuhängen scheint, ob vor dem set_Exec() noch ein (fhem)-Befehl kommt...
geht:
bwm{
if([$SELF:steuern] eq "BWM")
{
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_bwm",1,1);
fhem("set gendev_Leuchte_Garage on");
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_Aktor_Leuchte_Garage_Decke test $timeleft");
}
}


geht nicht
bwm{
if([$SELF:steuern] eq "BWM")
{
fhem("set gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_bwm",1,1);
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_Aktor_Leuchte_Garage_Decke test $timeleft");
}
}
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Zitat von: abc2006 am 23 September 2020, 23:23:34
So,
habe herausgefunden, dass das Problem damit zusammenzuhängen scheint, ob vor dem set_Exec() noch ein (fhem)-Befehl kommt...
geht:
bwm{
if([$SELF:steuern] eq "BWM")
{
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_bwm",1,1);
fhem("set gendev_Leuchte_Garage on");
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_Aktor_Leuchte_Garage_Decke test $timeleft");
}
}


geht nicht
bwm{
if([$SELF:steuern] eq "BWM")
{
fhem("set gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem("set gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_bwm",1,1);
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_neu",$timeleft,1,1);
fhem("setreading DF_Aktor_Leuchte_Garage_Decke test $timeleft");
}
}


Welche DOIF-Version benutzt du?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

98_DOIF.pm            22834 2020-09-23 17:50:00Z Damian

Habe zwischenzeitlich ausgeputzt, alle betreffenden DOIF gelöscht und neu angelegt.
Fehler tritt jetzt nicht mehr auf.

short{
if ([$SELF:steuern] eq "short")
{
if ([?gendev_Leuchte_Garage:status] =~ /^off/)
{
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_short_on",1,1);
}
elsif([?gendev_Leuchte_Garage:status] =~ /^on/)
{
    fhem_set("gendev_Leuchte_Garage off");
set_Reading("debug_leuchte_short_off",1,1);
}
}
}
long{
if ([$SELF:steuern] eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
set_Reading("debug_leuchte_long_a",1,1);
}
}
bwm{
if([$SELF:steuern] eq "BWM")
{
my $timeleft = get_Exec('tmr_Leuchte_Garage');
set_Reading("debug_leuchte_bwm",$timeleft,1);
fhem_set("gendev_Leuchte_Garage on");
if([?BMS:1_SOC_BMS_total:d] > 80)
{
set_Exec("tmr_Leuchte_Garage", 3600, 'fhem_set("gendev_Leuchte_Garage off")');
} else {
set_Exec("tmr_Leuchte_Garage", 600, 'fhem_set("gendev_Leuchte_Garage off")');
}
}
}
off{
if ([BMS:1_SOC_BMS_total:d] < 50 && get_Exec("tmr_Leuchte_Garage") == 0 && [?gendev_Leuchte_Garage:status] =~ /^on/)
{
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
set_Reading("debug_leuchte_auto_off",1,1);
}
}



Danke und Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX