diff --git a/FHEM/98_DOIF.pm b/FHEM/98_DOIF.pm
index b34776ac2..608f80b72 100644
--- a/FHEM/98_DOIF.pm
+++ b/FHEM/98_DOIF.pm
@@ -2844,7 +2844,7 @@ CmdDoIfPerl($$)
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,"state","initialized");
readingsBulkUpdate ($hash,"mode","enabled");
- readingsEndUpdate($hash, 1);
+ readingsEndUpdate($hash, 0);
$hash->{helper}{globalinit}=1;
}
@@ -3703,9 +3703,9 @@ Die Formatierungen lassen sich im DEF-Editor der Web-Oberfläche vornehmen.
So könnte eine Definition aussehen:
define di_Modul DOIF ([Switch1] eq "on" and [Switch2] eq "on") | ## wenn Schalter 1 und Schalter 2 on ist |
(set lamp on) | ## wird Lampe eingeschaltet |
DOELSE | ## im sonst-Fall, also wenn einer der Schalter off ist |
(set lamp off) | ## wird die Lampe ausgeschaltet |
(set lamp on) | ## wird Lampe eingeschaltet |
DOELSE | ## im sonst-Fall, also wenn einer der Schalter off ist |
(set lamp off) | ## wird die Lampe ausgeschaltet |
define di_Modul DOIF
if ([Switch1] eq "on" and [Switch2] eq "on") {
## wenn Schalter 1 und Schalter 2 on ist
fhem_set "lamp on"
## wird Lampe eingeschaltet
} elsif {
## im sonst-Fall, also wenn einer der Schalter off ist
fhem_set "lamp off"
## wird die Lampe ausgeschaltet
} else {
## im sonst-Fall, also wenn einer der Schalter off ist
fhem_set "lamp off"
## wird die Lampe ausgeschaltet
}
}
[<devicename>:"<regex>"]
define di_garage DOIF {if ([remotecontrol:"on"]) {fhem_set"garage on"} elsif ([remotecontrol:"off"]) {fhem_set"garage off"}}
define di_window_open (["^window_:open"]) (set Pushover msg 'alarm' 'open windows $DEVICE' '' 2 'persistent' 30 3600)
+define di_window_open DOIF (["^window_:open"]) (set Pushover msg 'alarm' 'open windows $DEVICE' '' 2 'persistent' 30 3600)
attr di_window_open do always
Perl-Modus:
-define di_window_open {if (["^window_:open"]) {fhem_set"Pushover msg 'alarm' 'open windows $DEVICE' '' 2 'persistent' 30 3600"}}
+define di_window_open DOIF {if (["^window_:open"]) {fhem_set"Pushover msg 'alarm' 'open windows $DEVICE' '' 2 'persistent' 30 3600"}}
Hier werden alle Fenster, die mit dem Device-Namen "window_" beginnen auf "open" im Event überwacht.
@@ -4066,13 +4066,11 @@ attr di_Raumtemp state In folgenden Zimmern ist zu kalt: [@"^Rooms":temperature:
Es soll beim Öffnen eines Fensters eine Meldung über alle geöffneten Fenster erfolgen:
define di_Fenster DOIF (["^Window:open"]) (push "Folgende Fenster: [@"^Window:state:"open"] sind geöffnet")
-
attr di_Fenster do always
Wenn im Wohnzimmer eine Lampe ausgeschaltet wird, sollen alle anderen Lampen im Wohnzimmer ebenfalls ausgeschaltet werden, die noch an sind:
define di_lamp DOIF (["^lamp_livingroom: off"]) (set [@"^lamp_livingroom":state:"on","defaultdummy"] off)
-
attr di_lamp DOIF do always
Mit der Angabe des Default-Wertes "defaultdummy", wird verhindert, dass der set-Befehl eine Fehlermeldung liefert, wenn die Device-Liste leer ist. Der angegebene Default-Dummy muss zuvor definiert werden.
@@ -4081,9 +4079,10 @@ Für reine Perlangaben gibt es eine entsprechende Perlfunktion namens Aggr
Beispiele
-define di_Fenster DOIF (["^Window:open"]) {foreach (AggrDoIf('@','^windows','state','"open"')) {Log3 "di_Fenster",3,"Das Fenster $_ ist noch offen"}}
+Perl-Modus:
+define di_Fenster DOIF {if (["^Window:open"]) {foreach (AggrDoIf('@','^windows','state','"open"')) {Log3 "di_Fenster",3,"Das Fenster $_ ist noch offen"}}}
-define di_Temperature DOIF (["^room:temperature"]) {foreach (AggrDoIf('@','^room','temperature','$_ < 15')) {Log3 "di_Temperatur",3,"im Zimmer $_ ist zu kalt"}}
+define di_Temperature DOIF {if (["^room:temperature"]) {foreach (AggrDoIf('@','^room','temperature','$_ < 15')) {Log3 "di_Temperatur",3,"im Zimmer $_ ist zu kalt"}}
Zeitsteuerung back
@@ -5692,7 +5691,7 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
Perl Modus
Der Perl-Modus ist sowohl für einfache, als auch für komplexere Automatisierungsabläufe geeignet. Der Anwender hat mehr Einfluss auf den Ablauf der Steuerung als im FHEM-Modus.
-Die Abläufe lassen sich, wie in höheren Programmiersprachen üblich, strukturiert programmieren. Zum Zeitpunkt der Definition werden alle DOIF-spezifischen Angaben in Perl übersetzt, zum Zeitpunkt der Ausführung wird nur noch Perl ausgeführt, damit wird maximale Performance gewährleistet.
+Die Abläufe lassen sich, wie in höheren Programmiersprachen üblich, strukturiert programmieren. Zum Zeitpunkt der Definition werden alle DOIF-spezifischen Angaben in Perl übersetzt, zum Zeitpunkt der Ausführung wird nur noch Perl ausgeführt, dadurch wird maximale Performance gewährleistet.
Syntax Perl-Modus:
@@ -5720,28 +5719,41 @@ Die Bedingungen des FHEM-Modus können ohne Änderungen in Perl-Modus übernomme
Einfache Anwendungsbeispiele (vgl. Anwendungsbeispiele im FHEM-Modus):
-define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem"set tv on"} else {fhem"set tv off"}}
+define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem_set"tv on"} else {fhem_set"tv off"}}
-define di_clock_radio DOIF {if ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) {fhem"set radio on"}} {if ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) {fhem"set radio off"}}
+define di_clock_radio DOIF {if ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) {fhem_set"radio on"}} {if ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) {fhem_set"radio off"}}
-define di_lamp DOIF {if ([06:00-09:00] and [sensor:brightness] < 40) {fhem"set lamp:FILTER=STATE!=on on"} else {fhem"set lamp:FILTER=STATE!=off off"}}
+define di_lamp DOIF {if ([06:00-09:00] and [sensor:brightness] < 40) {fhem_set"lamp:FILTER=STATE!=on on"} else {fhem_set"lamp:FILTER=STATE!=off off"}}
-Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Zustandsauswertung, daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option)
+Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung), daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option)
-Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen Trigger ausgewertet und zur Ausführung führen können:
+Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen oder mehrere Trigger ausgewertet und zur Ausführung führen können:
DOIF
-{ if (<Bedingung mit Trigger>) ... }
-{ if (<Bedingung mit Trigger>) ... }
+{ if (<Bedingung mit Triggern>) ... }
+{ if (<Bedingung mit Triggern>) ... }
...
+Einzelne Ereignis-/Zeittrigger, die nicht logisch mit anderen Bedingungen oder Triggern ausgewertet werden müssen, können auch ohne if-Anweisung angegeben werden, z. B.:
+
+DOIF
+{["lamp:on"];...}
+{[08:00];...}
+...
+
+Ereignis-/Zeittrigger sind intern Perlfunktionen, daher können sie an beliebiger Stelle im Perlcode angegeben werden, wo Perlfunktionen vorkommen dürfen, z. B.:
+
+DOIF {Log 1,"state of lamp: ".[lamp:state]}
+
+DOIF {fhem_set("lamp ".[remote:state])}
+
Es sind beliebige Hierarchietiefen möglich:
DOIF
{ if (<Bedingung>) {
if (<Bedingung>) {
- if (...
+ if (<Bedingung mit Triggern>...
...
}
}