Manchmal ist es einfacher im Ausführungsteil eine Bedingungsabfrage einzubauen, als eine Lösung über DOELSEIF-Bedingungen, z.B. wenn erst nach Ablauf eines Wait-Timers eine Bedingung geprüft werden soll.
Die Verwendung des Befehls IF hat den Nachteil, dass bei einer Readingsabfrage kein Defaultwert angegeben werden kann [Gerät:Reading,Defaultwert] ist nicht möglich, es müsste ReadingsVal("Gerät","Reading","Defaultwert") genutzt werden. Damit entfällt die einfache DOIF-Syntax für Readings mit Defaultwert.
DOIF hat inzwischen die Möglichkeit Perl mit DOIF-Syntax zu nutzen, sie ist sogar etwas kürzer.
Im nachstehenden Beispiel funktioniert nur der zweite Befehlszweig.
defmod if_in_doif DOIF (#1)\
(IF ([$SELF:xxx,1]) ({Log 1, "[$SELF:xxx,1]"}))\
DOELSEIF (#2)\
{if ([$SELF:xxx,1]) {Log 1, "[$SELF:xxx,1]"}}\
attr if_in_doif do always
attr if_in_doif icon helper_doif
attr if_in_doif room 0_Test
setstate if_in_doif initialized
setstate if_in_doif 2017-07-08 11:42:32 cmd 0
setstate if_in_doif 2017-07-08 11:42:32 state initialized
Ja, IF ist inzwischen in die Jahre gekommen ;) Es wird an der Zeit die IF-Syntax an die von DOIF anzugleichen, denn wenn man auf der FHEM-Ebene bleibt, dann ist IF kürzer als Perl-if.
Edit: ein Nachteil von
DOIF(1) {if ([$SELF:xxx,1]) {Log 1, "[$SELF:xxx,1]"}}
ist die Tatsache, dass [$SELF:xxx,1] durch den Wert ersetzt wird, damit funktioniert insb. bei Strings so etwas nicht:
if ([$SELF:xxx,1] eq "bla")
man muss dann
if ("[$SELF:xxx,1]" eq "bla")
angeben, was aber nicht intuitiv und für die meisten nicht nachvollziehbar ist.
ZitatEs wird an der Zeit die IF-Syntax an die von DOIF anzugleichen
Das wäre natürlich optimal.