Einmal 42 und zurück > Programmierung > FHEM: Zufällige Zeit-Offsets
FHEM: Zufällige Zeit-Offsets
Möchte man sein Haus automatisieren, stehen einem ein ganzer Zoo von verschiedenen Systemen zur Verfügung: HomeMatic, FS20, EnOcean, Peha, KNX und viele mehr. Leider haben die Steuerzentralen der einzelenen Systeme eins gemeinsam: Sie können nur Komponenten des eigenen Systems ansprechen und lassen sich schlecht erweitern.
Daher hat Rudolf Koenig mit einigen anderen Entwicklern eine universelle Hausautomatisierungszentrale entwickelt: FHEM. Hiermit lassen sich, wenn man entsprechende Gateways auf die jeweiligen Funksysteme hat, beliebige Systeme anbinden.
Möchte man Rollos automatisieren, so bietet die Sunset-Funktion einen einfachen Weg, bei Sonnenuntergang die Rollos herunterzufahren. So sorgt der Befehl
define Zimmer1.Rollo.Herunter at *{sunset(0,"17:00","22:00")} set Zimmer1.Rollo off
dafür, dass das Rollo Kueche.Rollo bei Sonnenuntergang heruntergefahren wird, jedoch nicht vor 17:00 und nicht nach 22:00.
Macht man das für alle Rollos auf diesem Weg, ergibt sich jedoch ein Problem. Das ganze sieht ziemlich automatisiert aus und taugt für keine 5 Pfennig (ähh…Cent) als Anwesenheitssimulation. Man würde schließlich wenn man anwesend ist, auch nicht alle Rollos gleichzeitig herunterfahren können. Praktisch wäre ein zufälliger Offset. FHEM bietet diese Funktion leider nicht von Haus aus, aber man kann sich schnell so eine Funktion selber bauen:
# Zufälligen Offset auf Zeitstamp addieren/subtrahieren sub time_random_offset { # Eingangs-Zeitstempel in Variable holen my ($timestamp) = shift; # Maximalen Zeitoffset (in Sekunden) in Variable speichern my ($maxoffset) = shift; # Zeitstempel in das interne Format konvertieren: 17:30:09 ==> 17.5025 # Stunden werden als ganze Zahlen gespeichert, minuten als 1/60 und sekunden als 1/3600 my ($t) = hms2h($timestamp); $t += rand() * $maxoffset / 3600; # Zurück in HH:MM:SS konvertieren. return h2hms_fmt($t); };
Diese Funktion packt man z.B. in die 99_myUtils.pm (vor das 1;) und lädt in der FHEM-Weboberfläche mit dem Befehl reload 99_myUtils.pm die Datei neu. Danach kann man den Rollobefehl wie folgt definieren:
define Zimmer1.Rollo.Herunter at *{time_random_offset(sunset(0,"17:00","22:00"),300)} set Zimmer1.Rollo off
define Zimmer2.Rollo.Herunter at *{time_random_offset(sunset(0,"17:00","22:00"),300)} set Zimmer2.Rollo off
Nun fahren die Rollos in beiden Zimmern grob gleichzeitig herunter…z.B. um 17:30 und 17:32, genauso, als würde man die Rollos manuell herunterfahren.