If-condition: Unterschied zwischen den Versionen
Krikan (Diskussion | Beiträge) K (Verlinkung) |
K (Logikkorrektur ("ab 18:00" erfordert einen Größer-gleich-Vergleichsoperator); Typos; Gleichhaltung Schreibweise "Perl-"; Verdeutlichung) |
||
Zeile 1: | Zeile 1: | ||
{{SEITENTITEL:if-condition}} | {{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!}} | {{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!}} | ||
Hier entsteht eine Erklärung über die richtige Benutzung von if-Bedingungen | Hier entsteht eine Erklärung über die richtige Benutzung von if-Bedingungen. | ||
if-Abfragen können Bedingungen prüfen und abhängig davon Befehle ausführen. Die Syntax und die Verwendung sollen an möglichst vielen Beispielen erläutert werden. | if-Abfragen können Bedingungen prüfen und abhängig davon Befehle ausführen. Die Syntax und die Verwendung sollen an möglichst vielen Beispielen erläutert werden. | ||
Zeile 7: | Zeile 7: | ||
== 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 Fhem, dass innerhalb | * 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- | : ([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 "[http://de.selfhtml.org/perl/sprache/operatoren.htm#logisch 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 == |
Version vom 3. März 2015, 17:28 Uhr
Hier wird die Verwendung der Perl-Anweisung if beschrieben. Diese ist nicht mit dem Fhem-Befehl IF zu verwechseln!
Hier entsteht eine Erklärung über die richtige Benutzung von if-Bedingungen.
if-Abfragen können Bedingungen prüfen und abhängig davon Befehle ausführen. Die Syntax und die Verwendung sollen an möglichst vielen Beispielen erläutert werden.
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.