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
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");
}
}
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?
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