If-condition: Unterschied zwischen den Versionen

Aus FHEMWiki
("Im Aufbau" entfernt, Links ergänzt)
 
(10 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Hier entsteht eine Erklärung über die richtige Benutzung von IF-Bedingungen
{{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 möglichst vielen Beispielen erläutert werden.
== Einfache if-Bedingung ==
 
:<code>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { fhem(&quot;set Funkschalter on&quot;) }}</code>
== einfache If-Bedingung ==
* Die äusseren geschweiften Klammern sagen FHEM, dass innerhalb Perl-Befehle ausgeführt werden.
<nowiki>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { fhem(&quot;set Funkschalter on&quot;) }}</nowiki>
* Das Wort '''if''' leitet die Bedingung ein.
* 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 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 Perlcode besteht nun wiederum aus der anweisung, einen fhem-Befehl auszuführen. Dieser wird zwischen die runden Klammern in Anführungsstriche gesetzt.
* 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 ==


<nowiki>define a2 at *00:01:00 { if ($wday == 3) || ($wday == 4)  { fhem("set LICHT off") } }</nowiki>
== Komplexere if-Bedingung ==
* mit den zwei senkrechten Strichen wird ein "oder" formuliert. (Also nur Mittwoch ODER Donnerstag schalten)
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 (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 "&" 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 außerdem '''jeden Tag''' vor 5:00


<nowiki>define a2 at *00:01:00 { if ($wday == 3) && ($hour > 18 || $hour < 5) { fhem("set LICHT off") } }</nowiki>
== if-else-Bedingung ==
* 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 einschalten at +*00:15 {if(Value("Variable") eq "on") { fhem(&quot;set Funkschalter on&quot;) } else { fhem(&quot;set funkschalter off&quot;)}}</code>


== If-Else-Bedingung ==
Wenn mehrere Bedingungen ausgeführt werden sollen:
<nowiki>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { 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;; set FHT80B desired-temp 21&quot;) }}</code>
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.


<nowiki>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { fhem(&quot;set Funkschalter on;; set FHT80B desired-temp 21&quot;) }</nowiki>
== Links ==
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.
* [[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

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