If-condition: Unterschied zwischen den Versionen
Krikan (Diskussion | Beiträge) K (Rechtschreibkorrektur / Hinweis zur Abgrenzung if/IF) |
("Im Aufbau" entfernt, Links ergänzt) |
||
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Randnotiz|RNTyp=Info|RNText=Hier wird die Verwendung der Perl-Anweisung if beschrieben. Diese ist nicht mit dem | {{SEITENTITEL:if-condition}} | ||
{{Randnotiz|RNTyp=Info|RNText=Hier wird die Verwendung der Perl-Anweisung if beschrieben. Diese ist nicht mit dem FHEM-Befehl [http://fhem.de/commandref.html#IF 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]]. | |||
if-Abfragen können Bedingungen prüfen und abhängig davon Befehle ausführen. Die Syntax und die Verwendung sollen an | |||
== Einfache if-Bedingung == | == Einfache if-Bedingung == | ||
:<code>define einschalten at +*00:15 { if ( "1" eq "1" ) { fhem("set Funkschalter on") }}</code> | :<code>define einschalten at +*00:15 { if ( "1" eq "1" ) { fhem("set Funkschalter on") }}</code> | ||
* Die äusseren geschweiften Klammern sagen | * Die äusseren geschweiften Klammern sagen FHEM, dass innerhalb Perl-Befehle ausgeführt werden. | ||
* Das Wort '''if''' leitet die Bedingung ein. | * Das Wort '''if''' leitet die Bedingung ein. | ||
* In den runden Klammern steht die Bedingung | * In den runden Klammern steht die Bedingung | ||
: ([http://de.selfhtml.org/perl/sprache/operatoren.htm#vergleich 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. | * In den folgenden geschweifen Klammern steht ebenfalls Perl-Code, der ausgeführt wird, falls die Bedingung zutrifft. | ||
* Der | * 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 == | == Komplexere if-Bedingung == | ||
Achtung Klammersetzung! Hiermit wird das komplette Verhalten beeinflusst! | Achtung Klammersetzung! Hiermit wird das komplette Verhalten beeinflusst! | ||
* mit den zwei senkrechten Strichen wird ein "oder" formuliert | * mit den zwei senkrechten Strichen wird ein "[http://de.selfhtml.org/perl/sprache/operatoren.htm#logisch oder]" formuliert (also nur Mittwoch ODER Donnerstag schalten): | ||
:<code>define a2 at *00:01:00 { if (($wday == 3) || ($wday == 4)) { fhem("set LICHT off") } }</code> | :<code>define a2 at *00:01:00 { if (($wday == 3) || ($wday == 4)) { fhem("set LICHT off") } }</code> | ||
* mit den zwei "&" wird ein "und" formuliert | * mit den zwei "&" wird ein "und" formuliert (also nur mittwochs UND auch dann nur zwischen 18:00 und 5:00 Uhr schalten): | ||
:<code>define a2 at *00:01:00 { if (($wday == 3) && (($hour > 18 || $hour < 5))) { fhem("set LICHT off") } }</code> | :<code>define a2 at *00:01:00 { if (($wday == 3) && (($hour >= 18 || $hour < 5))) { fhem("set LICHT off") } }</code> | ||
* Änderung der Logik durch andere Klammersetzung: | * Änderung der Logik durch andere Klammersetzung: | ||
:<code>define a2 at *00:01:00 { if ((($wday == 3) && ($hour > 18)) || ($hour < 5)) { fhem("set LICHT off") } }</code> | :<code>define a2 at *00:01:00 { if ((($wday == 3) && ($hour >= 18)) || ($hour < 5)) { fhem("set LICHT off") } }</code> | ||
:'''Achtung''': dieser Befehl schaltet '''mittwochs''' ab 18:00 und '''jeden Tag''' vor 5:00 | :'''Achtung''': dieser Befehl schaltet '''mittwochs''' ab 18:00 und außerdem '''jeden Tag''' vor 5:00 | ||
== if-else-Bedingung == | == if-else-Bedingung == | ||
Zeile 27: | Zeile 27: | ||
Wenn mehrere Bedingungen ausgeführt werden sollen: | Wenn mehrere Bedingungen ausgeführt werden sollen: | ||
:<code>define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem("set Funkschalter on;; set FHT80B desired-temp 21") }}</code> | :<code>define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem("set Funkschalter on;; set FHT80B desired-temp 21") }}</code> | ||
:Die beiden Bedingungen müssen nun mit zwei Semikola getrennt werden, da Perl vor der Übergabe an | :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 == | |||
* [[Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen|Struktur von "else if"-Verzweigungen]] | |||
* In Artikel zu notify sind ab [[Notify#Eine_PV-Anlage_.28Solarstrom.29_zur_Steuerung_der_Rollos_nutzen_.28optional_Zeit_und_Datums_abh.C3.A4ngig.29|hier]] weitere Beispiele für bedingte Befehlsausführungen enthalten. | |||
* Noch weitergehende Möglichkeiten sind in [[99 myUtils anlegen]] dargestellt. | |||
[[Kategorie:HOWTOS]] | [[Kategorie:HOWTOS]] |
Aktuelle Version vom 19. April 2018, 15:13 Uhr
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.