FHEM hat für die Programmierung zahlreiche Variablen schon vordefiniert, auf die man ganz einfach zugreifen kann – zum Beispiel um einen Aktor nur zu bestimmten Zeiten einzuschalten. Wem diese Variablen nicht reichen, der kann aber auch ganz einfach einfache Variablen definieren.
Vordefinierte Variablen in FHEM: $hour, $min, $month…
Diese Variablen stehen automatisch zur Verfügung und können für eigene IF-Bedingungen genutzt werden:
$hour: Die aktuelle Stunde
$min: Die aktuelle Minute
$sec: Die aktuelle Sekunde
$hms: Die Uhrzeit im Format HH:MM:SS
time(): Gibt den akuellen Unix-Timestamp zurück
» Alternative: my $timestamp = time();;
$month: Der aktuelle Monat (1-12, z.B. 9 für September)
$mday: Tag des Monats (1-31)
$year: Das aktuelle Jahr
$yday: Tag des Jahres (1-365)
$wday: Tag der Woche (0 = Sonntag bis 6)
$we: Wochenende (0 für in der Woche, 1 für Wochenende)
$isdst: Sommer- oder Winterzeit
$EVENT: Bei einem Notify: Wert des Events, z.B. "on" oder "off"
Die Werte der Event-Variable ist zusätzlich noch einzeln über die Variablen “$EVTPART0”, “$EVTPART1”, “$EVTPART2” ansprechbar: Enthält der Event nur “on”, enthält nur $EVTPART0 einen Wert (“on”), $EVTPART1 ist leer. Bei längeren Events wie “on-for-timer 15” enthält $EVTPART0 den Wert “on-for-timer” und $EVTPART1 den Wert “15”.
Eigene Variablen in FHEM definieren
Neben den vordefinierten FHEM Variablen kann man auch eigene Variablen definieren und in FHEM nutzen: Soll das nur in einem kurzen Stück Perl Code genutzt werden (nur innerhalb einer “define”-Definition), geht das so:
my $variable = "Mein Text";
my $zahl = 15;
Warum das “my” wichtig ist und wie man es nutzt, zeigen wir in diesem Artikel!
Eigene, globale Variablen in FHEM
Will man aber global Variablen nutzen, die man innerhalb der FHEM Steuerung auch von anderen Geräten oder notifys auslesen oder längerfristig speichern möchte, definiert man zunächst ein dummy-Device in FHEM, dem man später einen Wert geben kann:
define MeineVariable dummy
Diesem Device kann man jetzt einen Wert zuweisen – entweder aus FHEM selbst:
set MeineVariable on
oder aus Perl:
fhem(“set MeineVariable on”);
Auslesen der dummy-Variable:
Möchte man den Wert der frisch angelegten dummy-Variable mit Perl auslesen, geht das über den Befehl “ReadingsVal”:
if(ReadingsVal("Licht_Arbeitszimmer", "state", "") eq "off")) { fhem("set Licht_Arbeitszimmer on");; }
Wie man diesen Code in FHEM eingibt, zeigen wir hier!
So lässt sich mit diesem Beispiel immer abends um 18:00 Uhr das Licht einschalten, wenn es noch nicht an ist – Licht_Arbeitszimmer ist dabei eine Lampe, die sich so einschalten lässt, per ReadingsVal lässt sich der Status abfragen:
define Lichtsteuerung at *18:00:00 {\
if(ReadingsVal("Licht_Arbeitszimmer", "state", "on") eq "off") {\
fhem("set Licht_Arbeitszimmer on");;
}\
}
Man kann einer eigenen Variable aber auch andere Werte als on und off zuweisen, zum Beispiel die Uhrzeit des Sonnenaufgangs und Sonnenuntergangs:
define Uhrzeit_Sonnenaufgang dummy
define Uhrzeit_Sonnenuntergang dummy
define Sonnenaugang_speichern at *09:00:00 {\
my $Sonnenaufgang = sunrise_abs();;\
fhem("set Uhrzeit_Sonnenaufgang $Sonnenaufgang");;\
my $Sonnenuntergang = sunset_abs();;\
fhem("set Uhrzeit_Sonnenuntergang $Sonnenuntergang");;\
}
Auch hier kann man mit “ReadingsVal” wieder auf den Wert zugreifen:
define Licht_abends at *20:00:00 {\
if($hms ge ReadingsVal("Uhrzeit_Sonnenuntergang", "state", "")) { fhem("set Lampe on");; }}