if-condition
Hier wird die Verwendung der Perl-Anweisung if beschrieben. Diese ist nicht mit dem FHEM-Befehl IF zu verwechseln!
if-Abfragen können Bedingungen prüfen und abhängig davon Befehle ausführen. Die Syntax und die Verwendung sollen hier an einigen Beispielen erläutert werden. Der Einfachheit halber wird hier at als Modul verwendet, die hier aufgeführten Beispiele funktionieren aber genauso in allen anderen Modulen, die im Ausführungsteil Perl-Code interpretieren können, insbesondere also notify, WeekdayTimer und watchdog.
Einfache if-Bedingung
define einschalten at +*00:15 { if ( "1" eq "1" ) { fhem("set Funkschalter on") }}
- Die äusseren geschweiften Klammern sagen FHEM, dass innerhalb Perl-Befehle ausgeführt werden.
- Das Wort if leitet die Bedingung ein.
- In den runden Klammern steht die Bedingung
- (Perl-Vergleichsoperatoren sind für Zeichen(ketten)- und Zahlenvergleiche unterschiedlich!)
- In den folgenden geschweifen Klammern steht ebenfalls Perl-Code, der ausgeführt wird, falls die Bedingung zutrifft.
- Der Perl-Code besteht nun wiederum aus der Anweisung, einen FHEM-Befehl auszuführen. Dieser wird zwischen die runden Klammern in Anführungsstriche gesetzt.
Komplexere if-Bedingung
Achtung Klammersetzung! Hiermit wird das komplette Verhalten beeinflusst!
- mit den zwei senkrechten Strichen wird ein "oder" formuliert (also nur Mittwoch ODER Donnerstag schalten):
define a2 at *00:01:00 { if (($wday == 3) || ($wday == 4)) { fhem("set LICHT off") } }
- mit den zwei "&" wird ein "und" formuliert (also nur mittwochs UND auch dann nur zwischen 18:00 und 5:00 Uhr schalten):
define a2 at *00:01:00 { if (($wday == 3) && (($hour >= 18 || $hour < 5))) { fhem("set LICHT off") } }
- Änderung der Logik durch andere Klammersetzung:
define a2 at *00:01:00 { if ((($wday == 3) && ($hour >= 18)) || ($hour < 5)) { fhem("set LICHT off") } }
- Achtung: dieser Befehl schaltet mittwochs ab 18:00 und außerdem jeden Tag vor 5:00
if-else-Bedingung
define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem("set Funkschalter on") } else { fhem("set funkschalter off")}}
Wenn mehrere Bedingungen ausgeführt werden sollen:
define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem("set Funkschalter on;; set FHT80B desired-temp 21") }}
- Die beiden Bedingungen müssen nun mit zwei Semikola getrennt werden, da Perl vor der Übergabe an FHEM den Befehl übersetzt und dabei das eine Semikolon entfernt.
Links
- Struktur von "else if"-Verzweigungen
- In Artikel zu notify sind ab hier weitere Beispiele für bedingte Befehlsausführungen enthalten.
- Noch weitergehende Möglichkeiten sind in 99 myUtils anlegen dargestellt.