2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 01:09:47 +00:00

98_DOIF.pm: Rekursionen werden unterbunden

git-svn-id: https://svn.fhem.de/fhem/trunk@9422 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
damian-s 2015-10-10 18:39:11 +00:00
parent 8f4b5c5f53
commit 6b879f6d35

View File

@ -720,9 +720,11 @@ DOIF_cmd ($$$$)
} }
} }
if ($hash->{do}{$nr}{$subnr}) { if ($hash->{do}{$nr}{$subnr}) {
$hash->{helper}{cur_cmd_nr}="cmd_".($nr+1)."_".($subnr+1);
($cmd,$err)=ParseCommandsDoIf($hash,$hash->{do}{$nr}{$subnr},1); ($cmd,$err)=ParseCommandsDoIf($hash,$hash->{do}{$nr}{$subnr},1);
} }
DOIF_SetState ($hash,$nr,$subnr,$event,$err); DOIF_SetState ($hash,$nr,$subnr,$event,$err);
delete $hash->{helper}{cur_cmd_nr};
if (defined $hash->{do}{$nr}{++$subnr}) { if (defined $hash->{do}{$nr}{++$subnr}) {
my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1; my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1;
if (DOIF_SetSleepTimer($hash,$last_cond,$nr,$subnr,$event,-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 ($hash,$last_cond,$nr,$subnr,$device,$timerNr)=@_;
my $pn = $hash->{NAME}; my $pn = $hash->{NAME};
if (defined $hash->{helper}{cur_cmd_nr}) {
return 0;
}
my $sleeptimer=$hash->{helper}{sleeptimer}; my $sleeptimer=$hash->{helper}{sleeptimer};
my @waitdel=split(/:/,AttrVal($pn,"waitdel","")); my @waitdel=split(/:/,AttrVal($pn,"waitdel",""));
my @waitdelsubnr=split(/,/,defined $waitdel[$sleeptimer] ? $waitdel[$sleeptimer] : ""); my @waitdelsubnr=split(/,/,defined $waitdel[$sleeptimer] ? $waitdel[$sleeptimer] : "");
@ -2063,19 +2068,6 @@ attr di_light do always</code><br>
<br> <br>
müssen mit Attribut <code>do always</code> definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.<br> müssen mit Attribut <code>do always</code> definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.<br>
<br> <br>
Rekursionen vermeiden<br>
<br>
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:<br>
<br>
statt:<br>
<br>
<code>define di_lamp ([brightness] < 50 and [lamp] eq "off")(set lamp on)</code><br>
<br>
mit Fragezeichen abfragen:<br>
<br>
<code>define di_lamp ([brightness] < 50 and [?lamp] eq "off")(set lamp on)</code><br>
<br>
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: <br> 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: <br>
<br> <br>
statt:<br> statt:<br>