From 6b879f6d35171867d7347eacc54e52091c377e1a Mon Sep 17 00:00:00 2001 From: damian-s <> Date: Sat, 10 Oct 2015 18:39:11 +0000 Subject: [PATCH] 98_DOIF.pm: Rekursionen werden unterbunden git-svn-id: https://svn.fhem.de/fhem/trunk@9422 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_DOIF.pm | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm index 2fd362d5c..257809cfe 100644 --- a/fhem/FHEM/98_DOIF.pm +++ b/fhem/FHEM/98_DOIF.pm @@ -720,9 +720,11 @@ DOIF_cmd ($$$$) } } if ($hash->{do}{$nr}{$subnr}) { + $hash->{helper}{cur_cmd_nr}="cmd_".($nr+1)."_".($subnr+1); ($cmd,$err)=ParseCommandsDoIf($hash,$hash->{do}{$nr}{$subnr},1); } DOIF_SetState ($hash,$nr,$subnr,$event,$err); + delete $hash->{helper}{cur_cmd_nr}; if (defined $hash->{do}{$nr}{++$subnr}) { my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1; if (DOIF_SetSleepTimer($hash,$last_cond,$nr,$subnr,$event,-1)) { @@ -1072,6 +1074,9 @@ DOIF_SetSleepTimer($$$$$$) { my ($hash,$last_cond,$nr,$subnr,$device,$timerNr)=@_; my $pn = $hash->{NAME}; + if (defined $hash->{helper}{cur_cmd_nr}) { + return 0; + } my $sleeptimer=$hash->{helper}{sleeptimer}; my @waitdel=split(/:/,AttrVal($pn,"waitdel","")); my @waitdelsubnr=split(/,/,defined $waitdel[$sleeptimer] ? $waitdel[$sleeptimer] : ""); @@ -2063,19 +2068,6 @@ attr di_light do always

müssen mit Attribut do always definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.

-Rekursionen vermeiden
-
-Das Verändern des Status eines Devices z. B. durch set-Befehl, welches in der Bedingung bereits vorkommt, würde das Modul erneut triggern. -Solche Rekursionen (Loops) werden zwar von FHEM unterbunden, können jedoch elegant durch Abfragen mit Fragezeichen [?...] gelöst werden:
-
-statt:
-
-define di_lamp ([brightness] < 50 and [lamp] eq "off")(set lamp on)
-
-mit Fragezeichen abfragen:
-
-define di_lamp ([brightness] < 50 and [?lamp] eq "off")(set lamp on)
-
Bei Devices, die mit Zwischenzuständen arbeiten, insbesondere HM-Komponenten (Zwischenzustand: set_on, set_off), sollte die Definition möglichst genau formuliert werden, um unerwünschte Effekte zu vermeiden:

statt: