Heizung mit Bewegungsmelder steuern: Unterschied zwischen den Versionen

Aus FHEMWiki
(→‎Script: auf defmod umgeschrieben)
Zeile 63: Zeile 63:
  <nowiki>define WZ_nutzung_on notify PIRI_WZ:on.* {\
  <nowiki>define WZ_nutzung_on notify PIRI_WZ:on.* {\
  if($hour &lt; 1 || $hour &gt;= 7) {\
  if($hour &lt; 1 || $hour &gt;= 7) {\
   fhem ("delete reset_hzg_WZ&#160;;; set hzg_wz desired-temp 21&#160;;; define reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5&#160;;;;; set PIRI_WZ off")\
   fhem ("set hzg_wz desired-temp 21&#160;;; defmod reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5&#160;;;;; set PIRI_WZ off")\
  }\
  }\
}\</nowiki>
}\</nowiki>
Zeile 77: Zeile 77:


In der nachfolgenden Zeile wird an FHEM folgendes übergeben:
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 reset_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.) Alternativ kann auch der neue Befehl "defmod" verwendet werden.




Zeile 89: Zeile 83:
Stellt die Heizung auf die gewünschte Temperatur, hier 21 Grad.
Stellt die Heizung auf die gewünschte Temperatur, hier 21 Grad.


* define reset_hzg_WZ at +01:30
* defmod 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:
Definiert den Reset der Heizung. Der Befehl "defmod" bewirkt, dass der Reset erzeugt wird, wenn es noch keinen gibt, aber falls der Reset schon angelegt wurde wird er "verlängert", die Zeit also erneut gesetzt. Dadurch wird die Zeit mit jeder Auslösung nach hinten verschoben. 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
* set hzg_wz desired-temp 13.5
Zeile 110: Zeile 104:




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 Zeit in "defmod 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:
Die im Beispiel vorkommenden Backslashes "\" dienen dem Zeilenabschluss. Beim Schreiben des Beispieles in einer Zeile (funktional gleich, aber ggf. unübersichtlicher) sind sie wegzulassen:


define WZ_nutzung_on notify PIRI_WZ:on.* { if($hour &lt; 1 || $hour &gt;= 7) { fhem ("delete reset_hzg_WZ&#160;;; set hzg_wz desired-temp 21&#160;;; define reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5&#160;;;;; set PIRI_WZ off") } }
define WZ_nutzung_on notify PIRI_WZ:on.* { if($hour &lt; 1 || $hour &gt;= 7) { fhem ("set hzg_wz desired-temp 21&#160;;; defmod reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5&#160;;;;; set PIRI_WZ off") } }


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Version vom 24. September 2017, 14:55 Uhr

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 ("set hzg_wz desired-temp 21 ;; defmod 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:


  • set hzg_wz desired-temp 21

Stellt die Heizung auf die gewünschte Temperatur, hier 21 Grad.

  • defmod reset_hzg_WZ at +01:30

Definiert den Reset der Heizung. Der Befehl "defmod" bewirkt, dass der Reset erzeugt wird, wenn es noch keinen gibt, aber falls der Reset schon angelegt wurde wird er "verlängert", die Zeit also erneut gesetzt. Dadurch wird die Zeit mit jeder Auslösung nach hinten verschoben. 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 "defmod 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 ggf. unübersichtlicher) sind sie wegzulassen:

define WZ_nutzung_on notify PIRI_WZ:on.* { if($hour < 1 || $hour >= 7) { fhem ("set hzg_wz desired-temp 21 ;; defmod reset_hzg_WZ at +01:30 set hzg_wz desired-temp 13.5 ;;;; set PIRI_WZ off") } }