
Mit dem kostenlosen Smart Home System FHEM ist es gar kein Problem, auf eine erkannte Bewegung zu reagieren und zum Beispiel ein Licht einzuschalten. In der Regel wird man hier, zum Beispiel mit “on-for-timer” oder “sleep” das Licht für einen gewissen Zeitraum ein- und anschließend automatisch ausschalten. Wird dann wieder eine Bewegung erkannt, schaltet es sich wieder für den gleichen Zeitraum ein.
Passende Bewegungsmelder für FHEM:
Hält man sich aber länger in einem Raum auf, führt das dazu, dass das Licht immer wieder ein- und ausgeschaltet wird. Um das zu umgehen, hilft diese Steuerung: Sie merkt sich, wann die letzte Bewegung erkannt wurde und gleicht die Zeit mit einer frei wählbaren Zeitspanne ab (hier im Beispiel 60 Sekunden): Wurde innerhalb dieser Zeit eine neue Bewegung erkannt, bleibt das Licht eingeschaltet – bis für den gewählten Zeitraum keine Bewegung mehr erkannt wurde.
Unser Beispiel-Code ist direkt aus einem Backup der fhem.cfg Datei kopiert. Wie man eigenen Code in FHEM eingibt und was man dabei beachten muss, zeigen wir hier.
Bewegungsmelder mit FHEM
Im Code werden fünf Devices angelegt – ein weiteres wäre die Lampe, die man einschalten möchte. Die Bewegung wird hier über einen an den Raspberry angeschlossenen IR-Sensor erkannt, alternativ sind aber auch andere Bewegungsmelder möglich.
Das Dummy-Device “BewegungUhrzeit” speichert den aktuellen Timestamp der Bewegung und bekommt bei jeder erkannten Bewegung den neuen Timestamp zugewiesen: Darüber lässt sich nachher feststellen, ob die letzte Bewegung tatsächlich schon den gewählten Zeitraum (im Beispiel 60 Sekunden) her ist.
Ein weiteres Dummy-Device mit dem Namen “recheck” wird ebenfalls bei jeder Bewegung auf “on” gesetzt und mit dem notify “act_on_recheck” überwacht: Dabei wird in 45 Sekunden ein neues Device mit dem Namen “bewegungscheck” erstellt, das prüft, ob die letzte Bewegung schon 60 Sekunden her ist. Wird vorher eine neue Bewegung erkannt, wird das Device gelöscht und wieder neu angelegt, dass es wieder in 45 Sekunden startet:
define BewegungUhrzeit dummy
# GPIO Pin21 für Bewegung definieren
define RPIPin21 RPI_GPIO 21
attr RPIPin21 direction input
attr RPIPin21 interrupt both
# Auf Bewegung reagieren
define act_on_BewegungGPIO notify RPIPin21 {\
if ("$EVENT" ne "off") {\
fhem("set BewegungUhrzeit ".time().";;");;\
fhem("set Lampe on;;");;\
fhem("set recheck on;;");;\
}\
}
define recheck dummy
define act_on_recheck notify recheck {\
if ("$EVENT" ne "off") {\
if(Value('bewegungcheck') ne '') { fhem("delete bewegungcheck;;");; }\
fhem("define bewegungcheck at +00:00:45 { if(ReadingsVal('BewegungUhrzeit', 'state', '') < (time() - 60)) { fhem(\"set Lampe off;;;; delete bewegungcheck;;;; set recheck off;;;;\");;;; } else { fhem(\"set recheck on;;;;\");;;; } }");;\
}\
}
Dieser Code erkennt nun, ob eine Bewegung erfolgt und prüft nach 45 Sekunden, ob die letzte Bewegung schon mindestens 60 Sekunden her ist, ansonsten wird in 45 Sekunden erneut geprüft, da der Dummy “recheck” auf “on” gesetzt wird: Dieser löscht das letzte “bewegungscheck” device und legt es für eine neue Prüfung in 45 Sekunden wieder an, bis keine Bewegung mehr festgestellt wird: Dann wird der Befehl “set Lampe off” ausgeführt um die Lampe auszuschalten und das device “bewegungscheck” wieder gelöscht.