Escapen in Perlbefehlen

Aus FHEMWiki
Version vom 31. Januar 2018, 12:37 Uhr von Baumbuwe (Diskussion | Beiträge) (Vorlage Link2CmdRef)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
Info green.pngDie Verdopplung der ; bei Perl-Einzeilern ist nur bei der Direktbearbeitung der fhem.cfg notwendig. Wird die fhem.cfg -wie empfohlen- über das "Befehl-Eingabefenster" und die "Objektdetails" bearbeitet, ist die hier angegebene Anzahl an Semikola daher jeweils zu halbieren (Siehe auch Heimautomatisierung mit Fhem V. 4.0, S. 38).

Um in FHEM auch komplexere Aufgaben lösen zu können, lassen sich Perl "Einzeiler" einbinden. Diese werden mit geschweiften Klemmern gekennzeichnet: { } Innerhalb dieser Perl Einzeiler können dann Perl Funkion wie Wochentagsabfragen, if/else statements, Vergleiche etc genutzt werden.

Innerhalb der geschweiften Klammern kann man mit der Funktion fhem() Strings an Fhem zurück geben, die dann Fhem als Befehl ausführt.

In Perl werden Kommandos durch eine ; abgetrennt.

In den Perl Einzeilern innerhalb Fhem müssen diese "Escaped" (letztlich verdoppelt) werden.

{fhem ("set Lampe1 on ;; set hzg_wz desired-temp 21")}

Dies führt mitunter zu etwas unübersichtlichen Situationen. Soll in einem Perl Einzeiler zunächst ein Fhem Befehl ausgeführt werden, und dann per Fhem "define" zu z.b. einem späteren Zeitpunkt eine Kette weiterer Befehle, so kann es notwendig sein, doppelt zu escapen:

Angenommen, es soll innerhalb eines Perl Einzeiler folgendes geschehen:

  • Lampe1 soll sofort angeschaltet werden
  • Lampe2 soll sofort angeschaltet werden.

und ausserdem soll mittels "define ... at +01:00 in einer Stunde

  • Lampe3 angeschaltet werden.
  • Lampe4 angeschaltet werden.

so muss das Konstrukt in etwa so aussehen:

{fhem ("set Lampe1 on ;; set Lampe2 on ;; 
define LampeSpaeterAn at +01:00 set Lampe3 on ;;;; set Lampe4 on")}

Vergisst man das doppelte escapen zwischen Lampe3 und Lampe4 ergibt sich folgendes

{fhem ("set Lampe1 on ;; set Lampe2 on ;; 
define LampeSpaeterAn at +01:00 set Lampe3 on ;; set Lampe4 on")}

Dies würde als Folge haben, Lampe1, Lampe2 und Lampe 4 sofort eingeschaltet würden und nur Lampe3 später angeschaltet würde.


Ein Beispiel zur Anwendung des Doppelten Escapens finde sich hier: Heizung mit Bewegungsmelder steuern, Trick der Woche#Mehrere Geräte zugleich schalten

Weiteres und Details hier: Perlsektion in der FHEM commandref