Escapen in Perlbefehlen
![Info green.png](/w/images/thumb/0/02/Info_green.png/20px-Info_green.png)
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