If-condition: Unterschied zwischen den Versionen
Hasi (Diskussion | Beiträge)  | 
				 (Formatierung überarbeitet; Klammersetzung korrigiert lt. Forumeintrag http://forum.fhem.de/index.php/topic,20603)  | 
				||
| Zeile 3: | Zeile 3: | ||
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.  | ||
==   | == Einfache If-Bedingung ==  | ||
:<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  | ||
* 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 Perlcode besteht nun wiederum aus der   | * Der Perlcode 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!  | Achtung Klammersetzung! Hiermit wird das komplette Verhalten beeinflusst!  | ||
* mit den zwei senkrechten Strichen wird ein "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>  | |||
* mit den zwei   | * 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>  | |||
* Ä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>  | ||
:'''Achtung''': dieser Befehl schaltet '''mittwochs''' ab 18:00 und '''jeden Tag''' vor 5:00  | |||
== If-Else-Bedingung ==  | == If-Else-Bedingung ==  | ||
:<code>define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem("set Funkschalter on") } else { fhem("set funkschalter off")}}</code>  | |||
Wenn mehrere Bedingungen ausgeführt werden sollen:  | |||
Die beiden Bedingungen müssen nun mit zwei Semikola getrennt werden, da   | :<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 Fhem den Befehl übersetzt und dabei das eine Semikolon entfernt.  | |||
[[Kategorie:HOWTOS]]  | [[Kategorie:HOWTOS]]  | ||
Version vom 23. Februar 2014, 09:40 Uhr
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
 - In den folgenden geschweifen Klammern steht ebenfalls Perl-Code, der ausgeführt wird, falls die Bedingung zutrifft.
 - Der Perlcode 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 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.