If-condition: Unterschied zwischen den Versionen

Aus FHEMWiki
(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 ==
== Einfache If-Bedingung ==
<nowiki>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { fhem(&quot;set Funkschalter on&quot;) }}</nowiki>
:<code>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { fhem(&quot;set Funkschalter on&quot;) }}</code>
* Die äusseren geschweiften Klammern sagen fhem, dass innerhalb PERL-Befehle ausgeführt werden.
* 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 anweisung, einen fhem-Befehl auszuführen. Dieser wird zwischen die runden Klammern in Anführungsstriche gesetzt.
* 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 ==


== 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):
<nowiki>define a2 at *00:01:00 { if ($wday == 3) || ($wday == 4)  { fhem("set LICHT off") } }</nowiki>
:<code>define a2 at *00:01:00 { if (($wday == 3) || ($wday == 4))  { fhem("set LICHT off") } }</code>
* mit den zwei senkrechten Strichen wird ein "oder" formuliert. (Also nur Mittwoch ODER Donnerstag schalten)
* 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>
<nowiki>define a2 at *00:01:00 { if ($wday == 3) && ($hour > 18 || $hour < 5) { fhem("set LICHT off") } }</nowiki>
* Änderung der Logik durch andere Klammersetzung:
* mit den zwei "&" wird ein "und" formuliert. (Also nur Mittwochs UND Später als 18:00 ODER früher als 5:00  schalten)
:<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
<nowiki>define a2 at *00:01:00 { if ($wday == 3) && ($hour > 18) || ($hour < 5) { fhem("set LICHT off") } }</nowiki>
* !!!Achtung: Dieser Befehl schaltet Mittwochs ab 18:00 und jeden Tag! vor 5:00 !!!!


== If-Else-Bedingung ==
== If-Else-Bedingung ==
<nowiki>define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem(&quot;set Funkschalter on&quot;) } else { fhem(&quot;set funkschalter off&quot;)}}</nowiki>
:<code>define einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem(&quot;set Funkschalter on&quot;) } else { fhem(&quot;set funkschalter off&quot;)}}</code>
wenn mehrere Bedingungen ausgeführt werden sollen:


<nowiki>define einschalten at +*00:15  {if(Value("Variable") eq "on") { fhem(&quot;set Funkschalter on;; set FHT80B desired-temp 21&quot;) }}</nowiki>
Wenn mehrere Bedingungen ausgeführt werden sollen:
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.
:<code>define einschalten at +*00:15  {if(Value("Variable") eq "on") { fhem(&quot;set Funkschalter on;; set FHT80B desired-temp 21&quot;) }}</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, 10: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.