logoFHEM CONTROL 2.0

λ-script - für FHEM

Die für fhem geschaffene Scriptsprache λ-script erlaubt es, eine fhem-Installation komplett zu steuern. Die Syntax der Sprache in die modernen Programmiersprachen Rust und Haskell angelehnt. Sie ist so in FHEM eingebunden, das auf Änderungen in den Devices reagiert werden kann. Prozesse können zu bestimmten Zeitpunkten oder nach einer definierten Wartezeit gestartet werden. Den vordefinierten Funktionen können Neue zugefügt werden. Die Möglichkeit Klassen zu definieren, erlaubt es, Devices zu Gruppen zusammenzufassen und mit speziell definierten Kommandos anzusprechen.

script
Scriptbeispiel 3 in einer FHEM-Installation

Readings von fhem-Devices können ausgelesen und mit ihnen arithmetische Berechnungen und Vergleiche durchgeführt werden. Die Programmierung von Schleifen und Wiederholungen ist möglich. Ein Script kann in einen Wartezustand gehen. Der wird zu einem definierten Zeitpunkt beendet, oder nach dem Ablauf einer Zeitspanne, oder nachdem sich der Zustand von Devices bzw. Variablen geändert hat.

Komplexe Steuerungsaufgaben müssen nicht auf mehrere Devices (at, notify, doif, ...) verteilt werden. Die Möglichkeit der Definition eigener Kommandos, die sich harmonisch in die Scriptsprache einfügen, machen λ-scripts für vielschichtige Aufgaben leicht les- und editierbar. Die nachfolgenden Beispielscripte sollen das dokumentieren. Sie zeigen, wie einfach auch komplexere Aufgabenstellungen gelöst werden können.

Beispiele für λ-scripts

Beispiel 1:
log "Hallo Welt";

Schreibt 'Hallo Welt' in die Log-Datei

Beispiel 2:
repeat 3 {
   set WZ_Lampe on;
   wait 0,10;
   set WZ_Lampe off;
   wait 1,0;
}

Dieses Script schaltet das Device WZ_Lampe für 10 Sekunden an. Der Vorgang wird nach einer Minute wiederholt. Insgesamt drei mal.

Beispiel 3:
repeat {
   while [23:00 4:00] {
      wait (random 20 40)'minutes;
      set TreppenhausLicht press short self01;
   };
   wait 23:00'today;
}

Dieses Script betätigt zwischen 23:00 Uhr und 4:00 Uhr in einen zufälligen Abstand von 20 bis 40 Minuten den Treppenhauslichtschalter um Anwesenheit und wach sein zu simulieren.

Beispiel 4:
'(fhemDevice'Lampe1 -> fhemDevice'Lampe2) {
   always Lampe1 Lampe2 {
      wait [Lampe1];
      case
         {case ([Lampe1] ~ /on/ & [Lampe2] !~ /on/) {set Lampe2 on}
         {case ([Lampe1] ~ /off/ & [Lampe2] !~ /off/) {set Lampe2 off}
   }
};

'(fhemDevice'Lampe1 <-> fhemDevice'Lampe2) {
   Lampe1 -> Lampe2; Lampe2 -> Lampe1
);

Flur_Lampe -> WZ_Lampe;
EZ_Lampe <-> K_Lampe;

Dieses Script definiert zwei Funktionen mit denen sich Lampen synchronisieren lassen. Wenn die Eine geschalten wird, wird automatisch auch die Andere geschaltet. Der Aufruf der ersten Funktion synchronisiert das Lampenpaar Flur_Lampe und WZ_Lampe in einer Richtung. Der Aufruf der zweiten Funktion die Lampen EZ_Lampe und K_Lampe in beide Richtungen.

Beispiel 5:
'(moveRollos string'direction) {
   rollos := new stack of fhemDevice;
   rollos << rollo1 rollo2 rollo3;
   wait (random 5)'minutes;
   forEach rollos'shuffle rollo {
      wait (random 20 40)'seconds;
      set rollo direction;
   }
};

repeat {
   case
      ([BM_Garten brightness]'toNumber > 120 & (> 6:30)) {moveRollos "up"}
      ([BM_Garten brightness]'toNumber < 110 | (> 21:30)) {moveRollos "down"}
   };
   wait [BM_Garten brightness] 6:30'today 21:30'today;
}

Steuert Rollläden Rollo1, Rollo2 und Rollo3. Fährt sie am Morgen nach dem hell werden - aber nicht vor 6:30 Uhr hoch. Das Öffnen geschieht mit einer variablen Verzögerung zwischen 0 und 5 Minuten. Die Zeitspanne zwischen dem Öffnen der einzelnen Rollos variiert zwischen 20 und 40 Sekunden. Die Reihenfolge ist ebenfalls zufällig. Die Rollos werden geschlossen, wenn es draußen dunkel ist - aber spätestens 21:30 Uhr. Die Helligkeit wird über das Reading brightness eines außen angebrachten Bewegungsmelder BM_Garten gemessen.