IF oder if im Befehlsteil mit Readingangabe und Defaultwert ?

Begonnen von Ellert, 08 Juli 2017, 11:44:20

Vorheriges Thema - Nächstes Thema

Ellert

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






Damian

#1
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

ZitatEs wird an der Zeit die IF-Syntax an die von DOIF anzugleichen

Das wäre natürlich optimal.