Voraussetzung:
- Anwesenheit wird zyklisch auf den Bus gesendet
- Heizung oder Logik sendet Signal für WW-Bereitung auf den Bus
Features:
- PWM-Modus für die Zirkulationspumpe (z.B. 5 Minuten an, dann 25 Minuten aus)
- Zirkulation nur im bestimmten Zeitraum und bei Anwesenheit
- Bei WW-Bereitung wird auch die Zirkulationspumpe angeschalten
Im Anhang die Dateien als *.zip.
Die *.conf.sample editieren und nach conf.d im Wiregate-Plugin Verzeichnis kopieren. Das .sample muss dann entfernt werden.
Konfigurationsdatei
Zirkulationspumpe.conf.sample
Plugin-Datei
- Anwesenheit wird zyklisch auf den Bus gesendet
- Heizung oder Logik sendet Signal für WW-Bereitung auf den Bus
Features:
- PWM-Modus für die Zirkulationspumpe (z.B. 5 Minuten an, dann 25 Minuten aus)
- Zirkulation nur im bestimmten Zeitraum und bei Anwesenheit
- Bei WW-Bereitung wird auch die Zirkulationspumpe angeschalten
Im Anhang die Dateien als *.zip.
Die *.conf.sample editieren und nach conf.d im Wiregate-Plugin Verzeichnis kopieren. Das .sample muss dann entfernt werden.
Konfigurationsdatei
Zirkulationspumpe.conf.sample
Code:
###Ansteuerung einer Zirkulationspumpe #Die Pumpe wird im PWM-Modus betrieben, also innerhalb der eingestellten Zykluszeit (base_time) #fuer X-Prozent (on_perc) einmal eingeschalten. #Weiterhin erfolgt die Zuschaltug nur im angegebenen Zeitfenster (start/end) und #bei Anwesenheit (praesenz_ga = 1). #Bei der Warmwasserbereitung wird die die Zirkulationspumpe dauerhaft eingeschaltet #um auch das Wasser in der Leitung mit zu erw‰rmen. #Dafuer muss die Signalisierung der Warmwasserbereitung #ueber die GA (ww_ga) mit einem einstellbaren Wert (ww_ga_val) erfolgen. # # $zirk_ga -> Gruppenadresse der Zirkulationspumpe # Aktor muss bei 0 ausschalten und bei 1 anschalten # DPT sollte im WG hinterlegt sein bzw. DPT 1.001 # # $praesenz_ga -> Gruppenasdresse welche zyklisch die Anwesenheit sendet # 0 = Abwesend 1 = Anwesend # DPT sollte im WG hinterlegt sein bzw. DPT 1.001 # # $start -> Uhrzeit zum Start der Zirkulationsbereitschaft # Format: 'hh:mm' # # $end -> Uhrzeit zum Ende der Zirkulationsbereitschaft # Format: 'hh:mm' # # $base_time -> Zykluszeit des PWM-Modus in Minuten # Bei z.B. 60 Minuten Zykluszeit und 50 % Einschaltdauer ($on_perc) # wird die Pumpe 30 Minuten angeschalten und 30 Minuten ausgeschalten # Bei z.B. 30 Minuten Zykluszeit und 50 % Einschaltdauer ($on_perc) # wird die Pumpe 15 Minuten angeschalten und 15 Minuten ausgeschalten # # $on_perc -> Anschaltzeit des PWM-Modus in Prozent # Bei z.B. 60 Minuten Zykluszeit ($base_time) und 25 % Einschaltdauer # wird die Pumpe 15 Minuten angeschalten und 45 Minuten ausgeschalten # Bei z.B. 30 Minuten Zykluszeit ($base_time) und 10 % Einschaltdauer # wird die Pumpe 3 Minuten angeschalten und 27 Minuten ausgeschalten # # $ww_ga -> Gruppenasdresse welche den Status der Warmwasserbereitung der Heizung sendet # DPT muss im WG hinterlegt sein !!! # Die Heizung oder eine Logik muss Ihren Status auf den Bus senden der Wert fuer die # W-Bereitung wird in $ww_ga_val eingetragen # ueber einen Binaereingang lassen sich z.B. auch Waermepumpen ohne KNX-Anbindung auswerten # Beispiel: BE1 = Kompressor, BE2 = Umschaltventil (Heizen/WW), BE3 = Solepumpe # externe Logik: WENN Kompressor = "an" UND Umschaltventil = "WW" UND Solepumpe = "an" DANN Sende WW=1 # # $ww_ga_val -> Wert der von der Heizung oder Logik bei WW-Bereitung gesendet wird # DPT sollte im WG hinterlegt sein bzw. DPT 1.001 ### VARIABLEN DIE DEFINIERT WERDEN MueSSEN ### $zirk_ga = '0/5/5'; #GA Zirkulationspumpe $praesenz_ga = '0/7/0'; #GA fuer Meldung der Praesenz $start = '7:00'; #Startzeit Zirkulationsbereitschaft $end = '22:30'; #Endzeit Zirkulationsbereitschaft $base_time = 30; #Zykuluszeit in Minuten $on_perc = 15; #Einschaltdauer in Prozent $ww_ga = '0/5/0'; #GA fuer Statusuebertragung Heizung $ww_ga_val = '2'; #Wert fuer WW-Bereitung von GA ### ENDE ###
Code:
###Zirkulationspumpe #v0.1 2012-07-29 #JuMi2006 - > https://knx-user-forum.de ### MAIN ### # Variablen definieren my $time = time(); my $ww; my($zirk_ga,$praesenz_ga,$start,$end,$base_time,$on_perc,$ww_ga,$ww_ga_val); &readConf; $plugin_subscribe{$ww_ga}{$plugname} = 1; $plugin_info{$plugname.'_cycle'} = 60; ### CHECK PRAESENZ my $praesenz = knx_read($praesenz_ga,300); ### CHECK ZEITFENSTER my $allowtime = &check_time; ### CHECK WARMWASSERBEREITUNG if (knx_read($ww_ga,300) == $ww_ga_val) { my $ww = 1; }else{} ### MAIN / VERARBEITUNG if ($ww == 1) { #Zirkulation waehrend WW-Bereitung knx_write($zirk_ga,1,1.001); } else { if ($praesenz == 1 and $allowtime == 1) { #PWM Zirkulation wenn Anwesenheit, im Zeitfenster und keine WW-Bereitung & pwm; }else{ #Kein Zirkulation wenn Abwesenheit, ausserhalb Zeitfenster und keine WW-Bereitung knx_write($zirk_ga,0,1.001); } } #-------------S U B S -------------# ### ZEITABFRAGE ### sub check_time{ use Time::Local; my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday) = localtime(); my ($sh,$sm,$eh,$em); my $allowtime = (); if ($start =~/(\w{1,})\:(\w{1,})/) { $sh = $1; $sm = $2; } if ($end =~/(\w{1,})\:(\w{1,})/) { $eh = $1; $em = $2; } my $su = timelocal (0,$sm,$sh,$day,$mon,$year); #Start-Zeit in Unixzeit my $eu = timelocal (0,$em,$eh,$day,$mon,$year); #End-Zeit in Unixzeit my $time = time (); ##Startzeit vor Endzeit z.B. 14-18 Uhr if ($sh <= $eh) #Startzeit vor Endzeit z.B. 14-18 Uhr { if ($time < $eu && $time > $su) { $allowtime = 1; }else{} if ($sm > $em && $sh == $eh) { $allowtime = 1; }else{} } ##Startzeit nach Endzeit z.B. 18-7 Uhr if ($sh > $eh) #Startzeit nach Endzeit z.B. 18-7 Uhr { if ($time > $su) { $allowtime = 1; }else{} if ($time < $eu) { $allowtime = 1; }else{} } return $allowtime; } ### PWM ### sub pwm{ my $on_time = (($base_time/100)*$on_perc); my $off_time = ($base_time - $on_time); $on_time *= 60; #Minuten in Sekunden umrechnen $off_time *= 60; #Minuten in Sekunden umrechnen if ($plugin_info{$plugname.'_state'} eq 'pwm-off') #status = aus { if (($plugin_info{$plugname.'_stat-time'} + $off_time) <= $time) #zyklus aus ist vorbei { #ANSCHALTEN knx_write($zirk_ga,1,1.001); #STATUS = EIN setzen $plugin_info{$plugname.'_state'} = 'pwm-on'; #ANZEIT = jetzt $plugin_info{$plugname.'_stat-time'} = $time; } else {} } else {} if ($plugin_info{$plugname.'_state'} eq 'pwm-on') #status = an { if (($plugin_info{$plugname.'_stat-time'} + $on_time) <= $time) #zyklus an ist vorbei { #AUSCHALTEN knx_write($zirk_ga,0,1.001); #STATUS = AUS setzen $plugin_info{$plugname.'_state'} = 'pwm-off'; #AUSZEIT = JETZT $plugin_info{$plugname.'_stat-time'} = $time; } else {} } else {} if ( ($plugin_info{$plugname.'_stat-time'} + $on_time + $off_time) <= $time) { #ANSCHALTEN knx_write($zirk_ga,1,1.001); #STATUS = EIN setzen $plugin_info{$plugname.'_state'} = 'pwm-on'; #ANZEIT = jetzt $plugin_info{$plugname.'_stat-time'} = $time; plugin_log($plugname, "INITIALISIERUNG nach Abwesenheit"); } else {} } ### READ CONF ### sub readConf { my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf'; if (! -f $confFile) { plugin_log($plugname, "no conf file [$confFile] found."); } else { #plugin_log($plugname, "reading conf file [$confFile]."); open(CONF, $confFile); my @lines = <CONF>; close($confFile); my $result = eval("@lines"); #($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]"); if ($@) { plugin_log($plugname, "ERR: conf file [$confFile] returned:"); my @parts = split(/\n/, $@); plugin_log($plugname, "--> $_") foreach (@parts); } } }
Kommentar