DOIF/partielle Deaktivierung der Befehlsausführung, Zurücksetzen eines Wait-Timers mit $SELF oder IsDisabled verhindern, im Vergleich

Aus FHEMWiki

Die Möglichkeiten DOIF mit dem Attribut disable oder per set disable zu deaktivieren, haben den Nachteil, dass DOIF diesen Zustand nicht selbst ändern kann.
Hier wird gezeigt, wie eine partielle Deaktivierung möglich ist, die DOIF selbst aufheben kann.

Zurücksetzen eines Wait-Timers mit IsDisabled verhindern

Mit der internen FHEM-Funktion IsDisabled lässt sich für Bedingungszweige die Befehlsausführung deaktivieren. Das Reading state kann über setreading oder über das Attribut cmdState auf inactive gesetzt werden.
Grundsätzlich wird eine Bedingung, die inaktiv werden soll, so formuliert

(<Bedingung> and !IsDisabled("$SELF")) (<Befehle>)


Eine Abfrage des Rückgabewertes von IsDisabled ist nicht notwendig, wenn der Grund für den Deaktivierungszustand keine Rolle spielt.

Beschreibung

Info green.pngHinweis: Verwendung von
  • $SELF dem Eigennamen des DOIF
  • IsDisabled zum Abfragen der Inaktivität
  • ! zur Negation von IsDisabled
  • wait für Befehlssequenzen

Die Bedingungsteile, wie [$SELF:mybutton] == 1 sind im Beispiel nur zur Veranschaulichung eingebaut. Sie stehen für eine beliebige Bedingung.
Solange die Wait-Timer laufen und die 3. Befehlssequenz nicht ausgeführt wurde, kann die Bedingung 2 nicht wahr werden. Das wird durch den Bedingungsteil and !IsDisabled("$SELF") im Zusammenspiel mit cmdState inactive,inactive,... verhindert. cmdState setzt den Status des DOIF für die Befehlssequenzen 1 und 2 auf inaktive. Der Status bleibt erhalten bis die Befehlssequenz 3 ausgeführt wurde.

Definition

## 1
([$SELF:mybutton] == 1) 
   ({Log 1, "Befehl 1_1 gegen Zurücksetzen des wait geschützt"})
   ({Log 1, "Befehl 1_2 gegen Zurücksetzen des wait geschützt"})
   ({Log 1, "Befehl 1"})
## 2
DOELSEIF ([$SELF:mybutton] == 2 and !IsDisabled("$SELF")) 
   ({Log 1, "Befehl 2"})

wesentliche Attribute

cmdState inactive,inactive,Befehl 1|Befehl 2
wait 0,5,5:0

Zurücksetzen eines Wait-Timers mit $SELF verhindern

Grundsätzlich wird eine Bedingung, die innerhalb einer Zeitspann inaktiv werden soll, so formuliert

(<Bedingung> and [$SELF] !~ "<Regexp der Status, die deaktivieren>") (<Befehle>)

Beschreibung

Info green.pngHinweis: Verwendung von
  • $SELF dem Eigennamen des DOIF
  • !~ mit der Bedeutung enthält nicht
  • Regulärer Ausdruck
  • wait für Befehlssequenzen

Die Bedingungsteile, wie [$SELF:mybutton] == 1 sind im Beispiel nur zur Veranschaulichung eingebaut. Sie stehen für eine beliebige Bedingung.
Solange die Wait-Timer laufen und die 3. Befehlssequenz nicht ausgeführt wurde, kann die Bedingung 2 nicht wahr werden. Das wird durch den Bedingungsteil and [$SELF] !~ "cmd_1_1|cmd_1_2" verhindert.

Definition

## 1
([$SELF:mybutton] == 1) 
   ({Log 1, "Befehl 1_1 gegen Zurücksetzen des wait geschützt"})
   ({Log 1, "Befehl 1_2 gegen Zurücksetzen des wait geschützt"})
   ({Log 1, "Befehl 1"})
## 2
DOELSEIF ([$SELF:mybutton] == 2 and [$SELF] !~ "cmd_1_1|cmd_1_2") 
   ({Log 1, "Befehl 2"})

wesentliche Attribute

wait 0,5,5:0

Vergleich der Beispiele

Im Beispiel 2 wird das Attribut cmdState nicht benötigt. Dafür ist die Beschreibung des Bedingungsteiles zum Deaktivieren, durch die Verwendung eines regulären Ausdrucks, etwas komplexer als die Verwendung von IsDisabled in Beispiel 1.

Laborgruppe zum Import mit Raw definition

define using_inactive_Labor DOIF ## 1\
([$SELF:mybutton] == 1) \
   ({Log 1, "Befehl 1_1 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1_2 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1"})\
## 2\
DOELSEIF ([$SELF:mybutton] == 2 and !IsDisabled("$SELF")) \
   ({Log 1, "Befehl 2"})
attr using_inactive_Labor alias Nutzung von state inactive und IsDisabled-Funktion<br>Zurücksetzen des Wait-Timers verhindern
attr using_inactive_Labor cmdState inactive,inactive,Befehl 1|Befehl 2
attr using_inactive_Labor group Labor: state inactive und Funktion IsDisabled
attr using_inactive_Labor readingList mybutton
attr using_inactive_Labor room DOIF_Labor
attr using_inactive_Labor setList mybutton:0,1,2
attr using_inactive_Labor wait 0,5,5:0
attr using_inactive_Labor webCmd mybutton

setstate using_inactive_Labor 2016-12-09 07:44:21 mybutton 0


define using_cmd_x_Labor DOIF ## 1\
([$SELF:mybutton] == 1) \
   ({Log 1, "Befehl 1_1 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1_2 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1"})\
## 2\
DOELSEIF ([$SELF:mybutton] == 2 and [$SELF] !~ "cmd_1_1|cmd_1_2") \
   ({Log 1, "Befehl 2"})
attr using_cmd_x_Labor alias Nutzung der originären DOIF Funktionalität [$SELF] !~  und "cmd_1_1|cmd_1_2"<br> Zurücksetzen des Wait-Timers verhindern
attr using_cmd_x_Labor group Labor: state inactive und Funktion IsDisabled
attr using_cmd_x_Labor readingList mybutton
attr using_cmd_x_Labor room DOIF_Labor
attr using_cmd_x_Labor setList mybutton:0,1,2
attr using_cmd_x_Labor wait 0,5,5:0
attr using_cmd_x_Labor webCmd mybutton

setstate using_cmd_x_Labor 2016-12-09 08:59:00 mybutton 0

save

Links