mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-02-01 07:19:24 +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:
parent
8f4b5c5f53
commit
6b879f6d35
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user