Klammerebenen: Unterschied zwischen den Versionen

Aus FHEMWiki
KKeine Bearbeitungszusammenfassung
K (FHEM alles gross)
Zeile 1: Zeile 1:
Nachdem das Thema im Forum zum xten mal aufkam, hier ein schneller Stub zum Thema Klammern und Mischen von Perl und Fhem Kommandos.
Nachdem das Thema im Forum zum xten mal aufkam, hier ein schneller Stub zum Thema Klammern und Mischen von Perl und FHEM Kommandos.


Fhem kennt einges an Befehlen um Aktoren zu Schalten und auf Dinge zu reagieren. Es konnte aber anfänglich insbesondere keine komplexeren Operationen wie "if...else". Wollte man diese nutzen, muss man Fhem mit Perl-Einzeilern versehen.
FHEM kennt einiges an Befehlen um Aktoren zu Schalten und auf Dinge zu reagieren. Es konnte aber anfänglich insbesondere keine komplexeren Operationen wie "if...else". Wollte man diese nutzen, muss man FHEM mit Perl-Einzeilern versehen.


Die Perl Ebene wird mittels geschweifter Klammern aufgerufen: { }
Die Perl Ebene wird mittels geschweifter Klammern aufgerufen: { }


INNERHALB von Perlausdrücken will man aber oft doch Fhem Kommandos ausführen. Dazu muss man Perl mitteilen, dass diese Kommandos an Fhem übergeben werden sollen. Dies macht man durch den Ausdruck:
INNERHALB von Perl-Ausdrücken will man aber oft doch FHEM Kommandos ausführen. Dazu muss man Perl mitteilen, dass diese Kommandos an FHEM übergeben werden sollen. Dies macht man durch den Ausdruck:
  {fhem("  ")}
  {fhem("  ")}
Fhem Befehle innerhalb von Perlausdrücken müssen "Escaped" werden (verdoppelt). Mehr dazu hier: [[Escapen_in_Perlbefehlen]].
FHEM Befehle innerhalb von Perl-Ausdrücken müssen "Escaped" werden (verdoppelt). Mehr dazu hier: [[Escapen_in_Perl-Befehlen]].


Ein kompletter Ausdruck mit Perl und Fhem gemischt hat daher diese Form:
Ein kompletter Ausdruck mit Perl und FHEM gemischt hat daher diese Form:


define ''Name'' notify ''Ereignis''  {''''ab hier Perl-Code'''' { fhem(" ''hier Fhem Kommandos, escapen nicht vergessen'' ")} }
define ''Name'' notify ''Ereignis''  {''''ab hier Perl-Code'''' { fhem(" ''hier FHEM Kommandos, escapen nicht vergessen'' ")} }




Konkretes Beispiel: Es soll ein Garagentor geöffnet werden, aber nur wenn es vorher auch wirklich zu war. Dazu wird mittels des Perl Befehls "if" geprüft ob das Tor zu ist. Wenn ja (Value("Einfahrt") eq "Closed"), dann wird der Toraktor eingeschaltet, ausserdem einen Kontrollleuchte.
Konkretes Beispiel: Es soll ein Garagentor geöffnet werden, aber nur wenn es vorher auch wirklich zu war. Dazu wird mittels des Perl Befehls "if" geprüft ob das Tor zu ist. Wenn ja (Value("Einfahrt") eq "Closed"), dann wird der Toraktor eingeschaltet, außerdem einen Kontrollleuchte.


  define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed") { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }
  define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed") { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }
Zeile 23: Zeile 23:
  define act_on_Einfahrt_AUF notify Einfahrt_AUF { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }
  define act_on_Einfahrt_AUF notify Einfahrt_AUF { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }


Da Perl hier nur dazu verwendet wird ohne weitere Bedingung Kommandos an Fhem weiterzureichen, ist dies nur eine besonders komplizierte Schreibweise von
Da Perl hier nur dazu verwendet wird ohne weitere Bedingung Kommandos an FHEM weiterzureichen, ist dies nur eine besonders komplizierte Schreibweise von


  define act_on_Einfahrt_AUF notify Einfahrt_AUF set Tor_Aktor on ; set Kontrollampe on
  define act_on_Einfahrt_AUF notify Einfahrt_AUF set Tor_Aktor on ; set Kontrollampe on


Inzwischen ist Fhem um den relativ mächtigen Befehl DOIF erweitert, der die meisten Fälle von bedingten Aktionen ohne Perl abbildbar macht. Es gibt aber dennoch Fälle, wo Perl die einzige Möglichkeit bleibt bestimmte Aktionen durchzuführen.
Inzwischen ist FHEM um den relativ mächtigen Befehl DOIF erweitert, der die meisten Fälle von bedingten Aktionen ohne Perl abbildbar macht. Es gibt aber dennoch Fälle, wo Perl die einzige Möglichkeit bleibt bestimmte Aktionen durchzuführen.




[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]

Version vom 17. März 2019, 23:57 Uhr

Nachdem das Thema im Forum zum xten mal aufkam, hier ein schneller Stub zum Thema Klammern und Mischen von Perl und FHEM Kommandos.

FHEM kennt einiges an Befehlen um Aktoren zu Schalten und auf Dinge zu reagieren. Es konnte aber anfänglich insbesondere keine komplexeren Operationen wie "if...else". Wollte man diese nutzen, muss man FHEM mit Perl-Einzeilern versehen.

Die Perl Ebene wird mittels geschweifter Klammern aufgerufen: { }

INNERHALB von Perl-Ausdrücken will man aber oft doch FHEM Kommandos ausführen. Dazu muss man Perl mitteilen, dass diese Kommandos an FHEM übergeben werden sollen. Dies macht man durch den Ausdruck:

{fhem("  ")}

FHEM Befehle innerhalb von Perl-Ausdrücken müssen "Escaped" werden (verdoppelt). Mehr dazu hier: Escapen_in_Perl-Befehlen.

Ein kompletter Ausdruck mit Perl und FHEM gemischt hat daher diese Form:

define Name notify Ereignis {'ab hier Perl-Code' { fhem(" hier FHEM Kommandos, escapen nicht vergessen ")} }


Konkretes Beispiel: Es soll ein Garagentor geöffnet werden, aber nur wenn es vorher auch wirklich zu war. Dazu wird mittels des Perl Befehls "if" geprüft ob das Tor zu ist. Wenn ja (Value("Einfahrt") eq "Closed"), dann wird der Toraktor eingeschaltet, außerdem einen Kontrollleuchte.

define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed") { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }


Sinnlos sind mitunter anzutreffende Konstruktionen wie etwa:

define act_on_Einfahrt_AUF notify Einfahrt_AUF { fhem("set Tor_Aktor on ;; set Kontrollampe on")} }

Da Perl hier nur dazu verwendet wird ohne weitere Bedingung Kommandos an FHEM weiterzureichen, ist dies nur eine besonders komplizierte Schreibweise von

define act_on_Einfahrt_AUF notify Einfahrt_AUF set Tor_Aktor on ; set Kontrollampe on

Inzwischen ist FHEM um den relativ mächtigen Befehl DOIF erweitert, der die meisten Fälle von bedingten Aktionen ohne Perl abbildbar macht. Es gibt aber dennoch Fälle, wo Perl die einzige Möglichkeit bleibt bestimmte Aktionen durchzuführen.