|
From: <jum...@us...> - 2012-08-13 12:55:28
|
Revision: 950
http://openautomation.svn.sourceforge.net/openautomation/?rev=950&view=rev
Author: jumi2006
Date: 2012-08-13 12:55:20 +0000 (Mon, 13 Aug 2012)
Log Message:
-----------
Ansteuerung einer Zirkulationspumpe bei Pr?\195?\164senz, Zeitfenster und WW-Bereitung.
Added Paths:
-----------
wiregate/plugin/generic/Zirkulationspumpe
wiregate/plugin/generic/conf.d/Zirkulationspumpe.conf_sample
Added: wiregate/plugin/generic/Zirkulationspumpe
===================================================================
--- wiregate/plugin/generic/Zirkulationspumpe (rev 0)
+++ wiregate/plugin/generic/Zirkulationspumpe 2012-08-13 12:55:20 UTC (rev 950)
@@ -0,0 +1,168 @@
+###Zirkulationspumpe
+#v0.1 2012-07-29
+#JuMi2006 - > http://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);
+ }
+ }
+return;
+#-------------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);
+ }
+ }
+}
Property changes on: wiregate/plugin/generic/Zirkulationspumpe
___________________________________________________________________
Added: svn:eol-style
+ native
Added: wiregate/plugin/generic/conf.d/Zirkulationspumpe.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Zirkulationspumpe.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/Zirkulationspumpe.conf_sample 2012-08-13 12:55:20 UTC (rev 950)
@@ -0,0 +1,60 @@
+###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\xE4rmen.
+#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 ###
Property changes on: wiregate/plugin/generic/conf.d/Zirkulationspumpe.conf_sample
___________________________________________________________________
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|