Heizung mit Bewegungsmelder steuern
Aufgabe:
In einem Raum soll die Heizung automatisch bei Anwesenheit einer Person hochgefahren werden. Ist niemand im Raum, soll die Heizung herunter geregelt werden. Zu bestimmten Zeiten (z.b. Nachts) soll die Regelung jedoch nicht stattfinden.
Voraussetzungen:
Die beschriebene Lösung geht davon aus, dass der Raum über einen FS20 PIRA Infrarot-Bewegungsmelder oder ggf. ähnliche Homematic Bewegungsmelder realisiert.
Diese Komponenten sind in fhem.cfg zunächst einzurichten:
FHT80b
define hzg_wz FHT 060e attr hzg_wz IODev CUL1 attr hzg_wz room Wohnzimmer attr hzg_wz lazy define wz_log FileLog /mnt/array1/fhem/wz-%Y-%U.log hzg_wz:.*(measured-temp|actuator).* attr wz_log archivedir /mnt/array1/fhem/old_logs attr wz_log logtype fht attr wz_log nrarchive 0 attr wz_log room Wohnzimmer define wl_1 weblink fileplot wz_log:fht:CURRENT attr wl_1 room Wohnzimmer
Erläuterungen
060e ist die (Beispiel)Adresse des FHT80b
Die Zuweisung eines IODev (hier Beispielsweise CUL1) ist nur notwendig, wenn es mehrere Funkadapter aka "Zentrale" gibt.
Bei Steuerung des FHT80b mittels Bewegungsmelder ist unbedingt der lazy-mode zu verwenden, da bei Bewegung im Raum sonst innerhalb von wenigen Minuten die 1% Regel überschritten wird.
Die folgenden Zeilen dienen der Einrichtung eines Logfiles und der Anzeige des Temperaturverlaufs durch einen Graphen. Sie sind optional und für die Funktion nicht notwendig.
PIRI
define PIRI_WZ FS20 <Hauscode> <Addr.> attr PIRI_WZ room Wohnzimmer attr PIRI_WZ follow-on-for-timer 3072 define wz_piri_log FileLog /mnt/array1/fhem/PIRI_WZ-%Y-%U.log PIRI_WZ attr wz_piri_log archivedir /mnt/array1/fhem/old_logs attr wz_piri_log logtype fht attr wz_piri_log nrarchive 0 attr wz_piri_log room Wohnzimmer_oben define wl_10 weblink fileplot wz_piri_log:piri:CURRENT attr wl_10 room Wohnzimmer_oben
Erläuterungen
Hier wird von einem FS20 PIRA ausgegangen, die Definition ist bei anderen Bewegungsmelder aber grundsätzlich nicht anders. <Hauscode> <Addr.> ist die im PIRI eingetragende Adresse und Hauscode.
"follow-on-for-timer 3072" hat keine eigentliche Funktion, sondern diehnt nur dazu, die Anzeige des Zustandes des PIRI im Webfrontend abzubilden. Im Webfrontende steht der PIRI nach einer Auflösung auf ON und würde ohne weiteres so bleiben. Durch "follow-on-for-timer 3072" wird der Zustand im Webfrontende ca. 50 Minuten nach der letzten Auslösung auf OFF gestellt.
Die folgenden Zeilen dienen der Einrichtung eines Logfiles und der Anzeige der Auslösungen durch einen Graphen. Sie sind optional und für die Funktion nicht notwendig.
Der PIRI sollte so eingestellt werden, das er den längstmöglichen Sendeabstand (120 Sekunden) nutzt, um bei Personen im Raum die Anzahl der Funkevents zu reduzieren. D.H. das nach der ersten Auslösung mindestens 120 Sekunden vergehen, bis bei einer weiteren Bewegung eine Event gesendet wird.
Script
Das eigentliche steuernde Script in fhem.cfg:
define WZ_nutzung_on notify PIRI_WZ:on.* {\ if($hour < 1 || $hour >= 7) {\ fhem ("delete reset_hzg_WZ ;; set hzg_wz desired-temp 21 ;; define reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5 ;;;; set PIRI_WZ off")\ }\ }\
Erläuterungen
PIRI_WZ:on.* dient dazu, auch dann auszulösen, wenn das Event des PIRI nicht nur ON ist, sondern wegen eventueller falscher Einstellung des PIRI eine "ON-for-timer"
In der zweiten Zeile wird geprüft, ob es nicht zwischen 1 Uhr nachts und 7 Uhr morgens ist, da Auslösungen in dieser Zeit vermutlich nur zufällig oder einmalige Ereignisse sind, jedoch tatsächlich kein Heizbedarf besteht. Der Einschluss in geschweifte Klammern ist erforderlich, da es sich um einen PERL Expression handelt. Achtung: Dieses Zeitprüfung funktioniert nur, wenn die Startzeit nach 0 Uhr liegt. Ist Mitternacht als Startzeitpunkt vorgesehen, reicht z.B.: if($hour >= 7) als Test.
In der nachfolgenden Zeile wird an FHEM folgendes übergeben:
- delete reset_hzg_WZ
Dieser Teil löscht bei einer eventuellen früheren Auslösung angelegten Reset der Heizung. Dadurch wird die Heizzeit bei jeder Auslösung des PRI erneut auf die definierte Zeit eingestellt, also verlängert. Bei der Erstauslösung führt dies zu einer Fehlermeldung: "please define reset_hzg_WZ first". Dieses Verhalten ist normal und unkritisch. (Es wäre möglich, das "delete" von einer vorherigen Prüfung ob eset_hzg_WZ exisitert abhängig zu machen. Dies brächte aber nur die rein optische Verbesserung, dass die obige Fehlermeldung nicht mehr erscheint. Funktional ergibt sich kein Vorteil.)
- set hzg_wz desired-temp 21
Stellt die Heizung auf die gewünschte Temperatur, hier 21 Grad.
- define reset_hzg_WZ at +01:30
Definiert den Reset der Heizung. Hier soll eine Stunde und 30 Minuten nach der letzten Auslösung (+1:30) die Heizung ausgeschaltet werden:
- set hzg_wz desired-temp 13.5
und zwar auf 13,5 Grad. Ausserdem wird noch mit:
- set PIRI_WZ off"
der Zustand des PIRIs auf OFF gestellt. Dies hat rein optische Gründe und soll - ähnlich wie bei der Definition des PIRI "follow-on-for-timer 3072" - nur sicherstellen, das in der Weboberfläche ersichtlich ist, dass der PIRI seit einiger Zeit nicht mehr ausgelöst wurde. Streng genommen ist nur ein der beiden Aktionen erforderlich.
Zu beachten ist, dass die ";" zwischen den Befehlen doppelt "escaped" werden müssen.
{fhem ("Befehl A ;; Befehl B ;; define XY at +01:30 Befehl C ;;;; Befehl D")}
bedeutet, das "Befehl D" ebenso wie Befehl C Teil von "define XY at" ist und also erst nach 1,5 Stunden ausgeführt wird, wärend
{fhem ("Befehl A ;; Befehl B ;; define XY at +01:30 Befehl C ;; Befehl D")}
bewirken würde, das nur Befehl C später ausgeführt wird, wärend Befehl D sofort nach Befehl B ausgeführt wird.
Die Zeit in "define reset_hzg_WZ at +01:30" stellt einen Kompromiss dar zwischen der Überbrückung "bewegungsarmer" Zeiten (Person sieht z.b. fern und löst für längere Zeit den Bewegungsmelder nicht aus, Heizung soll trotzdem nicht ausgehen) und dem Wunsch, dass möglichst bald nach dem Verlassen des Raumes die Heizung zurückgeregelt wird. Sie sollten den jeweiligen Bedürfnissen angepasst werden (Badezimmer: kurze Zeit , z.b. 10 Minuten, Wohnzimmer lange Zeit, z.B. 1,5 Stunden).
Die im Beispiel vorkommenden Backslashes "\" dienen dem Zeilenabschluss. Beim Schreiben des Beispieles in einer Zeile (funktional gleich, aber unübersichtlicher) sind sie wegzulassen:
define WZ_nutzung_on notify PIRI_WZ:on.* { if($hour < 1 || $hour >= 7) { fhem ("delete reset_hzg_WZ ;; set hzg_wz desired-temp 21 ;; define reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5 ;;;; set PIRI_WZ off") } }