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: