If-condition: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Seitentitel an Perl angepasst / Verlinkung)
("Im Aufbau" entfernt, Links ergänzt)
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
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
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 ==
== Einfache if-Bedingung ==
:<code>define einschalten at +*00:15 { if ( &quot;1&quot; eq &quot;1&quot; ) { fhem(&quot;set Funkschalter on&quot;) }}</code>
:<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
: ([http://de.selfhtml.org/perl/sprache/operatoren.htm#vergleich Perl-Vergleichoperatoren] sind für Zeichen(ketten)- und Zahlenvergleiche unterschiedlich!)
: ([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 ==
== 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. (Also nur Mittwoch ODER Donnerstag schalten):
* 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. (Also nur mittwochs UND auch dann nur zwischen 18:00 und 5:00 Uhr 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>
:<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 29: 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(&quot;set Funkschalter on;; set FHT80B desired-temp 21&quot;) }}</code>
:<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.
: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, 16: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