if-condition

Aus FHEMWiki
Wechseln zu: Navigation, Suche


Info green.png 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