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