|
From: <ma...@us...> - 2012-08-02 17:58:39
|
Revision: 924
http://openautomation.svn.sourceforge.net/openautomation/?rev=924&view=rev
Author: makki1
Date: 2012-08-02 17:58:33 +0000 (Thu, 02 Aug 2012)
Log Message:
-----------
kWh_Zaehler von Netfritz
Modified Paths:
--------------
wiregate/plugin/generic/Uhrzeit-vom-Bus
Added Paths:
-----------
wiregate/plugin/generic/conf.d/kWh_Zaehler.conf
wiregate/plugin/generic/kWh_Zaehler.pl
Modified: wiregate/plugin/generic/Uhrzeit-vom-Bus
===================================================================
--- wiregate/plugin/generic/Uhrzeit-vom-Bus 2012-08-01 20:27:57 UTC (rev 923)
+++ wiregate/plugin/generic/Uhrzeit-vom-Bus 2012-08-02 17:58:33 UTC (rev 924)
@@ -19,17 +19,14 @@
### ENDE DEFINITION ###
#######################
-
-# Plugin an Gruppenadresse "anmelden"
-#$plugin_subscribe{$wert_ga}{$plugname} = 1;
-
my $knxdate = knx_read($datum_ga,1,11);
my ($dummy,$knxtime) = split(" ",knx_read($uhrzeit_ga,1,10));
if ($knxdate and $knxtime) {
my $oldtime = `date \"+%Y-%m-%d %H:%M:%S\"`;
my $newtime = `date --set=\"$knxdate $knxtime\"`;
- $dummy = `hwclock --systohc`;
+ # In RTC schreiben, nur wenn die Uhrzeit nicht zyklisch kommt! Ab PL33 in crontab
+ # $dummy = `hwclock --systohc`;
return "Uhrzeit vom Bus gesetzt: $oldtime -> $newtime";
} else {
return "Fehler beim lesen von Datum/Uhrzeit von $datum_ga / $uhrzeit_ga!";
Added: wiregate/plugin/generic/conf.d/kWh_Zaehler.conf
===================================================================
--- wiregate/plugin/generic/conf.d/kWh_Zaehler.conf (rev 0)
+++ wiregate/plugin/generic/conf.d/kWh_Zaehler.conf 2012-08-02 17:58:33 UTC (rev 924)
@@ -0,0 +1,13 @@
+# kWh_Zaehler.pl - Konfiguration
+#
+# zaehler_F = frei waehlbar F hier Aktor Kanal
+# name => 'trockn' = Trockner wir im Plugin fuers abspeichern gebraucht
+# I_GA=>'1/4/20', = GA vom Aktor die den Stromwert liefert
+# kWh_GA=>'15/0/20' = GA die der kWh Wert auf den Bus schreibt
+# kWh_DPT=>'9'} = DPT der kWh GA
+%zaehler=(
+zaehler_F =>{name => 'trockn', I_GA=>'1/4/20', kWh_GA=>'15/0/20', kWh_DPT=>'9'},
+zaehler_G =>{name => 'waschm', I_GA=>'1/4/15', kWh_GA=>'15/0/18', kWh_DPT=>'9'},
+zaehler_H =>{name => 'spueler', I_GA=>'1/4/16', kWh_GA=>'15/0/19', kWh_DPT=>'9'},
+);
+
Added: wiregate/plugin/generic/kWh_Zaehler.pl
===================================================================
--- wiregate/plugin/generic/kWh_Zaehler.pl (rev 0)
+++ wiregate/plugin/generic/kWh_Zaehler.pl 2012-08-02 17:58:33 UTC (rev 924)
@@ -0,0 +1,55 @@
+# Errechnet die kWhs aus dem Aktor-Strom.
+# Jedesmal wenn ein neuer Stromwert auf der GA gesendet wird
+# wird eine neue Rechnung durchgeführt,
+# gerechnet wird nach dieser Formel
+# kWh = I(mA)/1000*230V* cos_phi * Delta_Zeit s/3600 * 1/1000
+# by NetFritz 07/2012
+# http://knx-user-forum.de/wiregate/21343-kwh-zaehler-aus-dem-aktor-strom.html
+#
+my $cos_phi = 0.95;
+my $Volt = 230;
+my @Zaehler_config;
+$plugin_info{$plugname.'_cycle'} = 0;
+# Konfigurationsfile einlesen
+my $conf=$plugname; $conf=~s/\.pl$/.conf/;
+$conf="/etc/wiregate/plugin/generic/conf.d/$conf";
+my %zaehler=();
+my $err=read_from_config();
+return $err if $err;
+#------------------------------------------------------
+# Alle I_GAs aus der config abonnieren
+for my $r (grep ref($zaehler{$_}), keys %zaehler)
+ {
+ $plugin_subscribe{$zaehler{$r}{I_GA}}{$plugname}=1;
+ }
+# BUS ueberwachen
+if ($msg{'apci'} eq "A_GroupValue_Write") { # A_GroupValue_Write Telegramm eingetroffen
+ for my $r (grep ref($zaehler{$_}), keys %zaehler){ # Ueberwachte GAs durchlaufen
+ if ($msg{'dst'} eq $zaehler{$r}{I_GA}){ # GAs vergleichen
+ my $time_delta = time() - $plugin_info{$plugname.$zaehler{$r}{name} . '_time'};
+ my $I = $plugin_info{$plugname.$zaehler{$r}{name} . '_I'};
+ my $kWh = $plugin_info{$plugname.$zaehler{$r}{name} . '_kWh'} + (($I/1000) * $Volt * $cos_phi * ($time_delta/3600));
+ $plugin_info{$plugname. $zaehler{$r}{name} . '_I'} = $msg{'value'}/1000; # I mA ablegen
+ $plugin_info{$plugname. $zaehler{$r}{name} . '_time'} = time(); # Timestamp ablegen
+ $plugin_info{$plugname. $zaehler{$r}{name} . '_kWh'} = $kWh; # kWh ablegen
+ knx_write($zaehler{$r}{kWh_GA},$kWh*1000,$zaehler{$r}{kWh_DPT});
+ return($zaehler{$r}{kWh_GA} . "=" . $kWh);
+ }
+ }
+}else{
+ for my $r (grep ref($zaehler{$_}), keys %zaehler){ # Ueberwachte GAs durchlaufen
+ # knx_write($zaehler{$r}{kWh_GA},$plugin_info{$plugname.$zaehler{$r}{name} . '_kWh'},$zaehler{$r}{kWh_DPT});
+ }
+}
+#
+return;
+# ------------- config einlesen ----------------------
+sub read_from_config
+ {
+ open CONFIG, "<$conf" || return "no config found";
+ my @lines = <CONFIG>;
+ close CONFIG;
+ eval("@lines");
+ return "config error" if $@;
+}
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
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.
|
|
From: <jum...@us...> - 2012-08-14 06:24:47
|
Revision: 952
http://openautomation.svn.sourceforge.net/openautomation/?rev=952&view=rev
Author: jumi2006
Date: 2012-08-14 06:24:40 +0000 (Tue, 14 Aug 2012)
Log Message:
-----------
only added original autor to header
Modified Paths:
--------------
wiregate/plugin/generic/Nacht-Nachdimmen
wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample
Modified: wiregate/plugin/generic/Nacht-Nachdimmen
===================================================================
--- wiregate/plugin/generic/Nacht-Nachdimmen 2012-08-13 13:16:19 UTC (rev 951)
+++ wiregate/plugin/generic/Nacht-Nachdimmen 2012-08-14 06:24:40 UTC (rev 952)
@@ -1,7 +1,6 @@
-#return;
-#$plugin_info{$plugname.'_cycle'} = 0;
# Nachts Licht nur gedimmt einschalten.
# Plugin h\xF6rt auf GA des Ein-Befehles und schickt Dimmwert hinterher.
+# Autor: kleinklausi -> knx-user-forum.de
# V1.0 2012-07-20
# Minutengenaues dimmen m\xF6glich
# Auslagerung der Konfiguration in .conf file /etc/wiregate/plugin/generic/conf.d
Modified: wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample 2012-08-13 13:16:19 UTC (rev 951)
+++ wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample 2012-08-14 06:24:40 UTC (rev 952)
@@ -1,9 +1,9 @@
-#return;
-#$plugin_info{$plugname.'_cycle'} = 0;
# Nachts Licht nur gedimmt einschalten.
# Plugin h\xF6rt auf GA des Ein-Befehles und schickt Dimmwert hinterher.
+# Autor: kleinklausi -> knx-user-forum.de
# V1.0 2012-07-20
# Minutengenaues dimmen m\xF6glich
+# Auslagerung der Konfiguration in .conf file /etc/wiregate/plugin/generic/conf.d
# JuMi2006 -> knx-user-forum.de
### Definitionen
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jum...@us...> - 2012-08-15 07:01:21
|
Revision: 961
http://openautomation.svn.sourceforge.net/openautomation/?rev=961&view=rev
Author: jumi2006
Date: 2012-08-15 07:01:14 +0000 (Wed, 15 Aug 2012)
Log Message:
-----------
Small cleanup and bugfix -> works !!!
Modified Paths:
--------------
wiregate/plugin/generic/Nacht-Nachdimmen
wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample
Modified: wiregate/plugin/generic/Nacht-Nachdimmen
===================================================================
--- wiregate/plugin/generic/Nacht-Nachdimmen 2012-08-14 20:54:42 UTC (rev 960)
+++ wiregate/plugin/generic/Nacht-Nachdimmen 2012-08-15 07:01:14 UTC (rev 961)
@@ -1,38 +1,38 @@
# Nachts Licht nur gedimmt einschalten.
-# Plugin h\xF6rt auf GA des Ein-Befehles und schickt Dimmwert hinterher.
+# Plugin hoert auf GA des Ein-Befehles und schickt Dimmwert hinterher.
# Autor: kleinklausi -> knx-user-forum.de
-# V1.0 2012-07-20
-# Minutengenaues dimmen m\xF6glich
+
+# V1.0 2012-07-20
+# Minutengenaues dimmen m?glich
# Auslagerung der Konfiguration in .conf file /etc/wiregate/plugin/generic/conf.d
-# update: JuMi2006 -> knx-user-forum.de
+# JuMi2006 -> knx-user-forum.de
# Updates:
-# 20120814, mclb
-# - Umbau auf Liste von Hashes, damit das Plugin auch f\xFCr mehrere Lichter funktioniert.
+# 20120814, mclb -> knx-user-forum.de
+# - Umbau auf Liste von Hashes, damit das Plugin auch fuer mehrere Lichter funktioniert.
### Variablen Einlesen/Deklarieren
use Time::Local;
my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday) = localtime();
my $now = sprintf ("%02d:%02d",$hour,$min);
-my ($lichtein_ga,$lichtdim_ga,$dimvalue,$start,$end);
my ($sh,$sm,$eh,$em);
-my {$su, $eu, $time};
+my ($su, $eu, $time);
my $debug = 0;
my @lichter;
&readConf;
-# Eigenen Aufruf-Zyklus auf 1x t\xE4glich setzen, h\xF6rt ja auf GA
+# Eigenen Aufruf-Zyklus auf 1x t?glich setzen, h?rt ja auf GA
$plugin_info{$plugname.'_cycle'} = 86400;
# Plugin an Gruppenadresse "anmelden"
-foreach $licht (@lichter) {
+foreach my $licht (@lichter) {
$plugin_subscribe{$licht->{gaEin}}{$plugname} = 1;
}
# Zeit nur einmal berechnen
$time = time ();
-foreach $licht (@lichter) {
+foreach my $licht (@lichter) {
if ($licht->{start} =~/(\w{1,})\:(\w{1,})/) {
$sh = $1;
$sm = $2;
@@ -53,13 +53,13 @@
if ($time < $eu && $time > $su) {
#DIMMEN
knx_write($licht->{gaDimm},$licht->{valueDimm},5); # Dimmwert senden
- if ($debug == 1) { plugin_log($plugname,"Gedimmt $now Uhr"); }
+ if ($debug == 1) { plugin_log($plugname,"$licht->{name} gedimmt um $now Uhr"); }
}
if ($sm > $em && $sh == $eh) {
#DIMMEN
knx_write($licht->{gaDimm},$licht->{valueDimm},5); # Dimmwert senden
- if ($debug == 1) { plugin_log($plugname,"Gedimmt $now Uhr"); }
+ if ($debug == 1) { plugin_log($plugname,"$licht->{name} gedimmt um $now Uhr"); }
}
}
@@ -68,13 +68,13 @@
if ($time > $su) {
#DIMMEN
knx_write($licht->{gaDimm},$licht->{valueDimm},5); # Dimmwert senden
- if ($debug == 1) { plugin_log($plugname,"Gedimmt $now Uhr"); }
+ if ($debug == 1) { plugin_log($plugname,"$licht->{name} gedimmt um $now Uhr"); }
}
if ($time < $eu) {
#DIMMEN
knx_write($licht->{gaDimm},$licht->{valueDimm},5); # Dimmwert senden
- if ($debug == 1) { plugin_log($plugname,"Gedimmt $now Uhr"); }
+ if ($debug == 1) { plugin_log($plugname,"$licht->{name} gedimmt um $now Uhr"); }
}
}
}
Modified: wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample 2012-08-14 20:54:42 UTC (rev 960)
+++ wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample 2012-08-15 07:01:14 UTC (rev 961)
@@ -1,14 +1,15 @@
# Nachts Licht nur gedimmt einschalten.
-# Plugin h\xF6rt auf GA des Ein-Befehles und schickt Dimmwert hinterher.
+# Plugin hoert auf GA des Ein-Befehles und schickt Dimmwert hinterher.
# Autor: kleinklausi -> knx-user-forum.de
+
# V1.0 2012-07-20
-# Minutengenaues dimmen m\xF6glich
+# Minutengenaues dimmen m?glich
# Auslagerung der Konfiguration in .conf file /etc/wiregate/plugin/generic/conf.d
# JuMi2006 -> knx-user-forum.de
# Updates:
-# 20120814, mclb
-# - Umbau auf Liste von Hashes, damit das Plugin auch f\xFCr mehrere Lichter funktioniert.
+# 20120814, mclb -> knx-user-forum.de
+# - Umbau auf Liste von Hashes, damit das Plugin auch fuer mehrere Lichter funktioniert.
### Definitionen
### Hier werden die Werte/Gruppenadressen definiert
@@ -18,6 +19,10 @@
# valueDimm: Dimmwert
# start: Zeitpunkt, ab dem gedimmt werden soll (Format: hh:mm)
# end: Zeitpunkt, ab dem nicht mehr gedimmt werden soll (Format: hh:mm)
-push @lichter, { gaEin => "1/2/20", gaDimm => "1/2/23", valueDimm => 15, start => "22:00", end => "6:30" };
-### Ende Definitionen
+push @lichter, { name => "Flur OG", gaEin => "1/2/20", gaDimm => "1/2/23", valueDimm => 20, start => "00:00", end => "16:30" };
+push @lichter, { name => "Flur klein", gaEin => "1/1/20", gaDimm => "1/1/23", valueDimm => 35, start => "00:00", end => "16:30" };
+push @lichter, { name => "Hausflur", gaEin => "1/1/40", gaDimm => "1/1/43", valueDimm => 25, start => "00:00", end => "16:30" };
+
+
+### Ende Definitionen
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jum...@us...> - 2012-08-16 14:16:21
|
Revision: 969
http://openautomation.svn.sourceforge.net/openautomation/?rev=969&view=rev
Author: jumi2006
Date: 2012-08-16 14:16:13 +0000 (Thu, 16 Aug 2012)
Log Message:
-----------
copy of rrd_graph.pl - now using conf.d - now using easier config
Added Paths:
-----------
wiregate/plugin/generic/RRD_creator.pl
wiregate/plugin/generic/conf.d/RRD_creator.conf_sample
Copied: wiregate/plugin/generic/RRD_creator.pl (from rev 968, wiregate/plugin/generic/rrd_graph.pl)
===================================================================
--- wiregate/plugin/generic/RRD_creator.pl (rev 0)
+++ wiregate/plugin/generic/RRD_creator.pl 2012-08-16 14:16:13 UTC (rev 969)
@@ -0,0 +1,42 @@
+# Buswerte in RRD speichern
+# V2.0 2012-08-16
+# Info und Konfiguration in /etc/wiregate/plugin/generic/conf.d/RRD_creator.conf_sample
+# Eigene Konfiguration speichern unter /etc/wiregate/plugin/generic/conf.d/RRD_creator.conf
+# Alternativ \xFCber Webmin -> Plugins -> Pluginname -> config
+
+# Variablen deklarieren
+my @rrds;
+# conf einlsen
+&readConf;
+# Aufrufzyklus = Heartbeat RRD
+$plugin_info{$plugname.'_cycle'} = 300;
+
+# MAIN
+
+foreach my $rrd (@rrds) {
+update_rrd($rrd->{name},"",knx_read($rrd->{ga},300,$rrd->{dpt}));
+#plugin_log($plugname, "triggered $rrd->{name}");
+}
+
+return;
+
+# SUBS
+sub readConf
+{
+ my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+ if (! -f $confFile) {
+
+ } 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);
+ }
+ }
+}
\ No newline at end of file
Added: wiregate/plugin/generic/conf.d/RRD_creator.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/RRD_creator.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/RRD_creator.conf_sample 2012-08-16 14:16:13 UTC (rev 969)
@@ -0,0 +1,55 @@
+# Autor: makki -> http://knx-user-forum.de
+# Update: JuMi2006 -> http://knx-user-forum.de
+# Grafiken in RRD speichern
+
+# Info und Konfiguration in /etc/wiregate/plugin/generic/conf.d/RRD_creator.conf_sample
+# Eigene Konfiguration speichern unter /etc/wiregate/plugin/generic/conf.d/RRD_creator.conf
+# alternativ \xFCber Webmin -> Plugins -> Pluginname -> config
+
+# Beispiel fuer Temperaturwert (DPT9/EIS5)
+# push @rrds, { name => "Temperatur K\xFCche", ga => "7/1/10", dpt => 9};
+
+# Abgerufen koennen die Grafiken durch Modifikation der Grafik-URL eines vorhandenen
+# 1-Wire Sensors werden: z.B. 28.0D22CB010000_temp.rrd im letzten Beispiel durch
+# Temp_Kueche_knx3-1-46.rrd ersetzen. Gross/Kleinschreibung beachten!
+
+### EINSTELLBARE WERTE ###
+
+### Name des RRDs ###
+# name => "FREITEXT"
+# ACHTUNG: Keine Umlaute oder Sonderzeichen (/\: etc) und einmalig!
+###
+
+### Gruppenadresse ###
+# ga => "1/2/3"
+###
+
+### DPT ###
+# dpt => 9
+# DPT 1 (1 bit) = EIS 1/7 (move=DPT 1.8, step=DPT 1.7)
+# DPT 2 (1 bit controlled) = EIS 8
+# DPT 3 (3 bit controlled) = EIS 2
+# DPT 4 (Character) = EIS 13
+# DPT 5 (8 bit unsigned value) = EIS 6 (DPT 5.1) oder EIS 14.001 (DPT 5.10)
+# DPT 6 (8 bit signed value) = EIS 14.000
+# DPT 7 (2 byte unsigned value) = EIS 10.000
+# DPT 8 (2 byte signed value) = EIS 10.001
+# DPT 9 (2 byte float value) = EIS 5
+# DPT 10 (Time) = EIS 3
+# DPT 11 (Date) = EIS 4
+# DPT 12 (4 byte unsigned value) = EIS 11.000
+# DPT 13 (4 byte signed value) = EIS 11.001
+# DPT 14 (4 byte float value) = EIS 9
+# DPT 15 (Entrance access) = EIS 12
+# DPT 16 (Character string) = EIS 15
+###
+
+#### KONFIGURATION ####
+
+push @rrds, { name => "Helligkeit_EG_gr", ga => "3/1/49", dpt => 9};
+push @rrds, { name => "Helligkeit_EG_kl", ga => "3/1/29", dpt => 9};
+push @rrds, { name => "Helligkeit_OG", ga => "3/2/29", dpt => 9};
+push @rrds, { name => "WP_Heizungspumpe_Laufzeit", ga => "0/5/2", dpt => 1};
+push @rrds, { name => "WP_Zirkulation_Laufzeit", ga => "0/5/5", dpt => 1};
+push @rrds, { name => "WP_Solepumpe_Laufzeit", ga => "0/5/3", dpt => 1};
+push @rrds, { name => "WP_Kompressor_Laufzeit", ga => "0/5/4", dpt => 1};
\ No newline at end of file
Property changes on: wiregate/plugin/generic/conf.d/RRD_creator.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.
|
|
From: <pf...@us...> - 2012-11-10 05:46:06
|
Revision: 1112
http://openautomation.svn.sourceforge.net/openautomation/?rev=1112&view=rev
Author: pfry
Date: 2012-11-10 05:45:58 +0000 (Sat, 10 Nov 2012)
Log Message:
-----------
Neue Optionen fetch, eibd_cache, recalc_on_request und transmit_on_startup
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/MissGoogle.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2012-11-09 15:18:18 UTC (rev 1111)
+++ wiregate/plugin/generic/Logikprozessor.pl 2012-11-10 05:45:58 UTC (rev 1112)
@@ -98,8 +98,7 @@
for my $t (keys %logic)
{
- next if $t eq 'debug';
- $t=~s/^_//g;
+ next if $t eq 'debug' || $t=~/^_/;
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
@@ -117,6 +116,12 @@
next;
}
+ if(defined $logic{$t}{fetch} && ref $logic{$t}{fetch} && ref $logic{$t}{fetch} ne 'ARRAY')
+ {
+ plugin_log($plugname, "Config err: \$logic{$t}{fetch} ist weder Skalar noch ARRAY-Referenz ([...]).");
+ next;
+ }
+
if(defined $logic{$t}{state} && ref $logic{$t}{state} && ref $logic{$t}{state} ne 'HASH')
{
plugin_log($plugname, "Config err: \$logic{$t}{state} ist weder Skalar noch HASH-Referenz ({...}).");
@@ -137,7 +142,7 @@
}
# transmit-Adresse abonnieren
- my $transmit=groupaddress($logic{$t}{transmit});
+ my $transmit=groupaddress $logic{$t}{transmit};
$plugin_subscribe{$transmit}{$plugname}=1;
plugin_log($plugname, "\$logic{$t}: Transmit-GA $transmit nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$transmit};
@@ -149,44 +154,39 @@
if($logic{$t}{timer})
{
set_next_call($t, $debug);
- next;
}
- # fuer Nicht-Timer-Logiken: alle receive-Adressen abonnieren (eine oder mehrere)
- my $receive=groupaddress($logic{$t}{receive});
+ # Nun alle receive-Adressen abonnieren (eine oder mehrere)
+ my $receive=groupaddress $logic{$t}{receive};
next unless $receive;
- unless(ref $receive)
- {
- $plugin_subscribe{$receive}{$plugname}=1;
- plugin_log($plugname, "\$logic{$t}: Receive-GA $receive nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$receive};
- }
- else
+ $receive=[$receive] unless ref $receive;
+
+ for my $rec (@{$receive})
{
- for my $rec (@{$receive})
- {
- $plugin_subscribe{$rec}{$plugname}=1;
- plugin_log($plugname, "\$logic{$t}: Receive-GA $rec nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$rec};
- }
+ $plugin_subscribe{$rec}{$plugname}=1;
+ plugin_log($plugname, "\$logic{$t}: Receive-GA $rec nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$rec};
}
-
- if($logic{$t}{transmit_on_startup})
- {
- # Berechnung und Senden beim Startup des Logikprozessors
- # Vorsicht: Logiken mit dieser Bedingung koennen durch knx_read-Requests den Logikprozessor deutlich (!)
- # ueber die erlaubten 10s Ausfuehrungszeit eines Wiregate-Plugins bringen.
- # In diesem Fall wird die Initialisierung des Logikprozessors unvollstaendig abgebrochen!
- # Empfehlung: nur solche Logiken mit transmit_on_startup versehen, deren Read-Requests auf schnell
- # antwortende externe KNX-Geraete gehen oder sowieso durch den EIB-Cache beantwortet werden,
- # also bspw. nicht auf andere Plugins warten.
- my $result=execute_logic($t, $receive, undef, undef);
- my $ga=groupaddress($logic{$t}{transmit});
- $retval.="\$logic{$t}{transmit}(Logik) -> $ga:$result " if $debug;
- knx_write($ga, $result); # DPT aus eibga.conf
- }
}
+# plugin_log($plugname, "Initialisierungsblock beendet");
+
+ # ab hier wuerde uns ein Timeout nicht mehr so stark treffen...
+ for my $t (keys %logic)
+ {
+ next if $t eq 'debug' || $t=~/^_/;
+ next unless $logic{$t}{transmit_on_startup};
+
+ my $debug = $logic{debug} || $logic{$t}{debug};
+
+ # Berechnung und Senden beim Startup des Logikprozessors
+ my $result=execute_logic($t, undef, undef);
+ my $ga=groupaddress $logic{$t}{transmit};
+ plugin_log($plugname, "\$logic{$t}{transmit}(Logik) -> $ga:$result") if $debug;
+ knx_write($ga, $result); # DPT aus eibga.conf
+ }
+
$retval.=$count." initialisiert";
}
@@ -201,8 +201,7 @@
# welche translate-Logik ist aufgerufen?
for my $t (keys %logic)
{
- next if $t eq 'debug';
- $t=~s/^_//g;
+ next if $t eq 'debug' || $t=~/^_/;
my $transmit=groupaddress($logic{$t}{transmit});
my $transmit_ga = ($ga eq $transmit);
@@ -210,7 +209,7 @@
my $receive=groupaddress($logic{$t}{receive});
my $receive_ga=0;
- if(defined $receive && !$logic{$t}{timer})
+ if(defined $receive)
{
unless(ref $logic{$t}{receive})
{
@@ -233,30 +232,32 @@
if($transmit_ga)
{
# Ein Read-Request auf einer Transmit-GA wird mit dem letzten Ergebnis beantwortet
+ # ausser das Flag recalc_on_request ist gesetzt
# Read-Requests auf die receive-Adressen werden gar nicht beantwortet
if($msg{apci} eq "A_GroupValue_Read")
{
my $result=$plugin_info{$plugname.'_'.$t.'_result'};
- if(defined $result)
+ if(!defined $result || $logic{$t}{recalc_on_request})
{
+ # falls gespeichertes Ergebnis ungueltig, neuer Berechnungsversuch
+ $result=execute_logic($t, undef, undef)
+ unless defined $logic{$t}{recalc_on_request} && $logic{$t}{recalc_on_request}==0;
+
+ $retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(Logik) -> $ga:$result gesendet. " if $debug && defined $result;
+ knx_write($ga, $result, undef, 0x40) if defined $result; # response, DPT aus eibga.conf
+ }
+ else
+ {
$retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(memory) -> $ga:$result gesendet. " if $debug;
knx_write($ga, $result, undef, 0x40); # response, DPT aus eibga.conf
}
- else
- {
- # falls gespeichertes Ergebnis ungueltig, neuer Berechnungsversuch
- $result=execute_logic($t, groupaddress($logic{$t}{receive}), undef, undef);
-
- $retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(Logik) -> $ga:$result gesendet. " if $debug;
- knx_write($ga, $result, undef, 0x40); # response, DPT aus eibga.conf
- }
next;
}
- elsif(!$receive_ga) # Receive geht vor - bei Timer-Logiken ist receive_ga immer 0
+ elsif(!$receive_ga) # Wenn eine GA sowohl in transmit als auch receive vorkommt, geht receive vor
{
- if(defined $in) # Write/Response-Telegramm: das waren moeglicherweise wir selbst, also nicht antworten
+ if(defined $in) # Write/Response-Telegramm auf transmit: das waren moeglicherweise wir selbst, also nicht antworten
{
$plugin_info{$plugname.'_'.$t.'_result'}=$in; # einfach Input ablegen
}
@@ -283,7 +284,7 @@
# Aufruf der Logik-Engine
my $prevResult=$plugin_info{$plugname.'_'.$t.'_result'};
- my $result=execute_logic($t, $receive, $ga, $in);
+ my $result=execute_logic($t, $ga, $in);
# war Wiregate der Sender des Telegramms?
# Zirkelaufruf mit wiederholt gleichen Ergebnissen ausschliessen
@@ -360,7 +361,7 @@
{
# ...es sei denn, es ist eine timer-Logik. Die muss jetzt ausgefuehrt werden
# Aufruf der Logik-Engine
- $result=execute_logic($t, groupaddress($logic{$t}{receive}), undef, undef);
+ $result=execute_logic($t, undef, undef);
$retval.="\$logic{$t} -> $transmit:".
(defined $result?$result.($toor?" gespeichert":" gesendet"):"nichts zu senden")." (Timer) " if $debug;
@@ -387,12 +388,15 @@
# bspw wegen eines Plugin-Timeouts waehrend der Berechnung
for my $t (keys %logic)
{
- next if $t eq 'debug' || !defined $logic{$t}{timer};
+ next if $t eq 'debug' || $t=~/^_/;
+ next unless defined $logic{$t}{timer};
my $timer=$plugin_info{$plugname.'__'.$t.'_timer'};
next if defined $timer && $timer>time();
+ plugin_log($plugname, "\$logic{$t}: Timer nicht korrekt gesetzt ($plugin_info{$plugname.'__'.$t.'_timer'}), berechne erneut");
+
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
set_next_call($t, $debug);
@@ -715,20 +719,21 @@
if($nextcall=~/^([0-9]+)\:([0-9]+)/)
{
my $seconds=3600*($1-substr($time_of_day,0,2))+60*($2-substr($time_of_day,3,2))-substr($time_of_day,6,2);
- plugin_log($plugname, "Naechster Aufruf der Timer-Logik '$t'$daytext um $nextcall."); # if $debug;
+ plugin_log($plugname, "Naechster Aufruf der Timer-Logik '$t'$daytext um $nextcall.");# if $debug;
my $timer=$systemtime+$seconds+3600*24*$days_until_nextcall;
$plugin_info{$plugname.'__'.$t.'_timer'}=$timer;
+# plugin_log($plugname, "\$plugin_info{$plugname.'__'.$t.'_timer'}=$plugin_info{$plugname.'__'.$t.'_timer'}=$timer ?");# if $debug;
}
else
{
- plugin_log($plugname, "Ungueltige Uhrzeit des naechsten Aufrufs der Timer-Logik '$t'$daytext."); # if $debug;
+ plugin_log($plugname, "Ungueltige Uhrzeit des naechsten Aufrufs der Timer-Logik '$t'$daytext.");# if $debug;
}
}
else
{
plugin_log($plugname, "Logik '$t' wird nicht mehr aufgerufen (alle in time=>... festgelegten Termine sind verstrichen).")
- if $logic{$t}{timer}; # if $debug;
+ if $logic{$t}{timer};# && $debug;
delete $plugin_info{$plugname.'__'.$t.'_timer'};
}
@@ -738,8 +743,7 @@
# Im wesentlichen Vorbesetzen von input und state, Aufrufen der Logik, knx_write, Zurueckschreiben von state
sub execute_logic
{
- my ($t, $receive, $ga, $in)=@_; # Logikindex $t, Bustelegramm erhalten auf $ga mit Inhalt $in
- # $receive muss die direkten Gruppenadressen enthalten - Decodierung von Kuerzeln wird nicht vorgenommen
+ my ($t, $ga, $in)=@_; # Logikindex $t, Bustelegramm erhalten auf $ga mit Inhalt $in
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
@@ -747,12 +751,31 @@
# als erstes definiere das Input-Array fuer die Logik
my $input=$in;
+ # alle receive-GAs
+ my $receive=groupaddress $logic{$t}{receive};
+ my $fetch=groupaddress $logic{$t}{fetch};
+
+ if(defined $fetch)
+ {
+ if(!defined $receive)
+ {
+ $receive=$fetch;
+ }
+ else
+ {
+ # Arrays machen, falls es noch keines ist
+ $fetch=[$fetch] unless ref $fetch;
+ $receive=[$receive] unless ref $receive;
+ push @{$receive}, @{$fetch};
+ }
+ }
+
# Array-Fall: bereite Input-Array fuer Logik vor
if(!ref $receive)
{
# wenn ga gesetzt, steht der Input-Wert in $in
# wenn receive undefiniert, gibt es keine receive-GA
- $in=$input=knx_read($receive, 300) if !$ga && $receive;
+ $in=$input=knx_read($receive, (defined $logic{$t}{eibd_cache}?$logic{$t}{eibd_cache}:300)) if !$ga && $receive;
}
else
{
@@ -765,7 +788,8 @@
}
else
{
- push @{$input}, knx_read($rec, 300);
+ $in=knx_read($rec, (defined $logic{$t}{eibd_cache}?$logic{$t}{eibd_cache}:300));
+ push @{$input}, $in;
}
}
}
Modified: wiregate/plugin/generic/MissGoogle.pl
===================================================================
--- wiregate/plugin/generic/MissGoogle.pl 2012-11-09 15:18:18 UTC (rev 1111)
+++ wiregate/plugin/generic/MissGoogle.pl 2012-11-10 05:45:58 UTC (rev 1112)
@@ -247,11 +247,12 @@
for my $f (keys %text)
{
my $t=$text{$f};
+ $t=~s/ /\%20/g;
my $p=$f; $p=~s!/[^/]*$!!;
my $m=$f; $m=~s!\.wav$!.mp3!;
next if -f $f;
system "mkdir", "-p", $p;
- system "wget", "http://translate.google.de/translate_tts?ie=UTF-8&q=$t", "--keep-session-cookies", "--user-agent=sag_ich_nicht", "-O", $m;
+ system "wget", "http://translate.google.de/translate_tts?ie=UTF-8&q=$t&tl=de", "--keep-session-cookies", "--user-agent=sag_ich_nicht", "-O", $m;
system "mpg123", "-w", $f, $m;
system "rm", "-f", "tmp.wav", "tmp2.wav";
system "sox", $f, "tmp.wav", "silence", "1", "0.001", "0.2%", "1", "0.3", "0.1%";
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-11-09 15:18:18 UTC (rev 1111)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-11-10 05:45:58 UTC (rev 1112)
@@ -109,8 +109,10 @@
# Logiken mit timer-Klausel weichen in mehreren Punkten von den bisherigen Logiken ab:
# * sie ignorieren die delay-Klausel und die cool-Klausel
# * Die transmit_only_on_request-Klausel funktioniert aber
- # * jeglicher Bustraffic auf receive-Adressen wird ignoriert.
- # * Evtl. spezifizierte receive-Adressen werden aber beim Timer-Aufruf abgefragt, um das input-Array vorzubesetzen).
+ # * ALTES VERHALTEN: jeglicher Bustraffic auf receive-Adressen wird ignoriert. JETZT NICHT MEHR - FALLS MAN DIESES
+ # VERHALTEN M\xD6CHTE, KANN STATT receive=>.... DIE OPTION fetch=>... GENUTZT WERDEN!
+ # * Evtl. spezifizierte receive-Adressen werden beim Timer-Aufruf abgefragt, um das input-Array vorzubesetzen).
+ #
# Weitere Infos zu Timer-Spezifikationen
# * Als timer-Eintrag geht entweder ein einzelner Eintrag timer=>{...} wie oben oder eine Liste solcher Eintraege
# time=>[{...},{...},{...},...].
@@ -164,7 +166,7 @@
# F\xFCr komplexere F\xE4lle kann auch eine sub \xFCbergeben werden, die dann einen passenden Hash zur\xFCckgeben muss. In die sub
# wird der Aufrufkontext \xFCbergeben, der den "input", das "result" und den "state" umfasst. Daneben stehen aber auch
# vereinfachte Skalare zur Verf\xFCgung, $input, $state und $result.
-
+
subProwl => {
receive => '1/2/5',
prowl => sub {
@@ -193,6 +195,22 @@
}
}
+ # Weitere Optionen ohne Beispiel:
+
+ # 14. Die Optionen transmit_on_startup=>1 fuehrt die Logik bei der Initialisierung einmal aus (Vorsicht: bei zu
+ # vielen solchen Logiken kann das zum Timeout des Plugins fuehren!).
+
+ # 15. Falls Read-Requests an die transmit-Adresse einer Logik
+ # geschickt werden, so fuehrt das normalerweise zur erneuten Uebertragung des letzten Resultats bzw, falls dieses undef ist,
+ # zur Ausfuehrung der Logik und Uebertragung des Resultats. Mit recalc_on_request=>0 wird die Ausfuehrung der Logik in diesem
+ # Fall unterdrueckt, mit recalc_on_request=>1 wird sie in jedem Fall erzwungen.
+
+ # 16. Die Option eibd_cache legt die Cache-Zeit bei knx_read-Aufrufen fest. Default ist 300.
+
+ # 17. Neben receive kann in fetch=>... eine weitere GA oder GA-Liste \xFCbergeben werden. Diese GAs werden NICHT abonniert, und
+ # Telegramme hierauf l\xF6sen die Logik auch nicht aus, sie werden nur bei Ausf\xFChrung der Logik per knx_read ausgelesen und in
+ # $input hinterlegt
+
);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-12-22 06:30:23
|
Revision: 1242
http://openautomation.svn.sourceforge.net/openautomation/?rev=1242&view=rev
Author: pfry
Date: 2012-12-22 06:30:13 +0000 (Sat, 22 Dec 2012)
Log Message:
-----------
Neue Option ignore_read_requests
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2012-12-21 12:21:52 UTC (rev 1241)
+++ wiregate/plugin/generic/Logikprozessor.pl 2012-12-22 06:30:13 UTC (rev 1242)
@@ -234,6 +234,8 @@
# Read-Requests auf die receive-Adressen werden gar nicht beantwortet
if($msg{apci} eq "A_GroupValue_Read")
{
+ next if $logic{$t}{ignore_read_requests};
+
my $result=$plugin_info{$plugname.'_'.$t.'_result'};
if(!defined $result || $logic{$t}{recalc_on_request})
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-12-21 12:21:52 UTC (rev 1241)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-12-22 06:30:13 UTC (rev 1242)
@@ -219,10 +219,11 @@
# 14. Die Optionen transmit_on_startup=>1 fuehrt die Logik bei der Initialisierung einmal aus (Vorsicht: bei zu
# vielen solchen Logiken kann das zum Timeout des Plugins fuehren!).
- # 15. Falls Read-Requests an die transmit-Adresse einer Logik
- # geschickt werden, so fuehrt das normalerweise zur erneuten Uebertragung des letzten Resultats bzw, falls dieses undef ist,
- # zur Ausfuehrung der Logik und Uebertragung des Resultats. Mit recalc_on_request=>0 wird die Ausfuehrung der Logik in diesem
- # Fall unterdrueckt, mit recalc_on_request=>1 wird sie in jedem Fall erzwungen.
+ # 15. Falls Read-Requests an die transmit-Adresse einer Logik geschickt werden, so fuehrt das normalerweise zur
+ # (erneuten) Uebertragung des letzten Resultats bzw, falls dieses undef ist, zur Ausfuehrung der Logik und
+ # Uebertragung des Resultats. Mit recalc_on_request=>0 wird die Ausfuehrung der Logik in diesem Fall unterdrueckt,
+ # mit recalc_on_request=>1 wird sie in jedem Fall erzwungen. Mit ignore_read_requests=>1 werden solche Requests
+ # gar nicht beantwortet.
# 16. Die Option eibd_cache legt die Cache-Zeit bei knx_read-Aufrufen fest. Default ist 300.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2013-02-01 09:13:31
|
Revision: 1379
http://openautomation.svn.sourceforge.net/openautomation/?rev=1379&view=rev
Author: pfry
Date: 2013-02-01 09:13:24 +0000 (Fri, 01 Feb 2013)
Log Message:
-----------
Upgrade waehrend meiner eigenen Inbetriebnahme. Neue GAs optimize und reset.
Modified Paths:
--------------
wiregate/plugin/generic/Heizungsregler.pl
wiregate/plugin/generic/conf.d/Heizungsregler.conf
Modified: wiregate/plugin/generic/Heizungsregler.pl
===================================================================
--- wiregate/plugin/generic/Heizungsregler.pl 2013-02-01 07:48:24 UTC (rev 1378)
+++ wiregate/plugin/generic/Heizungsregler.pl 2013-02-01 09:13:24 UTC (rev 1379)
@@ -4,69 +4,87 @@
# Wiregate-Plugin
# (c) 2012 Fry under the GNU Public License
-# $plugin_info{$plugname.'_cycle'}=0; return "deaktiviert";
+#$plugin_info{$plugname.'_cycle'}=0; return "deaktiviert";
-use POSIX qw(floor);
+use POSIX qw(floor strftime);
use Math::Round qw(nearest);
my $use_short_names=1; # 1 fuer GA-Kuerzel (erstes Wort des GA-Namens), 0 fuer die "nackte" Gruppenadresse
+# Konfigfile seit dem letzten Mal geaendert?
+my $conf="/etc/wiregate/plugin/generic/conf.d/$plugname";
+$conf.='.conf' unless $conf=~s/\.pl$/.conf/;
+my $configtime=24*60*60*(-M $conf);
+my $config_modified = ($configtime < $plugin_info{$plugname.'_configtime'}-1);
+
# Aufrufgrund ermitteln
my $event=undef;
if (!$plugin_initflag)
-{ $event='restart'; } # Restart des daemons / Reboot
-#elsif ((stat('/etc/wiregate/plugin/generic/' . $plugname))[9] > time()-2)
-# ab PL30:
+{ $event='restart'; } # Restart des daemons / Reboot
elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'})
{ $event='modified'; } # Plugin modifiziert
-elsif (%msg) { $event='bus'; } # Bustraffic
-#elsif ($fh) { $event='socket'; } # Netzwerktraffic
+elsif (%msg)
+{
+ $event='bus';
+ unless($plugin_subscribe{$msg{dst}}{$plugname})
+ {
+ $event='cycle';
+ }
+ else
+ {
+ return if !$config_modified && $msg{apci} eq "A_GroupValue_Response";
+ }
+} # Bustraffic
+elsif ($fh) { $event='socket'; } # Netzwerktraffic
else { $event='cycle'; } # Zyklus
# Konfigurationsfile einlesen
-my $conf=$plugname; $conf=~s/\.pl$/.conf/;
-$conf="/etc/wiregate/plugin/generic/conf.d/$conf";
my %house=();
my $err=read_from_house_config();
return $err if $err;
# Initialisierung
-my %dyn=();
+my %dyn=recall_from_plugin_info();
my $retval='';
my $t=time();
if($event=~/restart|modified/)
{
- # Cleanup aller Variablen
+ # alle Variablen loeschen
for my $k (grep /^$plugname\_/, keys %plugin_info)
{
+ next if $k=~/^$plugname\_last/;
delete $plugin_info{$k};
}
+ store_to_plugin_info(\%dyn);
- # Alle Controller-GAs abonnieren, Reglerstati initialisieren
+ $plugin_info{$plugname.'_configtime'}=$configtime;
+
+ # Alle Controller-GAs abonnieren
for my $r (grep ref($house{$_}), keys %house)
{
+ next unless defined $house{$r}{control};
+
$plugin_subscribe{groupaddress($house{$r}{control})}{$plugname}=1;
- RESET($r);
+ $plugin_subscribe{groupaddress($house{$r}{optimize})}{$plugname}=1 if defined $house{$r}{optimize};
+ $plugin_subscribe{groupaddress($house{$r}{reset})}{$plugname}=1 if defined $house{$r}{reset};
}
$plugin_info{$plugname.'_cycle'}=$house{cycle};
- store_to_plugin_info(\%dyn);
-
- $retval.='initialisiert.';
+ $retval.='initialisiert: ';
$event='cycle';
}
-%dyn=recall_from_plugin_info();
-
# Zyklischer Aufruf - Regelung
if($event=~/cycle/)
{
my $Vreq=undef;
my $anynews=0;
- for my $r (grep ref($house{$_}), keys %house)
+
+ for my $r (sort grep ref($house{$_}), keys %house)
{
+# plugin_log($plugname, "\$dyn{$r}{mode}==$dyn{$r}{mode}");
if($dyn{$r}{mode} eq 'ON')
{
# PID-Regler
@@ -100,54 +118,76 @@
}
elsif($event=~/bus/)
{
- if($msg{apci} eq 'A_GroupValue_Response')
+ # Aufruf durch GA - neue Wunschtemperatur
+ my $ga=$msg{dst};
+
+ # erstmal den betroffenen Raum finden
+ my @controls=(sort grep ref($house{$_}) && groupaddress($house{$_}{control}) eq $ga, keys %house);
+ my @optimizes=(sort grep ref($house{$_}) && groupaddress($house{$_}{optimize}) eq $ga, keys %house);
+ my @resets=(sort grep ref($house{$_}) && groupaddress($house{$_}{reset}) eq $ga, keys %house);
+
+ # Unbekannte GA de-abonnieren
+ unless(@controls || @optimizes || @resets)
{
- for my $k (keys %house) { delete $house{$k}; } # Hilfe fuer die Garbage Collection
- for my $k (keys %dyn) { delete $dyn{$k}; } # Hilfe fuer die Garbage Collection
+ # GA-Abonnement loeschen
+ delete $plugin_subscribe{$ga}{$plugname};
+ plugin_log($plugname, "received $ga -> unsubscribed");
+
return;
}
- # Aufruf durch GA - neue Wunschtemperatur
- my $ga=$msg{dst};
+ @resets=@optimizes=() unless $msg{apci} eq 'A_GroupValue_Write' && defined $msg{value} && $msg{value}==1;
- # erstmal den betroffenen Raum finden
- my @rms=(grep ref($house{$_}) && groupaddress($house{$_}{control}) eq $ga, keys %house);
- my $r=shift @rms;
+ # nun der Reihe nach auf alle angekoppelten Aktionen reagieren
+ while(@controls || @optimizes || @resets)
+ {
+ my $r=undef;
+ my $action=undef;
- # $r ist undef falls obige Schleife fertig durchlaufen wurde
- if(defined $r)
- {
+ if(@controls)
+ {
+ $r=shift @controls;
+ $action='control';
+ }
+ elsif(@resets)
+ {
+ $r=shift @resets;
+ $action='reset';
+ }
+ elsif(@optimizes)
+ {
+ $r=shift @optimizes;
+ $action='optimize';
+ }
+
+ # $r ist undef falls obige Schleife fertig durchlaufen wurde
+ last unless defined $r;
+
+ # Wert des Telegramms, Modus des Reglers abholen
my $T0=0;
- $T0 = $msg{value} if defined $msg{value};
+ $T0 = $msg{value} if $action eq 'control' && defined $msg{value};
my $mode=$dyn{$r}{mode};
# Jemand moechte einen Sollwert wissen
- if($msg{apci} eq 'A_GroupValue_Read')
+ if($action eq 'control' && $msg{apci} eq 'A_GroupValue_Read')
{
$T0=$dyn{$r}{T0};
$T0=$dyn{$r}{T0old} if $dyn{mode} eq 'OPTIMIZE';
- knx_write($ga,$T0,9.001);
- for my $k (keys %house) { delete $house{$k}; } # Hilfe fuer die Garbage Collection
- for my $k (keys %dyn) { delete $dyn{$k}; } # Hilfe fuer die Garbage Collection
+ knx_write($ga,$T0,9.001,0x40);
return;
}
# spezielle Temperaturwerte sind 0=>OFF und -1=>OPTIMIZE
- if($T0==0)
+ if($action eq 'reset' || ($action eq 'control' && $T0==0))
{
RESET($r);
writeactuators($r,0);
$dyn{$r}{mode}='OFF';
$retval.="$r\->OFF";
}
- elsif($T0==-1)
+ elsif($action eq 'optimize' || ($action eq 'control' && $T0==-1))
{
- if($dyn{$r}{mode} eq 'OPTIMIZE') # Entprellen
- {
- for my $k (keys %house) { delete $house{$k}; } # Hilfe fuer die Garbage Collection
- for my $k (keys %dyn) { delete $dyn{$k}; } # Hilfe fuer die Garbage Collection
- return;
- }
+ return if $dyn{$r}{mode} eq 'OPTIMIZE'; # Entprellen
# Initialisierung der Optimierungsfunktion
$dyn{$r}{mode}='OPTIMIZE';
@@ -157,14 +197,9 @@
$retval.=sprintf "$r\->OPT", $T;
}
- else # neue Wunschtemperatur
+ elsif($action eq 'control') # neue Wunschtemperatur
{
- if($dyn{$r}{T0} == $T0) # Entprellen
- {
- for my $k (keys %house) { delete $house{$k}; } # Hilfe fuer die Garbage Collection
- for my $k (keys %dyn) { delete $dyn{$k}; } # Hilfe fuer die Garbage Collection
- return;
- }
+ return if $dyn{$r}{T0} == $T0; # Entprellen
RESET($r) if $mode eq 'OPTIMIZE'; # Optimierung unterbrochen
$dyn{$r}{mode}='ON'; # ansonsten uebrige Werte behalten
@@ -173,23 +208,14 @@
$retval.=sprintf "$r\->%.1f(%.1f)%d%%", $T, $T0, 100*$U;
}
}
- else
- {
- # GA-Abonnement loeschen
- delete $plugin_subscribe{$ga}{$plugname};
- print "Storniere $eibgaconf{$ga}{short}\n";
- }
}
# Speichere Statusvariablen aller Regler
store_to_plugin_info(\%dyn);
-for my $k (keys %house) { delete $house{$k}; } # Hilfe fuer die Garbage Collection
-for my $k (keys %dyn) { delete $dyn{$k}; } # Hilfe fuer die Garbage Collection
+return $retval eq '' ? 'Heizungsregler: nothing to do... event='.$event : $retval;
-return $retval eq '' ? undef : $retval;
-
########## Datenpersistenz - Speichern und Einlesen ###############
sub store_to_plugin_info
@@ -202,8 +228,9 @@
{
# Skalare
my @keylist=grep !/^(temps|times|Uvals)$/, keys %{$dyn->{$r}};
- map { $_=sprintf("'$_'=>'%.2f'",$dyn->{$r}{$_}) } @keylist;
- $plugin_info{$plugname.'_'.$r} = join ',', @keylist;
+ my $pi=join ',', map { $_="'$_'=>'$dyn->{$r}{$_}'" } @keylist;
+ $plugin_info{$plugname.'_'.$r} = $pi;
+# plugin_log($plugname,$r."< ".$pi) if $r eq 'D2';
# Arrays
for my $v (qw(temps times Uvals))
@@ -229,7 +256,9 @@
if(defined $plugin_info{$plugname.'_'.$r})
{
my $pi=$plugin_info{$plugname.'_'.$r};
- while($pi=~m/\'(.*?)\'=>\'(.*?)\'/g) { $dyn{$r}{$1}=$2 }
+# plugin_log($plugname,$r."> ".$pi) if $r eq 'D2';
+
+ while($pi=~m/\'(.*?)\'=>\'(.*?)\'/g) { $dyn{$r}{$1}=$2; }
}
for my $v (qw(temps times Uvals))
@@ -254,7 +283,7 @@
my @lines = <CONFIG>;
close CONFIG;
eval("@lines");
- return "config error" if $@;
+ return "config error: $@" if $@;
}
sub store_to_house_config
@@ -265,7 +294,7 @@
print CONFIG "\$house{$r}{pid}={";
for my $k (sort keys %{$house{$r}{pid}})
{
- print CONFIG sprintf "$k=>%.2f, ", $house{$r}{pid}{$k} unless $k eq 'date';
+ print CONFIG sprintf "$k=>%f, ", $house{$r}{pid}{$k} unless $k eq 'date';
print CONFIG "$k=>'$house{$r}{pid}{date}'," if $k eq 'date';
}
print CONFIG "};\n";
@@ -301,8 +330,8 @@
{
unless(defined $T{$type}{$s})
{
- $T{$type}{$s}=knx_read($s,$house{cycle},$dpt);
- delete $T{$type}{$s} unless defined $T{$type}{$s};
+ $T{$type}{$s}=knx_read($s,5*$house{cycle},$dpt);
+ delete $T{$type}{$s} unless defined $T{$type}{$s} && $T{$type}{$s}!=85;
}
}
}
@@ -317,7 +346,7 @@
{
if($type eq 'window')
{
- $R{$type}=1 if int($T{$type}{$k})==1;
+ $R{$type}=1 if int($T{$type}{$k})==0;
}
else
{
@@ -347,7 +376,7 @@
{
if(!defined $R{$type} && defined $house{$type})
{
- $R{$type} = knx_read(groupaddress($house{$type}),$house{cycle},9);
+ $R{$type} = knx_read(groupaddress($house{$type}),5*$house{cycle},9);
delete $R{$type} unless $R{$type};
}
}
@@ -361,6 +390,8 @@
# und wenn alle Stricke reissen, bleibt der vorkonfigurierte Wert
$R{spread}=$house{spread} unless defined $R{spread};
+ plugin_log($plugname, $r.": ".(join " ", map "$_=$R{$_}", qw(sensor inflow floor outflow spread window)));
+
return @R{qw(sensor inflow floor outflow spread window)};
}
@@ -369,9 +400,8 @@
my $r=shift; # Raum mit Substruktur
my $U=shift; # Ventileinstellung
-# plugin_log($plugname, "Trying to write $r, $U");
-
- my @substructures=values %{$house{$r}->{circ}} if defined $house{$r}->{circ};
+ my @substructures=();
+ @substructures=values %{$house{$r}->{circ}} if defined $house{$r}->{circ};
push @substructures, $house{$r};
for my $ss (@substructures)
@@ -386,7 +416,6 @@
}
}
}
-# plugin_log($plugname, "Done trying to write $r, $U");
}
########## PID-Regler #####################
@@ -413,7 +442,7 @@
return ($T,$T0,$U,0) unless $T && $spread;
# Regelparameter einlesen
- my ($Tv,$Tn,$lim,$prop,$refspread)=(5,30,1,1,10); # Defaults
+ my ($Tv,$Tn,$lim,$prop,$refspread)=(30,30,1,1,10); # Defaults
($Tv,$Tn,$lim,$prop,$refspread)
=@{$house{$r}{pid}}{qw(Tv Tn lim prop refspread)}
@@ -479,6 +508,7 @@
# und alles zusammen, skaliert mit der aktuellen Spreizung
$U = ($P + $IS + $DF) * $coeff;
+ plugin_log($plugname, sprintf("$r: %.1f(%.1f) U = P+I+D = %d%+d%+d = %d",$T,$T0,100*$P*$coeff,100*$IS*$coeff,100*$DF*$coeff,100*$U));
# Stellwert begrenzen auf 0-1
$U=1 if $U>1;
@@ -525,6 +555,8 @@
# Praktische Abkuerzungen fuer Statusvariablen
my ($mode,$phase,$T0old) = @{$dyn{$r}}{qw(mode phase T0old)};
+ plugin_log($plugname, "D2: phase=$phase") if $r eq 'D2';
+
# Falls Fenster offen -> Abbruch, Heizung aus und Regler resetten
if($window)
{
@@ -541,7 +573,7 @@
# Wir nutzen die "cooling"-Periode sowieso nicht.
# Also Parameter ins Konfig-File schreiben.
my ($Tn, $Tv, $prop, $refspread) = @{$dyn{$r}}{qw(Tn Tv prop refspread)};
- my $date=`/bin/date +"%F %X"`; chomp $date;
+ my $date=strftime("%F %X",localtime);
my $lim=0.5;
$house{$r}{pid}={Tv=>$Tv, Tn=>$Tn, lim=>$lim, prop=>$prop, refspread=>$refspread, date=>$date};
store_to_house_config($r);
@@ -568,14 +600,13 @@
mode=>$mode, phase=>'HEAT',
T0old=>$T0old, told=>0, optstart=>$t,
maxpos=>0, maxslope=>0,
- sumspread=>$spread, temps=>[0], times=>[$T]
+ sumspread=>$spread, temps=>[$T], times=>[0]
};
return sprintf("%.1f(HEAT)%.1f ",$T,$spread);
}
- my ($optstart, $sumspread, $told, $temps, $times)
- = @{$dyn{$r}}{qw(optstart sumspread told temps times)};
+ my ($optstart, $sumspread, $told, $temps, $times) = @{$dyn{$r}}{qw(optstart sumspread told temps times)};
my $tp=$t-$optstart;
@@ -615,13 +646,17 @@
$SXY+=$times->[$i]*$temps->[$i];
}
- my $slope = ($S1*$SXY - $SX*$SY)/($S1*$SY2 - $SY*$SY);
+ my $slope = ($S1*$SXY - $SX*$SY)/($S1*$SY2 - $SY*$SY) * 3600;
if($phase eq 'HEAT')
{
my ($maxpos, $maxslope) = @{$dyn{$r}}{qw(maxpos maxslope)};
+
+ plugin_log($plugname, "D2: maxpos=$maxpos maxslope=$maxslope slope=$slope") if $r eq 'D2';
- if($slope<=0 || $maxslope<=0 || $slope>=0.7*$maxslope)
+ if($maxslope==0) { $maxslope=0.5; }
+
+ if($slope<=0 || $maxslope<=0 || $slope>=0.6*$maxslope)
{
my $retval='';
@@ -629,15 +664,15 @@
{
$maxslope = $slope;
$maxpos = nearest(1,$#{$temps}-$S1/2);
- $retval=sprintf "%.2fKph",$slope*60*60;
+ $retval=sprintf "%.2fKph/max=%.2fKph)",$slope,$maxslope;
}
elsif($slope>0)
{
- $retval=sprintf "%.2fKph=%d%%", $slope*60*60, 100*$slope/$maxslope;
+ $retval=sprintf "%.2fKph=%d%%", $slope, 100*$slope/$maxslope;
}
else
{
- $retval=sprintf "%.2fKph",$slope*60*60;
+ $retval=sprintf "%.2fKph/max=%.2fKph)",$slope,$maxslope;
}
# Statusvariablen zurueckschreiben
@@ -696,15 +731,15 @@
my $refspread = $sumspread/scalar(@{$times});
my $DX = $Xplateau - $X0;
my $Ks = $DX/$refspread;
- my $Tu = $t1 - 2*($tp-$told) - ($X1-$X0)/$maxslope;
- my $Tg = $DX/$maxslope;
+ my $Tu = $t1 - 2*($tp-$told) - 3600*($X1-$X0)/$maxslope;
+ my $Tg = 3600*$DX/$maxslope;
# Optimierung der PID-Parameter nach Chien/Hrones/Reswick
# (siehe zB Wikipedia). Wir nehmen aber etwas andere Koeffizienten,
# das fuehrt zu ruhigerem Regelverhalten...
# Proportionalbereich prop=1/Kp, kleineres prop ist aggressiver
- my $prop = $maxslope*$Tu/(0.3*$refspread);
+ my $prop = $maxslope*$Tu/(0.3*$refspread)/3600;
# Nachstellzeit des Integralteils, kleiner ist aggressiver
my $Tn = $Tg/60;
@@ -747,7 +782,7 @@
# aber wir setzen $lim hier als Konstante
my ($Tn, $Tv, $prop, $refspread, $tcool)
= @{$dyn{$r}}{qw(Tn Tv prop refspread tcool)};
- my $date=`/bin/date +"%F %X"`; chomp $date;
+ my $date=strftime("%F %X",localtime);
my $lim=0.5;
$house{$r}{pid}={Tv=>$Tv, Tn=>$Tn, lim=>$lim, prop=>$prop, refspread=>$refspread, date=>$date};
store_to_house_config($r);
Modified: wiregate/plugin/generic/conf.d/Heizungsregler.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Heizungsregler.conf 2013-02-01 07:48:24 UTC (rev 1378)
+++ wiregate/plugin/generic/conf.d/Heizungsregler.conf 2013-02-01 09:13:24 UTC (rev 1379)
@@ -36,10 +36,13 @@
# Taktung des Reglers, Anzahl Sekunden zwischen Regleraufrufen
# Es macht durchaus Sinn, den Regler haeufiger laufen zu lassen als die
# Sensoren ausgelesen werden. Das sollte zu einem ruhigeren Regler fuehren.
+# Wichtig: die Temperatursensoren sollten ZYKLISCH senden, und zwar haeufig
+# genug, dass die Temperaturauslesung hier IMMER aus dem Cache erfolgt.
+# Sonst wartet der Heizungsregler staendig auf eine Busantwort, die nie kommt.
cycle => 60,
# Anzahl der Datenpunkte fuer Trendberechnung
- mindata => 15,
+ mindata => 10,
# Falls die Heizung ueber eine einstellbare Vorlauftemperatur verfuegt,
# so kann hier eine GA fuer die Wunsch-Vorlauftemperatur festgelegt werden,
@@ -47,7 +50,7 @@
# die tatsaechliche Vorlauftemperatur auch gemessen werden kann!
# inflow_control => '1/2/3', # GA zum Setzen der Soll-Vorlauftemperatur
- inflow_max => 40, # maximale Soll-Vorlauftemperatur
+# inflow_max => 40, # maximale Soll-Vorlauftemperatur
# Der Spread, oder die Spreizung, ist die Differenz zwischen Vorlauftemperatur
# und Ruecklauftemperatur. Falls entsprechende Messfuehler entweder nicht
@@ -74,6 +77,13 @@
WZ => {
control => $eibgaconf{TS_WZ}{ga}, # GA zum Setzen der Solltemperatur
+ # optimize: GA zum Starten der Optimierungsprozedur
+ # - alternativ eine -1 als Wunschtemperatur an die control-GA senden
+ optimize => $eibgaconf{TZ_WZ}{ga},
+
+ # reset: GA zum Ausloesen eines Resets der laufenden Optimierungsprozedur
+ reset => $eibgaconf{TR_WZ}{ga},
+
# Raumtemperaturfuehler (Liste oder nur einer)
# sensor => ['1/2/3','1/2/3','1/2/3'],
sensor => $eibgaconf{TL_WZ_Sofa}{ga},
@@ -107,8 +117,5 @@
);
# Ende der Konfiguration ##################################
-
-$house{WZ}{pid}={Tn=>485.62, Tv=>39.87, date=>'2012-04-20 22:34:06',lim=>1.00, prop=>0.31, refspread=>11.42, };
-$house{WZ}{pid}={Tn=>485.62, Tv=>19.93, date=>'2012-04-20 22:51:50',lim=>1.00, prop=>0.31, refspread=>11.42, };
-$house{WZ}{pid}={Tn=>485.62, Tv=>19.93, date=>'2012-04-20 23:30:49',lim=>0.20, prop=>0.31, refspread=>11.42, };
-$house{WZ}{pid}={Tn=>485.62, Tv=>19.93, date=>'2012-04-21 08:54:14',lim=>0.50, prop=>0.31, refspread=>11.42, };
+# Was hier ggf. folgt, sind von der Optimierungsprozedur berechnete PID-Parameter.
+# Diese werden nach Abschluss der Optimierungsprozedur an diese Datei angehaengt
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jen...@us...> - 2013-02-17 16:27:34
|
Revision: 1494
http://openautomation.svn.sourceforge.net/openautomation/?rev=1494&view=rev
Author: jensgulow1
Date: 2013-02-17 16:27:24 +0000 (Sun, 17 Feb 2013)
Log Message:
-----------
?\195?\132nderung der nicht zu bearbeitenden Eintr?\195?\164ge aus der alarms-Datei. Die zu bearbeitenden elemente werden ?\195?\188ber auto_dismiss=0 identifiziert.
Added Paths:
-----------
wiregate/plugin/generic/chumby_weckschaltuhr.pl
Removed Paths:
-------------
wiregate/plugin/generic/chumby_weckschaltuhr.pl
Deleted: wiregate/plugin/generic/chumby_weckschaltuhr.pl
===================================================================
--- wiregate/plugin/generic/chumby_weckschaltuhr.pl 2013-02-17 15:49:15 UTC (rev 1493)
+++ wiregate/plugin/generic/chumby_weckschaltuhr.pl 2013-02-17 16:27:24 UTC (rev 1494)
@@ -1,117 +0,0 @@
-# Plugin zum Senden eines Befehles [1] auf eine GA abhaengig von der aktiven Weckzeit aus dem Chumby.
-#
-# basiert auf chumby_weckzeit.pl von swiss (http://knx-user-forum.de/members/swiss.html)
-#
-# Version 0.1 BETA 17.02.1013
-# Copyright: jensgulow (http://knx-user-forum.de/members/jensgulow.html)
-# License: GPL (v2)
-# Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
-#
-#
-####################
-###Einstellungen:###
-####################
-
-my $chumby_ip = "xxx.xxx.xxx.xxx"; # Hier die IP-Adresse des Chumby eintragen.
-
-my $trigger_ga = "12/0/0"; # Auf diese GA wird zum aktiven Weckzeitpunkt eine [1] gesandt.
-
-my @do_not_use = ("Night","DAY week","DAY weekend"); # Diese Einträge der alarms sollen NICHT bearbeitet werden!
-my $anzahl_elemente = @do_not_use; # Anzahl der Einträge in @do_not_use (nicht verändern!)
-
-######################
-##ENDE Einstellungen##
-######################
-
-# Eigenen Aufruf-Zyklus auf xx sek. setzen
-$plugin_info{$plugname.'_cycle'} = 55;
-
-
-use POSIX;
-use XML::Simple;
-use LWP::Simple;
-use Encode qw(encode decode);
-use Time::Local;
-# use open ":utf8";
-
-my $sec; #Sekunde
-my $min; #Minute
-my $hour; #Stunde
-my $mday; #Monatstag
-my $mon; #Monatsnummer
-my $year; #Jahr
-my $wday; #Wochentag 0-6
-my $yday; #Tag ab 01.01.des aktuellen Jahres
-my $isdst;
-
-my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-
-my $perltime = int(60*$hour+$min); # rechnet auf die im Chumby verwendete Darstellung für time='' um
- # z.B. 5:30 Uhr = 330
-
-my $perltimemin = int(time/60); # Minuten seit dem 01.01.1970 (wird bei einmaligen Weckterminen als time='' verwandt
-
-my $command = "ping -c 2 -w 2 ".$chumby_ip;
-my $status = `$command`;
-if($status =~ /bytes from/)
-{
- my $url = "http://$chumby_ip/cgi-bin/custom/alarms.pl?page=download";
- my $xml = encode("utf8",get($url));
- die "Fehler beim Aufrufen der URL: $url. Bitte mit Anleitung ueberpruefen." unless defined $xml;
- my $alarms = XMLin($xml)->{alarm}; # Die alarms-Datei parsen
-
-
- SCHALTZEITPUNKT: while ((my $key) = each %{$alarms})
- {
- for(my $i=0; $i<$anzahl_elemente; $i++)
- {
- if ($alarms->{$key} ne $do_not_use[$i])
- {
- ### Fall "daily" als eingetragene Wecktage ###
- if ($alarms->{$key}->{enabled} == 1 && $alarms->{$key}->{time} == $perltime && $alarms->{$key}->{when} eq 'daily')
- {
- knx_write($trigger_ga,1,1.001);
- plugin_log($plugname, "geschalten, da Weckzeitpunkt erreicht. Sende [1] an $trigger_ga.");
- last SCHALTZEITPUNKT;
- }
-
- ### Fall "Once on xx/xx/xxxx" als eingetragener einmaliger Wecktag ###
- elsif ($alarms->{$key}->{enabled} == 1 && $alarms->{$key}->{time} == $perltimemin && $alarms->{$key}->{when} eq 'once')
- {
- knx_write($trigger_ga,1,1.001);
- plugin_log($plugname, "geschalten, da Weckzeitpunkt erreicht. Sende [1] an $trigger_ga.");
- last SCHALTZEITPUNKT;
- }
-
- ### Fall "dowxxxxxxx" als eingetragene Wecktage (individuelle Einstellung "day of week" ###
- elsif ($alarms->{$key}->{enabled} == 1 && $alarms->{$key}->{time} == $perltime)
- {
- if ($alarms->{$key}->{when} =~ /dow(\d{7})/)
- {
- my $wdaybinaer = $1;
- my @zeichen;
- for(my $j=0; $j<7; $j++)
- {
- $zeichen[$j] = substr($wdaybinaer,$j,1);
- if ($zeichen[$j] == 1 && $j eq $wday)
- {
- knx_write($trigger_ga,1,1.001);
- plugin_log($plugname, "geschalten, da Weckzeitpunkt erreicht. Sende [1] an $trigger_ga.");
- last SCHALTZEITPUNKT;
- }
- }
- }
- }
- next;
- }
- }
- }
-
- return "Status OK";
-
-}
-
-elsif($status =~ /0 received/)
-{
- return "Ein Fehler ist beim Testen der IP $chumby_ip aufgetreten";
-}
\ No newline at end of file
Copied: wiregate/plugin/generic/chumby_weckschaltuhr.pl (from rev 1493, wiregate/plugin/generic/chumby_weckschaltuhr.pl)
===================================================================
--- wiregate/plugin/generic/chumby_weckschaltuhr.pl (rev 0)
+++ wiregate/plugin/generic/chumby_weckschaltuhr.pl 2013-02-17 16:27:24 UTC (rev 1494)
@@ -0,0 +1,111 @@
+# Plugin zum Senden eines Befehles auf eine GA abhaengig von der aktiven Weckzeit aus dem Chumby.
+#
+# basiert auf chumby_weckzeit.pl von swiss (http://knx-user-forum.de/members/swiss.html)
+#
+# Version 0.2 BETA 17.02.1013
+# Copyright: jensgulow (http://knx-user-forum.de/members/jensgulow.html)
+# License: GPL (v2)
+# Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
+#
+#
+####################
+###Einstellungen:###
+####################
+
+my $chumby_ip = "xxx.xxx.xxx.xxx"; # Hier die IP-Adresse des Chumby eintragen.
+
+my $trigger_ga = "12/0/0"; # Auf diese GA wird zum aktiven Weckzeitpunkt eine $value_trigger_ga gesandt.
+
+my $value_trigger_ga = "1"; # Dieser Wert wird an $trigger_ga gesandt.
+
+my $DPT_trigger_ga = "1.001"; # DPT des gesendeten Wertes.
+
+######################
+##ENDE Einstellungen##
+######################
+
+# Eigenen Aufruf-Zyklus auf xx sek. setzen
+$plugin_info{$plugname.'_cycle'} = 55;
+
+
+use POSIX;
+use XML::Simple;
+use LWP::Simple;
+use Encode qw(encode decode);
+use Time::Local;
+# use open ":utf8";
+
+my $sec; #Sekunde
+my $min; #Minute
+my $hour; #Stunde
+my $mday; #Monatstag
+my $mon; #Monatsnummer
+my $year; #Jahr
+my $wday; #Wochentag 0-6
+my $yday; #Tag ab 01.01.des aktuellen Jahres
+my $isdst;
+
+my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+
+my $perltime = int(60*$hour+$min); # rechnet auf die im Chumby verwendete Darstellung für time='' um
+ # z.B. 5:30 Uhr = 330
+
+my $perltimemin = int(time/60); # Minuten seit dem 01.01.1970 (wird bei einmaligen Weckterminen als time='' verwandt
+
+my $command = "ping -c 2 -w 2 ".$chumby_ip;
+my $status = `$command`;
+if($status =~ /bytes from/)
+{
+ my $url = "http://$chumby_ip/cgi-bin/custom/alarms.pl?page=download";
+ my $xml = encode("utf8",get($url));
+ die "Fehler beim Aufrufen der URL: $url. Bitte mit Anleitung ueberpruefen." unless defined $xml;
+ my $alarms = XMLin($xml)->{alarm}; # Die alarms-Datei parsen
+
+SCHALTZEITPUNKT: while ((my $key) = each %{$alarms})
+{
+ ### Fall "daily" als eingetragene Wecktage ###
+ if ($alarms->{$key}->{enabled} == 1 && $alarms->{$key}->{time} == $perltime && $alarms->{$key}->{when} eq 'daily' && $alarms->{$key}->{auto_dismiss} == '0')
+ {
+ knx_write($trigger_ga,$value_trigger_ga,$DPT_trigger_ga);
+ plugin_log($plugname, "geschalten, da Weckzeitpunkt erreicht. Sende [$value_trigger_ga] an $trigger_ga.");
+ last SCHALTZEITPUNKT;
+ }
+
+ ### Fall "Once on xx/xx/xxxx" als eingetragener einmaliger Wecktag ###
+ elsif ($alarms->{$key}->{enabled} == 1 && $alarms->{$key}->{time} == $perltimemin && $alarms->{$key}->{when} eq 'once' && $alarms->{$key}->{auto_dismiss} == '0')
+ {
+ knx_write($trigger_ga,$value_trigger_ga,$DPT_trigger_ga);
+ plugin_log($plugname, "geschalten, da Weckzeitpunkt erreicht. Sende [$value_trigger_ga] an $trigger_ga.");
+ last SCHALTZEITPUNKT;
+ }
+
+ ### Fall "dowxxxxxxx" als eingetragene Wecktage (individuelle Einstellung "day of week" ###
+ elsif ($alarms->{$key}->{enabled} == 1 && $alarms->{$key}->{time} == $perltime && $alarms->{$key}->{auto_dismiss} == '0')
+ {
+ if ($alarms->{$key}->{when} =~ /dow(\d{7})/)
+ {
+ my $wdaybinaer = $1;
+ my @zeichen;
+ for(my $j=0; $j<7; $j++)
+ {
+ $zeichen[$j] = substr($wdaybinaer,$j,1);
+ if ($zeichen[$j] == 1 && $j eq $wday)
+ {
+ knx_write($trigger_ga,$value_trigger_ga,$DPT_trigger_ga);
+ plugin_log($plugname, "geschalten, da Weckzeitpunkt erreicht. Sende [$value_trigger_ga] an $trigger_ga.");
+ last SCHALTZEITPUNKT;
+ }
+ }
+ }
+ }
+ next;
+}
+
+ return "Status OK";
+
+}
+
+elsif($status =~ /0 received/)
+{
+ return "Ein Fehler ist beim Testen der IP $chumby_ip aufgetreten";
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2013-03-07 12:29:06
|
Revision: 1558
http://openautomation.svn.sourceforge.net/openautomation/?rev=1558&view=rev
Author: pfry
Date: 2013-03-07 12:28:59 +0000 (Thu, 07 Mar 2013)
Log Message:
-----------
PID-Parameter nun auch hausweit definierbar
Modified Paths:
--------------
wiregate/plugin/generic/Heizungsregler.pl
wiregate/plugin/generic/conf.d/Heizungsregler.conf
Modified: wiregate/plugin/generic/Heizungsregler.pl
===================================================================
--- wiregate/plugin/generic/Heizungsregler.pl 2013-03-07 09:38:50 UTC (rev 1557)
+++ wiregate/plugin/generic/Heizungsregler.pl 2013-03-07 12:28:59 UTC (rev 1558)
@@ -330,7 +330,10 @@
{
unless(defined $T{$type}{$s})
{
- $T{$type}{$s}=knx_read($s,5*$house{cycle},$dpt);
+ # wir lesen mit 1000s aus dem Cache, denn die Temp-Sensoren sind sowieso auf 1wire
+ # (und antworten daher nicht innerhalb der Plugin-Laufzeit).
+ # Achtung: sowohl Fensterkontakte als auch Temp-Sensoren sollten zyklisch senden!
+ $T{$type}{$s}=knx_read($s,5*$house{cycle},$dpt,1000);
delete $T{$type}{$s} unless defined $T{$type}{$s} && $T{$type}{$s}!=85;
}
}
@@ -390,7 +393,7 @@
# und wenn alle Stricke reissen, bleibt der vorkonfigurierte Wert
$R{spread}=$house{spread} unless defined $R{spread};
- plugin_log($plugname, $r.": ".(join " ", map "$_=$R{$_}", qw(sensor inflow floor outflow spread window)));
+ #plugin_log($plugname, $r.": ".(join " ", map "$_=$R{$_}", qw(sensor inflow floor outflow spread window)));
return @R{qw(sensor inflow floor outflow spread window)};
}
@@ -444,9 +447,18 @@
# Regelparameter einlesen
my ($Tv,$Tn,$lim,$prop,$refspread)=(30,30,1,1,10); # Defaults
- ($Tv,$Tn,$lim,$prop,$refspread)
- =@{$house{$r}{pid}}{qw(Tv Tn lim prop refspread)}
- if defined $house{$r}{pid};
+ if(defined $house{$r}{pid})
+ {
+ ($Tv,$Tn,$lim,$prop,$refspread)=@{$house{$r}{pid}}{qw(Tv Tn lim prop refspread)};
+ }
+ else
+ {
+ $Tv=$house{Tv} if defined $house{Tv};
+ $Tn=$house{Tn} if defined $house{Tn};
+ $lim=$house{lim} if defined $house{lim};
+ $prop=$house{prop} if defined $house{prop};
+ $refspread=$house{refspread} if defined $house{refspread};
+ }
$Tv*=60; $Tn*=60; # in Sekunden umrechnen
@@ -468,6 +480,8 @@
mode=>$mode, T0=>$T0, Told=>$T, told=>$t, IS=>$IS, DF=>$DF,
temps=>$temps, times=>$times, Uvals=>$Uvals, U=>$U
};
+
+ plugin_log($plugname, "$r: WINDOW");
writeactuators($r,$U);
return ($T,$T0,$U,0);
@@ -569,9 +583,9 @@
}
else
{
- # Tn, Tv, prop und refspread wurden am Ende der HEAT-Periode bereits berechnet
- # Wir nutzen die "cooling"-Periode sowieso nicht.
- # Also Parameter ins Konfig-File schreiben.
+ # Tn, Tv, prop und refspread wurden am Ende der HEAT-Periode bereits berechnet.
+ # Wir nutzen die "cooling"-Periode sowieso nicht fuer die Berechnung der Parameter.
+ # Also Parameter jetzt (Beginn "cooling") schon ins Konfig-File schreiben.
my ($Tn, $Tv, $prop, $refspread) = @{$dyn{$r}}{qw(Tn Tv prop refspread)};
my $date=strftime("%F %X",localtime);
my $lim=0.5;
@@ -708,7 +722,7 @@
RESET($r);
$dyn{$r}{mode}='ON'; # ansonsten uebrige Werte behalten
$dyn{$r}{T0}=$T0old;
- return "FAILED:POS2";
+ return "FAILED:POS2 ";
}
$pos2 = nearest(1,$pos2-$S1/2);
@@ -755,7 +769,7 @@
$dyn{$r}{T0}=$T0old;
$dyn{$r}{Told}=$T;
- return "FAILED:NEG";
+ return "FAILED:NEG ";
}
# Statusvariablen zurueckschreiben
Modified: wiregate/plugin/generic/conf.d/Heizungsregler.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Heizungsregler.conf 2013-03-07 09:38:50 UTC (rev 1557)
+++ wiregate/plugin/generic/conf.d/Heizungsregler.conf 2013-03-07 12:28:59 UTC (rev 1558)
@@ -62,6 +62,30 @@
# outflow => '1/2/3', # hausweite Ruecklauftemp, falls nicht raumweise messbar
spread => 20, # hausweite Spreizung, falls alle Stricke reissen
+ # PID-Regelparameter fuer alle Raeume, die keine eigenen Parametersaetze (siehe ganz unten) definieren
+ # Falls diese Werte fehlen, wird als Standard (30, 30, 1, 1, 10) genommen
+
+ # Vorausblickende Zeit - D-Koeffizient
+ # groessere Werte sind aggressiver
+ Tv=>20,
+
+ # Nachstellzeit - I-Koeffizient, kleinere Werte sind aggressiver
+ # kleinere Werte sind aggressiver
+ Tn=>50,
+
+ # maximaler Beitrag der I-Komponente zur Ventilstellung, verhindert "wind-up"-Effekt
+ # groessere Werte sind aggressiver
+ lim=>0.5,
+
+ # Proportionalitaetsbereich (K) - Koeffizient vor allen drei (P, I, D)-Regelbeitr\xE4gen
+ # kleinere Werte sind aggressiver
+ prop=>0.7,
+
+ # alle obigen Koeffizienten (au\xDFer lim) beziehen sich auf diesen Referenzspread und werden fuer andere Spreads angepasst
+ # Es kommt im Endeffekt nur auf den Quotienten prop/refspread an!
+ # groessere Werte sind aggressiver
+ refspread=>20,
+
# Die Gruppenadressen fuer
# sensor (Ist-Temperatur im Raum),
# window (Fensterkontakte, dpt-Typ 1, Wert 1 bedeutet offen)
@@ -74,6 +98,8 @@
# Falls die auch fehlen, wird der fixe Spread weiter oben genommen.
# Wenn der auch noch fehlt, arbeitet der Regler nicht.
+# Es folgen die Definitionen der Raeume
+
WZ => {
control => $eibgaconf{TS_WZ}{ga}, # GA zum Setzen der Solltemperatur
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2013-04-23 20:43:17
|
Revision: 1707
http://openautomation.svn.sourceforge.net/openautomation/?rev=1707&view=rev
Author: makki1
Date: 2013-04-23 20:43:08 +0000 (Tue, 23 Apr 2013)
Log Message:
-----------
APC-Plugin, iks Aquastar (Nachtrag)
Added Paths:
-----------
wiregate/plugin/generic/APC_USV1.pl
wiregate/plugin/generic/iks-Aquastar.pl
Added: wiregate/plugin/generic/APC_USV1.pl
===================================================================
--- wiregate/plugin/generic/APC_USV1.pl (rev 0)
+++ wiregate/plugin/generic/APC_USV1.pl 2013-04-23 20:43:08 UTC (rev 1707)
@@ -0,0 +1,439 @@
+# 2011-12-08 V1.1
+# Simple plugin to interface apcupsd
+# apcupsd muss installiert und eingerichtet sein (seriell oder SNMP),
+# kann jedoch auch remote (Win/Linux/Mac) laufen
+# mehr unter http://knx-user-forum.de/wiregate/14764-usv-einbinden-2.html#post194641
+# Beispiel fuer komplette Ausgabe von apcaccess und apcupsd.conf am Ende
+
+##################
+### DEFINITION ###
+##################
+
+$plugin_info{$plugname.'_cycle'} = 120;
+
+my $graph = 1; # Global : 1 = RRD-Dateien werden vom Plugin erstellt (besser: collectd verwenden, siehe Forum)
+my $upsname = "USV1-SU420"; # Name (Prefix) fuer die RRDs
+
+# Hash fuer UPS-Werte/Gruppenadressen-Zuordnung
+# Die Reihenfolge spielt keine Rolle, DPT5 (Scaling 0-100%) fuer Prozentwerte,
+# DPT9 (2byte float) fuer andere, DPT16 fuer Plaintext-Ausgabe
+# Eintraege koennen einfach hinzugefuegt/weggelassen werden, wenn kein GA-Versand erwuenscht leer lassen
+my %items = (
+ 'STATUS' => {
+ 'GA' => '13/2/11',
+ 'DPT' => '16',
+ 'Graph' => 0
+ },
+ 'LINEV' => {
+ 'GA' => '',
+ 'DPT' => '9',
+ 'Graph' => 1
+ },
+ 'LOADPCT' => {
+ 'GA' => '13/2/13',
+ 'DPT' => '5',
+ 'Graph' => 1
+ },
+ 'BCHARGE' => {
+ 'GA' => '13/2/14',
+ 'DPT' => '5',
+ 'Graph' => 1
+ },
+ 'TIMELEFT' => {
+ 'GA' => '13/2/15',
+ 'DPT' => '9',
+ 'Graph' => 1
+ },
+ 'OUTPUTV' => {
+ 'GA' => '',
+ 'DPT' => '9',
+ 'Graph' => 0
+ },
+ 'ITEMP' => {
+ 'GA' => '',
+ 'DPT' => '9',
+ 'Graph' => 1
+ },
+ 'LINEFREQ' => {
+ 'GA' => '',
+ 'DPT' => '9',
+ 'Graph' => 1
+ },
+ 'LASTXFER' => {
+ 'GA' => '',
+ 'DPT' => '16',
+ 'Graph' => 0
+ },
+ 'TONBATT' => {
+ 'GA' => '',
+ 'DPT' => '9',
+ 'Graph' => 0
+ },
+ 'CUMONBATT' => {
+ 'GA' => '',
+ 'DPT' => '9',
+ 'Graph' => 0
+ },
+ 'SELFTEST' => {
+ 'GA' => '',
+ 'DPT' => '16',
+ 'Graph' => 0
+ },
+ # STATFLAG ist speziell, es gibt das Status-Bytes (Register0) als DPT5.010
+ # und die einzelnen Zustaende auf sep. 1Bit GAs aus
+ 'STATFLAG' => {
+ 'GA_byte1' => '13/2/40',
+ 'DPT' => '5.010',
+ 'GA_online' => '13/2/41',
+ 'GA_onbatt' => '13/2/42',
+ 'GA_overload' => '13/2/43',
+ 'GA_battlow' => '13/2/44',
+ 'GA_replacebatt' => '13/2/45',
+ },
+ # ERROR wird gesendet wenn die Abfrage nicht geht
+ 'ERROR' => {
+ 'GA' => '13/2/20',
+ 'DPT' => '1',
+ 'Graph' => 0,
+ 'Value' => '1', # Wert bei Fehler
+ },
+);
+
+# Hostname/Port wo apcupsd laeuft
+my $host = "localhost";
+my $port = "3551";
+
+my $debug_log = 1; # Debug-Ausgabe in Plugin-Log bei Fehlern
+
+#######################
+### ENDE DEFINITION ###
+#######################
+
+
+my @out = `apcaccess status $host:$port`;
+if ($out[0] =~ /^APC/) {
+ foreach my $line (@out) {
+ $line =~ s/\r|\n|\s//g; # remove CR/LF & Space
+ my ($item,$value) = split(/:/,$line,2);
+ if ($items{$item}) {
+ if ($items{$item}{GA}) {
+ if ($value =~ /([0-9]*\.?[0-9]+)(.*)/) {
+ knx_write($items{$item}{GA},$1,$items{$item}{DPT});
+ } elsif ($items{$item}{DPT} == 16) {
+ knx_write($items{$item}{GA},$value,$items{$item}{DPT});
+ }
+ }
+ if ($items{$item} and $item eq "STATFLAG" and $value =~ /(0x[0-9A-F]*)(.*)/) {
+ my $statbyte1 = hex($1);
+ $statbyte1 &= 0xFF;
+ my $online = ($statbyte1 & 0x08) >> 3;
+ my $onbatt = ($statbyte1 & 0x10) >> 4;
+ my $overload = ($statbyte1 & 0x20) >> 5;
+ my $battlow = ($statbyte1 & 0x40) >> 6;
+ my $replacebatt = ($statbyte1 & 0x80) >> 7;
+ if ($items{$item}{GA_byte1}) {
+ knx_write($items{$item}{GA_byte1},$statbyte1,$items{$item}{DPT});
+ }
+ if ($items{$item}{GA_online}) {
+ knx_write($items{$item}{GA_online},$online,1);
+ }
+ if ($items{$item}{GA_onbatt}) {
+ knx_write($items{$item}{GA_onbatt},$onbatt,1);
+ }
+ if ($items{$item}{GA_overload}) {
+ knx_write($items{$item}{GA_overload},$overload,1);
+ }
+ if ($items{$item}{GA_battlow}) {
+ knx_write($items{$item}{GA_battlow},$battlow,1);
+ }
+ if ($items{$item}{GA_replacebatt}) {
+ knx_write($items{$item}{GA_replacebatt},$replacebatt,1);
+ }
+ }
+ if ($items{$item}{Graph} and $graph and $value =~ /([0-9]*\.?[0-9]+)(.*)/) {
+ update_rrd($upsname,"_$item",$1);
+ }
+ }
+ }
+} else {
+ # Fehler, mach was damit?
+ knx_write($items{ERROR}{GA},$items{ERROR}{Value},$items{ERROR}{DPT});
+ return "Error! got: @out" if $debug_log;
+}
+return;
+
+
+### BEISPIELE ### (Ausgabe `apcaccess`)
+# siehe auch "man apcupsd"
+
+# Seriell
+#wiregate1:~# apcaccess
+#APC : 001,051,1289
+#DATE : Sat Apr 13 13:19:07 CEST 2013
+#HOSTNAME : wiregate1
+#RELEASE : 3.14.4
+#VERSION : 3.14.4 (18 May 2008) debian
+#UPSNAME : USV1-SU420
+#CABLE : Custom Cable Smart
+#MODEL : Smart-UPS 420
+#UPSMODE : Stand Alone
+#STARTTIME: Mon Mar 11 17:55:13 CET 2013
+#STATUS : ONLINE
+#LINEV : 230.4 Volts
+#LOADPCT : 20.8 Percent Load Capacity
+#BCHARGE : 100.0 Percent
+#TIMELEFT : 25.0 Minutes
+#MBATTCHG : 10 Percent
+#MINTIMEL : 5 Minutes
+#MAXTIME : 0 Seconds
+#MAXLINEV : 233.2 Volts
+#MINLINEV : 230.4 Volts
+#OUTPUTV : 233.2 Volts
+#SENSE : High
+#DWAKE : 000 Seconds
+#DSHUTD : 180 Seconds
+#DLOWBATT : 02 Minutes
+#LOTRANS : 208.0 Volts
+#HITRANS : 253.0 Volts
+#RETPCT : 000.0 Percent
+#ALARMDEL : Low Battery
+#BATTV : 13.8 Volts
+#LINEFREQ : 50.0 Hz
+#LASTXFER : Automatic or explicit self test
+#NUMXFERS : 2
+#XONBATT : Tue Mar 12 12:19:41 CET 2013
+#TONBATT : 0 seconds
+#CUMONBATT: 3 seconds
+#XOFFBATT : Tue Mar 12 12:19:43 CET 2013
+#LASTSTEST: Tue Mar 12 12:19:41 CET 2013
+#SELFTEST : NO
+#STESTI : 168
+#STATFLAG : 0x07000008 Status Flag
+#REG1 : 0x00 Register 1
+#REG2 : 0x00 Register 2
+#REG3 : 0x00 Register 3
+#MANDATE : 09/22/99
+#SERIALNO : NS9939240943
+#BATTDATE : 07/09/10
+#NOMOUTV : 230 Volts
+#NOMBATTV : 12.0 Volts
+#FIRMWARE : 21.4.I
+#APCMODEL : DWI
+#END APC : Sat Apr 13 13:19:59 CEST 2013
+#
+#
+# SNMP-Adapter
+#root@wiregate231:~# apcaccess
+#APC : 001,049,1173
+#DATE : Sat Apr 13 13:18:53 CEST 2013
+#HOSTNAME : wiregate231
+#RELEASE : 3.14.4
+#VERSION : 3.14.4 (18 May 2008) debian
+#UPSNAME : SU700EDV
+#CABLE : Custom Cable Smart
+#MODEL : SNMP UPS Driver
+#UPSMODE : Stand Alone
+#STARTTIME: Mon Sep 10 20:52:34 CEST 2012
+#STATUS : ONLINE
+#LINEV : 236.0 Volts
+#LOADPCT : 28.0 Percent Load Capacity
+#BCHARGE : 100.0 Percent
+#TIMELEFT : 24.0 Minutes
+#MBATTCHG : 10 Percent
+#MINTIMEL : 5 Minutes
+#MAXTIME : 0 Seconds
+#MAXLINEV : 240.0 Volts
+#MINLINEV : 235.0 Volts
+#OUTPUTV : 237.0 Volts
+#SENSE : Medium
+#DWAKE : 060 Seconds
+#DSHUTD : 020 Seconds
+#DLOWBATT : 02 Minutes
+#LOTRANS : 196.0 Volts
+#HITRANS : 253.0 Volts
+#RETPCT : 000.0 Percent
+#ITEMP : 44.0 C Internal
+#ALARMDEL : 5 seconds
+#LINEFREQ : 50.0 Hz
+#LASTXFER : Automatic or explicit self test
+#NUMXFERS : 0
+#TONBATT : 0 seconds
+#CUMONBATT: 0 seconds
+#XOFFBATT : N/A
+#SELFTEST : OK
+#STESTI : biweekly
+#STATFLAG : 0x07000008 Status Flag
+#DIPSW : 0x00 Dip Switch
+#MANDATE : 05/05/00
+#SERIALNO : NS0019241899
+#BATTDATE : 05/01/11
+#NOMOUTV : 230 Volts
+#NOMPOWER : 0 Watts
+#EXTBATTS : 0
+#BADBATTS : 0
+#FIRMWARE : 50.11.I
+#APCMODEL : SMART-UPS 700
+#END APC : Sat Apr 13 13:19:37 CEST 2013
+
+# SNMP-Adapter
+#wiregate1:~# apcaccess status elab14
+#APC : 001,052,1287
+#DATE : Sat Apr 13 17:39:07 W. Europe Daylight Time 2013
+#HOSTNAME : elab14
+#RELEASE : 3.14.0
+#VERSION : 3.14.0 (9 February 2007) Win32
+#UPSNAME : ElabUSV1
+#CABLE : Ethernet Link
+#MODEL : SNMP UPS Driver
+#UPSMODE : Stand Alone
+#STARTTIME: Wed Mar 27 10:30:48 W. Europe Standard Time 2013
+#STATUS : REPLACEBATT
+#LINEV : 243.0 Volts
+#LOADPCT : 27.0 Percent Load Capacity
+#BCHARGE : 000.0 Percent
+#TIMELEFT : 0.0 Minutes
+#MBATTCHG : 5 Percent
+#MINTIMEL : 10 Minutes
+#MAXTIME : 0 Seconds
+#MAXLINEV : 243.0 Volts
+#MINLINEV : 243.0 Volts
+#OUTPUTV : 227.0 Volts
+#SENSE : Low
+#DWAKE : 060 Seconds
+#DSHUTD : 300 Seconds
+#DLOWBATT : 10 Minutes
+#LOTRANS : 176.0 Volts
+#HITRANS : 264.0 Volts
+#RETPCT : 000.0 Percent
+#ITEMP : 17.0 C Internal
+#ALARMDEL : 30 seconds
+#LINEFREQ : 50.0 Hz
+#LASTXFER : Automatic or explicit self test
+#NUMXFERS : 0
+#TONBATT : 0 seconds
+#CUMONBATT: 0 seconds
+#XOFFBATT : N/A
+#SELFTEST : NG
+#STESTI : biweekly
+#STATFLAG : 0x07000080 Status Flag
+#DIPSW : 0x00 Dip Switch
+#REG1 : 0x00 Register 1
+#REG2 : 0x00 Register 2
+#REG3 : 0x00 Register 3
+#MANDATE : 04/01/97
+#SERIALNO : 81012965
+#BATTDATE : 04/01/97
+#NOMOUTV : 230
+#NOMINV : 000
+#EXTBATTS : 2
+#BADBATTS : 0
+#FIRMWARE : 5ZI
+#APCMODEL : MATRIX 5000
+#END APC : Sat Apr 13 17:39:46 W. Europe Daylight Time 2013
+
+## Smart-UPS 1500 via USB
+#root@wiregateXXX:~# apcaccess
+#APC : 001,042,1046
+#DATE : Tue Apr 23 09:05:24 CEST 2013
+#HOSTNAME : wiregate915
+#RELEASE : 3.14.4
+#VERSION : 3.14.4 (18 May 2008) debian
+#UPSNAME : USV_Technik
+#CABLE : Custom Cable Smart
+#MODEL : Smart-UPS 1500
+#UPSMODE : Stand Alone
+#STARTTIME: Tue Apr 23 08:43:50 CEST 2013
+#STATUS : ONLINE
+#LINEV : 239.0 Volts
+#LOADPCT : 0.0 Percent Load Capacity
+#BCHARGE : 100.0 Percent
+#TIMELEFT : 322.0 Minutes
+#MBATTCHG : 10 Percent
+#MINTIMEL : 5 Minutes
+#MAXTIME : 0 Seconds
+#OUTPUTV : 239.0 Volts
+#SENSE : High
+#DWAKE : -01 Seconds
+#DSHUTD : 180 Seconds
+#LOTRANS : 208.0 Volts
+#HITRANS : 253.0 Volts
+#RETPCT : 015.0 Percent
+#ITEMP : 28.8 C Internal
+#ALARMDEL : Always
+#BATTV : 27.5 Volts
+#LINEFREQ : 50.0 Hz
+#LASTXFER : No transfers since turnon
+#NUMXFERS : 0
+#TONBATT : 0 seconds
+#CUMONBATT: 0 seconds
+#XOFFBATT : N/A
+#SELFTEST : NO
+#STATFLAG : 0x07000008 Status Flag
+#SERIALNO : XXXXYYYYY
+#BATTDATE : 2012-02-27
+#NOMOUTV : 230 Volts
+#NOMBATTV : 24.0 Volts
+#FIRMWARE : 653.13.I USB FW:4.2
+#APCMODEL : Smart-UPS 1500
+#END APC : Tue Apr 23 09:06:01 CEST 2013
+
+
+### BEISPIELE ### apcupsd.conf
+# Seriell (smart-cable), lokal:
+
+#UPSNAME USV1-SU420
+#UPSCABLE smart
+#UPSTYPE apcsmart
+#DEVICE /dev/usbserial-1-4.1
+#LOCKFILE /var/lock
+#ONBATTERYDELAY 6
+#TIMEOUT 0
+#ANNOY 300
+#ANNOYDELAY 60
+#NOLOGON disable
+#KILLDELAY 0
+#NETSERVER on
+#NISIP 0.0.0.0
+#NISPORT 3551
+#EVENTSFILE /var/log/apcupsd.events
+#EVENTSFILEMAX 10
+#UPSCLASS standalone
+#UPSMODE disable
+#STATTIME 0
+#STATFILE /var/log/apcupsd.status
+#LOGSTATS off
+#DATATIME 0
+#
+#
+#apcupsd.conf Netzwerk / via SNMP-Adapter:
+#UPSNAME SU700-EDV
+#UPSCABLE smart
+#UPSTYPE snmp
+#DEVICE 172.17.2.66:161:APC:public
+#LOCKFILE /var/lock
+#SCRIPTDIR /etc/apcupsd
+#PWRFAILDIR /etc/apcupsd
+#NOLOGINDIR /etc
+#ONBATTERYDELAY 6
+#TIMEOUT 0
+#ANNOY 300
+#ANNOYDELAY 60
+#NOLOGON disable
+#KILLDELAY 0
+#NETSERVER on
+#NISIP 0.0.0.0
+#NISPORT 3551
+#EVENTSFILE /var/log/apcupsd.events
+#EVENTSFILEMAX 100
+#UPSCLASS standalone
+#UPSMODE disable
+#STATTIME 0
+#STATFILE /var/log/apcupsd.status
+#LOGSTATS off
+#DATATIME 0
+#
+
+#apcupsd.conf via USB direkt:
+#UPSCABLE smart
+#UPSTYPE usb
+
Added: wiregate/plugin/generic/iks-Aquastar.pl
===================================================================
--- wiregate/plugin/generic/iks-Aquastar.pl (rev 0)
+++ wiregate/plugin/generic/iks-Aquastar.pl 2013-04-23 20:43:08 UTC (rev 1707)
@@ -0,0 +1,74 @@
+# V1.0 2013-04-07
+# simple Plugin fuer iks Aquastar
+# socat: socat /dev/ttyS0,raw,b9600,cs8,icanon=1 udp-datagram:localhost:50108,reuseaddr
+
+##################
+### DEFINITION ###
+##################
+
+my $socknum = 1; # Eindeutige Nummer des Sockets
+
+my $interval = 120; # Sendeintervall KNX
+
+my $recv_ip = "localhost"; # Empfangsport (UDP, wie in Socket-Einstellungen)
+my $recv_port = "50108"; # Empfangsport (UDP, wie in Socket-Einstellungen)
+
+my $temp_ga = "13/3/1";
+my $ph_ga = "13/3/2";
+my $redox_ga = "13/3/3";
+
+# Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches pruefen)
+$plugin_info{$plugname.'_cycle'} = 300;
+
+#######################
+### ENDE DEFINITION ###
+#######################
+
+# Hauptverarbeitung
+if (!$socket[$socknum]) { # socket erstellen
+ $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
+ Proto => "udp",
+ LocalAddr => $recv_ip
+ )
+ or return ("open of $recv_ip : $recv_port failed: $!");
+ $socksel->add($socket[$socknum]); # add socket to select
+ $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
+ return "opened UDP-Socket $socknum";
+}
+elsif ($fh) { # Read from UDP-Socket
+ my $buf;
+ recv($fh,$buf,255,0);
+ next if(!$buf || length($buf) < 2); # Bogus messages
+ $buf =~ s/\r|\n//g; # remove CR/LF
+ my $bufhex = $buf;
+ $bufhex =~ s/(.)/sprintf("%x ",ord($1))/eg;
+ if($buf =~ /^E([0-9]+) (\(.*\))([\s-+]*?[0-9]*\.?[0-9]+).*/ ) {
+ if ($1 == 2) {
+ $plugin_info{$plugname.'_tempval'} = $3;
+ } elsif ($1 == 3) {
+ $plugin_info{$plugname.'_phval'} = $3;
+ } elsif ($1 == 4) {
+ $plugin_info{$plugname.'_redoxval'} = $3;
+ }
+ if (time() - $plugin_info{$plugname.'_sentlast'} > $interval) {
+ # write to knx
+ knx_write($temp_ga,$plugin_info{$plugname.'_tempval'},9);
+ knx_write($ph_ga,$plugin_info{$plugname.'_phval'},9);
+ knx_write($redox_ga,$plugin_info{$plugname.'_redoxval'},9);
+ # Update _sentlast
+ $plugin_info{$plugname.'_sentlast'} = time();
+ }
+ #return "Recv $buf == Input: $1 Type/State: $2 Val: $3";
+ } else {
+ #DEBUG: return "Recv $buf ($bufhex)";
+ }
+}
+return;
+
+# in debug we get:
+#2013-04-07 14:57:03.024,iks-Aquastar,Recv E1 (Pe ) Wasser (45 31 20 28 50 65 20 29 20 57 61 73 73 65 72 20 20 20 20 ),0s,
+#2013-04-07 14:57:04.867,iks-Aquastar,Recv E2 (Te ) 26.5 �C == Input: 2 Type: (Te ) Val: 26.5,0s,
+#2013-04-07 14:57:06.712,iks-Aquastar,Recv E3 (pH )07.87 pH == Input: 3 Type: (pH ) Val: 07.87,0s,
+#2013-04-07 14:57:09.140,iks-Aquastar,Recv E4 (Rx ) +396 mV == Input: 4 Type: (Rx ) Val: +396,0s,
+#2013-04-07 14:57:10.874,iks-Aquastar,Recv E15:10 So, 07.04. (45 31 35 3a 31 30 20 20 20 20 53 6f 2c 20 30 37 2e 30 34 2e ),0s,
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mc...@us...> - 2013-05-20 18:24:28
|
Revision: 1743
http://openautomation.svn.sourceforge.net/openautomation/?rev=1743&view=rev
Author: mclb
Date: 2013-05-20 18:24:18 +0000 (Mon, 20 May 2013)
Log Message:
-----------
Sonnenstandsabh?\195?\164ngige Beschattung mittels Raffstores oder Rolll?\195?\164den
Added Paths:
-----------
wiregate/plugin/generic/berechne_sonnenstand.pl
wiregate/plugin/generic/beschattung_doit.pl
wiregate/plugin/generic/beschattung_freigabe.pl
Added: wiregate/plugin/generic/berechne_sonnenstand.pl
===================================================================
--- wiregate/plugin/generic/berechne_sonnenstand.pl (rev 0)
+++ wiregate/plugin/generic/berechne_sonnenstand.pl 2013-05-20 18:24:18 UTC (rev 1743)
@@ -0,0 +1,107 @@
+#############################################################################
+# Plugin: Berechnung Azimuth und Elevation per Standort
+# V1.0 2013-05-06
+# Copyright: Marcus Lichtenberger (ma...@li...)
+# License: GPL (v3)
+#
+# Das Ergebnis dieses Plugins kann in mehreren anderen Plugins verwendet werden.
+#
+#############################################################################
+#
+# \xC4nderungshistorie:
+# 20130506 - mclb - Erstellung
+#
+#############################################################################
+#
+# Offene Punkte:
+# - Dzt. keine bekannt
+#
+#############################################################################
+#
+# Abh\xE4ngigkeiten:
+# - Paket libastro-satpass-perl
+# - Astro::Coord::ECI;
+# - Astro::Coord::ECI::Sun;
+# - Astro::Coord::ECI::TLE;
+# - Astro::Coord::ECI::Utils qw{rad2deg deg2rad};
+# - Installation:
+# - Wiregate Web-IF unter Updates Paket installieren libastro-satpass-perl oder
+# - in der Konsole apt-get -install libastro-satpass-perl
+#
+#############################################################################
+#
+# plugin_info-Werte
+# - azimuth: Azimuth-Wert
+# - elevation: Elevation-Wert
+#
+#############################################################################
+
+# Module laden
+use Astro::Coord::ECI;
+use Astro::Coord::ECI::Sun;
+use Astro::Coord::ECI::TLE;
+use Astro::Coord::ECI::Utils qw{rad2deg deg2rad};
+
+my $gv_lat;
+my $gv_lon;
+my $gv_elev;
+my $show_debug;
+
+my $gv_azimuth;
+my $gv_elevation;
+
+# Read config file in conf.d
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+if (! -f $confFile)
+{
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ return "no conf file [$confFile] found.";
+}
+else
+{
+ plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 1);
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ if( $show_debug > 1 )
+ {
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ }
+ if ($@)
+ {
+ plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 1 );
+ my @parts = split(/\n/, $@);
+ if( $show_debug > 1 )
+ {
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+ }
+}
+
+# Ruf mich alle 5 Minuten selbst auf und berechne Azimuth und Elevation neu
+$plugin_info{$plugname.'_cycle'} = 60;
+
+($gv_azimuth, $gv_elevation) = berechneSonnenstand($gv_lat, $gv_lon, $gv_elev);
+
+$plugin_info{'azimuth'} = $gv_azimuth;
+$plugin_info{'elevation'} = $gv_elevation;
+
+return 'Sonnenstand erfolgreich berechnet!';
+
+####################################################
+# Aufruf mit berechneSonnenstand($lat, $lon, $elev);
+####################################################
+sub berechneSonnenstand {
+ # Aktuelle Zeit
+ my $lv_time = time ();
+ # Die eigenen Koordinaten
+ my $lv_loc = Astro::Coord::ECI->geodetic(deg2rad(shift), deg2rad(shift), shift);
+ # Sonne instanzieren
+ my $lv_sun = Astro::Coord::ECI::Sun->universal($lv_time);
+ # Feststellen wo die Sonne gerade ist
+ my ($lv_azimuth, $lv_elevation, $lv_range) = $lv_loc->azel($lv_sun);
+ $lv_azimuth = rad2deg($lv_azimuth);
+ $lv_elevation = rad2deg($lv_elevation);
+ return ($lv_azimuth, $lv_elevation);
+}
\ No newline at end of file
Added: wiregate/plugin/generic/beschattung_doit.pl
===================================================================
--- wiregate/plugin/generic/beschattung_doit.pl (rev 0)
+++ wiregate/plugin/generic/beschattung_doit.pl 2013-05-20 18:24:18 UTC (rev 1743)
@@ -0,0 +1,439 @@
+#############################################################################
+# Plugin: Beschattung mit Raffstores/Roll\xE4den
+# V1.0 2013-05-06
+# Copyright: Marcus Lichtenberger (ma...@li...)
+# License: GPL (v3)
+#
+#############################################################################
+#
+# Plugin zur Beschattung eines Hauses mittels Raffstores oder Roll\xE4den
+# - Helligkeitsabh\xE4ngige Beschattung
+# - Beschattung je Sonnenstand
+# - Hochfahren der Beschattung, wenn Fenster ge\xF6ffnet wird
+# - Sperre der gesamten Beschattung bzw. jedes einzelnen Fensters mittels Bustelegramm
+# - Lamellennachf\xFChrung bei Raffstores
+# - Sommer- und Winter-Modus
+#
+#############################################################################
+#
+# \xC4nderungshistorie:
+# 20120804 - joda123 - rollo_beschattungsposition eingef\xFChrt: Rollos k\xF6nnen bei
+# Beschattung jetzt n% geschlossen werden (vorher immer 100%)
+# 20120805 - joda123 - Lokale Definitionen in conf Datei ausgelagert: Es sind keine
+# site-spezifischen Definitionen in diesem Script mehr erforderlich.
+# Alle lokalen Anpassungen in /etc/wiregate/plugin/generic/conf.d/beschattung_v2.conf
+# 20120808 - mclb - Lamellenbehandlung nur noch, wenn $gs_raffstore->{lamellenNachfuehrung} nicht NACHF_AUS ist
+# 20120808 - mclb - Neuen Header eingef\xFCgt (nun mit Hinweis auf GPL, damit auch Andere hier weiterentwickeln k\xF6nnen
+# 20120808 - mclb - Umbenennung von beschattung_v2 auf beschattung
+# 20120821 - mclb - Definition einer Konstante hat gefehlt
+# NACHF_100 gefixt
+# 20120920 - mclb - Winter-Modus (Aktivierbar \xFCber eigene GA; Im Winter-Modus k\xF6nnen die Lamellen an eine andere Stelle zur Beschattung gefahren werden)
+# 20120925 - mclb - Beschattung temperaturabh\xE4ngig aktivieren/deaktivieren
+# 20130506 - mclb - Aufteilen in 2 Plugins - 1. Freigabe, 2. Ausf\xFChrung
+#
+#############################################################################
+#
+# Offene Punkte:
+# - Beschattung abh\xE4ngig von der Raumtemperatur
+#
+#############################################################################
+#
+# Abh\xE4ngigkeiten:
+# - Plugin beschattung_freigabe
+#
+#############################################################################
+#
+# plugin_info-Werte
+#
+#############################################################################
+
+# Konstanten f\xFCr Aufrufart
+use constant EVENT_RESTART => 'restart';
+use constant EVENT_MODIFIED => 'modified';
+use constant EVENT_BUS => 'bus';
+use constant EVENT_SOCKET => 'socket';
+use constant EVENT_CYCLE => 'cycle';
+# Konstanten f\xFCr die Freigabe
+use constant FREIGABE_AUS => 0;
+use constant FREIGABE_EIN => 1;
+# Konstanten f\xFCr Nachf\xFChrung ein/aus
+use constant NACHF_AUS => 'AUS';
+use constant NACHF_EIN => 'EIN';
+use constant NACHF_100 => '100';
+# Konstanten f\xFCr Raffstore-Attribute
+use constant AKTIV => 'A';
+use constant INAKTIV => 'I';
+use constant SPERRE_AKTIV => 1;
+use constant SPERRE_INAKTIV => 0;
+use constant AUTOMATIK_EIN => 'EIN';
+use constant AUTOMATIK_AUS => 'AUS';
+# Konstanten f\xFCr die Trennung der dynamischen Raffstore-Definitionen
+use constant SEPARATOR1 => ';';
+use constant SEPARATOR2 => '->';
+# Konstanten f\xFCr Temperaturfreigabe
+use constant TEMPFREIGABE_EIN => 'EIN';
+use constant TEMPFREIGABE_AUS => 'AUS';
+
+# Variablendefinitionen
+my $gv_helligkeit;
+my $gv_zeitpunkt;
+my $gv_zeitdifferenz;
+my $gs_raffstore;
+my $gv_raffstore_dyn;
+my @gt_raffstores_dyn;
+my $gv_id;
+my $gv_aktiv;
+my $gv_sperre;
+my $gv_automatik;
+my $gv_startWinkel;
+my $gv_endWinkel;
+my $gv_rolloPos;
+my $gv_rolloBeschattungspos;
+my $gv_lamellePos;
+my $gv_lamellePosNeu;
+my $gv_index;
+my $gv_tempFreigabe;
+my $gv_temperatur;
+my $gv_temperaturFreigabe;
+# Zeitpunkt auslesen
+my $gv_sekunden;
+my $gv_minuten;
+my $gv_stunden;
+my $gv_monatstag;
+my $gv_monat;
+my $gv_jahr;
+my $gv_wochentag;
+my $gv_jahrestag;
+my $gv_sommerzeit;
+
+# Definition und Initialisierung der konfigurierbaren Werte
+my $show_debug = 0; # switches debug information that will be shown in the log
+my $gv_gaWinter = "";
+my $gv_gaFreigabe = "";
+my @gt_raffstores;
+
+# Read config file in conf.d
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+if (! -f $confFile)
+{
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ return "no conf file [$confFile] found.";
+}
+else
+{
+ plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 1);
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ if( $show_debug > 1 )
+ {
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ }
+ if ($@)
+ {
+ plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 1 );
+ my @parts = split(/\n/, $@);
+ if( $show_debug > 1 )
+ {
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+ }
+}
+
+# Ruf mich alle 60 Sekunden selbst auf, damit ich pr\xFCfen kann, ob die Helligkeit \xFCber-/unterschritten wurde
+$plugin_info{$plugname.'_cycle'} = 60;
+# Ruf mich auf, wenn zwischen Sommer- und Winter-Modus gewechselt wird
+if ($gv_gaWinter ne '') {
+ $plugin_subscribe{$gv_gaWinter}{$plugname} = 1;
+}
+# Ruf mich auf, wenn sich die Freigabe \xE4ndert
+if ($gv_gaFreigabe ne '') {
+ $plugin_subscribe{$gv_gaFreigabe}{$plugname} = 1;
+}
+# Ruf mich auf, wenn sich an der Sperr-GA eines Raffstores etwas \xE4ndert
+# Ruf mich auf, wenn sich der Fenster-Status \xE4ndert
+foreach $gs_raffstore (@gt_raffstores) {
+ # Aufruf bei Sperr-GA
+ if ($gs_raffstore->{gaSperre} ne "") {
+ $plugin_subscribe{$gs_raffstore->{gaSperre}}{$plugname} = 1;
+ }
+ # Aufruf, wenn sich der Fenster-Status \xE4ndert (offen/geschlossen)
+ if ($gs_raffstore->{gaFensterStatus} ne "") {
+ $plugin_subscribe{$gs_raffstore->{gaFensterStatus}}{$plugname} = 1;
+ }
+ # Aufruf, wenn eine ben\xF6tigte Temperatur gesendet wird
+ if ($gs_raffstore->{gaTemperatur} ne "") {
+ $plugin_subscribe{$gs_raffstore->{gaTemperatur}}{$plugname} = 1;
+ }
+}
+
+# Dynamische Teile der Raffstore-Definition einlesen
+@gt_raffstores_dyn = split(SEPARATOR1, $plugin_info{$plugname.'_gt_raffstores_dyn'});
+foreach $gv_raffstore_dyn (@gt_raffstores_dyn) {
+ ($gv_id, $gv_aktiv, $gv_sperre, $gv_automatik, $gv_temperatur, $gv_temperaturFreigabe) = split(SEPARATOR2, $gv_raffstore_dyn);
+
+ # Wegen Update auf gt_raffstores hier eine for-Schleife
+ for ($gv_index=0; $gv_index<@gt_raffstores; $gv_index++) {
+ $gs_raffstore = $gt_raffstores[$gv_index];
+ if ($gs_raffstore->{id} eq $gv_id) {
+ if ($gv_aktiv ne '') {
+ $gs_raffstore->{aktiv} = $gv_aktiv;
+ }
+ if ($gv_sperre ne '') {
+ $gs_raffstore->{sperre} = $gv_sperre;
+ }
+ if ($gv_automatik ne '') {
+ $gs_raffstore->{automatik} = $gv_automatik;
+ }
+ if ($gv_temperatur ne '') {
+ $gs_raffstore->{valueTemperatur} = $gv_temperatur;
+ }
+ if ($gv_temperaturFreigabe ne '') {
+ $gs_raffstore->{temperaturFreigabe} = $gv_temperaturFreigabe;
+ }
+ $gt_raffstores[$gv_index] = $gs_raffstore;
+ last();
+ }
+ }
+}
+
+# Module laden
+use Astro::Coord::ECI;
+use Astro::Coord::ECI::Sun;
+use Astro::Coord::ECI::TLE;
+use Astro::Coord::ECI::Utils qw{rad2deg deg2rad};
+
+# Aus welchem Grund l\xE4uft das Plugin gerade
+my $gv_event=undef;
+if (!$plugin_initflag) {
+ $gv_event = EVENT_RESTART; # Restart des daemons / Reboot
+} elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {
+ $gv_event = EVENT_MODIFIED; # Plugin modifiziert
+} elsif (%msg) {
+ $gv_event = EVENT_BUS; # Bustraffic
+} elsif ($fh) {
+ $gv_event = EVENT_SOCKET; # Netzwerktraffic
+} else {
+ $gv_event = EVENT_CYCLE; # Zyklus
+}
+
+if ($gv_event eq EVENT_RESTART) {
+ #Default: Sommermodus
+ if (!exists $plugin_info{$plugname.'_winterModus'}) {
+ $plugin_info{$plugname.'_winterModus'} = 0;
+ }
+ if (!exists $gs_raffstore->{temperaturFreigabe}) {
+ $gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_AUS;
+ }
+} elsif ($gv_event eq EVENT_MODIFIED) {
+ # Default nicht beschatten, falls der Wert noch nicht existiert
+ if (!exists $plugin_info{$plugname.'_freigabe'}) {
+ $plugin_info{$plugname.'_freigabe'} = FREIGABE_AUS;
+ }
+ if (!exists $gs_raffstore->{temperaturFreigabe}) {
+ $gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_AUS;
+ }
+} elsif ($gv_event eq EVENT_BUS) {
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaFreigabe) {
+ plugin_log($plugname, '20 - Freigabe = '.$msg{'value'});
+ $plugin_info{$plugname.'_freigabe'} = $msg{'value'};
+ } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaWinter) {
+ # Umschalten zwischen Sommer- und Wintermodus
+ $plugin_info{$plugname.'_winterModus'} = $msg{'value'};
+ } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gv_gaWinter) {
+ # R\xFCckmeldung, ob gerade Sommer- oder Wintermodus aktiv ist
+ knx_write($gv_gaWinter,$plugin_info{$plugname.'_winterModus'});
+ } else {
+ for ($gv_index=0; $gv_index < @gt_raffstores; $gv_index++) {
+ # Muss mittels for-Schleife (und nicht foreach) gemacht werden, weil ich die Werte in der Schleife updaten muss.
+ $gs_raffstore = $gt_raffstores[$gv_index];
+
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gs_raffstore->{gaSperre}) {
+ # Sperre wurde gesetzt oder aufgehoben
+ $gs_raffstore->{sperre} = $msg{'value'};
+ }
+ if ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gs_raffstore->{gaSperre}) {
+ # Sperre wurde abgefragt
+ knx_write($gs_raffstore->{gaSperre}, $gs_raffstore->{sperre});
+ }
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gs_raffstore->{gaFensterStatus}) {
+ if ($msg{'value'} == 0) {
+ # Wird ein Fenster ge\xF6ffnet, dann Raffstore nach oben und Automatik aus
+ $gs_raffstore->{automatik} = AUTOMATIK_AUS;
+ $gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
+ if ($gv_rolloPos != 0) {
+ knx_write($gs_raffstore->{gaRolloPos}, 0, 5.001);
+ }
+ if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
+ $gv_lamellePos = knx_read($gs_raffstore->{gaLamellePosRM}, 5.001);
+ if ($gv_lamellePos != 0) {
+ knx_write($gs_raffstore->{gaLamellePos}, 0, 5.001);
+ }
+ }
+ } elsif ($msg{'value'} == 1) {
+ # Wird ein Fenster geschlossen, dann Automatik aus
+ $gs_raffstore->{automatik} = AUTOMATIK_EIN;
+ }
+ }
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gs_raffstore->{gaTemperatur}) {
+ $gs_raffstore->{valueTemperatur} = $msg{'value'};
+ }
+ $gt_raffstores[$gv_index] = $gs_raffstore;
+ }
+ }
+} elsif ($gv_event eq EVENT_SOCKET) {
+} elsif ($gv_event eq EVENT_CYCLE) {
+ # Beschattungs-Automatik
+ plugin_log($plugname,'10 - Cycle-Aufruf, Sperre = '.$plugin_info{$plugname.'_sperre'}.', Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
+ if ($plugin_info{$plugname.'_sperre'} == SPERRE_INAKTIV) {
+ plugin_log($plugname,'11 - Beschattung') if ($show_debug > 0);
+ plugin_log($plugname,'11a - Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
+
+ # Automatik l\xE4uft grunds\xE4tzlich
+ foreach $gs_raffstore (@gt_raffstores) {
+ plugin_log($plugname,'12 - Aktiv = '.$gs_raffstore->{aktiv}.', Sperre = '.$gs_raffstore->{sperre}.', Automatik = '.$gs_raffstore->{automatik}) if ($show_debug > 0);
+
+ if ($gs_raffstore->{aktiv} eq AKTIV and
+ $gs_raffstore->{sperre} == SPERRE_INAKTIV and
+ $gs_raffstore->{automatik} eq AUTOMATIK_EIN) {
+
+ plugin_log($plugname,'13 - Beschattung aktiv; Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
+
+ # Automatik ist aktiv -> also mach nun deine Arbeit
+ if ($plugin_info{$plugname.'_freigabe'} eq FREIGABE_AUS) {
+ # Freigabe ist aufgrund der Helligkeit nicht notwendig -> Raffstore nach oben!
+
+ plugin_log($plugname,'14 - Freigabe AUS -> Raffstores nach oben') if ($show_debug > 0);
+
+ # Raffstores hoch
+ $gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
+ if ($gv_rolloPos != 0) {
+ knx_write($gs_raffstore->{gaRolloPos}, 0, 5.001);
+ }
+ if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
+ $gv_lamellePos = knx_read($gs_raffstore->{gaLamellePosRM}, 5.001);
+ if ($gv_lamellePos != 0) {
+ knx_write($gs_raffstore->{gaLamellePos}, 0, 5.001);
+ }
+ }
+ } else {
+ plugin_log($plugname,'15 - Freigabe EIN -> Ausrichtungsabh\xE4ngig beschatten; Ausrichtung = '.$gs_raffstore->{ausrichtung}) if ($show_debug > 0);
+
+ if (exists($gs_raffstore->{ausrichtung})) {
+ #Startwinkel berechnen
+ $gv_startWinkel = $gs_raffstore->{ausrichtung} - 85;
+ if ($gv_startWinkel < 0) {
+ $gv_startWinkel = $gv_startWinkel + 360;
+ }
+ # Endwinkel berechnen
+ $gv_endWinkel = $gs_raffstore->{ausrichtung} + 85;
+ if ($gv_endWinkel > 360) {
+ $gv_endWinkel = $gv_endWinkel - 360;
+ }
+ }
+ if (exists($gs_raffstore->{startWinkel})) {
+ $gv_startWinkel = $gs_raffstore->{startWinkel};
+ }
+ if (exists($gs_raffstore->{endWinkel})) {
+ $gv_endWinkel = $gs_raffstore->{endWinkel};
+ }
+
+ # Muss aufgrund der Raumtemperatur beschattet werden?
+ if (exists $gs_raffstore->{minTemperatur} and
+ exists $gs_raffstore->{maxTemperatur} and
+ exists $gs_raffstore->{valueTemperatur} ) {
+
+ plugin_log($plugname,'15a - minTemperatur = '.$gs_raffstore->{minTemperatur}.', maxTemperatur = '.$gs_raffstore->{maxTemperatur}.', valueTemperatur = '.$gs_raffstore->{valueTemperatur}) if ($show_debug > 0);
+
+ if ($gs_raffstore->{valueTemperatur} < $gs_raffstore->{minTemperatur}) {
+ $gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_AUS;
+ }
+ if ($gs_raffstore->{valueTemperatur} > $gs_raffstore->{maxTemperatur}) {
+ $gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_EIN;
+ }
+ } else {
+ # Wenn keine explizite Temperaturfreigabelogik vorhanden, dann default freigegeben verwenden
+ $gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_EIN;
+ }
+
+ plugin_log($plugname,'16 - StartWinkel = '.$gv_startWinkel.', EndWinkel = '.$gv_endWinkel.', Azimuth = '.$plugin_info{'azimuth'}) if ($show_debug > 0);
+ plugin_log($plugname,'16a - TemperaturFreigabe = '.$gs_raffstore->{temperaturFreigabe}) if ($show_debug > 0);
+
+ # Aktuelle Sonnenposition verwenden um zu bestimmen, ob der Raffstore gerade beschattet werden muss
+ if ($plugin_info{'azimuth'} >= $gv_startWinkel and
+ $plugin_info{'azimuth'} <= $gv_endWinkel and
+ $gs_raffstore->{temperaturFreigabe} eq TEMPFREIGABE_EIN) {
+
+ # Beschattung aufgrund der Ausrichtung und Raumtemperatur
+
+ # Raffstore runter
+ $gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
+ if ($plugin_info{$plugname.'_winterModus'} == 1) {
+ $gv_rolloBeschattungspos = $gs_raffstore->{rolloBeschattungsposWinter};
+ } else {
+ $gv_rolloBeschattungspos = $gs_raffstore->{rolloBeschattungspos};
+ }
+ if ($gv_rolloPos != $gv_rolloBeschattungspos) {
+ knx_write($gs_raffstore->{gaRolloPos}, $gv_rolloBeschattungspos, 5.001);
+ }
+ if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
+ $gv_lamellePos = knx_read($gs_raffstore->{gaLamellePosRM}, 5.001);
+ }
+
+ # Lamellennachf\xFChrung
+
+ if ($gv_minuten % 5 == 0) {
+ if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
+ if ($gs_raffstore->{lamellenNachfuehrung} eq NACHF_100) {
+ # Somit wird auf jeden Fall ganz zu gemacht.
+ $gv_lamellePos = 0;
+ $gv_lamellePosNeu = 100;
+ } else {
+ $gv_lamellePosNeu = (90 - $plugin_info{$plugname.'_elevation'})/90*100;
+ # Faktor f\xFCr die Abweichung der Sonne von der Ausrichtung des Fensters miteinbeziehen
+ $gv_lamellePosNeu = $gv_lamellePosNeu * (1 - (abs($plugin_info{'azimuth'} - $gs_raffstore->{ausrichtung}) * 0.01));
+ # Der Wert f\xFCr den Lamellenwinkel muss immer zwischen 0 und 100 sein! Alles dar\xFCber hinaus wird fix auf 0 bzw. 100 gesetzt.
+ if ($gv_lamellePosNeu < 0) { $gv_lamellePosNeu = 0; }
+ if ($gv_lamellePosNeu > 100) { $gv_lamellePosNeu = 100; }
+ }
+ # Nicht wegen jeder Kleinigkeit gleich nachstellen, erst nach einer gewissen Mindest\xE4nderung.
+ if (abs($gv_lamellePos - $gv_lamellePosNeu) > 5) {
+ knx_write($gs_raffstore->{gaLamellePos},$gv_lamellePosNeu,5.001);
+ }
+ }
+ }
+ } else {
+ # Keine Beschattung aufgrund der Ausrichtung
+
+ # Raffstore hoch
+ $gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
+ if ($gv_rolloPos != 0) {
+ knx_write($gs_raffstore->{gaRolloPos}, 0, 5.001);
+ }
+ if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
+ $gv_lamellePos = knx_read($gs_raffstore->{gaLamellePosRM}, 5.001);
+ if ($gv_lamellePos != 0) {
+ knx_write($gs_raffstore->{gaLamellePos}, 0, 5.001);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+# Dynamische Werte der Raffstore-Definition im plugin_info merken
+@gt_raffstores_dyn = ();
+foreach $gs_raffstore (@gt_raffstores) {
+ unshift(@gt_raffstores_dyn, join(SEPARATOR2, $gs_raffstore->{id}, $gs_raffstore->{aktiv}, $gs_raffstore->{sperre}, $gs_raffstore->{automatik}, $gs_raffstore->{valueTemperatur}, $gs_raffstore->{temperaturFreigabe}));
+}
+$gv_raffstore_dyn = join(SEPARATOR1, @gt_raffstores_dyn);
+$plugin_info{$plugname.'_gt_raffstores_dyn'} = $gv_raffstore_dyn;
+
+if ($show_debug > 0) {
+ return $gv_raffstore_dyn;
+} else {
+ return 'Beschattungslogik erledigt!';
+}
\ No newline at end of file
Added: wiregate/plugin/generic/beschattung_freigabe.pl
===================================================================
--- wiregate/plugin/generic/beschattung_freigabe.pl (rev 0)
+++ wiregate/plugin/generic/beschattung_freigabe.pl 2013-05-20 18:24:18 UTC (rev 1743)
@@ -0,0 +1,238 @@
+#############################################################################
+# Plugin: Beschattung freigeben / einschalten
+# V1.0 2013-05-06
+# Copyright: Marcus Lichtenberger (ma...@li...)
+# License: GPL (v3)
+#
+#############################################################################
+#
+# \xC4nderungshistorie:
+# 20130506 - mclb - Erstellung
+#
+#############################################################################
+#
+# Offene Punkte:
+# - Dzt. keine bekannt
+#
+#############################################################################
+#
+# Abh\xE4ngigkeiten:
+# - Plugin berechne_sonnenstand
+#
+#############################################################################
+#
+# plugin_info-Werte
+# -
+#
+#############################################################################
+
+# Konstanten f\xFCr Aufrufart
+use constant EVENT_RESTART => 'restart';
+use constant EVENT_MODIFIED => 'modified';
+use constant EVENT_BUS => 'bus';
+use constant EVENT_SOCKET => 'socket';
+use constant EVENT_CYCLE => 'cycle';
+# Konstanten f\xFCr Beschattung ein/aus
+use constant BESCHATTUNG_AUS => 'AUS';
+use constant BESCHATTUNG_EIN => 'EIN';
+# Konstanten f\xFCr Beschattung Freigabe ein/aus
+use constant FREIGABE_AUS => 'AUS';
+use constant FREIGABE_EIN => 'EIN';
+
+# Variablendefinitionen
+my $gv_helligkeit;
+my $gv_azimuth;
+my $gv_elevation;
+my $gv_beschattungEin;
+my $gv_zeitpunkt;
+my $gv_zeitdifferenz;
+# Zeitpunkt auslesen
+my $gv_sekunden;
+my $gv_minuten;
+my $gv_stunden;
+my $gv_monatstag;
+my $gv_monat;
+my $gv_jahr;
+my $gv_wochentag;
+my $gv_jahrestag;
+my $gv_sommerzeit;
+
+# Definition und Initialisierung der konfigurierbaren Werte
+my $show_debug = 0; # switches debug information that will be shown in the log
+my $gv_gaHelligkeit = "";
+my $gv_gaSperre = "";
+my $gv_gaFreigabe = "";
+
+# Read config file in conf.d
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+if (! -f $confFile)
+{
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ return "no conf file [$confFile] found.";
+}
+else
+{
+ plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 0);
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ if( $show_debug > 0 )
+ {
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ }
+ if ($@)
+ {
+ plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 0 );
+ my @parts = split(/\n/, $@);
+ if( $show_debug > 0 )
+ {
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+ }
+}
+
+# Ruf mich alle 60 Sekunden selbst auf, damit ich pr\xFCfen kann, ob die Helligkeit \xFCber-/unterschritten wurde
+$plugin_info{$plugname.'_cycle'} = 60;
+# Ruf mich auf, wenn sich die Helligkeit \xE4ndert, damit ich meine Helligkeits-Variable setzen kann
+if ($gv_gaHelligkeit ne '') {
+ $plugin_subscribe{$gv_gaHelligkeit}{$plugname} = 1;
+}
+# Ruf mich auf, wenn die Automatik gesperre oder freigegeben wird
+if ($gv_gaSperre ne '') {
+ $plugin_subscribe{$gv_gaSperre}{$plugname} = 1;
+}
+
+# Aus welchem Grund l\xE4uft das Plugin gerade
+my $gv_event=undef;
+if (!$plugin_initflag) {
+ $gv_event = EVENT_RESTART; # Restart des daemons / Reboot
+} elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {
+ $gv_event = EVENT_MODIFIED; # Plugin modifiziert
+} elsif (%msg) {
+ $gv_event = EVENT_BUS; # Bustraffic
+} elsif ($fh) {
+ $gv_event = EVENT_SOCKET; # Netzwerktraffic
+} else {
+ $gv_event = EVENT_CYCLE; # Zyklus
+}
+
+plugin_log($plugname, "0 - Event: ".$gv_event) if ($show_debug > 0);
+
+if ($gv_event eq EVENT_RESTART) {
+ # Default nicht beschatten, falls der Wert noch nicht existiert
+ if (!exists $plugin_info{$plugname.'_beschattungFreigabe'}) {
+ $plugin_info{$plugname.'_beschattungFreigabe'} = FREIGABE_AUS;
+ }
+ # Evtl. Sperre setzen, falls noch nicht existent
+ if (!exists $plugin_info{$plugname.'_sperre'}) {
+ $plugin_info{$plugname.'_sperre'} = SPERRE_INAKTIV;
+ }
+ # Evtl. Werte initialisieren, falls es sie noch nicht gibt.
+ if (!exists $plugin_info{$plugname.'_beschattungEin'}) {
+ $plugin_info{$plugname.'_beschattungEin'} = BESCHATTUNG_AUS;
+ }
+ if (!exists $plugin_info{$plugname.'_beschattungEinTime'}) {
+ ($gv_sekunden, $gv_minuten, $gv_stunden, $gv_monatstag, $gv_monat, $gv_jahr, $gv_wochentag, $gv_jahrestag, $gv_sommerzeit) = localtime(time);
+ $gv_zeitpunkt = $gv_minuten + ($gv_stunden*60);
+ $plugin_info{$plugname.'_beschattungEinTime'} = $gv_zeitpunkt;
+ }
+} elsif ($gv_event eq EVENT_MODIFIED) {
+ # Default nicht beschatten, falls der Wert noch nicht existiert
+ if (!exists $plugin_info{$plugname.'_beschattungFreigabe'}) {
+ $plugin_info{$plugname.'_beschattungFreigabe'} = FREIGABE_AUS;
+ }
+ # Evtl. Sperre setzen, falls noch nicht existent
+ if (!exists $plugin_info{$plugname.'_sperre'}) {
+ }
+ $plugin_info{$plugname.'_sperre'} = SPERRE_INAKTIV;
+ # Evtl. Werte initialisieren, falls es sie noch nicht gibt.
+ if (!exists $plugin_info{$plugname.'_beschattungEin'}) {
+ $plugin_info{$plugname.'_beschattungEin'} = BESCHATTUNG_AUS;
+ }
+ if (!exists $plugin_info{$plugname.'_beschattungEinTime'}) {
+ ($gv_sekunden, $gv_minuten, $gv_stunden, $gv_monatstag, $gv_monat, $gv_jahr, $gv_wochentag, $gv_jahrestag, $gv_sommerzeit) = localtime(time);
+ $gv_zeitpunkt = $gv_minuten + ($gv_stunden*60);
+ $plugin_info{$plugname.'_beschattungEinTime'} = $gv_zeitpunkt;
+ }
+} elsif ($gv_event eq EVENT_BUS) {
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaHelligkeit) {
+ # Aufruf durch Helligkeits-Telegramm
+ $gv_helligkeit = $msg{'value'};
+
+ # Azimuth und Elevation einlesen, damit ich bestimmen kann, ob beschattet werden muss, oder nicht.
+ $gv_elevation = $plugin_info{'elevation'};
+ $gv_azimuth = $plugin_info{'azimuth'};
+
+ plugin_log($plugname, "1 - Elevation: ".$gv_elevation." , Helligkeit: ".$gv_helligkeit) if ($show_debug > 0);
+
+ # Pr\xFCfen, ob das Telegramm etwas am aktuellen Status \xE4ndert und ggf. merken
+ if ($gv_elevation > 0 and $gv_elevation <= 10 and $gv_helligkeit >= 10000) { $gv_beschattungEin = 'J'; }
+ if ($gv_elevation > 10 and $gv_elevation <= 20 and $gv_helligkeit >= 20000) { $gv_beschattungEin = 'J'; }
+ if ($gv_elevation > 20 and $gv_elevation <= 30 and $gv_helligkeit >= 30000) { $gv_beschattungEin = 'J'; }
+ if ($gv_elevation > 30 and $gv_elevation <= 40 and $gv_helligkeit >= 40000) { $gv_beschattungEin = 'J'; }
+ if ($gv_elevation > 40 and $gv_elevation <= 50 and $gv_helligkeit >= 50000) { $gv_beschattungEin = 'J'; }
+ if ($gv_elevation > 50 and $gv_elevation <= 90 and $gv_helligkeit >= 75000) { $gv_beschattungEin = 'J'; }
+
+ if ($gv_elevation < 0) { $gv_beschattungEin = 'N'; }
+ if ($gv_elevation > 0 and $gv_elevation <= 10 and $gv_helligkeit < 10000) { $gv_beschattungEin = 'N'; }
+ if ($gv_elevation > 10 and $gv_elevation <= 20 and $gv_helligkeit < 20000) { $gv_beschattungEin = 'N'; }
+ if ($gv_elevation > 20 and $gv_elevation <= 30 and $gv_helligkeit < 30000) { $gv_beschattungEin = 'N'; }
+ if ($gv_elevation > 30 and $gv_elevation <= 40 and $gv_helligkeit < 40000) { $gv_beschattungEin = 'N'; }
+ if ($gv_elevation > 40 and $gv_elevation <= 50 and $gv_helligkeit < 50000) { $gv_beschattungEin = 'N'; }
+ if ($gv_elevation > 50 and $gv_elevation <= 90 and $gv_helligkeit < 75000) { $gv_beschattungEin = 'N'; }
+
+ plugin_log($plugname, "2 - Beschattung ein: ".$gv_beschattungEin) if ($show_debug > 0);
+
+ # Abh\xE4ngig vom letzte...
[truncated message content] |
|
From: <mc...@us...> - 2013-06-22 16:34:40
|
Revision: 1771
http://sourceforge.net/p/openautomation/code/1771
Author: mclb
Date: 2013-06-22 16:34:37 +0000 (Sat, 22 Jun 2013)
Log Message:
-----------
Die Plugins kommunizieren nun per GAs, nicht mehr ?\195?\188ber plugin_info. Somit kann man z.B. auch den Sonnenstand einer Wetterstation verwenden, und das Plugin berechne_sonnenstand weglassen.
Modified Paths:
--------------
wiregate/plugin/generic/berechne_sonnenstand.pl
wiregate/plugin/generic/beschattung_doit.pl
wiregate/plugin/generic/beschattung_freigabe.pl
Modified: wiregate/plugin/generic/berechne_sonnenstand.pl
===================================================================
--- wiregate/plugin/generic/berechne_sonnenstand.pl 2013-06-20 13:49:20 UTC (rev 1770)
+++ wiregate/plugin/generic/berechne_sonnenstand.pl 2013-06-22 16:34:37 UTC (rev 1771)
@@ -10,6 +10,7 @@
#
# \xC4nderungshistorie:
# 20130506 - mclb - Erstellung
+# 20130617 - mclb - Azimuth und Elevation werden nun zus\xE4tzlich auf GAs geschrieben.
#
#############################################################################
#
@@ -49,44 +50,54 @@
my $gv_azimuth;
my $gv_elevation;
+my $gv_gaAzimuth;
+my $gv_gaElevation;
# Read config file in conf.d
my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
if (! -f $confFile)
{
- plugin_log($plugname, " no conf file [$confFile] found.");
+ plugin_log($plugname, "0.1 - no conf file [$confFile] found.") if ($show_debug > 0);
return "no conf file [$confFile] found.";
}
else
{
- plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 1);
+ plugin_log($plugname, "0.2 - reading conf file [$confFile].") if ($show_debug > 0);
open(CONF, $confFile);
my @lines = <CONF>;
close($confFile);
my $result = eval("@lines");
if( $show_debug > 1 )
{
- ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ ($result) and plugin_log($plugname, "0.3 - conf file [$confFile] returned result[$result]");
}
if ($@)
{
- plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 1 );
+ plugin_log($plugname, "0.4 - conf file [$confFile] returned:") if ($show_debug > 0);
my @parts = split(/\n/, $@);
if( $show_debug > 1 )
{
- plugin_log($plugname, "--> $_") foreach (@parts);
+ plugin_log($plugname, "0.5 - --> $_") foreach (@parts);
}
}
}
# Ruf mich alle 5 Minuten selbst auf und berechne Azimuth und Elevation neu
-$plugin_info{$plugname.'_cycle'} = 60;
+$plugin_info{$plugname.'_cycle'} = 300;
($gv_azimuth, $gv_elevation) = berechneSonnenstand($gv_lat, $gv_lon, $gv_elev);
-$plugin_info{'azimuth'} = $gv_azimuth;
-$plugin_info{'elevation'} = $gv_elevation;
+plugin_log($plugname, '1 - Azimuth alt: '.$plugin_info{'azimuth'}.', Azimuth neu: '.$gv_azimuth) if ($show_debug > 0);
+plugin_log($plugname, '2 - Elevation alt: '.$plugin_info{'elevation'}.', Elevation neu: '.$gv_elevation) if ($show_debug > 0);
+if ($gv_azimuth ne $plugin_info{'azimuth'} or $gv_elevation ne $plugin_info{'elevation'}) {
+ $plugin_info{'azimuth'} = $gv_azimuth;
+ $plugin_info{'elevation'} = $gv_elevation;
+
+ if ($gv_gaAzimuth ne '') { knx_write($gv_gaAzimuth, $gv_azimuth); }
+ if ($gv_gaElevation ne '') { knx_write($gv_gaElevation, $gv_elevation); }
+}
+
return 'Sonnenstand erfolgreich berechnet!';
####################################################
Modified: wiregate/plugin/generic/beschattung_doit.pl
===================================================================
--- wiregate/plugin/generic/beschattung_doit.pl 2013-06-20 13:49:20 UTC (rev 1770)
+++ wiregate/plugin/generic/beschattung_doit.pl 2013-06-22 16:34:37 UTC (rev 1771)
@@ -30,6 +30,8 @@
# 20120920 - mclb - Winter-Modus (Aktivierbar \xFCber eigene GA; Im Winter-Modus k\xF6nnen die Lamellen an eine andere Stelle zur Beschattung gefahren werden)
# 20120925 - mclb - Beschattung temperaturabh\xE4ngig aktivieren/deaktivieren
# 20130506 - mclb - Aufteilen in 2 Plugins - 1. Freigabe, 2. Ausf\xFChrung
+# 20130620 - mclb - Azimuth und Elevation werden jetzt \xFCber GAs empfangen, nicht mehr direkt vom plugin_info gelesen.
+# Somit er\xFCbrigt sich auch der zyklische Aufruf jede Minute.
#
#############################################################################
#
@@ -110,47 +112,45 @@
my $show_debug = 0; # switches debug information that will be shown in the log
my $gv_gaWinter = "";
my $gv_gaFreigabe = "";
+my $gv_gaAzimuth = "";
+my $gv_gaElevation = "";
my @gt_raffstores;
# Read config file in conf.d
my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
-if (! -f $confFile)
-{
- plugin_log($plugname, " no conf file [$confFile] found.");
+if (! -f $confFile) {
+ plugin_log($plugname, "0.1 - no conf file [$confFile] found.") if ($show_debug > 0);
return "no conf file [$confFile] found.";
-}
-else
-{
- plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 1);
+} else {
+ plugin_log($plugname, "0.2 - reading conf file [$confFile].") if($show_debug > 0);
open(CONF, $confFile);
my @lines = <CONF>;
close($confFile);
my $result = eval("@lines");
if( $show_debug > 1 )
{
- ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ ($result) and plugin_log($plugname, "0.3 - conf file [$confFile] returned result[$result]");
}
if ($@)
{
- plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 1 );
+ plugin_log($plugname, "0.4 - conf file [$confFile] returned:") if($show_debug > 0);
my @parts = split(/\n/, $@);
if( $show_debug > 1 )
{
- plugin_log($plugname, "--> $_") foreach (@parts);
+ plugin_log($plugname, "0.5 - --> $_") foreach (@parts);
}
}
}
-# Ruf mich alle 60 Sekunden selbst auf, damit ich pr\xFCfen kann, ob die Helligkeit \xFCber-/unterschritten wurde
-$plugin_info{$plugname.'_cycle'} = 60;
+# Ruf mich garnicht zyklisch auf, nur wenn sich auf einer meiner abbonierten GAs etwas tut
+$plugin_info{$plugname.'_cycle'} = 0;
# Ruf mich auf, wenn zwischen Sommer- und Winter-Modus gewechselt wird
-if ($gv_gaWinter ne '') {
- $plugin_subscribe{$gv_gaWinter}{$plugname} = 1;
-}
+if ($gv_gaWinter ne '') { $plugin_subscribe{$gv_gaWinter}{$plugname} = 1; }
# Ruf mich auf, wenn sich die Freigabe \xE4ndert
-if ($gv_gaFreigabe ne '') {
- $plugin_subscribe{$gv_gaFreigabe}{$plugname} = 1;
-}
+if ($gv_gaFreigabe ne '') { $plugin_subscribe{$gv_gaFreigabe}{$plugname} = 1; }
+# Ruf mich auf, wenn sich der Sonnenstand \xE4ndert
+if ($gv_gaAzimuth ne '') { $plugin_subscribe{$gv_gaAzimuth}{$plugname} = 1; }
+if ($gv_gaElevation ne '') { $plugin_subscribe{$gv_gaElevation}{$plugname} = 1; }
# Ruf mich auf, wenn sich an der Sperr-GA eines Raffstores etwas \xE4ndert
# Ruf mich auf, wenn sich der Fenster-Status \xE4ndert
foreach $gs_raffstore (@gt_raffstores) {
@@ -236,14 +236,24 @@
}
} elsif ($gv_event eq EVENT_BUS) {
if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaFreigabe) {
- plugin_log($plugname, '20 - Freigabe = '.$msg{'value'});
+ plugin_log($plugname, '1 - Freigabe = '.$msg{'value'}) if ($show_debug > 0);
$plugin_info{$plugname.'_freigabe'} = $msg{'value'};
} elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaWinter) {
# Umschalten zwischen Sommer- und Wintermodus
+ plugin_log($plugname, '2 - Write Winter-Modus = '.$msg{'value'}) if ($show_debug > 0);
$plugin_info{$plugname.'_winterModus'} = $msg{'value'};
} elsif ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gv_gaWinter) {
- # R\xFCckmeldung, ob gerade Sommer- oder Wintermodus aktiv ist
+ # Schreibe den Sommer-Winter-Modus Wert auf den Bus
+ plugin_log($plugname, '3 - Read Winter-Modus = '.$msg{'value'}) if ($show_debug > 0);
knx_write($gv_gaWinter,$plugin_info{$plugname.'_winterModus'});
+ } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaAzimuth) {
+ # Neuer Azimuth-Wert
+ plugin_log($plugname, '4 - Azimuth = '.$msg{'value'}) if ($show_debug > 0);
+ $plugin_info{$plugname.'_azimuth'} = $msg{'value'};
+ } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaElevation) {
+ # Neuer Elevation-Wert
+ plugin_log($plugname, '5 - Elevation = '.$msg{'value'}) if ($show_debug > 0);
+ $plugin_info{$plugname.'_elevation'} = $msg{'value'};
} else {
for ($gv_index=0; $gv_index < @gt_raffstores; $gv_index++) {
# Muss mittels for-Schleife (und nicht foreach) gemacht werden, weil ich die Werte in der Schleife updaten muss.
@@ -258,7 +268,9 @@
knx_write($gs_raffstore->{gaSperre}, $gs_raffstore->{sperre});
}
if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gs_raffstore->{gaFensterStatus}) {
+ plugin_log($plugname, '6 - Fenster-Status = '.$msg{'value'}) if ($show_debug > 0);
if ($msg{'value'} == 0) {
+ plugin_log($plugname, '6a - Fenster-Status AUTOMATIK_AUS') if ($show_debug > 0);
# Wird ein Fenster ge\xF6ffnet, dann Raffstore nach oben und Automatik aus
$gs_raffstore->{automatik} = AUTOMATIK_AUS;
$gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
@@ -272,6 +284,7 @@
}
}
} elsif ($msg{'value'} == 1) {
+ plugin_log($plugname, '6b - Fenster-Status AUTOMATIK_EIN') if ($show_debug > 0);
# Wird ein Fenster geschlossen, dann Automatik aus
$gs_raffstore->{automatik} = AUTOMATIK_EIN;
}
@@ -282,29 +295,28 @@
$gt_raffstores[$gv_index] = $gs_raffstore;
}
}
-} elsif ($gv_event eq EVENT_SOCKET) {
-} elsif ($gv_event eq EVENT_CYCLE) {
+
# Beschattungs-Automatik
- plugin_log($plugname,'10 - Cycle-Aufruf, Sperre = '.$plugin_info{$plugname.'_sperre'}.', Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
+ plugin_log($plugname,'7 - Cycle-Aufruf, Sperre = '.$plugin_info{$plugname.'_sperre'}.', Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
if ($plugin_info{$plugname.'_sperre'} == SPERRE_INAKTIV) {
- plugin_log($plugname,'11 - Beschattung') if ($show_debug > 0);
- plugin_log($plugname,'11a - Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
+ plugin_log($plugname,'8 - Beschattung') if ($show_debug > 0);
+ plugin_log($plugname,'9 - Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
# Automatik l\xE4uft grunds\xE4tzlich
foreach $gs_raffstore (@gt_raffstores) {
- plugin_log($plugname,'12 - Aktiv = '.$gs_raffstore->{aktiv}.', Sperre = '.$gs_raffstore->{sperre}.', Automatik = '.$gs_raffstore->{automatik}) if ($show_debug > 0);
+ plugin_log($plugname,'10 - Raffstore = '.$gs_raffstore->{id}.', Aktiv = '.$gs_raffstore->{aktiv}.', Sperre = '.$gs_raffstore->{sperre}.', Automatik = '.$gs_raffstore->{automatik}) if ($show_debug > 0);
if ($gs_raffstore->{aktiv} eq AKTIV and
$gs_raffstore->{sperre} == SPERRE_INAKTIV and
$gs_raffstore->{automatik} eq AUTOMATIK_EIN) {
- plugin_log($plugname,'13 - Beschattung aktiv; Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
+ plugin_log($plugname,'11 - Beschattung aktiv; Freigabe = '.$plugin_info{$plugname.'_freigabe'}) if ($show_debug > 0);
# Automatik ist aktiv -> also mach nun deine Arbeit
if ($plugin_info{$plugname.'_freigabe'} eq FREIGABE_AUS) {
# Freigabe ist aufgrund der Helligkeit nicht notwendig -> Raffstore nach oben!
- plugin_log($plugname,'14 - Freigabe AUS -> Raffstores nach oben') if ($show_debug > 0);
+ plugin_log($plugname,'12 - Freigabe AUS -> Raffstores nach oben') if ($show_debug > 0);
# Raffstores hoch
$gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
@@ -318,7 +330,7 @@
}
}
} else {
- plugin_log($plugname,'15 - Freigabe EIN -> Ausrichtungsabh\xE4ngig beschatten; Ausrichtung = '.$gs_raffstore->{ausrichtung}) if ($show_debug > 0);
+ plugin_log($plugname,'13 - Freigabe EIN -> Ausrichtungsabh\xE4ngig beschatten; Ausrichtung = '.$gs_raffstore->{ausrichtung}) if ($show_debug > 0);
if (exists($gs_raffstore->{ausrichtung})) {
#Startwinkel berechnen
@@ -344,7 +356,7 @@
exists $gs_raffstore->{maxTemperatur} and
exists $gs_raffstore->{valueTemperatur} ) {
- plugin_log($plugname,'15a - minTemperatur = '.$gs_raffstore->{minTemperatur}.', maxTemperatur = '.$gs_raffstore->{maxTemperatur}.', valueTemperatur = '.$gs_raffstore->{valueTemperatur}) if ($show_debug > 0);
+ plugin_log($plugname,'14 - minTemperatur = '.$gs_raffstore->{minTemperatur}.', maxTemperatur = '.$gs_raffstore->{maxTemperatur}.', valueTemperatur = '.$gs_raffstore->{valueTemperatur}) if ($show_debug > 0);
if ($gs_raffstore->{valueTemperatur} < $gs_raffstore->{minTemperatur}) {
$gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_AUS;
@@ -357,12 +369,12 @@
$gs_raffstore->{temperaturFreigabe} = TEMPFREIGABE_EIN;
}
- plugin_log($plugname,'16 - StartWinkel = '.$gv_startWinkel.', EndWinkel = '.$gv_endWinkel.', Azimuth = '.$plugin_info{'azimuth'}) if ($show_debug > 0);
- plugin_log($plugname,'16a - TemperaturFreigabe = '.$gs_raffstore->{temperaturFreigabe}) if ($show_debug > 0);
+ plugin_log($plugname,'15 - StartWinkel = '.$gv_startWinkel.', EndWinkel = '.$gv_endWinkel.', Azimuth = '.$plugin_info{$plugname.'_azimuth'}) if ($show_debug > 0);
+ plugin_log($plugname,'16 - TemperaturFreigabe = '.$gs_raffstore->{temperaturFreigabe}) if ($show_debug > 0);
# Aktuelle Sonnenposition verwenden um zu bestimmen, ob der Raffstore gerade beschattet werden muss
- if ($plugin_info{'azimuth'} >= $gv_startWinkel and
- $plugin_info{'azimuth'} <= $gv_endWinkel and
+ if ($plugin_info{$plugname.'_azimuth'} >= $gv_startWinkel and
+ $plugin_info{$plugname.'_azimuth'} <= $gv_endWinkel and
$gs_raffstore->{temperaturFreigabe} eq TEMPFREIGABE_EIN) {
# Beschattung aufgrund der Ausrichtung und Raumtemperatur
@@ -370,10 +382,13 @@
# Raffstore runter
$gv_rolloPos = knx_read($gs_raffstore->{gaRolloPosRM}, 5.001);
if ($plugin_info{$plugname.'_winterModus'} == 1) {
+ plugin_log($plugname,'17 - WinterModus = 1 - rolloBeschattungspos = '.$gs_raffstore->{rolloBeschattungsposWinter}) if ($show_debug > 0);
$gv_rolloBeschattungspos = $gs_raffstore->{rolloBeschattungsposWinter};
} else {
+ plugin_log($plugname,'18 - WinterModus = 0 - rolloBeschattungspos = '.$gs_raffstore->{rolloBeschattungspos}) if ($show_debug > 0);
$gv_rolloBeschattungspos = $gs_raffstore->{rolloBeschattungspos};
}
+ plugin_log($plugname,'19 - rolloPos = '.$gv_rolloPos.', rolloBeschattungsPos = '.$gv_rolloBeschattungspos) if ($show_debug > 0);
if ($gv_rolloPos != $gv_rolloBeschattungspos) {
knx_write($gs_raffstore->{gaRolloPos}, $gv_rolloBeschattungspos, 5.001);
}
@@ -392,7 +407,7 @@
} else {
$gv_lamellePosNeu = (90 - $plugin_info{$plugname.'_elevation'})/90*100;
# Faktor f\xFCr die Abweichung der Sonne von der Ausrichtung des Fensters miteinbeziehen
- $gv_lamellePosNeu = $gv_lamellePosNeu * (1 - (abs($plugin_info{'azimuth'} - $gs_raffstore->{ausrichtung}) * 0.01));
+ $gv_lamellePosNeu = $gv_lamellePosNeu * (1 - (abs($plugin_info{$plugname.'_azimuth'} - $gs_raffstore->{ausrichtung}) * 0.01));
# Der Wert f\xFCr den Lamellenwinkel muss immer zwischen 0 und 100 sein! Alles dar\xFCber hinaus wird fix auf 0 bzw. 100 gesetzt.
if ($gv_lamellePosNeu < 0) { $gv_lamellePosNeu = 0; }
if ($gv_lamellePosNeu > 100) { $gv_lamellePosNeu = 100; }
@@ -422,6 +437,8 @@
}
}
}
+} elsif ($gv_event eq EVENT_SOCKET) {
+} elsif ($gv_event eq EVENT_CYCLE) {
}
# Dynamische Werte der Raffstore-Definition im plugin_info merken
Modified: wiregate/plugin/generic/beschattung_freigabe.pl
===================================================================
--- wiregate/plugin/generic/beschattung_freigabe.pl 2013-06-20 13:49:20 UTC (rev 1770)
+++ wiregate/plugin/generic/beschattung_freigabe.pl 2013-06-22 16:34:37 UTC (rev 1771)
@@ -8,6 +8,8 @@
#
# \xC4nderungshistorie:
# 20130506 - mclb - Erstellung
+# 20130617 - mclb - Sonnenstand wird nun mittels GAs erhalten
+# Somit k\xF6nnen nun die Werte z.B. einer Wetterstation verwendet werden.
#
#############################################################################
#
@@ -62,32 +64,34 @@
my $gv_gaHelligkeit = "";
my $gv_gaSperre = "";
my $gv_gaFreigabe = "";
+my $gv_gaAzimuth = "";
+my $gv_gaElevation = "";
# Read config file in conf.d
my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
if (! -f $confFile)
{
- plugin_log($plugname, " no conf file [$confFile] found.");
+ plugin_log($plugname, "0.1 - no conf file [$confFile] found.") if ($show_debug > 0);
return "no conf file [$confFile] found.";
}
else
{
- plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 0);
+ plugin_log($plugname, "0.2 - reading conf file [$confFile].") if ($show_debug > 0);
open(CONF, $confFile);
my @lines = <CONF>;
close($confFile);
my $result = eval("@lines");
if( $show_debug > 0 )
{
- ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ ($result) and plugin_log($plugname, "0.3 - conf file [$confFile] returned result[$result]");
}
if ($@)
{
- plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 0 );
+ plugin_log($plugname, "0.4 - conf file [$confFile] returned:") if ($show_debug > 0);
my @parts = split(/\n/, $@);
if( $show_debug > 0 )
{
- plugin_log($plugname, "--> $_") foreach (@parts);
+ plugin_log($plugname, "0.5 - --> $_") foreach (@parts);
}
}
}
@@ -95,13 +99,12 @@
# Ruf mich alle 60 Sekunden selbst auf, damit ich pr\xFCfen kann, ob die Helligkeit \xFCber-/unterschritten wurde
$plugin_info{$plugname.'_cycle'} = 60;
# Ruf mich auf, wenn sich die Helligkeit \xE4ndert, damit ich meine Helligkeits-Variable setzen kann
-if ($gv_gaHelligkeit ne '') {
- $plugin_subscribe{$gv_gaHelligkeit}{$plugname} = 1;
-}
+if ($gv_gaHelligkeit ne '') { $plugin_subscribe{$gv_gaHelligkeit}{$plugname} = 1; }
# Ruf mich auf, wenn die Automatik gesperre oder freigegeben wird
-if ($gv_gaSperre ne '') {
- $plugin_subscribe{$gv_gaSperre}{$plugname} = 1;
-}
+if ($gv_gaSperre ne '') { $plugin_subscribe{$gv_gaSperre}{$plugname} = 1; }
+# Ruf mich auf, wenn sich der Sonnenstand \xE4ndert
+if ($gv_gaAzimuth ne '') { $plugin_subscribe{$gv_gaAzimuth}{$plugname} = 1; }
+if ($gv_gaElevation ne '') { $plugin_subscribe{$gv_gaElevation}{$plugname} = 1; }
# Aus welchem Grund l\xE4uft das Plugin gerade
my $gv_event=undef;
@@ -117,7 +120,7 @@
$gv_event = EVENT_CYCLE; # Zyklus
}
-plugin_log($plugname, "0 - Event: ".$gv_event) if ($show_debug > 0);
+plugin_log($plugname, "1 - Event: ".$gv_event) if ($show_debug > 0);
if ($gv_event eq EVENT_RESTART) {
# Default nicht beschatten, falls der Wert noch nicht existiert
@@ -156,15 +159,19 @@
$plugin_info{$plugname.'_beschattungEinTime'} = $gv_zeitpunkt;
}
} elsif ($gv_event eq EVENT_BUS) {
- if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaHelligkeit) {
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaAzimuth) {
+ $plugin_info{$plugname.'_azimuth'} = $msg{'value'};
+ } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaElevation) {
+ $plugin_info{$plugname.'_elevation'} = $msg{'value'};
+ } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $gv_gaHelligkeit) {
# Aufruf durch Helligkeits-Telegramm
$gv_helligkeit = $msg{'value'};
# Azimuth und Elevation einlesen, damit ich bestimmen kann, ob beschattet werden muss, oder nicht.
- $gv_elevation = $plugin_info{'elevation'};
- $gv_azimuth = $plugin_info{'azimuth'};
+ $gv_azimuth = $plugin_info{$plugname.'_azimuth'};
+ $gv_elevation = $plugin_info{$plugname.'_elevation'};
- plugin_log($plugname, "1 - Elevation: ".$gv_elevation." , Helligkeit: ".$gv_helligkeit) if ($show_debug > 0);
+ plugin_log($plugname, "2 - Elevation: ".$gv_elevation." , Helligkeit: ".$gv_helligkeit) if ($show_debug > 0);
# Pr\xFCfen, ob das Telegramm etwas am aktuellen Status \xE4ndert und ggf. merken
if ($gv_elevation > 0 and $gv_elevation <= 10 and $gv_helligkeit >= 10000) { $gv_beschattungEin = 'J'; }
@@ -182,7 +189,7 @@
if ($gv_elevation > 40 and $gv_elevation <= 50 and $gv_helligkeit < 50000) { $gv_beschattungEin = 'N'; }
if ($gv_elevation > 50 and $gv_elevation <= 90 and $gv_helligkeit < 75000) { $gv_beschattungEin = 'N'; }
- plugin_log($plugname, "2 - Beschattung ein: ".$gv_beschattungEin) if ($show_debug > 0);
+ plugin_log($plugname, "3 - Beschattung ein: ".$gv_beschattungEin) if ($show_debug > 0);
# Abh\xE4ngig vom letzten g\xFCltigen Wert den neuen beschattungEin setzen
if ($gv_beschattungEin eq 'J' and $plugin_info{$plugname.'_beschattungEin'} eq BESCHATTUNG_AUS) {
@@ -204,8 +211,8 @@
# Aufruf durch Zyklus
$plugin_info{$plugname.'_beschattungFreigabeOld'} = $plugin_info{$plugname.'_beschattungFreigabe'};
- $gv_azimuth = $plugin_info{'azimuth'};
- $gv_elevation = $plugin_info{'elevation'};
+ $gv_azimuth = $plugin_info{$plugname.'_azimuth'};
+ $gv_elevation = $plugin_info{$plugname.'_elevation'};
# Pr\xFCfen, ob die Beschattung aktiviert oder deaktiviert werden muss
if ($plugin_info{$plugname.'_beschattungEin'} eq BESCHATTUNG_EIN and
@@ -215,10 +222,10 @@
($gv_sekunden, $gv_minuten, $gv_stunden, $gv_monatstag, $gv_monat, $gv_jahr, $gv_wochentag, $gv_jahrestag, $gv_sommerzeit) = localtime(time);
$gv_zeitpunkt = $gv_minuten + ($gv_stunden*60);
$gv_zeitdifferenz = $gv_zeitpunkt - $plugin_info{$plugname.'_beschattungEinTime'};
- plugin_log($plugname, "3a - Zeit neu: ".$gv_zeitpunkt.", Zeit alt: ".$plugin_info{$plugname.'_beschattungEinTime'}.", Differenz: ".$gv_zeitdifferenz) if ($show_debug > 0);
+ plugin_log($plugname, "4 - Zeit neu: ".$gv_zeitpunkt.", Zeit alt: ".$plugin_info{$plugname.'_beschattungEinTime'}.", Differenz: ".$gv_zeitdifferenz) if ($show_debug > 0);
if ($gv_zeitdifferenz > 5) {
$plugin_info{$plugname.'_beschattungFreigabe'} = FREIGABE_EIN;
- knw_write($gv_gaFreigabe, 1);
+ knx_write($gv_gaFreigabe, 1);
}
} elsif ( ($plugin_info{$plugname.'_beschattungEin'} eq BESCHATTUNG_AUS or
$plugin_info{$plugname.'_sperre'} == 1) and
@@ -227,10 +234,10 @@
($gv_sekunden, $gv_minuten, $gv_stunden, $gv_monatstag, $gv_monat, $gv_jahr, $gv_wochentag, $gv_jahrestag, $gv_sommerzeit) = localtime(time);
$gv_zeitpunkt = $gv_minuten + ($gv_stunden*60);
$gv_zeitdifferenz = $gv_zeitpunkt - $plugin_info{$plugname.'_beschattungEinTime'};
- plugin_log($plugname, "3b - Zeit neu: ".$gv_zeitpunkt.", Zeit alt: ".$plugin_info{$plugname.'_beschattungEinTime'}.", Differenz: ".$gv_zeitdifferenz) if ($show_debug > 0);
+ plugin_log($plugname, "5 - Zeit neu: ".$gv_zeitpunkt.", Zeit alt: ".$plugin_info{$plugname.'_beschattungEinTime'}.", Differenz: ".$gv_zeitdifferenz) if ($show_debug > 0);
if ($gv_zeitdifferenz > 15) {
$plugin_info{$plugname.'_beschattungFreigabe'} = FREIGABE_AUS;
- knw_write($gv_gaFreigabe, 0);
+ knx_write($gv_gaFreigabe, 0);
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mc...@us...> - 2013-07-23 06:36:47
|
Revision: 1828
http://sourceforge.net/p/openautomation/code/1828
Author: mclb
Date: 2013-07-23 06:36:45 +0000 (Tue, 23 Jul 2013)
Log Message:
-----------
Kleine Korrekturen
Modified Paths:
--------------
wiregate/plugin/generic/beschattung_doit.pl
wiregate/plugin/generic/beschattung_freigabe.pl
Modified: wiregate/plugin/generic/beschattung_doit.pl
===================================================================
--- wiregate/plugin/generic/beschattung_doit.pl 2013-07-22 21:08:00 UTC (rev 1827)
+++ wiregate/plugin/generic/beschattung_doit.pl 2013-07-23 06:36:45 UTC (rev 1828)
@@ -32,6 +32,7 @@
# 20130506 - mclb - Aufteilen in 2 Plugins - 1. Freigabe, 2. Ausf\xFChrung
# 20130620 - mclb - Azimuth und Elevation werden jetzt \xFCber GAs empfangen, nicht mehr direkt vom plugin_info gelesen.
# Somit er\xFCbrigt sich auch der zyklische Aufruf jede Minute.
+# 20130723 - mclb - Beseitigung einer \xFCberfl\xFCssigen if-Abfrage
#
#############################################################################
#
@@ -398,25 +399,23 @@
# Lamellennachf\xFChrung
- if ($gv_minuten % 5 == 0) {
- if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
- if ($gs_raffstore->{lamellenNachfuehrung} eq NACHF_100) {
- # Somit wird auf jeden Fall ganz zu gemacht.
- $gv_lamellePos = 0;
- $gv_lamellePosNeu = 100;
- } else {
- $gv_lamellePosNeu = (90 - $plugin_info{$plugname.'_elevation'})/90*100;
- # Faktor f\xFCr die Abweichung der Sonne von der Ausrichtung des Fensters miteinbeziehen
- $gv_lamellePosNeu = $gv_lamellePosNeu * (1 - (abs($plugin_info{$plugname.'_azimuth'} - $gs_raffstore->{ausrichtung}) * 0.01));
- # Der Wert f\xFCr den Lamellenwinkel muss immer zwischen 0 und 100 sein! Alles dar\xFCber hinaus wird fix auf 0 bzw. 100 gesetzt.
- if ($gv_lamellePosNeu < 0) { $gv_lamellePosNeu = 0; }
- if ($gv_lamellePosNeu > 100) { $gv_lamellePosNeu = 100; }
- }
- # Nicht wegen jeder Kleinigkeit gleich nachstellen, erst nach einer gewissen Mindest\xE4nderung.
- if (abs($gv_lamellePos - $gv_lamellePosNeu) > 5) {
- knx_write($gs_raffstore->{gaLamellePos},$gv_lamellePosNeu,5.001);
- }
+ if ($gs_raffstore->{lamellenNachfuehrung} ne NACHF_AUS) {
+ if ($gs_raffstore->{lamellenNachfuehrung} eq NACHF_100) {
+ # Somit wird auf jeden Fall ganz zu gemacht.
+ $gv_lamellePos = 0;
+ $gv_lamellePosNeu = 100;
+ } else {
+ $gv_lamellePosNeu = (90 - $plugin_info{$plugname.'_elevation'})/90*100;
+ # Faktor f\xFCr die Abweichung der Sonne von der Ausrichtung des Fensters miteinbeziehen
+ $gv_lamellePosNeu = $gv_lamellePosNeu * (1 - (abs($plugin_info{$plugname.'_azimuth'} - $gs_raffstore->{ausrichtung}) * 0.01));
+ # Der Wert f\xFCr den Lamellenwinkel muss immer zwischen 0 und 100 sein! Alles dar\xFCber hinaus wird fix auf 0 bzw. 100 gesetzt.
+ if ($gv_lamellePosNeu < 0) { $gv_lamellePosNeu = 0; }
+ if ($gv_lamellePosNeu > 100) { $gv_lamellePosNeu = 100; }
}
+ # Nicht wegen jeder Kleinigkeit gleich nachstellen, erst nach einer gewissen Mindest\xE4nderung.
+ if (abs($gv_lamellePos - $gv_lamellePosNeu) > 5) {
+ knx_write($gs_raffstore->{gaLamellePos},$gv_lamellePosNeu,5.001);
+ }
}
} else {
# Keine Beschattung aufgrund der Ausrichtung
Modified: wiregate/plugin/generic/beschattung_freigabe.pl
===================================================================
--- wiregate/plugin/generic/beschattung_freigabe.pl 2013-07-22 21:08:00 UTC (rev 1827)
+++ wiregate/plugin/generic/beschattung_freigabe.pl 2013-07-23 06:36:45 UTC (rev 1828)
@@ -10,6 +10,7 @@
# 20130506 - mclb - Erstellung
# 20130617 - mclb - Sonnenstand wird nun mittels GAs erhalten
# Somit k\xF6nnen nun die Werte z.B. einer Wetterstation verwendet werden.
+# 20130723 - mclb - Beseitigung einer falschen Klammerung
#
#############################################################################
#
@@ -147,8 +148,8 @@
}
# Evtl. Sperre setzen, falls noch nicht existent
if (!exists $plugin_info{$plugname.'_sperre'}) {
+ $plugin_info{$plugname.'_sperre'} = SPERRE_INAKTIV;
}
- $plugin_info{$plugname.'_sperre'} = SPERRE_INAKTIV;
# Evtl. Werte initialisieren, falls es sie noch nicht gibt.
if (!exists $plugin_info{$plugname.'_beschattungEin'}) {
$plugin_info{$plugname.'_beschattungEin'} = BESCHATTUNG_AUS;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <kru...@us...> - 2013-09-14 05:12:17
|
Revision: 1888
http://sourceforge.net/p/openautomation/code/1888
Author: krumboeck
Date: 2013-09-14 05:12:14 +0000 (Sat, 14 Sep 2013)
Log Message:
-----------
Added plugin OpenWeatherMap
Added plugin OpenWeatherMapUpload
Added Paths:
-----------
wiregate/plugin/generic/OpenWeatherMap.pl
wiregate/plugin/generic/OpenWeatherMapUpload.pl
wiregate/plugin/generic/conf.d/OpenWeatherMap.conf_sample
wiregate/plugin/generic/conf.d/OpenWeatherMapUpload.conf_sample
Added: wiregate/plugin/generic/OpenWeatherMap.pl
===================================================================
--- wiregate/plugin/generic/OpenWeatherMap.pl (rev 0)
+++ wiregate/plugin/generic/OpenWeatherMap.pl 2013-09-14 05:12:14 UTC (rev 1888)
@@ -0,0 +1,120 @@
+######################################################################################
+#
+# Plugin OpenWeatherMap
+# Copyright: krumboeck (http://knx-user-forum.de/members/krumboeck.html)
+# License: GPL (v2)
+# V0.3 2013-09-07
+#
+# Ein Wiregate Plugin zum Senden von openweathermap.org Wetterdaten auf den KNX Bus
+#
+######################################################################################
+
+
+#################
+### Konfiguration
+#################
+
+# Festlegen, dass das Plugin alle 20 Minuten laufen soll
+$plugin_info{$plugname.'_cycle'} = 1200;
+
+
+#################################
+### Lesen der Konfigurationsdatei
+#################################
+
+my ($lat, $lon, $locale);
+my $knxGA;
+
+# Read config file in conf.d
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+if (! -f $confFile) {
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ return "no conf file [$confFile] found.";
+} else {
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ if ($@) {
+ plugin_log($plugname, "conf file [$confFile] returned:");
+ my @parts = split(/\n/, $@);
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+}
+
+
+################
+### Definitionen
+################
+
+use LWP::UserAgent;
+use XML::Simple;
+
+my $units = 'metric';
+my $mode = 'xml';
+
+
+#########################
+### Wetterdaten ermitteln
+#########################
+
+my $baseurl = 'http://api.openweathermap.org/data/2.5/weather?';
+my $url = $baseurl . 'lat=' . $lat . '&lon=' . $lon . '&units=' . $units . '&mode=' . $mode . '&lang=' . $locale;
+
+my $ua = LWP::UserAgent->new;
+$ua->timeout(30);
+my $response = $ua->get($url);
+
+if (! $response->is_success) {
+ return $response->status_line;
+}
+
+my $content = $response->decoded_content;
+
+my $xml = new XML::Simple;
+my $data = $xml->XMLin($content);
+
+
+#################################
+### Wetterdaten auf Bus schreiben
+#################################
+
+if (defined $knxGA->{temperature}) {
+ knx_write($knxGA->{temperature}, $data->{temperature}->{value}, 9.001);
+}
+
+if (defined $knxGA->{humidity}) {
+ knx_write($knxGA->{humidity}, $data->{humidity}->{value}, 9.007);
+}
+
+if (defined $knxGA->{pressure}) {
+ knx_write($knxGA->{pressure}, $data->{pressure}->{value}, 9.006);
+}
+
+if (defined $knxGA->{windSpeed}) {
+ var $windSpeed = sprintf("%.1f", $data->{wind}->{speed}->{value} / 3.6);
+ knx_write($knxGA->{windSpeed}, $windSpeed, 9.005);
+}
+
+if (defined $knxGA->{windDirection}) {
+ knx_write($knxGA->{windDirection}, $data->{wind}->{direction}->{value}, 9.003);
+}
+
+if (defined $knxGA->{clouds}) {
+ knx_write($knxGA->{clouds}, $data->{clouds}->{value}, 5.004);
+}
+
+if (defined $knxGA->{city}) {
+ my $city = $data->{city}->{name};
+ if (length($city) > 14) {
+ $city = subtr($city, 0, 14);
+ }
+ knx_write($knxGA->{city}, $city, 16.001);
+}
+
+my $ret = "Temperatur: " . $data->{temperature}->{value} . " °C";
+$ret .= "; Luftfeuchtigkeit: " . $data->{humidity}->{value} . " %";
+$ret .= "; Luftdruck: " . $data->{pressure}->{value} . " hPa";
+$ret .= "; Windgeschwindigkeit: " . $data->{wind}->{speed}->{value} . " km/h";
+
+return $ret;
Property changes on: wiregate/plugin/generic/OpenWeatherMap.pl
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: wiregate/plugin/generic/OpenWeatherMapUpload.pl
===================================================================
--- wiregate/plugin/generic/OpenWeatherMapUpload.pl (rev 0)
+++ wiregate/plugin/generic/OpenWeatherMapUpload.pl 2013-09-14 05:12:14 UTC (rev 1888)
@@ -0,0 +1,135 @@
+######################################################################################
+#
+# Plugin OpenWeatherMapUpload
+# Copyright: krumboeck (http://knx-user-forum.de/members/krumboeck.html)
+# License: GPL (v2)
+# V0.3 2013-08-24
+#
+# Ein Wiregate Plugin zum Upload von Wetterdaten für openweathermap.org
+# Folgende Funktionen werden unterstützt:
+# - Zeitliches Aussetzen wegen Messfehler (z.B.: Sonne scheint auf Tempfühler, etc.)
+# - Außentemperatur
+#
+# TODO:
+# - Andere Wetterdaten
+#
+######################################################################################
+
+
+#################
+### Konfiguration
+#################
+
+# Festlegen, dass das Plugin alle 10 Minuten laufen soll
+$plugin_info{$plugname.'_cycle'} = 600;
+
+
+#################################
+### Lesen der Konfigurationsdatei
+#################################
+
+my ($user, $pass, $name, $lat, $lon, $alt, $GAtemp);
+my @TimeExclusions;
+
+# Read config file in conf.d
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+if (! -f $confFile) {
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ return "no conf file [$confFile] found.";
+} else {
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ if ($@) {
+ plugin_log($plugname, "conf file [$confFile] returned:");
+ my @parts = split(/\n/, $@);
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+}
+
+use LWP::UserAgent;
+use HTTP::Request;
+use URI::Escape;
+
+
+######################
+### Prüfen von Sperren
+######################
+
+my ($Sekunden, $Minuten, $Stunden, $Tag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
+
+$Stunden = ($Stunden < 10) ? "0" . $Stunden : $Stunden;
+$Minuten = ($Minuten < 10) ? "0" . $Minuten : $Minuten;
+
+my $currentTime = $Stunden . $Minuten;
+print $currentTime;
+
+foreach my $exclusion (@TimeExclusions) {
+ my $from = $exclusion->{from};
+ $from =~ s/://;
+ my $until = $exclusion->{until};
+ $until =~ s/://;
+ print $from;
+ print $until;
+ if ($from <= $until) {
+ if (($from <= $currentTime) && ($until >= $currentTime)) {
+ return "Übertragung ist derzeit gesperrt";
+ }
+ } else {
+ if (($from <= $currentTime) && (2359 >= $currentTime)) {
+ return "Übertragung ist derzeit gesperrt";
+ }
+ if ((0 <= $currentTime) && ($until >= $currentTime)) {
+ return "Übertragung ist derzeit gesperrt";
+ }
+ }
+}
+
+
+#########################
+### Wetterdaten ermitteln
+#########################
+
+my $ret = "";
+my %post_data;
+$post_data{name} = $name;
+$post_data{lat} = $lat;
+$post_data{long} = $lon;
+$post_data{alt} = $alt;
+
+if ((defined $GAtemp) && (length($GAtemp) >= 5)) {
+ my $temp = knx_read($GAtemp, 300, 9.001);
+ if (defined $temp) {
+ $post_data{temp} = $temp;
+ $ret .= "Temperatur: " . $temp . "; ";
+ } else {
+ $ret .= "Temperatur: N/A" . "; ";
+ }
+}
+
+
+########################
+### Übertragen der Daten
+########################
+
+my $encoded_data = "";
+while ( my ($key, $value) = each(%post_data) ) {
+ $encoded_data .= $key . "=" . uri_escape($value) . "&";
+}
+$encoded_data =~ s/&$//;
+
+my $ua = new LWP::UserAgent;
+my $request = new HTTP::Request(POST => 'http://openweathermap.org/data/post');
+$request->authorization_basic($user, $pass);
+$request->header('Content-Type' => 'application/x-www-form-urlencoded');
+$request->content($encoded_data);
+my $response = $ua->request($request);
+
+if ($response->is_success) {
+ $ret =~ s/; $//;
+ return $ret;
+} else {
+ return "Upload Fehler: " . $response->status_line;
+}
+
Property changes on: wiregate/plugin/generic/OpenWeatherMapUpload.pl
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: wiregate/plugin/generic/conf.d/OpenWeatherMap.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/OpenWeatherMap.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/OpenWeatherMap.conf_sample 2013-09-14 05:12:14 UTC (rev 1888)
@@ -0,0 +1,17 @@
+
+# Längengrad, Breitengrad und Sprache
+$lat = 49.235;
+$lon = 16.653;
+$locale = 'de';
+
+# Die Gruppenadressen müssen vorher mit dem Gruppenadresseditor erfasst werden.
+# Wenn ein Wert nicht benötigt wird, kann man ihn einfach auskommentieren.
+$knxGA = {
+ temperature => '1/2/0', # DPT 9.001: Außentemperatur in °C
+ humidity => '1/2/1', # DPT 9.007: Luftfeuchtigkeit in %
+ pressure => '1/2/2', # DPT 9.006: Luftdruck in hPa
+ windSpeed => '1/2/3', # DPT 9.005: Windgeschwindigkeit in km/h
+ windDirection => '1/2/4', # DPT 5.003: Winkel in Grad
+ clouds => '1/2/5', # DPT 5.004: Bewölkung in %
+ city => '1/2/6', # DPT 16.001: Name des nächsten Ortes (mit Wettervorhersage)
+ };
Added: wiregate/plugin/generic/conf.d/OpenWeatherMapUpload.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/OpenWeatherMapUpload.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/OpenWeatherMapUpload.conf_sample 2013-09-14 05:12:14 UTC (rev 1888)
@@ -0,0 +1,20 @@
+
+# Benutzername und Passwort für openweathermap.org
+$user = "myusername"; # Benutzername
+$pass = "supergeheim"; # Passwort
+
+# Name, Koordinaten und Meereshöhe der Wetterstation
+$name = "Name-Station"; # Name der Wetterstation
+$lat = 49.275; # Breitengrad in Grad
+$lon = 16.683; # Längengrad in Grad
+$alt = 276; # Höhe über dem Meeresspiegel in Meter
+
+# Gruppenadresse für den Außentemperaturfühler
+$GAtemp = "4/3/0";
+
+# Zeiträume in welchen keine Übertragung stattfinden soll
+# z.B. Messfehler wegen direkter Sonneneinstrahlung
+# Wenn nicht benötigt einfach auskommentieren. Für einen
+# zusätzlichen Zeitraum die Zeile kopieren.
+push @TimeExclusions, { from => "06:00", until => "10:00" };
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2014-02-07 15:51:16
|
Revision: 2067
http://sourceforge.net/p/openautomation/code/2067
Author: makki1
Date: 2014-02-07 15:51:13 +0000 (Fri, 07 Feb 2014)
Log Message:
-----------
yr.no weather-images - mainly WiP/example
Added Paths:
-----------
wiregate/plugin/generic/yr-forecast-hour.pl
wiregate/plugin/generic/yr-forecast.pl
Added: wiregate/plugin/generic/yr-forecast-hour.pl
===================================================================
--- wiregate/plugin/generic/yr-forecast-hour.pl (rev 0)
+++ wiregate/plugin/generic/yr-forecast-hour.pl 2014-02-07 15:51:13 UTC (rev 2067)
@@ -0,0 +1,147 @@
+###############################################################################
+# Plugin yr.no Wetter (long-term)
+# - teilw. noch Testscript zum parsen !
+# - benoetigt gnuplot!
+
+# URL wie im Browser + forecast.xml (varsel.xml)
+my $url = "http://www.yr.no/place/Germany/Bavaria/Ottobrunn~6556321/";
+my $url_xml = "forecast_hour_by_hour.xml";
+my $image_name = "/var/www/images/forecast_hour_by_hour.png";
+
+# Todo: forecast_hour_by_hour.xml ?
+# Moegliche Funktionen
+my $rain_intervals = 12; # Anzahl der (je 1h) zusammengezaehlten Vorhersage-Intervalle fuer die erwartete Niederschlagsmenge
+my $rain_threshold = 4; # Schwellwert fuer Regen (intervals addiert) - Ziel: Bewaesserungs-steuerung mit (Kurzzeit!)-Vorhersage
+my $wind_intervals = 4; # Anzahl der (je 6h) zusammengezaehlten Vorhersage-Intervalle fuer Windwarnungen *ohne* Unwetter (Gartenmöbel leicht sichern etc.)
+my $wind_threshold = 5; # Schwellwert Windwarnung (meter/sek) - siehe FIXME: cv_config.xml
+
+### Links ###
+# http://om.yr.no/verdata/free-weather-data/
+# http://api.met.no/weatherapi/documentation
+# http://om.yr.no/forklaring/symbol/
+# https://code.google.com/p/yrno/
+# http://www.webdesign-bamberg.net/erstellen-einer-wetterkarte-yr-no/
+# Altes Googlewetter-Plugin:
+# http://openautomation.svn.sourceforge.net/viewvc/openautomation/wiregate/plugin/generic/Googleweather?revision=348&view=markup
+
+#TODO: some defines
+my $linetype1 = "lw 1 lc rgb '#FF6347'"; # Temp real
+my $linetype2 = "lw 2 lc rgb 'red'"; # Temp longterm bezier
+my $bg = "black";
+###############################################################################
+if (! -x '/usr/bin/gnuplot') { return "install gnuplot !"; }
+use Date::Parse;
+use LWP::Simple;
+use XML::Simple;
+#use Encode qw(encode decode);
+
+my @period = qw(Nacht Vormittag Nachmittag Abend);
+#my $xml = encode("utf8",get($url . $url_xml));
+my $xml = get($url . $url_xml);
+#TODO: save XML locally to be re-used (Rain,Wind,...)
+return "Couldn't get $url" unless defined $xml;
+
+my $yr = XMLin($xml);
+#my $yr = XMLin('forecast.xml');
+
+my $nextup = $yr->{meta}{nextupdate};
+#my $link = $yr->{credit}{link}{url};
+my $start_time;
+my $end_time;
+my $rain_counter=0;
+my $rain_absvalue=0;
+
+# now first unfreak the XML into something readable, CSV ;)
+# anonymous tempfile
+my $csvfh;
+open($csvfh,">",'/tmp/forecast_hour_by_hour.txt');
+print $csvfh "#forecast.xml $yr->{meta}{lastupdate} $yr->{meta}{nextupdate} \n";
+
+# maybe skip/ignore first(current period) record?
+# or make two graphs: detailed and long-term
+foreach (@{$yr->{forecast}{tabular}{time}}) {
+# print "Von $_->{from} bis $_->{to} \n";
+# print " Periode $_->{period} = $period[$_->{period}] \n";
+# print " Symbol $_->{symbol}{number} $_->{symbol}{name} V: $_->{symbol}{var}\n";
+# print " Luftdruck $_->{pressure}{value} \n";
+# print " Wind $_->{windSpeed}{mps} : $_->{windSpeed}{name} \n";
+# print " Regen $_->{precipitation}{minvalue} $_->{precipitation}{maxvalue} \n";
+# print " Regen $_->{precipitation}{value} \n";
+# print " Temperatur $_->{temperature}{value} \n";
+ #if (!$start_time) { $start_time = $_->{to}; } # omit first record and start with future-forecast
+ if (!$start_time) { $start_time = $_->{from}; } # omit first record and start with future-forecast
+ $end_time = $_->{to};
+ #FIXME: Rain min/max if available
+ print $csvfh "$_->{from} $_->{temperature}{value} $_->{precipitation}{value} $_->{pressure}{value} $_->{windSpeed}{mps}\n";
+ if ($rain_counter < $rain_intervals) {
+ $rain_counter++;
+ $rain_absvalue += $_->{precipitation}{value};
+ }
+#FIXME: print JSON for CV here!
+}
+close($csvfh);
+
+# if ($rain_absvalue > $rain_treshold) {
+## Bewaesserung sperren
+# } else {
+## Bewaesserung freigeben
+# }
+
+#print "Infos: Sonnenaufgang $yr->{sun}{rise} Sonnenuntergang: $yr->{sun}{set} \n";
+#FIXME: send sunrise/sunset to GA?
+
+# gnuplot ist MUTTER ALLER FREAKSHOWS!
+# so print every single command line by line to be able to change this stuff later..
+my $gnuplotcmds;
+open($gnuplotcmds,'>','/tmp/gnuplotcmds_hour');
+#print $gnuplotcmds "set title 'Vorhersage'\n";
+print $gnuplotcmds "set title '$yr->{credit}{link}{text}' tc rgb '#cccccc'\n"; # credits
+print $gnuplotcmds "set xlabel 'WireGate - created " . getISODateStamp . " von $start_time bis $end_time' tc rgb '#cccccc'\n";
+#print $gnuplotcmds "set ylabel 'Temperatur'\n";
+print $gnuplotcmds "set format y \"%0.0f\\260C\"\n"; # GradCelsius
+print $gnuplotcmds "set y2label 'Niederschlag mm'\n";
+print $gnuplotcmds "set ytics nomirror\n";
+print $gnuplotcmds "set y2tics nomirror\n";
+# Colors
+print $gnuplotcmds "set grid front lc rgb '#dddddd'\n"; # Mand command grid!
+#print $gnuplotcmds "set border lc rgb 'white'\n"; # optional
+#print $gnuplotcmds "set obj 1 rectangle behind from screen 0,0 to screen 1,1\n"; # optional
+#print $gnuplotcmds "set obj 1 fillstyle solid 1.0 fillcolor rgbcolor 'black'\n"; # optional
+#print $gnuplotcmds "set logscale y2\n";
+print $gnuplotcmds "set y2range [0:5]\n";
+
+# Datumsformat
+print $gnuplotcmds "set locale 'de_DE.UTF-8'\n";
+print $gnuplotcmds "set xdata time\n";
+print $gnuplotcmds "set timefmt '%Y-%m-%dT%H:%M:%S'\n";
+print $gnuplotcmds "set format x \"%a\\n%H:%M\"\n";
+print $gnuplotcmds "set style fill solid 0.3 border 0\n";
+#print $gnuplotcmds "set style fill transparent solid 0.3 border 0\n";
+print $gnuplotcmds "set term png size 828, 302\n"; # size of yr.no 48h-diagram
+print $gnuplotcmds "set out '$image_name'\n";
+print $gnuplotcmds "set xrange ['$start_time':'$end_time']\n";
+print $gnuplotcmds "plot '/tmp/forecast_hour_by_hour.txt' using 1:3 title '' with boxes lw -1 lc rgb 'blue' axes x1y2, ";
+print $gnuplotcmds " '' using 1:3 with lines lw 1 lc rgb 'blue' title '' smooth bezier axes x1y2, ";
+print $gnuplotcmds " '' using 1:2 with lines lw 1 lc rgb '#FF6347' title '' smooth csplines, ";
+print $gnuplotcmds " '' using 1:2 with lines lw 2 lc rgb 'red' title '' smooth bezier ";
+print $gnuplotcmds "\n\n";
+close $gnuplotcmds;
+my $ret = `gnuplot '/tmp/gnuplotcmds_hour'`;
+
+#icons: http://symbol.yr.no/grafikk/sym/b48/10.png
+
+# set cycle to next update-time
+$plugin_info{$plugname.'_cycle'} = int((str2time($nextup) -time())+60);
+if ($plugin_info{$plugname.'_cycle'} < 60) {
+ $plugin_info{$plugname.'_cycle'} = 60; # avoid running wild if theres no new data
+} elsif ($plugin_info{$plugname.'_cycle'} > 3600) {
+ $plugin_info{$plugname.'_cycle'} = 3600; # at least once an hour to slide graph
+}
+# important: tune rrd to accept 6h-step:
+#rrdtool tune /var/www/rrd/yr_precipation_12h.rrd --heartbeat value:28800
+#rrdtool tune /var/www/rrd/yr_precipation_24h.rrd --heartbeat value:28800
+update_rrd("yr_precipation_12h","",$rain_absvalue);
+
+return "next update $nextup ($rain_absvalue)";
+return "Gnuplot sagt: $ret (nichts ist gut), next update $nextup";
+
Added: wiregate/plugin/generic/yr-forecast.pl
===================================================================
--- wiregate/plugin/generic/yr-forecast.pl (rev 0)
+++ wiregate/plugin/generic/yr-forecast.pl 2014-02-07 15:51:13 UTC (rev 2067)
@@ -0,0 +1,143 @@
+###############################################################################
+# Plugin yr.no Wetter (long-term)
+# - teilw. noch Testscript zum parsen !
+# - benoetigt gnuplot!
+
+# URL wie im Browser + forecast.xml (varsel.xml)
+my $url = "http://www.yr.no/place/Germany/Bavaria/Ottobrunn~6556321/";
+my $url_xml = "forecast.xml";
+my $image_name = "/var/www/images/forecast.png";
+
+# Todo: forecast_hour_by_hour.xml ?
+# Moegliche Funktionen
+my $rain_intervals = 4; # Anzahl der (je 6h) zusammengezaehlten Vorhersage-Intervalle fuer die erwartete Niederschlagsmenge
+my $rain_threshold = 4; # Schwellwert fuer Regen (intervals addiert) - Ziel: Bewaesserungs-steuerung mit (Kurzzeit!)-Vorhersage
+my $wind_intervals = 4; # Anzahl der (je 6h) zusammengezaehlten Vorhersage-Intervalle fuer Windwarnungen *ohne* Unwetter (Gartenmöbel leicht sichern etc.)
+my $wind_threshold = 5; # Schwellwert Windwarnung (meter/sek) - siehe FIXME: cv_config.xml
+
+### Links ###
+# http://om.yr.no/verdata/free-weather-data/
+# http://api.met.no/weatherapi/documentation
+# http://om.yr.no/forklaring/symbol/
+# https://code.google.com/p/yrno/
+# http://www.webdesign-bamberg.net/erstellen-einer-wetterkarte-yr-no/
+# Altes Googlewetter-Plugin:
+# http://openautomation.svn.sourceforge.net/viewvc/openautomation/wiregate/plugin/generic/Googleweather?revision=348&view=markup
+
+#TODO: some defines
+my $linetype1 = "lw 1 lc rgb '#FF6347'"; # Temp real
+my $linetype2 = "lw 2 lc rgb 'red'"; # Temp longterm bezier
+my $bg = "black";
+###############################################################################
+if (! -x '/usr/bin/gnuplot') { return "install gnuplot !"; }
+use Date::Parse;
+use LWP::Simple;
+use XML::Simple;
+#use Encode qw(encode decode);
+
+my @period = qw(Nacht Vormittag Nachmittag Abend);
+#my $xml = encode("utf8",get($url . $url_xml));
+my $xml = get($url . $url_xml);
+#TODO: save XML locally to be re-used (Rain,Wind,...)
+return "Couldn't get $url" unless defined $xml;
+
+my $yr = XMLin($xml);
+#my $yr = XMLin('forecast.xml');
+
+my $nextup = $yr->{meta}{nextupdate};
+#my $link = $yr->{credit}{link}{url};
+my $start_time;
+my $end_time;
+my $rain_counter=0;
+my $rain_absvalue=0;
+
+# now first unfreak the XML into something readable, CSV ;)
+# anonymous tempfile
+my $csvfh;
+open($csvfh,">",'/tmp/forecast.txt');
+print $csvfh "#forecast.xml $yr->{meta}{lastupdate} $yr->{meta}{nextupdate} \n";
+
+# maybe skip/ignore first(current period) record?
+# or make two graphs: detailed and long-term
+foreach (@{$yr->{forecast}{tabular}{time}}) {
+# print "Von $_->{from} bis $_->{to} \n";
+# print " Periode $_->{period} = $period[$_->{period}] \n";
+# print " Symbol $_->{symbol}{number} $_->{symbol}{name} V: $_->{symbol}{var}\n";
+# print " Luftdruck $_->{pressure}{value} \n";
+# print " Wind $_->{windSpeed}{mps} : $_->{windSpeed}{name} \n";
+# print " Regen $_->{precipitation}{minvalue} $_->{precipitation}{maxvalue} \n";
+# print " Regen $_->{precipitation}{value} \n";
+# print " Temperatur $_->{temperature}{value} \n";
+ if (!$start_time) { $start_time = $_->{to}; } # omit first record and start with future-forecast
+ $end_time = $_->{to};
+ print $csvfh "$_->{from} $_->{temperature}{value} $_->{precipitation}{value} $_->{pressure}{value} $_->{windSpeed}{mps}\n";
+ if ($rain_counter < $rain_intervals) {
+ $rain_counter++;
+ $rain_absvalue += $_->{precipitation}{value};
+ }
+#FIXME: print JSON for CV here!
+}
+close($csvfh);
+
+# if ($rain_absvalue > $rain_treshold) {
+## Bewaesserung sperren
+# } else {
+## Bewaesserung freigeben
+# }
+
+#print "Infos: Sonnenaufgang $yr->{sun}{rise} Sonnenuntergang: $yr->{sun}{set} \n";
+#FIXME: send sunrise/sunset to GA?
+
+# gnuplot ist MUTTER ALLER FREAKSHOWS!
+# so print every single command line by line to be able to change this stuff later..
+my $gnuplotcmds;
+open($gnuplotcmds,'>','/tmp/gnuplotcmds');
+#print $gnuplotcmds "set title 'Vorhersage'\n";
+print $gnuplotcmds "set title '$yr->{credit}{link}{text}' tc rgb '#cccccc'\n"; # credits
+print $gnuplotcmds "set xlabel 'WireGate - created " . getISODateStamp . " von $start_time bis $end_time' tc rgb '#cccccc'\n";
+#print $gnuplotcmds "set ylabel 'Temperatur'\n";
+print $gnuplotcmds "set format y \"%0.0f\\260C\"\n"; # GradCelsius
+print $gnuplotcmds "set y2label 'Niederschlag mm'\n";
+print $gnuplotcmds "set ytics nomirror\n";
+print $gnuplotcmds "set y2tics nomirror\n";
+# Colors
+print $gnuplotcmds "set grid front lc rgb '#dddddd'\n"; # Mand command grid!
+#print $gnuplotcmds "set border lc rgb 'white'\n"; # optional
+#print $gnuplotcmds "set obj 1 rectangle behind from screen 0,0 to screen 1,1\n"; # optional
+#print $gnuplotcmds "set obj 1 fillstyle solid 1.0 fillcolor rgbcolor 'black'\n"; # optional
+#print $gnuplotcmds "set logscale y2\n";
+print $gnuplotcmds "set y2range [0:5]\n";
+
+# Datumsformat
+print $gnuplotcmds "set locale 'de_DE.UTF-8'\n";
+print $gnuplotcmds "set xdata time\n";
+print $gnuplotcmds "set timefmt '%Y-%m-%dT%H:%M:%S'\n";
+print $gnuplotcmds "set format x \"%a\\n%d.%m\"\n";
+print $gnuplotcmds "set style fill solid 0.3 border 0\n";
+#print $gnuplotcmds "set style fill transparent solid 0.3 border 0\n";
+print $gnuplotcmds "set term png size 828, 302\n"; # size of yr.no 48h-diagram
+print $gnuplotcmds "set out '$image_name'\n";
+print $gnuplotcmds "set xrange ['$start_time':'$end_time']\n";
+print $gnuplotcmds "plot '/tmp/forecast.txt' using 1:3 title '' with boxes lw -1 lc rgb 'blue' axes x1y2, ";
+print $gnuplotcmds " '' using 1:3 with lines lw 1 lc rgb 'blue' title '' smooth bezier axes x1y2, ";
+print $gnuplotcmds " '' using 1:2 with lines lw 1 lc rgb '#FF6347' title '' smooth csplines, ";
+print $gnuplotcmds " '' using 1:2 with lines lw 2 lc rgb 'red' title '' smooth bezier ";
+print $gnuplotcmds "\n\n";
+close $gnuplotcmds;
+my $ret = `gnuplot '/tmp/gnuplotcmds'`;
+
+#icons: http://symbol.yr.no/grafikk/sym/b48/10.png
+
+# set cycle to next update-time
+$plugin_info{$plugname.'_cycle'} = int((str2time($nextup) -time())+60);
+if ($plugin_info{$plugname.'_cycle'} < 60) {
+ $plugin_info{$plugname.'_cycle'} = 60; # avoid running wild if theres no new data
+}
+# important: tune rrd to accept 6h-step!
+#rrdtool tune /var/www/rrd/yr_precipation_12h.rrd --heartbeat value:28800
+#rrdtool tune /var/www/rrd/yr_precipation_24h.rrd --heartbeat value:28800
+update_rrd("yr_precipation_24h","",$rain_absvalue);
+
+return "next update $nextup ($rain_absvalue)";
+return "Gnuplot sagt: $ret (nichts ist gut), next update $nextup";
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <chr...@us...> - 2014-03-10 15:25:58
|
Revision: 2143
http://sourceforge.net/p/openautomation/code/2143
Author: chris_ace
Date: 2014-03-10 15:25:53 +0000 (Mon, 10 Mar 2014)
Log Message:
-----------
neues Wetter-Plugin (Weather.pl) basierend auf Wunderground
Added Paths:
-----------
wiregate/plugin/generic/Weather.pl
wiregate/plugin/generic/conf.d/Weather.conf
Added: wiregate/plugin/generic/Weather.pl
===================================================================
--- wiregate/plugin/generic/Weather.pl (rev 0)
+++ wiregate/plugin/generic/Weather.pl 2014-03-10 15:25:53 UTC (rev 2143)
@@ -0,0 +1,159 @@
+# Weather Plugin
+# Version 0.01
+# by ctr (http://knx-user-forum.de/members/ctr.html)
+# based on
+# - Plugin zum Abfragen von Google Weather (by jensgulow)
+# - Wundergroundweather (by Bodo)
+# Copyright: ctr
+# License: GPL (v2)
+
+my $provider;
+my $city;
+my $country;
+my $lang;
+my $api;
+
+my $weather_update_ga;
+my $weather_temp_ga;
+my $weather_hum_ga;
+my $weather_clouds_ga;
+my $weather_wind_ga;
+my $weather_wind_speed_ga;
+my $weather_wind_dir_ga;
+
+my $weather_current_temp;
+my $weather_current_humidity;
+my $weather_current_clouds;
+my $weather_current_wind;
+my $weather_current_windchill;
+my $weather_current_wind_speed;
+my $weather_current_wind_dir;
+my $weather_current_sunrise;
+my $weather_current_sunset;
+my @weather_forecast_maxtemp;
+my @weather_forecast_mintemp;
+my @weather_forecast_clouds;
+my @weather_forecast_day;
+my @weather_forecast_pop;
+
+my $show_debug = 0;
+
+use Switch;
+
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+if (! -f $confFile)
+{
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ return("error");
+}
+else
+{
+ plugin_log($plugname, " reading conf file [$confFile].") if( $show_debug > 1);
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ if( $show_debug > 1 )
+ {
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ }
+ if ($@)
+ {
+ plugin_log($plugname, "conf file [$confFile] returned:") if( $show_debug > 1 );
+ my @parts = split(/\n/, $@);
+ if( $show_debug > 1 )
+ {
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+ }
+}
+
+
+
+
+if (not defined($plugin_info{$plugname.'_cycle'})) {
+ $plugin_info{$plugname.'_cycle'} = 1800; # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
+ # nicht zu klein, da die Daten sowieso in längeren Perioden refresht werden
+ # und das Plugin auf die CF schreibt.
+}
+
+sub Wunderground {
+ my $wunderground_baseurl = "http://api.wunderground.com/api/";
+ use LWP::Simple;
+ use XML::Simple;
+ my $url = $wunderground_baseurl.$api."/conditions/forecast/astronomy/lang:".$lang."/q/".$country."\/".$city."\.xml";
+ my $xml = get($url);
+ return "Couldn't get it!" unless defined $xml;
+ my $weather = XMLin($xml,SuppressEmpty => '');
+ # current weather
+ $weather_current_temp = $weather->{current_observation}->{temp_c};
+ ($weather_current_humidity) = ($weather->{current_observation}->{relative_humidity} =~ m/(\d{1,3})\D/);
+# $weather_current_wind = $weather->{current_observation}->{wind_string};
+ SELECT:{
+ if ($weather->{current_observation}->{wind_kph} < 1.08) { $weather_current_wind = "0"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 5.76) { $weather_current_wind = "1"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 12.24) { $weather_current_wind = "2"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 19.8) { $weather_current_wind = "3"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 28.8) { $weather_current_wind = "4"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 38.88) { $weather_current_wind = "5"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 50.04) { $weather_current_wind = "6"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 61.92) { $weather_current_wind = "7"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 74.88) { $weather_current_wind = "8"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 88.2) { $weather_current_wind = "9"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 102.6) { $weather_current_wind = "10"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} < 117.72) { $weather_current_wind = "11"; last SELECT; }
+ if ($weather->{current_observation}->{wind_kph} >= 117.72) { $weather_current_wind = "12"; last SELECT; }
+ }
+ $weather_current_wind_speed = $weather->{current_observation}->{wind_kph};
+ $weather_current_wind_dir = $weather->{current_observation}->{wind_dir};
+ if ($weather->{current_observation}->{weather}) {
+ $weather_current_clouds = $weather->{current_observation}->{weather};
+ } else {
+ $weather_current_clouds = "Klar";
+ }
+ $weather_current_windchill = $weather->{current_observation}->{windchill_c};
+ $weather_current_sunset = $weather->{moon_phase}->{sunset}->{hour}.":".$weather->{moon_phase}->{sunset}->{minute};
+ $weather_current_sunrise = $weather->{moon_phase}->{sunrise}->{hour}.":".$weather->{moon_phase}->{sunrise}->{minute};
+ #forecast
+ for (my $i = 0; $i <= 3; $i++) {
+ $weather_forecast_maxtemp[$i] = $weather->{forecast}->{simpleforecast}->{forecastdays}->{forecastday}->[$i]->{high}->{celsius};
+ $weather_forecast_mintemp[$i] = $weather->{forecast}->{simpleforecast}->{forecastdays}->{forecastday}->[$i]->{low}->{celsius};
+ $weather_forecast_clouds[$i] = $weather->{forecast}->{simpleforecast}->{forecastdays}->{forecastday}->[$i]->{conditions};
+ $weather_forecast_day[$i] = $weather->{forecast}->{simpleforecast}->{forecastdays}->{forecastday}->[$i]->{date}->{weekday};
+ $weather_forecast_pop[$i] = $weather->{forecast}->{simpleforecast}->{forecastdays}->{forecastday}->[$i]->{pop};
+ }
+} # Ende "sub Wunderground"
+
+
+sub Results {
+ $plugin_info{$plugname.'_current_temp'} = $weather_current_temp." °C";
+ if ($weather_hum_ga) { knx_write($weather_hum_ga,$weather_current_humidity,9); }
+ $plugin_info{$plugname.'_current_humidity'} = $weather_current_humidity." %";
+ if ($weather_clouds_ga) { knx_write($weather_clouds_ga,$weather_current_clouds,16); }
+ $plugin_info{$plugname.'_current_clouds'} = $weather_current_clouds;
+ if ($weather_wind_ga) { knx_write($weather_wind_ga,$weather_current_wind,16); }
+ $plugin_info{$plugname.'_current_wind'} = $weather_current_wind;
+ if ($weather_wind_speed_ga) { knx_write($weather_wind_speed_ga,$weather_current_wind_speed,16); }
+ $plugin_info{$plugname.'_current_wind_speed'} = $weather_current_wind_speed;
+ if ($weather_wind_ga) { knx_write($weather_wind_dir_ga,$weather_current_wind_dir,16); }
+ $plugin_info{$plugname.'_current_wind_dir'} = $weather_current_wind_dir;
+ $plugin_info{$plugname.'_current_sunset'} = $weather_current_sunset;
+ $plugin_info{$plugname.'_current_sunrise'} = $weather_current_sunrise;
+ for (my $i = 0; $i <= 3; $i++) {
+ $plugin_info{$plugname.'_forecast_maxtemp'.$i} = $weather_forecast_maxtemp[$i]." °C";
+ $plugin_info{$plugname.'_forecast_mintemp'.$i} = $weather_forecast_mintemp[$i]." °C";
+ $plugin_info{$plugname.'_forecast_clouds'.$i} = $weather_forecast_clouds[$i];
+ $plugin_info{$plugname.'_forecast_day'.$i} = $weather_forecast_day[$i];
+ $plugin_info{$plugname.'_forecast_pop'.$i} = $weather_forecast_pop[$i]." %";
+ }
+ knx_write($weather_update_ga,1,1);
+} # Ende "sub Results"
+
+
+if (lc $provider eq "wunderground" ) {
+ Wunderground();
+ Results();
+ return("Done");
+} else {
+ return("no valid provider defined");
+}
Added: wiregate/plugin/generic/conf.d/Weather.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Weather.conf (rev 0)
+++ wiregate/plugin/generic/conf.d/Weather.conf 2014-03-10 15:25:53 UTC (rev 2143)
@@ -0,0 +1,213 @@
+# Weather.pl Config
+
+$provider = "Wunderground"; # Anbieter, derzeit unterstützt: Wunderground
+$city = ""; # Meine Stadt, hier statt ü,ä,ö einfach u,a,o nehmen oder ue,ae,oe
+$country = ""; # Mein Land
+$lang = "DL"; # Meine Sprache (DL = deutsch)
+$api = ""; # API, muss man sich bei Wunderground besorgen
+
+$weather_update_ga = ""; # Gruppenadresse zum signalisieren eines Updates (fuer Visu!), Pflichtfeld!
+#$weather_temp_ga = ""; # Gruppenadresse Temperatur (DPT9.001, Grad Celsius)
+#$weather_hum_ga = ""; # Gruppenadresse Luftfeuchte (DPT9.007, Prozent relative Luffeuchtigkeit)
+#$weather_clouds_ga = ""; # Gruppenadresse Wolken (DPT16, Text)
+#$weather_wind_ga = ""; # Gruppenadresse Wind (tbd, Beaufort)
+#$weather_wind_speed_ga = ""; # Gruppenadresse Windgeschwindigkeit (tbd, km/h)
+#$weather_wind_dir_ga = ""; # Gruppenadresse Windrichtung (tbd, Grad)
+
+
+$plugin_info{$plugname.'_cycle'} = 1800; # alle 30 Minuten ausfuehren
+
+
+
+#### CometVisu Example Config:
+#
+# <group name="Weather">
+# <layout colspan="6"/>
+# <group nowidget="true" align="center">
+# <layout colspan="1.65"/>
+# <group nowidget="true" align="center">
+# <layout colspan="4.35"/>
+# <text align="center">
+# <label>Aktuell</label>
+# </text>
+# </group>
+# <group nowidget="true" align="center">
+# <layout colspan="1.65"/>
+# <text>
+# <layout colspan="0.45"/>
+# <label>
+# <icon name="temp_temperature"/>
+# </label>
+# </text>
+# <wgplugin_info variable="Weather.pl_current_temp">
+# <layout colspan="1.2"/>
+# <label>
+# <icon name="it_internet"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <break/>
+# <text>
+# <layout colspan="0.45"/>
+# <label>
+# <icon name="temp_temperature"/>
+# </label>
+# </text>
+# <info format="%.1f °C">
+# <layout colspan="1.2"/>
+# <label>
+# <icon name="weather_station"/>
+# </label>
+# <address transform="DPT:9.001" mode="read">$temp_ga_weatherstation</address>
+# </info>
+# <break/>
+# <text>
+# <layout colspan="0.45"/>
+# <label>
+# <icon name="weather_wind_speed"/>
+# </label>
+# </text>
+# <info format="%.1f">
+# <layout colspan="1.2"/>
+# <label>
+# <icon name="weather_station"/>
+# </label>
+# <address transform="DPT:9.001" mode="read">$windspeed_ga_weatherstation</address>
+# </info>
+# <text>
+# <layout colspan="0.45"/>
+# <label>
+# <icon name="weather_humidity_rel"/>
+# </label>
+# </text>
+# <wgplugin_info variable="Weather.pl_current_humidity">
+# <layout colspan="1.2"/>
+# <label>
+# <icon name="it_internet"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_current_clouds">
+# <layout colspan="1.65"/>
+# <label>
+# <icon name="weather_cloudy_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# </group>
+# </group>
+# <group nowidget="true" align="center">
+# <layout colspan="4.35"/>
+# <group nowidget="true" align="center">
+# <layout colspan="4.35"/>
+# <text align="center">
+# <label>Vorhersage</label>
+# </text>
+# </group>
+# <group nowidget="true" align="center">
+# <layout colspan="1.45"/>
+# <wgplugin_info variable="Weather.pl_forecast_day0">
+# <layout colspan="1.45"/>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_maxtemp0">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="temp_temperature_max"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_mintemp0">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="temp_temperature_min"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_pop0">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="weather_rain_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_clouds0">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="weather_cloudy_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# </group>
+# <group nowidget="true" align="center">
+# <layout colspan="1.45"/>
+# <wgplugin_info variable="Weather.pl_forecast_day1">
+# <layout colspan="1.45"/>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_maxtemp1">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="temp_temperature_max"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_mintemp1">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="temp_temperature_min"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_pop1">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="weather_rain_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_clouds1">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="weather_cloudy_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# </group>
+# <group nowidget="true" align="center">
+# <layout colspan="1.45"/>
+# <wgplugin_info variable="Weather.pl_forecast_day2">
+# <layout colspan="1.45"/>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_maxtemp2">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="temp_temperature_max"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_mintemp2">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="temp_temperature_min"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_pop2">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="weather_rain_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# <wgplugin_info variable="Weather.pl_forecast_clouds2">
+# <layout colspan="1.45"/>
+# <label>
+# <icon name="weather_cloudy_light"/>
+# </label>
+# <address transform="DPT:1.001" mode="read">$weather_update_ga</address>
+# </wgplugin_info>
+# </group>
+# </group>
+# </group>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <kru...@us...> - 2014-05-24 10:10:29
|
Revision: 2192
http://sourceforge.net/p/openautomation/code/2192
Author: krumboeck
Date: 2014-05-24 10:10:24 +0000 (Sat, 24 May 2014)
Log Message:
-----------
v0.8 of RolladenAutomatik plugin
Modified Paths:
--------------
wiregate/plugin/generic/RollladenAutomatik.pl
wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
Modified: wiregate/plugin/generic/RollladenAutomatik.pl
===================================================================
--- wiregate/plugin/generic/RollladenAutomatik.pl 2014-05-17 21:37:24 UTC (rev 2191)
+++ wiregate/plugin/generic/RollladenAutomatik.pl 2014-05-24 10:10:24 UTC (rev 2192)
@@ -1,6 +1,6 @@
######################################################################################
# Plugin RollladenAutomatik
-# V0.7 2013-11-05
+# V0.8 2014-05-24
# Lizenz: GPLv2
# Autoren: kleinklausi (http://knx-user-forum.de/members/kleinklausi.html)
# krumboeck (http://knx-user-forum.de/members/krumboeck.html)
@@ -24,6 +24,8 @@
# - Steuerung aufgrund der Raumtemperatur (krumboeck)
# - Hysteresewerte für Temperatur, Wind und Bewölkung (krumboeck)
# - Speichern der Rolladenposition und aktuellen Zuständen (krumboeck)
+# - Fahren auf Positionen welche im Aktor (z.B. Siemens 523/03) gespeichert sind (krumboeck)
+# - Überprüfen von Positionen vor Sonnenauf bzw. -untergang (krumboeck)
#
# TODO: Was teilweise integriert ist aber noch nicht komplett ist:
# - Bei Fensterdefinition auch Elevation oben bzw. unten angeben
@@ -159,15 +161,24 @@
next;
}
+ # Ermittle gewünschte Position und Grund des Fahrens für den Rollladen
my ($position, $bemerkung) = berechneRolladenposition($rolladen, $azimuth, $elevation, $lastAzimuth, $lastElevation, $daemmerung, $weather);
- my $lastPosition = ladeRolladenParameter($rolladen, "position");
+ # Fahre den Rollladen wenn es einen Positionswunsch gibt
if (defined $position) {
- if ($position != $lastPosition) {
- fahreRollladen($rolladen, $position);
- plugin_log($plugname,"Name: " . $rolladen->{name} . "; " . $bemerkung);
+
+ if ($position =~ m/((\d+|\*));Position:(\d+)/) {
+ if (positionChanged($rolladen, $position)) {
+ ladeRollladenPosition($rolladen, $position, $3);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . " (Lade Pos); " . $bemerkung);
+ }
+ } else {
+ if (positionChanged($rolladen, $position)) {
+ fahreRollladen($rolladen, $position);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; " . $bemerkung);
+ }
}
- } elsif ($debug) {
+ } elsif (defined $rolladen->{debug} && $rolladen->{debug}) {
plugin_log($plugname,"Name: " . $rolladen->{name} . "; Fahren wird fuer diesen Zyklus ausgesetzt");
}
@@ -180,9 +191,62 @@
return "Grad gegen Norden: " . round(rad2deg($azimuth)) . "; Grad ueber Horizont: " . round(rad2deg($elevation));
-####################################
+############################################
+# Prüft ob der Rolladen gefahren werden muss
+############################################
+sub positionChanged {
+ my ($rolladen, $newPosition) = @_;
+
+ # Ermittle die aktuelle Position
+ my $lastPosition = ladeRolladenParameter($rolladen, "position");
+
+ my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
+ my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
+
+
+ my $newPositionValue = $newPosition;
+ if ($newPosition =~ m/((\d+|\*));Position:(\d+)/) {
+ $newPositionValue = $1;
+ }
+ my $lastPositionValue = $lastPosition;
+ if ($lastPosition =~ m/((\d+|\*));Position:(\d+)/) {
+ $lastPositionValue = $1;
+ }
+
+ if ((defined $rolladen->{pruefePositionSonnenAufUnter} && $rolladen->{pruefePositionSonnenAufUnter} == 1
+ && ($testAbendDaemmerung || $testMorgenDaemmerung))
+ || (($lastPosition ne $newPosition) && ($lastPositionValue eq "*"))) {
+ if (defined $rolladen->{GAistPos}) {
+ $lastPositionValue = knx_read($rolladen->{GAistPos}, 0, 5.001);
+ $lastPositionValue = sprintf("%d", $lastPositionValue);
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Rollladen meldete Position: " . $lastPosition);
+ }
+ } else {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Konfiguration benötigt GAistPos für diesen Rollladen");
+ }
+ }
+
+ if ($newPosition == 1) {
+ $newPosition = 100;
+ }
+ if ($newPositionValue == 1) {
+ $newPositionValue = 100;
+ }
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Last-Pos: " . $lastPosition . "; Pos: " . $newPosition);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Last-Pos-Value: " . $lastPositionValue . "; Pos-Value: " . $newPositionValue);
+ }
+ if (($lastPosition ne $newPosition) || ($newPositionValue <= ($lastPositionValue - 1)) || ($newPositionValue >= ($lastPositionValue + 1))) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+###################################
# Berechne Parameter eines Rolladen
-####################################
+###################################
sub berechneRolladenParameter {
my ($rolladen, $counter) = @_;
if ($counter > 20) {
@@ -238,7 +302,7 @@
my $testAktuellBeschienen = ($azimuth > $winkel1 && $azimuth < $winkel2) || 0;
my $testVoherBeschienen = ($lastAzimuth > $winkel1 && $lastAzimuth < $winkel2) || 0;
- # Test ob Nach oder Daemmerung
+ # Test ob Nacht oder Daemmerung
my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
my $testNacht = ($elevation < deg2rad($daemmerung)) || 0;
@@ -397,16 +461,22 @@
my ($rolladen, $richtung) = @_;
my $GA = $rolladen->{GAfahren};
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname, "Name: " . $rolladen->{name} . "; Fahre Rolladen Position: " . $richtung);
+ }
+
if ($richtung == 0 || $richtung == 1) {
# Auf/Zu fahren
knx_write($GA,$richtung,3);
- }
- else {
+ } else {
# Position anfahren
knx_write($GA,$richtung,5);
}
# Position speichern
+ if ($richtung == 1) {
+ $richtung = 100;
+ }
speichereRolladenParameter($rolladen, "position", $richtung);
# kurze Pause, falls das benutzte Interface das braucht...
@@ -415,7 +485,31 @@
}
}
+####################################################
+# Aufruf mit fahreRollladen($richtung, $GA);
+####################################################
+sub ladeRollladenPosition {
+ my ($rolladen, $wert, $position) = @_;
+ if (! defined $rolladen->{GAladePos}) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Wert für GAladePos ist nicht definiert!");
+ return;
+ }
+
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname, "Name: " . $rolladen->{name} . "; Fahre zur gespeicherten Position: " . $position);
+ }
+
+ knx_write($rolladen->{GAladePos}, $position, 1.001);
+
+ speichereRolladenParameter($rolladen, "position", $wert);
+
+ # kurze Pause, falls das benutzte Interface das braucht...
+ if ($bugfixSlowInterface) {
+ usleep(20000);
+ }
+}
+
########################################
# Parameter für einen Rolladen speichern
########################################
Modified: wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-05-17 21:37:24 UTC (rev 2191)
+++ wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-05-24 10:10:24 UTC (rev 2192)
@@ -73,6 +73,10 @@
# GAfahren => "0/0/126"
# GA um die Automatik dieses einen Rollladen zu sperren
# GAsperre=> "0/0/129"
+# GA für die aktuelle Position des Rollladen
+# GAistPos => "0/0/130"
+# GA für das Laden einer Position des Rollladen (für Aktoren welche gespeicherte Positionen unterstützen)
+# GAladePos => "0/0/131"
# Rolladen soll aufgrund der Raumtemperatur gesteuert werden
# tempGesteuert => 1
# Hysterese für Regelung aufgrund der Raumtemperatur (in °C)
@@ -89,6 +93,15 @@
# minAussenTemp => -15
# Hysterese für Regelung aufgrund der Außentemperatur (in °C)
# aussenTempHysterese => 2
+# Prüft die Position vor dem Fahren bei Sonnenauf und Untergang (boolean)
+# pruefePositionSonnenAufUnter => 1
+# Debugging für Rolladen einschalten
+# debug => 1
+
+# Format für im Aktor gespeicherte Positionen:
+# "44;Position:0" bezeichnet die im Aktor gespeicherte Position 0. Der Wert 44 dient lediglich zur Kontrolle.
+
+
push @AlleRolllaeden, { name => "default", istVorlage => 1, wertZuBesch => 1, wertAufBesch => 0,
wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 1, raumSollTemp => 23,
tempGesteuert => 1, tempHysterese => 0.5, maxWindGeschw => 80,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <kru...@us...> - 2014-05-29 05:22:35
|
Revision: 2194
http://sourceforge.net/p/openautomation/code/2194
Author: krumboeck
Date: 2014-05-29 05:22:31 +0000 (Thu, 29 May 2014)
Log Message:
-----------
v0.9 of RollladenAutomatik plugin
Modified Paths:
--------------
wiregate/plugin/generic/RollladenAutomatik.pl
wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
Modified: wiregate/plugin/generic/RollladenAutomatik.pl
===================================================================
--- wiregate/plugin/generic/RollladenAutomatik.pl 2014-05-25 09:10:06 UTC (rev 2193)
+++ wiregate/plugin/generic/RollladenAutomatik.pl 2014-05-29 05:22:31 UTC (rev 2194)
@@ -1,6 +1,6 @@
######################################################################################
# Plugin RollladenAutomatik
-# V0.8 2014-05-24
+# V0.9 2014-05-29
# Lizenz: GPLv2
# Autoren: kleinklausi (http://knx-user-forum.de/members/kleinklausi.html)
# krumboeck (http://knx-user-forum.de/members/krumboeck.html)
@@ -26,6 +26,7 @@
# - Speichern der Rolladenposition und aktuellen Zuständen (krumboeck)
# - Fahren auf Positionen welche im Aktor (z.B. Siemens 523/03) gespeichert sind (krumboeck)
# - Überprüfen von Positionen vor Sonnenauf bzw. -untergang (krumboeck)
+# - Nach Aufhebung der Sperre auf Position fahren (krumboeck)
#
# TODO: Was teilweise integriert ist aber noch nicht komplett ist:
# - Bei Fensterdefinition auch Elevation oben bzw. unten angeben
@@ -149,16 +150,20 @@
# Los gehts. Jeden Rolladen/Fenster/Raum abarbeiten.
foreach my $element (@AlleRolllaeden) {
- if (defined $element->{istVorlage} && $element->{istVorlage}) {
+ if (defined $element->{istVorlage} && $element->{istVorlage}) {
next;
}
my $rolladen = berechneRolladenParameter($element, 0);
- # Falls gesperrt, mit nächstem Rollladen fortfahren
- if (defined $rolladen->{GAsperre}
- && knx_read($rolladen->{GAsperre}, 0, 1) == 1) {
- next;
+ if (defined $rolladen->{GAsperre}) {
+ $plugin_subscribe{$rolladen->{GAsperre}}{$plugname} = 1;
+ # Falls gesperrt, mit nächstem Rollladen fortfahren
+ if (knx_read($rolladen->{GAsperre}, 0, 1) == 1) {
+ speichereRolladenParameter($rolladen, "locked", 1);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Sperre für Rolladen wurde empfangen");
+ next;
+ }
}
# Ermittle gewünschte Position und Grund des Fahrens für den Rollladen
@@ -203,6 +208,16 @@
my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
+ my $testLockChanged = 0;
+ if (defined $rolladen->{GAsperre}) {
+ my $parameterLocked = ladeRolladenParameter($rolladen, "locked");
+ if (defined $parameterLocked && $parameterLocked && knx_read($rolladen->{GAsperre}, 0, 1) == 0) {
+ speichereRolladenParameter($rolladen, "locked", 0);
+ if (defined $rolladen->{pruefePositionNachSperre} && $rolladen->{pruefePositionNachSperre}) {
+ $testLockChanged = 1;
+ }
+ }
+ }
my $newPositionValue = $newPosition;
if ($newPosition =~ m/((\d+|\*));Position:(\d+)/) {
@@ -215,6 +230,7 @@
if ((defined $rolladen->{pruefePositionSonnenAufUnter} && $rolladen->{pruefePositionSonnenAufUnter} == 1
&& ($testAbendDaemmerung || $testMorgenDaemmerung))
+ || $testLockChanged
|| (($lastPosition ne $newPosition) && ($lastPositionValue eq "*"))) {
if (defined $rolladen->{GAistPos}) {
$lastPositionValue = knx_read($rolladen->{GAistPos}, 0, 5.001);
@@ -222,6 +238,8 @@
if (defined $rolladen->{debug} && $rolladen->{debug}) {
plugin_log($plugname,"Name: " . $rolladen->{name} . "; Rollladen meldete Position: " . $lastPosition);
}
+ } elsif ($testLockChanged) {
+ $lastPositionValue = -1;
} else {
plugin_log($plugname,"Name: " . $rolladen->{name} . "; Konfiguration benötigt GAistPos für diesen Rollladen");
}
Modified: wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-05-25 09:10:06 UTC (rev 2193)
+++ wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-05-29 05:22:31 UTC (rev 2194)
@@ -97,6 +97,8 @@
# pruefePositionSonnenAufUnter => 1
# Debugging für Rolladen einschalten
# debug => 1
+# Prüft die Position nach Aufhebung einer Sperre (boolean)
+# pruefePositionNachSperre => 1
# Format für im Aktor gespeicherte Positionen:
# "44;Position:0" bezeichnet die im Aktor gespeicherte Position 0. Der Wert 44 dient lediglich zur Kontrolle.
@@ -105,8 +107,9 @@
push @AlleRolllaeden, { name => "default", istVorlage => 1, wertZuBesch => 1, wertAufBesch => 0,
wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 1, raumSollTemp => 23,
tempGesteuert => 1, tempHysterese => 0.5, maxWindGeschw => 80,
- windGeschwHysterese => 5, maxBewoelkung => 75, bewoelkungHysterese => 5,
- minAussenTemp => -15, aussenTempHysterese => 2, wertAufSchutz => 0, wertZuSchutz => 1 };
+ windGeschwHysterese => 5, maxBewoelkung => 70, bewoelkungHysterese => 5,
+ minAussenTemp => -15, aussenTempHysterese => 2, wertAufSchutz => 0, wertZuSchutz => 1,
+ pruefePositionSonnenAufUnter => 1, pruefePositionNachSperre => 1 };
push @AlleRolllaeden, { name => "Wohnzimmer", vorlage => "default", winkel1 => 66, winkel2 => 180,
GAraumIstTemp => "2/3/0", GAfahren => "3/1/0" };
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sw...@us...> - 2014-07-22 21:49:00
|
Revision: 2215
http://sourceforge.net/p/openautomation/code/2215
Author: swiss1
Date: 2014-07-22 21:48:56 +0000 (Tue, 22 Jul 2014)
Log Message:
-----------
Update to Version 1.6.9 BETA
Modified Paths:
--------------
wiregate/plugin/generic/ComfoAir_kwl.pl
wiregate/plugin/generic/conf.d/ConfoAir_kwl.conf
Modified: wiregate/plugin/generic/ComfoAir_kwl.pl
===================================================================
--- wiregate/plugin/generic/ComfoAir_kwl.pl 2014-07-22 14:38:45 UTC (rev 2214)
+++ wiregate/plugin/generic/ComfoAir_kwl.pl 2014-07-22 21:48:56 UTC (rev 2215)
@@ -1,5 +1,5 @@
# Plugin zur Ansteuerung einer Zender ComfoAir
-# Version 1.6.7d 22.08.2013 BETA
+# Version 1.6.9 15.07.2014 BETA
# Copyright: swiss (http://knx-user-forum.de/members/swiss.html)
# Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
# - Neu mit der Moeglichkeit zur Anbindung \xFCber einen Moxa NPort von Fechter65 (http://knx-user-forum.de/members/fechter65.html)
@@ -9,6 +9,8 @@
# - Neu mit der M\xF6glichkeit die Ventilationsstufe direkt zu setzen von swiss (http://knx-user-forum.de/members/swiss.html)
# - Neu mit der M\xF6glichkeit die Ventilatorstufe f\xFCr Zuluft und Abluft getrennt zu setzen (0% - 100%) von Netsrac80 (http://knx-user-forum.de/members/netsrac80.html)
# - Korrektur Stufe direkt setzen. Senden / empfangen hat nun das gleiche Mapping 1=Auto, 2=Sufe1, 3=Stufe2, 4=Stufe3
+# - Neu mit R\xFCckmeldung auf Lesetelegramme
+# - Bugfix: Themperatur wird nach dem Verstellen nicht direkt als Status zur\xFCckgegeben
@@ -33,7 +35,7 @@
my $ga_stufe1 = ''; #1bit Trigger fuer Stufe1. 1=Aktivieren
my $ga_stufe2 = ''; #1bit Trigger fuer Stufe2. 1=Aktivieren
my $ga_stufe3 = ''; #1bit Trigger fuer Stufe3. 1=Aktivieren
-my $ga_stufe_setzen = ''; # GA DPT 5.005 zum direkten setzen der Stufe (1=A, 2=Stufe1, 3=Stufe2, 4=Stufe3)
+my $ga_stufe_setzen = ''; # GA DPT 5.005 zum direkten setzen der Stufe (1=Abwesend, 2=Stufe1, 3=Stufe2, 4=Stufe3)
my $ga_komforttemp = ''; #GA DPT 9.001 zum setzen der Komforttemperatur
my $ga_drehzahl_ventilator_zul = ''; #GA DPT 5.001 zum setzen der Zuluftdrehzahl
my $ga_drehzahl_ventilator_abl = ''; #GA DPT 5.001 zum setzen der Abluftdrehzahl
@@ -91,7 +93,7 @@
my $seriel;
my $sin; #Serial Input = Empangener Datenstrom
my $cin; #Counter Input = L\xE4nge des Datenpackets
-my $laenge; #L\xE4nge des empfangenen Datenstrings nachdem k\xFCrzen
+my $laenge; #L\xE4nge des empfangenen Datenstrings nach dem k\xFCrzen
my $checksum = 0; #Checksumme
my @hex; #Hilfsarray f\xFCr die Checksummenberechnung
@@ -145,8 +147,26 @@
###############################################################################################
###############################################################################################
-
-if ($msg{'apci'} eq "A_GroupValue_Write"){
+ if ($msg{'apci'} eq "A_GroupValue_Read"){ #Hier werden die Lesetelegramme verarbeitet und beantwortet
+ if ($msg{'dst'} eq $ga_aktstufe){
+ $daten = "00CD00";
+ if($debug>=1){plugin_log($plugname,'Ventilationsstufe abrufen');}
+ $return_value2 = command_senden($daten);
+ }elsif($msg{'dst'} eq $ga_status_bypass_prozent){
+ $daten = "000D00";
+ if($debug>=1){plugin_log($plugname,'Bypass Zustand abrufen');}
+ $return_value2 = command_senden($daten);
+ }elsif($msg{'dst'} eq $ga_status_ventilator_zul or $msg{'dst'} eq $ga_status_ventilator_abl){
+ $daten = "000B00";
+ if($debug>=1){plugin_log($plugname,'Ventilator Status abrufen');}
+ $return_value2 = command_senden($daten);
+ }elsif($msg{'dst'} eq $ga_aul_temp or $msg{'dst'} eq $ga_zul_temp or $msg{'dst'} eq $ga_abl_temp or $msg{'dst'} eq $ga_fol_temp or $msg{'dst'} eq $ga_komfort_temp){
+ $daten = "00D100";
+ plugin_log($plugname,'Temperatur abrufen');
+ $return_value2 = command_senden($daten);
+ }
+
+}elsif ($msg{'apci'} eq "A_GroupValue_Write"){ #Hier werden neue Werte vom KNX an die ComfoAir gesendet
if ($msg{'dst'} eq $ga_stufeabwesend && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990101";
plugin_log($plugname,'Stufe abwesend setzen');
@@ -183,8 +203,8 @@
if($debug>=1){plugin_log($plugname,'Ventilationsstufe abrufen');}
$return_value2 = command_senden($daten);
}
- }elsif ($msg{'dst'} eq $ga_stufe_setzen) {
- my $stufenwert = knx_read($msg{'dst'},0,5.005);
+ }elsif ($msg{'dst'} eq $ga_stufe_setzen) {
+ my $stufenwert = knx_read($msg{'dst'},0,5.005);
$daten = "0099010" . $stufenwert;
plugin_log($plugname,'Stufe direkt setzen auf: ' . $stufenwert);
$return_value2 = command_senden($daten);
@@ -195,6 +215,7 @@
}
}elsif ($msg{'dst'} eq $ga_komforttemp) {
my $komforttemp = knx_read($msg{'dst'},0,9.001);
+ if($ga_komfort_temp ne ''){knx_write($ga_komfort_temp,$komforttemp,9.001);}
plugin_log($plugname,'Komforttemp auf: ' . $komforttemp . '\xB0C setzen');
my $temphex = ($komforttemp + 20)*2; #Rechne die Temperatur fuer die ComfoAir um
$temphex = sprintf "%x" , $temphex; # Mache aus Integer HEX
@@ -202,6 +223,7 @@
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_reset_filter && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00DB0400000001";
+ knx_write($ga_fehler_filter,0,1);
plugin_log($plugname,'Filter zuruecksetzen');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_reset_error && knx_read($msg{'dst'},0,1) == 1) {
@@ -221,12 +243,12 @@
my $drehzahl_abl = knx_read($msg{'dst'},0,5.001);
plugin_log($plugname,'Drehzahl Abluftluefter auf: ' . $drehzahl_abl . '% setzen');
$plugin_info{$plugname."_abluftdrehzahl_1"} = $drehzahl_abl;
-
+
my $temp_zuluftdrehzahl = sprintf "%x",$plugin_info{$plugname."_zuluftdrehzahl_1"};
my $hex_abluftdrehzahl = sprintf "%x" , $drehzahl_abl; # Mache aus Integer HEX
$daten = "00CF090F" . $hex_abluftdrehzahl.'0F0F'. $temp_zuluftdrehzahl.'0F0F0F0F';
$return_value2 = command_senden($daten);
- if($debug>=2){plugin_log($plugname,'Drehzahl Abluftl\xFCfter DATEN: ' . $daten . ' mit '. $drehzahl_abl. ' setzen! Antwort:'.$return_value2); }
+ if($debug>=2){plugin_log($plugname,'Drehzahl Abluftl\xFCfter DATEN: ' . $daten . ' mit '. $drehzahl_abl. ' setzen! Antwort:'.$return_value2); }
}
if($debug>=2){plugin_log($plugname,'ENDE Aufruf durch GA');}
return;
@@ -242,10 +264,22 @@
$plugin_subscribe{$ga_stufe1}{$plugname} = 1;
$plugin_subscribe{$ga_stufe2}{$plugname} = 1;
$plugin_subscribe{$ga_stufe3}{$plugname} = 1;
- $plugin_subscribe{$ga_stufe_setzen}{$plugname} = 1;
+ $plugin_subscribe{$ga_stufe_setzen}{$plugname} = 1;
$plugin_subscribe{$ga_komforttemp}{$plugname} = 1;
$plugin_subscribe{$ga_reset_filter}{$plugname} = 1;
$plugin_subscribe{$ga_reset_error}{$plugname} = 1;
+ $plugin_subscribe{$ga_drehzahl_ventilator_zul}{$plugname} = 1;
+ $plugin_subscribe{$ga_drehzahl_ventilator_abl}{$plugname} = 1;
+
+ $plugin_subscribe{$ga_aktstufe}{$plugname} = 1;
+ $plugin_subscribe{$ga_status_bypass_prozent}{$plugname} = 1;
+ $plugin_subscribe{$ga_status_ventilator_zul}{$plugname} = 1;
+ $plugin_subscribe{$ga_status_ventilator_abl}{$plugname} = 1;
+ $plugin_subscribe{$ga_aul_temp}{$plugname} = 1;
+ $plugin_subscribe{$ga_zul_temp}{$plugname} = 1;
+ $plugin_subscribe{$ga_abl_temp}{$plugname} = 1;
+ $plugin_subscribe{$ga_fol_temp}{$plugname} = 1;
+ $plugin_subscribe{$ga_komfort_temp}{$plugname} = 1;
####################################################################################################
@@ -290,10 +324,10 @@
}
if($ga_fehlercode){ #Nur wenn die GA vergeben ist, werden hier die Stoermeldungen abgefragt
- $daten = "00D900";
- if($debug>=1){plugin_log($plugname,'St\xF6rungen abrufen');}
- $return_value2 = command_senden($daten);
- }
+ $daten = "00D900";
+ if($debug>=1){plugin_log($plugname,'St\xF6rungen abrufen');}
+ $return_value2 = command_senden($daten);
+ }
if($debug>=2){plugin_log($plugname,'ENDE Zyklische Abfrage');}
return;
@@ -345,9 +379,9 @@
if($debug>=2){plugin_log($plugname,'reciv-direkt: ' . $sin);}
if($reciv =~ /070f/i){
- if (substr($reciv,(length($reciv)-6),6) ne '07070f'){
- last;
- }
+ if (substr($reciv,(length($reciv)-6),6) ne '07070f'){
+ last;
+ }
}
}#Ende While
@@ -395,7 +429,7 @@
#Test einer Methode falls aussversehen mehrere Datenpakete auf einmal im Datenstring enthalten sind...
if($reciv =~ /07f307f0/i){
my @dataarray=split(/07f307f0/,$reciv);
- $reciv = @dataarray[1];
+ $reciv = $dataarray[0];
}
@@ -410,7 +444,7 @@
#Hier wird die Subroutine f\xFCr die Berechnung der Checksumme aufgerufen und das Ergebnis in $rcv_checksum zur\xFCck gegeben
$rcv_checksum = checksum_berechnen($reciv);
-
+
#######################################################################
#######################################################################
## Ab hier werden die Rueckmeldungen von der ComfoAir ausgewertet... ##
@@ -420,14 +454,14 @@
if($rcv_checksum eq $checksum){ #Hier wird gepr\xFCft ob die Checksumme korrekt ist
if($debug>=2){plugin_log($plugname,'Checksumme OK ');}
-
- #Hier werden die doppelten 07 aus dem Antwortstring entfernt.
- if($debug>=2){plugin_log($plugname,'String vor 07 bereinigung: '.$reciv);}
- while ($reciv =~ s/0707/07/) {}
- if($debug>=2){plugin_log($plugname,'String nach 07 bereinigung: '.$reciv);}
-
+
+ #Hier werden die doppelten 07 aus dem Antwortstring entfernt.
+ if($debug>=2){plugin_log($plugname,'String vor 07 bereinigung: '.$reciv);}
+ while ($reciv =~ s/0707/07/) {}
+ if($debug>=2){plugin_log($plugname,'String nach 07 bereinigung: '.$reciv);}
+
if($reciv =~ /00D209/i){ #Wenn die Temperaturen empfangen wurden
- my $t1 = substr($reciv,6,2);
+ my $t1 = substr($reciv,6,2);
my $t2 = substr($reciv,8,2);
my $t3 = substr($reciv,10,2);
my $t4 = substr($reciv,12,2);
@@ -438,10 +472,10 @@
$t2 = (hex($t2)/2)-20;
$t3 = (hex($t3)/2)-20;
$t4 = (hex($t4)/2)-20;
- $t5 = (hex($t5)/2)-20;
+ $t5 = (hex($t5)/2)-20;
#Wenn die GA's vergeben wurde, die Temperaturen auf die GA's senden
- if($ga_komfort_temp ne ''){knx_write($ga_komfort_temp,$t1,9.001);}
+ if($ga_komfort_temp ne ''){knx_write($ga_komfort_temp,$t1,9.001);}
if($ga_aul_temp ne ''){knx_write($ga_aul_temp,$t2,9.001);}
if($ga_zul_temp ne ''){knx_write($ga_zul_temp,$t3,9.001);}
if($ga_abl_temp ne ''){knx_write($ga_abl_temp,$t4,9.001);}
@@ -462,7 +496,7 @@
knx_write($ga_status_ventilator_zul,hex($vent_zul),5.001);
knx_write($ga_status_ventilator_abl,hex($vent_abl),5.001);
- }elsif($reciv =~ /00CE0E/i){ #Wenn Status Ventilatorenstufe empfangen wurden
+ }elsif($reciv =~ /00CE0E/i){ #Wenn der Status der Ventilatorenstufe empfangen wurden
my $akt_stufe = substr($reciv,22,2);
if(hex($akt_stufe) == 1){
plugin_log($plugname,'AKT_STUFE: A');
@@ -476,9 +510,9 @@
plugin_log($plugname,'Bypass: ' . hex($bypass_prozent) . '%');
knx_write($ga_status_bypass_prozent,hex($bypass_prozent),5.001);
- }elsif($reciv =~ /00DE14/i){ #Wenn die Rueckmeldung der Betriebsstunden des Filters empfangen wurden
+ }elsif($reciv =~ /00DE14/i){ #Wenn die Rueckmeldung der Betriebsstunden des Filters empfangen wurden
my $betriebsstunden_filter = substr($reciv,36,4);
- if($debug>=3){plugin_log($plugname,'Betriebsstunden Filter Roh: '.$betriebsstunden_filter);}
+ if($debug>=3){plugin_log($plugname,'Betriebsstunden Filter Roh: '.$betriebsstunden_filter);}
plugin_log($plugname,'Betriebsstunden Filter: ' . hex($betriebsstunden_filter) . 'h');
knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter) . 'h',16.000);
@@ -552,7 +586,7 @@
sub checksum_berechnen {
my $chk_datasum = $_[0];
- $rcv_checksum =0;
+ $rcv_checksum = 0;
my $i;
$chk_datasum = $chk_datasum . "AD"; #+173 fuer die Checksummenberechnung
if($debug>=2){plugin_log($plugname,'String f\xFCr die Berechnung der Checksumme: '.$chk_datasum);}
Modified: wiregate/plugin/generic/conf.d/ConfoAir_kwl.conf
===================================================================
--- wiregate/plugin/generic/conf.d/ConfoAir_kwl.conf 2014-07-22 14:38:45 UTC (rev 2214)
+++ wiregate/plugin/generic/conf.d/ConfoAir_kwl.conf 2014-07-22 21:48:56 UTC (rev 2215)
@@ -7,12 +7,15 @@
$ga_stufe1 = ''; #1bit Trigger fuer Stufe1. 1=Aktivieren
$ga_stufe2 = ''; #1bit Trigger fuer Stufe2. 1=Aktivieren
$ga_stufe3 = ''; #1bit Trigger fuer Stufe3. 1=Aktivieren
+$ga_stufe_setzen = ''; # GA DPT 5.005 zum direkten setzen der Stufe (1=Abwesend, 2=Stufe1, 3=Stufe2, 4=Stufe3)
$ga_komforttemp = ''; #GA DPT 9.001 zum setzen der Komforttemperatur
+$ga_drehzahl_ventilator_zul = ''; #GA DPT 5.001 zum setzen der Zuluftdrehzahl
+$ga_drehzahl_ventilator_abl = ''; #GA DPT 5.001 zum setzen der Abluftdrehzahl
$ga_reset_filter = ''; #1bit Trigger fuer das Zuruecksetzen des Betriebsstundenzaehlers des Filters. 1=Reset
$ga_reset_error = ''; #1bit Trigger fuer das zuruecksetzen der KWL nach einem Fehler. 1=Reset
-#Hier werden die Gruppenadressen fuer die Rueckmeldungen vergeben: (Nicht vergeben = inaktiv)
+#Hier werden die Gruppenadressen fuer die Rueckmeldungen vergeben: (Nich vergeben = inaktiv)
$ga_status_ventilator_zul = ''; #GA DPT 5.001 fuer Status Ventilator Zuluft %
$ga_status_ventilator_abl = ''; #GA DPT 5.001 fuer Status Ventilator Abluft %
$ga_status_bypass_prozent = ''; #GA DPT 5.001 fuer Status Bypassklappe %
@@ -20,13 +23,14 @@
$ga_zustand_badschalter = ''; #GA DPT 1.001 fuer die Rueckmeldung des Zustandes des Badezimmerschalters
$ga_fehler_filter = ''; #GA DPT 1.001 fuer den Zustand des Filters. 0=OK, 1=Filter Voll
$ga_fehlercode = ''; #GA DPT 16.000 fuer die Ausgabe des Fehlercodes als Text
-$ga_aktstufe = ''; #GA DPT 5.005 Wert für aktuelle Stufe
+$ga_aktstufe = ''; #GA DPT 5.005 liefert den Wert für die aktuelle Stufe (1=A, 2=Stufe1, 3=Stufe2, 4=Stufe3)
-#Hier werden die Gruppenadressen für die Temperaturen vergeben: (Nicht vergeben=inaktiv)
+#Hier werden die Gruppenadressen für die Rückmeldung der Temperaturen vergeben: (Nicht vergeben=inaktiv)
$ga_aul_temp = ''; #GA DPT 9.001 für die Aussenlufttemperatur
$ga_zul_temp = ''; #GA DPT 9.001 für die Zulufttemperatur
$ga_abl_temp = ''; #GA DPT 9.001 für die Ablufttemperatur
$ga_fol_temp = ''; #GA DPT 9.001 für die Fortlufttemperatur
+$ga_komfort_temp = ''; #GA DPT 9.001 für die Komforttemperatur
#Zuordnung der Namen fuer die RRD's:
$Name_rrd_AUL = 'KWL_Aussenluft'; #Name RRD Aussenluft
@@ -35,14 +39,13 @@
$Name_rrd_FOL = 'KWL_Fortluft'; #Name RRD Fortluft
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
-$schnittstelle = '/dev/ttyUSB-1-1';
+$schnittstelle = '/dev/ttyUSB-2-4';
-### Neu in Version 1.6 ###
#Angaben für die Kommunikation über den UDP-Port einer MOXA [diese Einstellungen reichen aus, d.h. auf dem Wiregate muss unter "Seriell/LAN/Socketverbindungen" KEINE Socketverbindung erstellt werden
$socknum = ""; # Eindeutige Nummer des Sockets
$send_ip = ""; # SendeIP (UDP)
-$send_port = ""; # Sendeport (UDP)
+$send_port = ""; # Sendeport (UDP)
$recv_ip = ""; # EmpfangsIP (UDP)
$recv_port = ""; # Empfangsport (UDP)
@@ -52,12 +55,11 @@
# Dauer einer Abfrage
-$Zaehler = "2500"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 2'500; für Moxa: 250
+$Zaehler = "2500"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 2500; für Moxa: 250
# Debug level 0 = nur die wichtigsten Infos, 1 = Alle Zustaende, 2 = Rohdaten (nur für Fehlersuche)
-$debug=1;
+$debug=0;
-
######################
##ENDE Einstellungen##
######################
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <kru...@us...> - 2014-09-13 11:49:23
|
Revision: 2229
http://sourceforge.net/p/openautomation/code/2229
Author: krumboeck
Date: 2014-09-13 11:49:10 +0000 (Sat, 13 Sep 2014)
Log Message:
-----------
Add experimental plugin and configuration for heat pump Stiebel Eltron LWZ 304/404
Added Paths:
-----------
wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl
wiregate/plugin/generic/conf.d/StiebelEltron-LWZ-x04.conf
Added: wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl
===================================================================
--- wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl (rev 0)
+++ wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl 2014-09-13 11:49:10 UTC (rev 2229)
@@ -0,0 +1,863 @@
+######################################################################################
+# Plugin StiebelEltron-LWZ-x04
+# V0.1 2014-09-13
+# Lizenz: GPLv2
+# Autor: krumboeck (http://knx-user-forum.de/members/krumboeck.html)
+#
+# Benötigt:
+# * CAN Bus Adapter
+# * Kernel Update für CAN Bus
+# * iproute2 für CAN Bus Konfiguration
+#
+# ACHTUNG: Es handelt sich hier um ein experimentelles Plugin!!
+# Es wird keine Haftung für Beschädigungen aller Art übernommen!
+#
+# Die verwendeten Variablen basieren auf Reverse Engineering und
+# sind weder geprüft noch ausreichend getestet.
+#
+# TIPP: Bevor sie eine Variable beschreiben, lesen sie diese bitte
+# ein und überprüfen sie die Korrektheit des Wertes.
+#
+######################################################################################
+
+
+use warnings;
+use strict;
+use Socket qw(SOCK_RAW);
+use Convert::Binary::C;
+
+######################
+# Startevent ermitteln
+######################
+my $event=undef;
+if (!$plugin_initflag) {
+ $event = 'restart';
+} elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {
+ $event = 'modified'; # Plugin modifiziert
+} elsif (%msg) {
+ $event = 'knx'; # KNX/EIB Bustraffic
+} elsif ($fh) {
+ $event = 'socket'; # Netzwerktraffic
+} else {
+ $event = 'cycle'; # Zyklus
+}
+
+#########################
+### BEGINN DEFINITION ###
+#########################
+
+my $socknum = 500; # Eindeutige Nummer des Sockets
+
+use constant {
+ PF_CAN => 29,
+ AF_CAN => 29,
+ CAN_RAW => 1,
+ SOL_CAN_BASE => 100,
+ SOL_CAN_RAW => 101,
+ CAN_RAW_FILTER => 1,
+ CAN_RAW_ERR_FILTER => 2,
+ CAN_RAW_LOOPBACK => 3,
+ CAN_RAW_RECV_OWN_MSGS => 4,
+ # special address description flags for the CAN_ID
+ CAN_EFF_FLAG => 0x80000000, # EFF/SFF is set in the MSB
+ CAN_RTR_FLAG => 0x40000000, # remote transmission request
+ CAN_ERR_FLAG => 0x20000000, # error frame
+ # valid bits in CAN ID for frame formats
+ CAN_SFF_MASK => 0x000007FF, # standard frame format (SFF)
+ CAN_EFF_MASK => 0x1FFFFFFF, # extended frame format (EFF)
+ CAN_ERR_MASK => 0x1FFFFFFF, # omit EFF, RTR, ERR flags
+ # bits/ioctls.h
+ SIOCGIFINDEX => 0x8933,
+ # LWZ protocol
+ TARGET_SYSTEM => 0x03,
+ TARGET_HEIZKREIS => 0x06,
+ TARGET_SENSOR => 0x08,
+ TARGET_DISPLAY => 0x0D,
+ SOURCE_SYSTEM => 0x01,
+ SOURCE_HEIZKREIS => 0x03,
+ SOURCE_SENSOR => 0x04,
+ SOURCE_DISPLAY => 0x06,
+ HEIZKREIS_1 => 0x01,
+ HEIZKREIS_2 => 0x02,
+ TYPE_WRITE => 0x00,
+ TYPE_REQUEST => 0x01,
+ TYPE_RESPONSE => 0x02,
+ TYPE_REGISTER => 0x06,
+};
+
+my $cstruct = "
+typedef unsigned long canid_t;
+
+#define ifr_name ifr_ifrn.ifrn_name /* interface name */
+#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
+struct ifreq {
+ union {
+ char ifrn_name[16];
+ } ifr_ifrn;
+ union {
+ int ifru_ivalue;
+ } ifr_ifru;
+};
+
+struct can_frame {
+ canid_t can_id;
+ unsigned char can_dlc;
+ unsigned char align[3];
+ unsigned char data[8];
+};
+
+struct sockaddr_can {
+ int can_family;
+ int can_ifindex;
+ union {
+ struct { canid_t rx_id, tx_id; } tp;
+ } can_addr;
+};
+
+struct can_filter {
+ canid_t can_id;
+ canid_t can_mask;
+};
+
+";
+
+my @definitions;
+push @definitions, { name => 'Warmwasser_Solltemperatur', valueId => 00, valueSubId => 0x03,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizkreis_Solltemperatur', valueId => 0x00, valueSubId => 0x04,
+ writeTarget => undef, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizen_Raumtemperatur_Tag', valueId => 0x00, valueSubId => 0x05,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizen_Raumtemperatur_Nacht', valueId => 0x00, valueSubId => 0x08,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Außentemperatur', valueId => 0x00, valueSubId => 0x0C,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Vorlauftemperatur', valueId => 0x00, valueSubId => 0x0D,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Warmwasser_Temperatur', valueId => 0x00, valueSubId => 0x0E,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizkreis_Temperatur', valueId => 0x00, valueSubId => 0x0F,
+ writeTarget => undef, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Raumtemperatur', valueId => 0x00, valueSubId => 0x11,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Raum-Solltemperatur', valueId => 0x00, valueSubId => 0x12,
+ writeTarget => undef, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Warmwasser_Solltemperatur_Tag', valueId => 0x00, valueSubId => 0x13,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Verdampfertemperatur', valueId => 0x00, valueSubId => 0x14,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Rücklauftemperatur', valueId => 0x00, valueSubId => 0x16,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Kollektortemperatur', valueId => 0x00, valueSubId => 0x1A,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Maximale_Vorlauftemperatur_Heizkreis', valueId => 0x00, valueSubId => 0x27,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizkurfe_Maximaler_Sollwert', valueId => 0x00, valueSubId => 0x28,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Abtauen_Verdamper', valueId => 0x00, valueSubId => 0x60,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'Luftfeuchtigkeit', valueId => 0x00, valueSubId => 0x75,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthPercent', knxTyp => '9.007' };
+push @definitions, { name => 'Luftfeuchtigkeit_Hysterese', valueId => 0x00, valueSubId => 0x8E,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'percent', knxTyp => '8.010' };
+push @definitions, { name => 'Dämpfung_Außentemperatur', valueId => 0x01, valueSubId => 0x0C,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'hour_byte', knxTyp => '7' };
+push @definitions, { name => 'Heizkurve_Steigung', valueId => 0x01, valueSubId => 0x0E,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'percent', knxTyp => '8.010' };
+push @definitions, { name => 'Raumeinfluss', valueId => 0x01, valueSubId => 0x0F,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Warmwasser_unbekannt', valueId => 0x01, valueSubId => 0x12,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Sommerbetrieb_Heizgrundeinstellung', valueId => 0x01, valueSubId => 0x16,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Ferienbeginn_Tag', valueId => 0x01, valueSubId => 0x1B,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'day_byte', knxTyp => '7' };
+push @definitions, { name => 'Ferienbeginn_Monat', valueId => 0x01, valueSubId => 0x1C,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'month_byte', knxTyp => '7' };
+push @definitions, { name => 'Ferienbeginn_Jahr', valueId => 0x01, valueSubId => 0x1D,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'year_byte', knxTyp => '7' };
+push @definitions, { name => 'Ferienende_Tag', valueId => 0x01, valueSubId => 0x1E,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'day_byte', knxTyp => '7' };
+push @definitions, { name => 'Ferienende_Monat', valueId => 0x01, valueSubId => 0x1F,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'month_byte', knxTyp => '7' };
+push @definitions, { name => 'Ferienende_Jahr', valueId => 0x01, valueSubId => 0x20,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'year_byte', knxTyp => '7' };
+push @definitions, { name => 'Wochentag', valueId => 0x01, valueSubId => 0x21,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'weekday_byte', knxTyp => '7' };
+push @definitions, { name => 'Datum_Tag', valueId => 0x01, valueSubId => 0x22,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'day_byte', knxTyp => '7' };
+push @definitions, { name => 'Datum_Monat', valueId => 0x01, valueSubId => 0x23,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'month_byte', knxTyp => '7' };
+push @definitions, { name => 'Datum_Jahr', valueId => 0x01, valueSubId => 0x24,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'year_byte', knxTyp => '7' };
+push @definitions, { name => 'Zeit_Stunde', valueId => 0x01, valueSubId => 0x25,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'hour_byte', knxTyp => '7' };
+push @definitions, { name => 'Zeit_Minute', valueId => 0x01, valueSubId => 0x26,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'minute_byte', knxTyp => '7' };
+push @definitions, { name => 'Heizen_Soll_Handbetrieb', valueId => 0x01, valueSubId => 0x29,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizkurfe_Sollwert_Min', valueId => 0x01, valueSubId => 0x2B,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizen_Raumtemperatur_Bereitschaft', valueId => 0x01, valueSubId => 0x3D,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Warmwasser_Hysterese', valueId => 0x01, valueSubId => 0x40,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthKelvin', knxTyp => '9.002' };
+push @definitions, { name => 'Integralanteil_Heizgrundeinstellung', valueId => 0x01, valueSubId => 0x62,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 60, format => 'kelvinPerMinute', knxTyp => '9.003' };
+push @definitions, { name => 'Display_Symbole', valueId => 0x01, valueSubId => 0x76,
+ writeTarget => 0x0D, requestTarget => undef, responseTarget => undef,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Maximaldauer_Warmwasser_Erzeugung', valueId => 0x01, valueSubId => 0x80,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'hour', knxTyp => '7.007' };
+push @definitions, { name => 'Volumenstrom', valueId => 0x01, valueSubId => 0xDA,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 600, format => 'tenthLiterPerMinute', knxTyp => '9.025' };
+push @definitions, { name => 'Tautemperatur', valueId => 0x02, valueSubId => 0x64,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heissgastemperatur', valueId => 0x02, valueSubId => 0x65,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Solar_Kollektorschutz', valueId => 0x02, valueSubId => 0xF5,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'Solar_Kollektorgrenztemperatur', valueId => 0x02, valueSubId => 0xF6,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Wärmemenge_Wärmerückgewinnung_Tag_Wh', valueId => 0x03, valueSubId => 0xAE,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'wattHour', knxTyp => '13.010' };
+push @definitions, { name => 'Wärmemenge_Wärmerückgewinnung_Tag_KWh', valueId => 0x03, valueSubId => 0xAF,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'kiloWattHour', knxTyp => '13.013' };
+push @definitions, { name => 'Wärmemenge_Wärmerückgewinnung_Summe_KWh', valueId => 0x03, valueSubId => 0xB0,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'kiloWattHour', knxTyp => '13.013' };
+push @definitions, { name => 'Wärmemenge_Wärmerückgewinnung_Summe_MWh', valueId => 0x03, valueSubId => 0xB1,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'megaWattHour', knxTyp => '13.013' };
+push @definitions, { name => 'Lüftung_Filter_Reset', valueId => 0x03, valueSubId => 0x3B,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'Lüftung_Filter_Laufzeit', valueId => 0x03, valueSubId => 0x41,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'day', knxTyp => '7' };
+push @definitions, { name => 'Solar_Kollektorschutztemperatur', valueId => 0x02, valueSubId => 0xB8,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Solar_Kollektorsperrtemperatur', valueId => 0x02, valueSubId => 0xBB,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Kühlen_Raumtemperatur_Tag', valueId => 0x05, valueSubId => 0x69,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Kühlen_Raumtemperatur_Bereitschaft', valueId => 0x05, valueSubId => 0x6A,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Kühlen_Raumtemperatur_Nacht', valueId => 0x05, valueSubId => 0x6B,
+ writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Lüftung_Stufe_Tag', valueId => 0x05, valueSubId => 0x6C,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Lüftung_Stufe_Nacht', valueId => 0x05, valueSubId => 0x6D,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Lüftung_Stufe_Bereitschaft', valueId => 0x05, valueSubId => 0x6F,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Lüftung_Stufe_Party', valueId => 0x05, valueSubId => 0x70,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Lüftung_Außerordentlich_Stufe_0', valueId => 0x05, valueSubId => 0x71,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'Lüftung_Außerordentlich_Stufe_1', valueId => 0x05, valueSubId => 0x72,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'Lüftung_Außerordentlich_Stufe_2', valueId => 0x05, valueSubId => 0x73,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'Lüftung_Außerordentlich_Stufe_3', valueId => 0x05, valueSubId => 0x74,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'Passivkühlung', valueId => 0x05, valueSubId => 0x75,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Lüfterstufe_Zuluft_1', valueId => 0x05, valueSubId => 0x76,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Lüfterstufe_Zuluft_2', valueId => 0x05, valueSubId => 0x77,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Lüfterstufe_Zuluft_3', valueId => 0x05, valueSubId => 0x78,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Lüfterstufe_Abluft_1', valueId => 0x05, valueSubId => 0x79,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Lüfterstufe_Abluft_2', valueId => 0x05, valueSubId => 0x7A,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Lüfterstufe_Abluft_3', valueId => 0x05, valueSubId => 0x7B,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Ofen_Kamin', valueId => 0x05, valueSubId => 0x7C,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'LL_Wärmetauscher_Max_Abtaudauer', valueId => 0x05, valueSubId => 0x7D,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'LL_Wärmetauscher_Abtaubeginnschwelle', valueId => 0x05, valueSubId => 0x7E,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'percent', knxTyp => '8.010' };
+push @definitions, { name => 'LL_Wärmetauscher_Drehzahl_Filter', valueId => 0x05, valueSubId => 0x7F,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'percent', knxTyp => '8.010' };
+push @definitions, { name => 'Warmwasser_Solltemperatur_Handbetrieb', valueId => 0x05, valueSubId => 0x80,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Warmwasser_Solltemperatur_Bereitschaft', valueId => 0x05, valueSubId => 0x81,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Kühlen_Temperatur_Heizkreis', valueId => 0x05, valueSubId => 0x82,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Kühlen_Vorlauftemperatur_Hysterese_Unbekannt', valueId => 0x05, valueSubId => 0x83,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthKelvin', knxTyp => '9.002' };
+push @definitions, { name => 'Kühlen_Raumtemperatur_Hysterese', valueId => 0x05, valueSubId => 0x84,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthKelvin', knxTyp => '9.002' };
+push @definitions, { name => 'Antilegionellen', valueId => 0x05, valueSubId => 0x85,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'day', knxTyp => '7' };
+push @definitions, { name => 'Warmwasser_Temperatur_Legionellen', valueId => 0x05, valueSubId => 0x86,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Zeitsperre_Nacherwärmung', valueId => 0x05, valueSubId => 0x88,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'Temperaturfreigabe_Nacherwärmung', valueId => 0x05, valueSubId => 0x89,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Nacherwärmung_Stufe_Warmwasser', valueId => 0x05, valueSubId => 0x8A,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Warmwasser_Pufferbetrieb', valueId => 0x05, valueSubId => 0x8B,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'Warmwasser_Max_Vorlauftemperatur', valueId => 0x05, valueSubId => 0x8C,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Warmwasser_ECO_Modus', valueId => 0x05, valueSubId => 0x8D,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'Solar_Hysterese', valueId => 0x05, valueSubId => 0x8F,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthKelvin', knxTyp => '9.002' };
+push @definitions, { name => 'Zuluft_Soll', valueId => 0x05, valueSubId => 0x96,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Zuluft_Ist', valueId => 0x05, valueSubId => 0x97,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'herz', knxTyp => '14.033' };
+push @definitions, { name => 'Abluft_Soll', valueId => 0x05, valueSubId => 0x98,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 0.001, format => 'cubicmeterPerHour', knxTyp => '9.025' };
+push @definitions, { name => 'Abluft_Ist', valueId => 0x05, valueSubId => 0x99,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'herz', knxTyp => '14.033' };
+push @definitions, { name => 'Fortluft_Soll', valueId => 0x05, valueSubId => 0x9A,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'percent', knxTyp => '8.010' };
+push @definitions, { name => 'Fortluft_Ist', valueId => 0x05, valueSubId => 0x9B,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'herz', knxTyp => '14.033' };
+push @definitions, { name => 'Verflüssiger_Temperatur', valueId => 0x05, valueSubId => 0x9C,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizkurve_Anteil_Vorlauf', valueId => 0x05, valueSubId => 0x9D,
+ writeTarget => 0x06, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizkurve_Fußpunkt', valueId => 0x05, valueSubId => 0x9E,
+ writeTarget => 0x06, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizgrundeinstellung_Nacherwärmung_Maximale_Stufe', valueId => 0x05, valueSubId => 0x9F,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'Heizgrundeinstellung_Zeitsperre_Nacherwärmung', valueId => 0x05, valueSubId => 0xA0,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'minute', knxTyp => '7.006' };
+push @definitions, { name => 'Heizgrundeinstellung_Heizleistung_Nacherwärmung_1', valueId => 0x05, valueSubId => 0xA1,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 100, format => 'hundrethKiloWatt', knxTyp => '9.024' };
+push @definitions, { name => 'Heizgrundeinstellung_Hysterese_Sommerbetrieb', valueId => 0x05, valueSubId => 0xA2,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthKelvin', knxTyp => '9.002' };
+push @definitions, { name => 'Heizgrundeinstellung_Korrektur_Außentemperatur', valueId => 0x05, valueSubId => 0xA3,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Heizstufe', valueId => 0x05, valueSubId => 0xBB,
+ writeTarget => undef, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 1, format => 'none', knxTyp => '7' };
+push @definitions, { name => 'LL_Wärmetauscher_Abtauen', valueId => 0x05, valueSubId => 0xBC,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => undef, format => 'boolean', knxTyp => '1.002' };
+push @definitions, { name => 'Warmwasser_Solltemperatur_Nacht', valueId => 0x05, valueSubId => 0xBF,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+push @definitions, { name => 'Hysterese_1', valueId => 0x05, valueSubId => 0xC0,
+ writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
+ decimalFactor => 10, format => 'tenthKelvin', knxTyp => '9.0...
[truncated message content] |
|
From: <kru...@us...> - 2014-09-16 19:21:50
|
Revision: 2237
http://sourceforge.net/p/openautomation/code/2237
Author: krumboeck
Date: 2014-09-16 19:21:47 +0000 (Tue, 16 Sep 2014)
Log Message:
-----------
RollladenAutomatik: Upgrade to version 1.1
Modified Paths:
--------------
wiregate/plugin/generic/RollladenAutomatik.pl
wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
Modified: wiregate/plugin/generic/RollladenAutomatik.pl
===================================================================
--- wiregate/plugin/generic/RollladenAutomatik.pl 2014-09-15 22:46:15 UTC (rev 2236)
+++ wiregate/plugin/generic/RollladenAutomatik.pl 2014-09-16 19:21:47 UTC (rev 2237)
@@ -1,6 +1,6 @@
######################################################################################
# Plugin RollladenAutomatik
-# V1.0 2014-05-29
+# V1.1 2014-09-16
# Lizenz: GPLv2
# Autoren: kleinklausi (http://knx-user-forum.de/members/kleinklausi.html)
# krumboeck (http://knx-user-forum.de/members/krumboeck.html)
@@ -27,6 +27,8 @@
# - Fahren auf Positionen welche im Aktor (z.B. Siemens 523/03) gespeichert sind (krumboeck)
# - Überprüfen von Positionen vor Sonnenauf bzw. -untergang (krumboeck)
# - Nach Aufhebung der Sperre auf Position fahren (krumboeck)
+# - Hinzufügen von Bedingungen (krumboeck)
+# - Erweiterte Einstellungen für Sonnenauf- und untergang (krumboeck)
#
# TODO: Was teilweise integriert ist aber noch nicht komplett ist:
# - Bei Fensterdefinition auch Elevation oben bzw. unten angeben
@@ -43,6 +45,14 @@
use constant EQUAL => 0;
use constant LOWER => -1;
+use constant MONTAG => 1;
+use constant DIENSTAG => 2;
+use constant MITTWOCH => 3;
+use constant DONNERSTAG => 4;
+use constant FREITAG => 5;
+use constant SAMSTAG => 6;
+use constant SONNTAG => 7;
+
# Die Koordinaten des Hauses. Sehr einfach über http://www.getlatlon.com/ zu ermitteln.
# Und die Höhe über NN
my ($lat, $lon, $elev);
@@ -155,6 +165,13 @@
my $rolladen = berechneRolladenParameter($element, 0);
+ if (defined $rolladen->{bedingung} && !callBedingung($rolladen)) {
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname, "Name: " . $rolladen->{name} . "; Bedingung nicht erfüllt");
+ }
+ next;
+ }
+
if (defined $rolladen->{GAsperre}) {
$plugin_subscribe{$rolladen->{GAsperre}}{$plugname} = 1;
# Falls gesperrt, mit nächstem Rollladen fortfahren
@@ -196,6 +213,37 @@
############################################
+# Bedingung ausführen
+############################################
+sub callBedingung {
+ my ($rolladen) = @_;
+ my ($sekunde, $minute, $stunde, $tag, $monat, $jahr, $wochentag, $tagImJahr, $isdst) = localtime(time);
+ $monat += 1;
+ $tagImJahr += 1;
+ if ($wochentag == 0) {
+ $wochentag = 7;
+ }
+ $jahr += 1900;
+ my $result = eval $rolladen->{bedingung};
+ if ($@) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Fehler in Bedingung: " . $@);
+ return 0;
+ }
+ return $result;
+}
+
+sub toDayOfYear {
+ my ($day, $month, $year)=@_;
+ my @cumul_d_in_m = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365);
+ my $doy=$cumul_d_in_m[--$month]+$day;
+ return $doy if $month < 2;
+ return $doy unless $year % 4 == 0;
+ return ++$doy unless $year % 100 == 0;
+ return $doy unless $year % 400 == 0;
+ return ++$doy;
+}
+
+############################################
# Prüft ob der Rolladen gefahren werden muss
############################################
sub positionChanged {
@@ -350,12 +398,12 @@
}
}
- if ($element->{sonnenAufUnter}) {
- if ($testNacht) {
+ if ($element->{sonnenAufUnter} > 0) {
+ if ($testNacht && ($element->{sonnenAufUnter} == 1 || $element->{sonnenAufUnter} == 3)) {
$position = $element->{wertZuNacht};
$bemerkung = "Wegen Abenddaemmerung zufahren bei: " . round(rad2deg($azimuth));
return ($position, $bemerkung);
- } elsif ($testMorgenDaemmerung) {
+ } elsif ($testMorgenDaemmerung && ($element->{sonnenAufUnter} == 1 || $element->{sonnenAufUnter} == 2)) {
$position = $element->{wertAufNacht};
$bemerkung = "Wegen Morgendaemmerung auffahren bei: " . round(rad2deg($azimuth));
}
Modified: wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-09-15 22:46:15 UTC (rev 2236)
+++ wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-09-16 19:21:47 UTC (rev 2237)
@@ -62,7 +62,9 @@
# Bei ungleich 0, wird DPT5 angenommen und Position angefahren
# wertAufSchutz => 0
# Ob der Rollladen in die Automatik für Sonnenauf- und untergang einbezogen werden soll
-# sonnenAufUnter => 1
+# sonnenAufUnter => 1 # bei Sonnenaufgang und Sonnenuntergang
+# sonnenAufUnter => 2 # nur Sonnenaufgang
+# sonnenAufUnter => 3 # nur Sonnenuntergang
# Raum-Solltemperatur, wenn keine GA angegeben wurde oder kein Wert vom Bus gelesen wurde
# raumSollTemp => 22
# GA der Raum-Solltemperatur
@@ -99,6 +101,11 @@
# debug => 1
# Prüft die Position nach Aufhebung einer Sperre (boolean)
# pruefePositionNachSperre => 1
+# Regel wird nur ausgeführt wenn die Bedingung erfüllt ist (boolean)
+# Beispiel für Heizzeitraum
+# bedingung => '($tagImJahr < toDayOfYear(15, 5, $jahr) || $tagImJahr >= toDayOfYear(15, 9, $jahr)) ? 1 : 0'
+# Beispiel für Wochenende
+# bedingung => '($wochentag == SAMSTAG || $wochentag == SONNTAG) ? 1 : 0'
# Format für im Aktor gespeicherte Positionen:
# "44;Position:0" bezeichnet die im Aktor gespeicherte Position 0. Der Wert 44 dient lediglich zur Kontrolle.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2014-12-17 12:03:19
|
Revision: 2288
http://sourceforge.net/p/openautomation/code/2288
Author: pfry
Date: 2014-12-17 12:03:04 +0000 (Wed, 17 Dec 2014)
Log Message:
-----------
Zahlreiche Erweiterungen, siehe KNX-Forum
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
Added Paths:
-----------
wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample
Removed Paths:
-------------
wiregate/plugin/generic/conf.d/Logikprozessor.conf
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2014-12-14 16:52:45 UTC (rev 2287)
+++ wiregate/plugin/generic/Logikprozessor.pl 2014-12-17 12:03:04 UTC (rev 2288)
@@ -4,27 +4,24 @@
##################
# Wiregate-Plugin
# (c) 2012 Fry under the GNU Public License
+#
+# sendSMS Code based on sipgate-provided Perl script written by Sam Buca
+#
+# COMPILE_PLUGIN
-# $plugin_info{$plugname.'_cycle'}=0; return 'deaktiviert';
+#$plugin_info{$plugname.'_cycle'}=0; return 'deaktiviert';
-use POSIX qw(floor strftime);
+use POSIX qw(floor strftime sqrt);
+use Math::Trig qw(asin acos atan tan);
# Tools und vorbesetzte Variablen fuer die Logiken
sub limit { my ($lo,$x,$hi)=@_; return $x<$lo?$lo:($x>$hi?$hi:$x); }
+sub scene { my ($n,$op)=@_; $n--; return $n | ((defined $op && $op eq 'store') ? 0x80 : 0); }
+
my $date=strftime("%W,%a,%u,%m,%d,%Y,%j,%H,%M,%T",localtime);
plugin_log($plugname, "Datum/Uhrzeit nicht lesbar: '$date'.") unless ($date=~/^(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)$/);
-#my $date=`/bin/date +"%W,%a,%u,%m,%d,%Y,%j,%H,%M,%T"`;
-#unless($date=~/^(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)$/)
-#{
-# plugin_log($plugname, "Datum/Uhrzeit nicht lesbar: '$date', versuche strftime.");
-# $date=strftime("%W,%a,%u,%m,%d,%Y,%j,%H,%M,%T",time(),0,1,0,0,70,7,0);
-# unless($date=~/^(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)$/)
-# {
-# plugin_log($plugname, "Datum/Uhrzeit auch bei strftime nicht lesbar: '$date', steige aus.");
-# return;
-# }
-#}
-my $calendar_week=$1;
+
+my $calendar_week=$1+1;
my $day_of_week=$2;
my $day_of_week_no=$3;
my $month=int($4);
@@ -34,17 +31,20 @@
my $hour=int($8);
my $minute=int($9);
my $time_of_day=$10; # '08:30:43'
-my $weekend=($day_of_week_no>=6);
-my $weekday=!$weekend;
+my $weekend=($day_of_week_no>=6)?1:0;
+my $weekday=1-$weekend;
my $holiday=is_holiday($year,$day_of_year);
-my $workingday=(!$weekend && !$holiday);
-my $day=($hour>=7 && $hour<23);
-my $night=!$day;
+my $workingday=($weekend==0 && $holiday==0)?1:0;
+my $day=($hour>=7 && $hour<22)?1:0;
+my $night=1-$day;
my $systemtime=time();
-my $date=sprintf("%02d/%02d",$month,$day_of_month);
+$date=sprintf("%02d/%02d",$month,$day_of_month);
+my $eibd_backend_address=undef;
sub groupaddress;
-sub my_knx_write;
+sub sendSMS;
+sub sendProwl;
+sub verify;
# Konfigfile seit dem letzten Mal geaendert?
my $conf="/etc/wiregate/plugin/generic/conf.d/$plugname";
@@ -67,44 +67,60 @@
elsif ($fh) { $event='socket'; } # Netzwerktraffic
else { $event='cycle'; } # Zyklus
-# Konfigurationsfile einlesen
-my $eibd_backend_address='1.1.254';
-my %logic=();
-my %settings=();
-open FILE, "<$conf" || return "no config found";
-$/=undef;
-my $lines = <FILE>;
-$lines =~ s/((?:translate|\'translate\'|\"translate\")\s*=>\s*sub\s*\{)/$1 my \(\$state,\$input\)=\@\_;/sg;
-$lines =~ s/((?:prowl|\'prowl\'|\"prowl\")\s*=>\s*sub\s*\{)/$1 my \(\%context\)=\@\_;my \(\$input,\$state,\$result\)=\(\$context{input},\$context{state},\$context{result}\);/sg;
-close FILE;
-eval($lines);
-return "config error: $@" if $@;
-
-# Plugin-Code
+# Rueckgabewert des Plugins
my $retval='';
# Im Falle eines Timeouts soll der Logikprozessor in 10s neu gestartet werden
$plugin_info{$plugname."_cycle"}=10;
-# Unterscheidung Aufrufgrund
-if($event=~/restart|modified/ || $config_modified)
+if($event=~/restart|modified/ || $config_modified || !defined $plugin_cache{$plugname}{logic})
{
- # alle Variablen loeschen
+ # eibpa.conf - falls existent - einlesen
+ my %eibpa=();
+
+ if(open EIBPA, "</etc/wiregate/eibpa.conf")
+ {
+ $/="\n";
+ while(<EIBPA>)
+ {
+ next unless /^(.*)\s+([0-9]+\.[0-9]+\.[0-9]+)\s*$/;
+
+ $eibpa{$2}=$1;
+ $eibpa{$1}=$2;
+ }
+ close EIBPA;
+ }
+ $plugin_cache{$plugname}{eibpa}=\%eibpa;
+
+ my %logic=();
+ my %settings=();
+
+ # Konfigurationsfile einlesen
+ open CONFIG, "<$conf" || return "cannot open config";
+ $/=undef;
+ my $lines = <CONFIG>;
+ $lines =~ s/((?:translate|\'translate\'|\"translate\")\s*=>\s*sub\s*\{)/$1 my \(\$logname,\$state,\$ga,\$input,\$year,\$day_of_year,\$month,\$day_of_month,\$calendar_week,\$day_of_week,\$day_of_week_no,\$hour,\$minute,\$time_of_day,\$systemtime,\$weekend,\$weekday,\$holiday,\$workingday,\$day,\$night,\$date\)=\@\_;/sg;
+ $lines =~ s/((?:prowl|\'prowl\'|\"prowl\")\s*=>\s*sub\s*\{)/$1 my \(\%context\)=\@\_;my \(\$input,\$state,\$result\)=\(\$context{input},\$context{state},\$context{result}\);/sg;
+ close CONFIG;
+ eval $lines;
+ return "config error: $@" if $@;
+
+ $logic{'_eibd_backend_address'}=$eibd_backend_address if !defined $logic{'_eibd_backend_address'} && defined $eibd_backend_address;
+
+ # bestimmte Variablen loeschen
for my $k (grep /^$plugname\_/, keys %plugin_info)
{
- next if $k=~/^$plugname\_last/;
+ next if $k=~m/^$plugname\_last/;
+ next unless $k=~m/$plugname\__(.*)_(timer|delay|cool|followup)/ && !defined $logic{$1};
delete $plugin_info{$k};
}
- $plugin_info{$plugname.'_configtime'}=$configtime;
-
+ # Konfiguration pruefen #######################################################
my $count=0;
my $err=0;
- for my $t (keys %logic)
+ for my $t (grep !/^(debug$|_)/, keys %logic)
{
- next if $t eq 'debug' || $t=~/^_/;
-
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
@@ -127,6 +143,12 @@
next;
}
+ if(defined $logic{$t}{trigger} && ref $logic{$t}{trigger} && ref $logic{$t}{trigger} ne 'ARRAY')
+ {
+ plugin_log($plugname, "Config err: \$logic{$t}{trigger} ist weder Skalar noch ARRAY-Referenz ([ga1,ga2>=2,ga3==ANY,...]).");
+ next;
+ }
+
if(defined $logic{$t}{state} && ref $logic{$t}{state} && ref $logic{$t}{state} ne 'HASH')
{
plugin_log($plugname, "Config err: \$logic{$t}{state} ist weder Skalar noch HASH-Referenz ({...}).");
@@ -141,14 +163,99 @@
next;
}
- if(defined $logic{$t}{timer} && defined $logic{$t}{delay})
+ my @keywords=qw(receive fetch trigger transmit translate debug delay timer prowl eibd_cache reply_to_read_requests
+ ignore_read_requests transmit_only_on_request recalc_on_request state transmit_changes_only
+ execute_on_input_changes_only cool rrd transmit_on_startup followup prowl execute_only_if_input_defined);
+ my $keywords="(".join("|",@keywords).")";
+
+ for my $k (keys %{$logic{$t}})
{
- plugin_log($plugname, "Config err: \$logic{$t}: delay und timer festgelegt, ignoriere delay");
+ next if $k=~/^$keywords$/;
+ plugin_log($plugname, "Config warn: \$logic{$t}, Eintrag '$k' wird ignoriert. Typo?");
}
+ }
+ # Korrektur der Flags reply_to_read_requests, damit nicht mehrere Logiken antworten...
+ my %responding=();
+
+ for my $t (grep !/^(debug$|_)/, keys %logic)
+ {
my $transmit=$logic{$t}{transmit};
+ next if !defined $transmit;
+ # Default ist nun, dass NICHT geantwortet wird
+ my $reply=$logic{$t}{reply_to_read_requests};
+ $reply = 1 if $logic{$t}{recalc_on_request} || $logic{$t}{transmit_only_on_request}; # macht ja nur so Sinn
+
+ # Flag ignore_read_requests ist veraltet, wird aber noch unterstuetzt
+ $reply=!$logic{$t}{ignore_read_requests} if !defined $reply && defined $logic{$t}{ignore_read_requests};
+
+ if($logic{$t}{ignore_read_requests})
+ {
+ plugin_log($plugname, "Config warn: \$logic{$t} - Option ignore_read_requests ist veraltet (und nun per Default gesetzt).");
+ }
+ if($reply && $logic{$t}{ignore_read_requests})
+ {
+ plugin_log($plugname, "Config err: \$logic{$t} hat sowohl reply_to_read_requests als auch ignore_read_requests gesetzt.");
+ $reply=0;
+ }
+ if($reply && (!defined $transmit || ref $transmit))
+ {
+ plugin_log($plugname, "Config warn: \$logic{$t}: reply_to_read_requests funktioniert nur bei GENAU EINER transmit-Adresse.");
+ $reply=0;
+ }
+
+ my $footnote="";
+ $footnote.="(T)" if $logic{$t}{transmit_only_on_request};
+ $footnote.="(R)" if $logic{$t}{recalc_on_request};
+
+ $logic{$t}{reply_to_read_requests}=$reply;
+ next unless $reply;
+
+ $transmit=[$transmit] unless ref $transmit;
+ for my $tx (@{$transmit})
+ {
+ $responding{$tx}=[] unless defined $responding{$tx};
+ push @{$responding{$tx}}, $t.$footnote;
+ }
+ }
+
+ my @problemgas=sort grep @{$responding{$_}}>1, keys %responding; # alle GAs mit mehr als einer antwortenden Logik
+
+ if(@problemgas)
+ {
+ my %changed=();
+
+ plugin_log($plugname, "Config warn: Lesezugriffe auf folgende transmit-Adressen werden von mehreren Logiken beantwortet:");
+ for my $ga (@problemgas)
+ {
+ plugin_log($plugname, "$ga -> ".join(", ", @{$responding{$ga}}));
+ my @change=sort grep !/\([TR]\)$/, @{$responding{$ga}};
+ shift @change unless grep /\([TR]\)$/, @{$responding{$ga}}; # erste antwortende Logik mag noch ok sein...
+
+ for my $t (@change)
+ {
+ $logic{$t}{reply_to_read_requests}=0;
+ $changed{$t}=1;
+ }
+ }
+
+ plugin_log($plugname, "(T) - transmit_only_on_request gesetzt");
+ plugin_log($plugname, "(R) - recalc_on_request gesetzt");
+ plugin_log($plugname, "Bei folgende Logiken wurde daher reply_to_read_requests=>0 gesetzt:");
+ plugin_log($plugname, join ", ", keys %changed);
+ }
+ # Ende Konfiguration pruefen #######################################################
+
+ # es folgt die eigentliche Initialisierung - abonnieren von GAs, Aufbau von Hilfsstrukturen
+ for my $t (grep !/^(debug$|_)/, keys %logic)
+ {
+ # Debuggingflag gesetzt
+ my $debug = $logic{debug} || $logic{$t}{debug};
+
# transmit-Adresse(n) abonnieren
+ my $transmit=$logic{$t}{transmit};
+
if(defined $transmit)
{
$transmit=groupaddress $transmit;
@@ -161,26 +268,59 @@
{
if(defined $eibgaconf{$trm}{ga})
{
- $plugin_subscribe{$trm}{$plugname}=1;
+ if($logic{$t}{reply_to_read_requests})
+ {
+ $plugin_subscribe_read{$trm}{$plugname}=1;
+ $plugin_subscribe_write{$trm}{$plugname}=1;
+ $logic{'__'.$trm}{$t}=1;
+ }
}
else
{
- plugin_log($plugname, "\$logic{$t}: Transmit-GA $trm nicht in %eibgaconf gefunden");
+ plugin_log($plugname, "\$logic{$t}: Transmit-GA $trm nicht in eibga.conf gefunden");
+# plugin_log($plugname, join" ",@{$transmit});
}
}
}
}
- # Timer-Logiken reagieren nicht auf Bustraffic auf den receive-Adressen
- # fuer Timer-Logiken: ersten Call berechnen
- if($logic{$t}{timer})
+ # trigger-Adresse(n) abonnieren
+ if(defined $logic{$t}{trigger})
{
- set_next_call($t, $debug);
+ my $trigger=$logic{$t}{trigger};
+ $trigger=[$trigger] unless ref $trigger eq 'ARRAY';
+ my @trigcond = grep !/^(within\s*[0-9]+(?:m|min|h|s)?|all_in_order|any|all)$/, @{$trigger};
+
+ my @doubles=();
+
+ for my $cond (@trigcond)
+ {
+ my ($trg,$op,$sval) = ($cond=~/^([^\s<=>!]*)(?:(==|\seq|\slt|\sgt|\sle|\sge|>|<|>=|<=|!=)(.+?))?$/);
+
+ if(defined $eibgaconf{$trg}{ga})
+ {
+ $trg=groupaddress $trg;
+ $plugin_subscribe_write{$trg}{$plugname}=1;
+ $logic{'__'.$trg}{$t}=1;
+ }
+ else
+ {
+ plugin_log($plugname, "\$logic{$t}: Trigger-GA $trg nicht in eibga.conf gefunden");
+ next;
+ }
+
+ if($debug)
+ {
+ my $qtrg=quotemeta $trg;
+ push @doubles, $trg if grep /^$qtrg$/, @{$transmit};
+ }
+ }
+ plugin_log($plugname, "\$logic{$t}: Moegliche Zirkellogik: ".(join",", @doubles)." ist Trigger- und Transmit-GA, und weder delay, cool noch transmit_only_on_request ist spezifiziert.") if $debug && @doubles && !defined $logic{$t}{cool} && !defined $logic{$t}{delay} && !defined $logic{$t}{transmit_only_on_request};
}
+ # Nun alle receive-Adressen abonnieren (eine oder mehrere)
my $receive=$logic{$t}{receive};
- # Nun alle receive-Adressen abonnieren (eine oder mehrere)
if(defined $receive)
{
$receive=groupaddress $receive;
@@ -194,11 +334,12 @@
{
if(defined $eibgaconf{$rec}{ga})
{
- $plugin_subscribe{$rec}{$plugname}=1;
+ $plugin_subscribe_write{$rec}{$plugname}=1;
+ $logic{'__'.$rec}{$t}=1;
}
else
{
- plugin_log($plugname, "\$logic{$t}: Receive-GA $rec nicht in %eibgaconf gefunden");
+ plugin_log($plugname, "\$logic{$t}: Receive-GA $rec nicht in eibga.conf gefunden");
}
if($debug)
@@ -209,76 +350,115 @@
}
}
- plugin_log($plugname, "\$logic{$t}: Warnung: ".(join",", @doubles)." sowohl Receive- als auch Transmit-GA.") if $debug && @doubles;
+ plugin_log($plugname, "\$logic{$t}: Moegliche Zirkellogik: ".(join",", @doubles)." ist Receive- und Transmit-GA, und weder delay, cool noch transmit_only_on_request ist spezifiziert.") if $debug && @doubles && !defined $logic{$t}{cool} && !defined $logic{$t}{delay} && !defined $logic{$t}{transmit_only_on_request};
}
- # Zaehlen und Logeintrag
- $count++;
- }
+ # Zeitangaben in delay, cool und eibd_cache normalisieren
+ for my $opt (qw(delay cool eibd_cache))
+ {
+ if(defined $logic{$t}{$opt} && $logic{$t}{$opt}=~/^([0-9]*)(m|h|min|s)$/)
+ {
+ my $val=$1;
+ $val*=3600 if $2 eq 'h';
+ $val*=60 if $2 eq 'm' || $2 eq 'min';
+ $logic{$t}{$opt}=$val;
+ }
+ }
-# plugin_log($plugname, "Initialisierungsblock beendet");
+ # Timer-Logiken reagieren idR nicht auf Bustraffic auf den receive-Adressen, stattdessen haben sie einen komplexen Timer-Eintrag,
+ # der das Aufrufmuster festlegt. Dieses wird hier standardisiert fuer spaetere leichtere Auswertung: $logic->{$t}{timer} ist eine
+ # Liste oder ein einzelner Eintrag. Jeder solche Eintrag ist ein Hash zB der Art
+ # {day_of_month=>[(1..7)],day_of_week=>'Mo',time=>['08:30','09:20']}
+ # Das gerade genannte Beispiel bedeutet "jeden Monat jeweils der erster Montag, 8:30 oder 9:20". Verwendbare Klauseln sind:
+ # year, month, day_of_month, calendar_week, day_of_week und time
+ # Pflichtfeld ist lediglich time, die anderen duerfen auch entfallen. Jeder Wert darf ein Einzelwert oder eine Liste sein.
- # ab hier wuerde uns ein Timeout nicht mehr so stark treffen...
- for my $t (keys %logic)
- {
- next if $t eq 'debug' || $t=~/^_/;
- next unless $logic{$t}{transmit_on_startup};
+ if(defined $logic{$t}{timer})
+ {
+ $logic{$t}{timer}=[$logic{$t}{timer}] if ref $logic{$t}{timer} eq 'HASH';
+
+ for my $s (@{$logic{$t}{timer}})
+ {
+ # Schedule-Form standardisieren (alle Eintraege in Listenform setzen und Wochentage durch Zahlen ersetzen)
+ standardize_and_expand_single_schedule($t,$s,$debug);
+ }
- my $debug = $logic{debug} || $logic{$t}{debug};
+ # fuer Timer-Logiken: ersten Call berechnen
+ set_next_call('timer',$t,$logic{$t}{timer},$year,$day_of_year,$month,$day_of_month,$calendar_week,$day_of_week_no,
+ $hour,$minute,$time_of_day,$systemtime,$debug);
+ }
- # Berechnung und Senden beim Startup des Logikprozessors
- my $result=execute_logic($t, undef, undef);
-
- if(defined $result && defined $logic{$t}{transmit})
+ if(defined $logic{$t}{followup})
{
- my $transmit=groupaddress $logic{$t}{transmit};
+ my $followup=$logic{$t}{followup};
- if($transmit)
- {
- $transmit=[$transmit] unless ref $transmit;
-
- for my $trm (@{$transmit})
+ for my $q (grep !/^debug$/, keys %{$followup})
+ {
+ next unless ref $followup->{$q};
+ $followup->{$q}=[$followup->{$q}] if ref $followup->{$q} eq 'HASH';
+
+ for my $s (@{$followup->{$q}})
{
- knx_write($trm, $result); # DPT aus eibga.conf
+ # Followup-Form standardisieren (alle Eintraege in Listenform setzen und Wochentage durch Zahlen ersetzen)
+ standardize_and_expand_single_schedule($t,$s,$debug);
}
-
- if($debug)
- {
- if(ref $logic{$t}{transmit})
- {
- $retval.="\$logic{$t}{transmit}(Logik) -> [".join(",",@{$logic{$t}{transmit}})."]:$result gesendet; ";
- }
- else
- {
- $retval.="\$logic{$t}{transmit}(Logik) -> ".$logic{$t}{transmit}.":$result gesendet; ";
- }
- }
}
}
- }
+ # Zaehlen der erfolgreich eingetragenen Logiken
+ $count++;
+ }
+
+ $plugin_info{$plugname.'_configtime'}=$configtime;
+
+ # Alle Logiken im Cache speichern:
+ $plugin_cache{$plugname}{logic}=\%logic;
+ $plugin_cache{$plugname}{settings}=\%settings;
+
$retval.=$count." initialisiert; ";
}
+# Falls das config-File nicht veraendert wurde, geht es hier eigentlich los... alle Logikdefinitionen stehen schon in %plugin_cache
+my $logic=$plugin_cache{$plugname}{logic};
+my $settings=$plugin_cache{$plugname}{settings};
+my $eibpa=$plugin_cache{$plugname}{eibpa};
+
+$eibd_backend_address=$logic->{'_eibd_backend_address'} if defined $logic->{'_eibd_backend_address'};
+
+# Alle Logiken mit transmit_on_startup=>1 als followup vormerken - dadurch kann uns ein Timeout nicht so sehr treffen...
+if($event=~/restart|modified/)
+{
+ for my $t (grep !/^(debug$|_)/, keys %{$logic})
+ {
+ next unless $logic->{$t}{transmit_on_startup};
+ followup({$t=>0});
+ }
+}
+
+# Aufruf durch Bustraffic (d.h. eine Logik wird durch receive=>..., trigger=>... oder auch transmit=>... auf einer GA "getroffen"
if($event=~/bus/)
{
return $retval if $msg{apci} eq "A_GroupValue_Response";
my $ga=$msg{dst};
my $in=$msg{value};
+ $msg{sender}=$eibpa->{$msg{src}} if defined $eibpa->{$msg{src}};
+
my $keep_subscription=0; # falls am Ende immer noch Null, die GA stornieren
# welche translate-Logik ist aufgerufen?
- for my $t (keys %logic)
+ for my $t (sort grep !/^(debug$|_)/, keys %{$logic->{'__'.$ga}})
{
- next if $t eq 'debug' || $t=~/^_/;
+ # Flags abfragen
+ my $reply=$logic->{$t}{reply_to_read_requests};
+ my $debug = $logic->{debug} || $logic->{$t}{debug};
- my $transmit=groupaddress($logic{$t}{transmit});
+ # transmit hoert auf read- und write-Telegramme
+ my $transmit=groupaddress($logic->{$t}{transmit});
my $transmit_ga=0;
-
if(defined $transmit)
{
- unless(ref $logic{$t}{transmit})
+ unless(ref $logic->{$t}{transmit})
{
$transmit_ga=1 if $ga eq $transmit;
$transmit=[$transmit];
@@ -287,14 +467,69 @@
{
$transmit_ga=1 if grep /^$ga$/, @{$transmit};
}
+ $keep_subscription=1 if $transmit_ga;
+
+ # Sonderfall: Read- und Write-Telegramme auf einer Transmit-Adresse
+ # Diesen Sonderfall erstmal aus dem Weg raeumen...
+ if($transmit_ga)
+ {
+ # Ein Read-Request auf einer Transmit-GA wird mit dem letzten Ergebnis beantwortet
+ # ausser recalc_on_request ist gesetzt, dann wird neu berechnet
+ if($msg{apci} eq "A_GroupValue_Read")
+ {
+ next unless $reply;
+
+ my $result=$plugin_info{$plugname.'__'.$t.'_result'};
+
+ if(!defined $result || $logic->{$t}{recalc_on_request})
+ {
+ # falls gespeichertes Ergebnis ungueltig, neuer Berechnungsversuch
+ $result=execute_logic($t,undef,undef,$year,$day_of_year,$month,$day_of_month,$calendar_week,$day_of_week,$day_of_week_no,$hour,$minute,$time_of_day,$systemtime,$weekend,$weekday,$holiday,$workingday,$day,$night,$date)
+ unless defined $logic->{$t}{recalc_on_request} && $logic->{$t}{recalc_on_request}==0;
+
+ if(defined $result)
+ {
+ $retval.="$ga:Lesetelegramm -> \$logic->{$t}{transmit}(Logik) -> $ga:$result gesendet; " if $debug;
+ knx_write($ga, $result, undef, 0x40) if defined $result; # response, DPT aus eibga.conf
+ $plugin_info{$plugname.'__'.$t.'_result'}=$result;
+ last; # maximal eine Antwort auf ein read-Telegramm!
+ }
+ else
+ {
+ $retval.="$ga:Lesetelegramm -> \$logic->{$t}{transmit}(Logik) -> nichts zu senden; " if $debug;
+ }
+ }
+ elsif(defined $result)
+ {
+ $retval.="$ga:Lesetelegramm -> \$logic->{$t}{transmit}(memory) -> $ga:$result gesendet; " if $debug;
+ knx_write($ga, $result, undef, 0x40); # response, DPT aus eibga.conf
+ last; # maximal eine Antwort auf ein read-Telegramm!
+ }
+ else
+ {
+ $retval.="$ga:Lesetelegramm -> \$logic->{$t}{transmit}(memory) -> nichts zu senden; " if $debug;
+ }
+
+ next;
+ }
+ elsif($reply && !defined $plugin_info{$plugname.'__'.$t.'_delay'})
+ {
+ # Speichern hat keinen Zweck, wenn wir spaeter sowieso nicht auf read-requests reagieren
+ # oder wenn noch ein Delay-Timer laeuft! - dann ist das noch zu sendende Logikresultat gespeichert
+ # und darf nicht geaendert werden
+ $plugin_info{$plugname.'__'.$t.'_result'}=$in if defined $in;
+ }
+ }
}
- my $receive=groupaddress($logic{$t}{receive});
+ next unless $msg{apci} eq "A_GroupValue_Write" && defined $in;
+ # Wir wissen ab hier: Es liegt ein Write-Telegramm vor, kein Read- (oder Response-) Telegramm
+
+ my $receive=groupaddress($logic->{$t}{receive});
my $receive_ga=0;
-
- if(defined $receive)
+ if(defined $receive)
{
- unless(ref $logic{$t}{receive})
+ unless(ref $logic->{$t}{receive})
{
$receive_ga=1 if $ga eq $receive;
}
@@ -302,207 +537,308 @@
{
$receive_ga=1 if grep /^$ga$/, @{$receive};
}
+
+ if($receive_ga)
+ {
+ $keep_subscription=1;
+ $retval.="$msg{src} $ga:$in -> \$logic->{$t}{receive}" if $debug;
+ }
}
- next unless $receive_ga || $transmit_ga; # diese Logik nicht anwendbar
-
- $keep_subscription=1;
-
- # Debuggingflag gesetzt
- my $debug = $logic{debug} || $logic{$t}{debug};
- my $ignore_read_requests=$logic{$t}{ignore_read_requests};
-
- # bei mehreren transmit-Adressen per Default Read-Requests ignorieren (wird idR so erwuenscht sein)
- $ignore_read_requests = ref $logic{$t}{transmit} && !$logic{$t}{recalc_on_request} && !$logic{$t}{transmit_only_on_request}
- unless defined $ignore_read_requests;
-
- # Sonderfall: Read- und Write-Telegramme auf einer Transmit-Adresse
- if($transmit_ga)
- {
- # Ein Read-Request auf einer Transmit-GA wird mit dem letzten Ergebnis beantwortet
- # ausser das Flag recalc_on_request ist gesetzt
- # Read-Requests auf die receive-Adressen werden gar nicht beantwortet
- if($msg{apci} eq "A_GroupValue_Read")
- {
- next if $ignore_read_requests;
-
- my $result=$plugin_info{$plugname.'_'.$t.'_result'};
-
- if(!defined $result || $logic{$t}{recalc_on_request})
+ my $trigger_ga=0;
+ if(!$receive_ga && defined $logic->{$t}{trigger})
+ {
+ my $trigger=$logic->{$t}{trigger};
+
+ $trigger=[$trigger] unless ref $trigger eq 'ARRAY';
+
+ my $any=1;
+ my $all=grep /^all$/i, @{$trigger};
+ my $all_in_order=grep /^all_in_order$/i, @{$trigger};
+ ($any,$all)=(0,0) if $all_in_order;
+ $any=0 if $all;
+
+ # Karenzzeit ("within") in Sekunden berechnen
+ my $within=60;
+ if($all || $all_in_order)
+ {
+ my @within=grep /^within\s*([0-9]+)(h|min|m|s)?$/, @{$trigger};
+ $within=$1*(defined $2 ? ($2 eq 'h' ? 3600:(($2 eq 'min' || $2 eq 'm') ? 60:1)):1)
+ if @within && $within[0]=~/^within\s*([0-9]+)(h|min|m|s)?$/;
+ }
+
+ my @trigcond = grep !/^(within\s*[0-9]+(?:m|min|h|s)?|all_in_order|any|all)$/, @{$trigger};
+
+ for my $cond (@trigcond)
+ {
+ my ($tga,$op,$sval) = ($cond=~/^\s*(.*?)\s*(?:(==|\seq|\slt|\sgt|\sle|\sge|>|<|>=|<=|!=)(.+?))?\s*$/);
+ $tga=groupaddress($tga);
+
+ if($all || $all_in_order) # erfuellte Bedingungen loeschen, falls zu viel Zeit verstrichen
{
- # falls gespeichertes Ergebnis ungueltig, neuer Berechnungsversuch
- $result=execute_logic($t, undef, undef)
- unless defined $logic{$t}{recalc_on_request} && $logic{$t}{recalc_on_request}==0;
-
- if(defined $result)
- {
- $retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(Logik) -> $ga:$result gesendet; " if $debug;
- knx_write($ga, $result, undef, 0x40) if defined $result; # response, DPT aus eibga.conf
- }
- }
- else
- {
- $retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(memory) -> $ga:$result gesendet; " if $debug;
- knx_write($ga, $result, undef, 0x40); # response, DPT aus eibga.conf
+ my $lasttime=$plugin_cache{$plugname}{triggercache}{$t}{$cond};
+ delete $plugin_cache{$plugname}{triggercache}{$t}{$cond} if defined $lasttime && $systemtime-$lasttime>$within;
}
- next;
+ next unless $ga eq $tga;
+
+ $keep_subscription=1;
+ $trigger_ga=1 unless $any;
+
+ if($any && verify($in,$op,$sval)) # Fuer "any" wird hier gleich die Bedingung geprueft
+ {
+ $trigger_ga=1;
+ }
}
- elsif(!$receive_ga) # Wenn eine GA sowohl in transmit als auch receive vorkommt, geht receive vor
+
+ my $retv=0;
+
+ # Das Folgende wird nur ausgefuehrt, wenn all oder all_in_order spezifiziert wurde UND wir schon wissen,
+ # dass eine der in trigger vorkommenden GAs vorliegt
+ if($trigger_ga && !$any)
{
- next if $ignore_read_requests; # Speichern hat keinen Zweck, wenn wir spaeter sowieso nicht auf read-requests reagieren
-
- if(defined $in) # Write/Response-Telegramm auf transmit: das waren moeglicherweise wir selbst, also nicht antworten
+ for my $cond (@trigcond)
{
- $plugin_info{$plugname.'_'.$t.'_result'}=$in; # einfach Input ablegen
+ my ($tga,$op,$sval) = ($cond=~/^(.*?)(?:(==|\seq|\slt|\sgt|\sle|\sge|>|<|>=|<=|!=)(.+?))?$/);
+ $tga=groupaddress($tga);
+ $plugin_cache{$plugname}{triggercache}{$t}{$cond}=$systemtime if $ga eq $tga && verify($in,$op,$sval);
+
+ if(defined $plugin_cache{$plugname}{triggercache}{$t}{$cond})
+ {
+ if($debug)
+ {
+ $retval.="$msg{src} $ga:$in -> \$logic->{$t}{trigger}(" unless $retv;
+ $retval.="," if $retv;
+ $retval.="$cond";
+ $retv=1;
+ }
+ }
+ else
+ {
+ $trigger_ga=0; # Bedingung nicht erfuellt -> trigger nicht faellig
+ last if $all_in_order; # fur "all_in_order" testen wir nicht weiter, fuer "all" schon...
+ }
}
- else
- {
- delete $plugin_info{$plugname.'_'.$t.'_result'};
- }
- next;
+ delete $plugin_cache{$plugname}{triggercache}{$t} if $trigger_ga; # Reset aller Bedingungen
}
+
+ if($debug && $trigger_ga)
+ {
+ $retval.="$msg{src} $ga:$in -> \$logic->{$t}{trigger}" unless $retv;
+ $retval.=($retv?",":"(")."triggered" unless $any;
+ $retv=1;
+ }
+
+ $retval.=")" if $retv && !$any;
}
- next unless $msg{apci} eq "A_GroupValue_Write" && $receive_ga;
- # Wir wissen ab hier: Es liegt ein Write-Telegramm auf einer der receive-Adressen vor
+ next unless $receive_ga || $trigger_ga;
+ # Wir wissen ab hier: Es liegt ein Write-Telegramm auf einer der receive-Adressen oder einer Trigger-Adresse vor
- # Nebenbei berechnen wir noch zwei Flags, die Zirkelkommunikation verhindern sollen
- # (Logik antwortet auf sich selbst in einer Endlosschleife)
-
# Cool-Periode definiert und noch nicht abgelaufen?
if(defined $plugin_info{$plugname.'__'.$t.'_cool'} && $plugin_info{$plugname.'__'.$t.'_cool'}>time())
{
- $retval.="$ga:$in -> \$logic{$t}{receive}(Cool); " if $debug;
+ $retval.="(Cool) -> nichts zu senden; " if $debug;
next;
}
# Aufruf der Logik-Engine
- my $prevResult=$plugin_info{$plugname.'_'.$t.'_result'};
- my $result=execute_logic($t, $ga, $in);
+ my $prevResult=$plugin_info{$plugname.'__'.$t.'_result'};
+ my $result=execute_logic($t,$ga,$in,$year,$day_of_year,$month,$day_of_month,$calendar_week,$day_of_week,$day_of_week_no,$hour,$minute,$time_of_day,$systemtime,$weekend,$weekday,$holiday,$workingday,$day,$night,$date);
- # war Wiregate der Sender des Telegramms?
- # Zirkelaufruf mit wiederholt gleichen Ergebnissen ausschliessen
- my $sender_is_wiregate = $msg{src} eq $eibd_backend_address;
- next if $sender_is_wiregate && $transmit_ga && $in == $result;
-
- # In bestimmten Sonderfaellen nichts schicken
- unless(defined $result) # Resultat undef => nichts senden
+ # In bestimmten Sonderfaellen nichts senden. Diese Sonderfaelle behandeln wir erstmal
+ if(!defined $transmit || !defined $result)
{
- $retval.="$ga:$in -> \$logic{$t}{receive}(Logik) -> nichts zu senden; " if $debug;
+ $retval.="(Logik) -> nichts zu senden; " if $debug;
+
+ if($logic->{$t}{delay} && defined $plugin_info{$plugname.'__'.$t.'_delay'}) # Laufender Delay?
+ {
+ $plugin_info{$plugname.'__'.$t.'_result'}=$prevResult; # altes Resultat wieder aufnehmen
+ }
next;
}
- if($logic{$t}{transmit_only_on_request})
+ # Ggf warnen vor Logiken, die aussehen wie Zirkel
+ plugin_log($plugname, "(circle logic?)") if $msg{src} eq $eibd_backend_address && $transmit_ga && $in==$result && $debug;
+
+ # Wir wissen nun: Die Logik hat ein Ergebnis gebracht (result ist definiert) und eine/mehrere transmit-GAs sind definiert
+
+ # In bestimmten Faellen wird dennoch nicht oder nicht sofort gesendet:
+ if($logic->{$t}{transmit_only_on_request})
{
- if($debug)
+ if(ref $logic->{$t}{transmit})
{
- if(ref $logic{$t}{transmit})
+ $retval.="(Logik) -> [".join(",",@{$logic->{$t}{transmit}})."]:$result gespeichert; " if $debug;
+ }
+ else
+ {
+ $retval.="(Logik) -> ".$logic->{$t}{transmit}.":$result gespeichert; " if $debug;
+ }
+ next;
+ }
+ if($result eq 'cancel' && ($logic->{$t}{delay} || $logic->{$t}{followup}))
+ {
+ if($logic->{$t}{delay} && defined $plugin_info{$plugname.'__'.$t.'_delay'})
+ {
+ $plugin_info{$plugname.'__'.$t.'_result'}=$prevResult; # altes Resultat wieder aufnehmen
+
+ if($result eq 'cancel')
{
- $retval.="$msg{src} $ga:$in -> \$logic{$t}{receive}(Logik) -> [".join(",",@{$logic{$t}{transmit}})."]:$result gespeichert; ";
+ delete $plugin_info{$pl...
[truncated message content] |
|
From: <mi...@us...> - 2015-01-02 23:21:59
|
Revision: 2303
http://sourceforge.net/p/openautomation/code/2303
Author: mivola
Date: 2015-01-02 23:21:52 +0000 (Fri, 02 Jan 2015)
Log Message:
-----------
add some "AddOns" for Logikprozessor.pl
Added Paths:
-----------
wiregate/plugin/generic/Logikprozessor.addRssLogViaCurl.pl
wiregate/plugin/generic/Logikprozessor.addRssLogViaHttpRequest.pl
wiregate/plugin/generic/Logikprozessor.sendNma.pl
Added: wiregate/plugin/generic/Logikprozessor.addRssLogViaCurl.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.addRssLogViaCurl.pl (rev 0)
+++ wiregate/plugin/generic/Logikprozessor.addRssLogViaCurl.pl 2015-01-02 23:21:52 UTC (rev 2303)
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+##################
+# Logikprozessor AddOn: create RSS Log via HTTP::Request
+##################
+#
+# COMPILE_PLUGIN
+
+
+sub addRssLog {
+ my (%parameters)=@_;
+ my ($title, $content, $tags, $url);
+
+ my $settings=$plugin_cache{"Logikprozessor.pl"}{settings};
+
+ # Parameter ermitteln
+ # dom, 2012-11-05: $settings auch hier auswerten. Damit kann addRssLog() direkt aus der Logik aufgerufen werden!
+ $title = $parameters{title} || $settings->{rssLog}{title} || '';
+ $content = $parameters{content} || $settings->{rssLog}{content} || '';
+ $tags = $parameters{tags} || $settings->{rssLog}{tags} || '';
+ $url = $parameters{url} || $settings->{rssLog}{url} || '';
+
+ # HTTP Request aufsetzen
+ my $requestURL;
+
+ $requestURL = sprintf($url."?t=%s&c=%s&tags=%s",
+ uri_escape(encode("utf8", $title)),
+ uri_escape(encode("utf8", $content)),
+ uri_escape(encode("utf8", $tags)));
+
+ plugin_log($plugname, "RSSLog url: $requestURL") if $parameters{debug};
+ my $curlResult = system("curl -s \"$requestURL\" &");
+ plugin_log($plugname, "RSSLog curlResult: $curlResult") if $parameters{debug};
+
+ return undef;
+}
Added: wiregate/plugin/generic/Logikprozessor.addRssLogViaHttpRequest.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.addRssLogViaHttpRequest.pl (rev 0)
+++ wiregate/plugin/generic/Logikprozessor.addRssLogViaHttpRequest.pl 2015-01-02 23:21:52 UTC (rev 2303)
@@ -0,0 +1,47 @@
+#!/usr/bin/perl -w
+##################
+# Logikprozessor AddOn: create RSS Log via HTTP::Request
+##################
+#
+# COMPILE_PLUGIN
+
+sub addRssLogViaHttpRequest {
+ my (%parameters)=@_;
+ my ($title, $content, $tags, $url);
+
+ my $settings=$plugin_cache{"Logikprozessor.pl"}{settings};
+
+ # Parameter ermitteln
+ # dom, 2012-11-05: $settings auch hier auswerten. Damit kann addRssLog() direkt aus der Logik aufgerufen werden!
+ $title = $parameters{title} || $settings->{rssLog}{title} || '';
+ $content = $parameters{content} || $settings->{rssLog}{content} || '';
+ $tags = $parameters{tags} || $settings->{rssLog}{tags} || '';
+ $url = $parameters{url} || $settings->{rssLog}{url} || '';
+
+ use LWP::UserAgent;
+ use URI::Escape;
+ use Encode;
+
+ # HTTP Request aufsetzen
+ my ($userAgent, $request, $response, $requestURL);
+ $userAgent = LWP::UserAgent->new;
+ $userAgent->agent("WireGatePlugin/1.0");
+
+ $requestURL = sprintf($url."?t=%s&c=%s&tags=%s",
+ uri_escape(encode("utf8", $title)),
+ uri_escape(encode("utf8", $content)),
+ uri_escape(encode("utf8", $tags)));
+
+ $request = HTTP::Request->new(GET => $requestURL);
+ #$request->timeout(5);
+
+ $response = $userAgent->request($request);
+
+ if ($response->is_success) {
+ plugin_log($plugname, "RSSLog erfolgreich abgesetzt: $title, $content, $tags, $url") if $parameters{debug};
+ } else {
+ plugin_log($plugname, "RSSLog ($requestURL) nicht abgesetzt: " . $response->content);
+ }
+
+ return undef;
+}
Added: wiregate/plugin/generic/Logikprozessor.sendNma.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.sendNma.pl (rev 0)
+++ wiregate/plugin/generic/Logikprozessor.sendNma.pl 2015-01-02 23:21:52 UTC (rev 2303)
@@ -0,0 +1,56 @@
+#!/usr/bin/perl -w
+##################
+# Logikprozessor AddOn: create RSS Log via HTTP::Request
+##################
+#
+# COMPILE_PLUGIN
+
+
+sub sendNma {
+ my (%parameters)=@_;
+ my ($priority, $event, $description, $application, $url, $apikey, $targetUrl);
+
+ my $settings=$plugin_cache{"Logikprozessor.pl"}{settings};
+
+ # Parameter ermitteln
+ # dom, 2012-11-05: $settings auch hier auswerten. Damit kann addRssLog() direkt aus der Logik aufgerufen werden!
+ $priority = $parameters{priority} || $settings->{nma}{priority} || 0;
+ $event = $parameters{event} || $settings->{nma}{event} || '[unbenanntes Ereignis]';
+ $description = $parameters{description} || $settings->{nma}{description} || '';
+ $application = $parameters{application} || $settings->{nma}{application} || 'WireGate KNX';
+ $targetUrl = $parameters{targetUrl} || $settings->{nma}{targetUrl} || '';
+ $url = $parameters{url} || $settings->{nma}{url} || '';
+ $apikey = $parameters{apikey} || $settings->{nma}{apikey} || '';
+
+ use LWP::UserAgent;
+ use URI::Escape;
+ use Encode;
+
+ # HTTP Request aufsetzen
+ my ($userAgent, $request, $response, $requestURL);
+ $userAgent = LWP::UserAgent->new;
+ $userAgent->agent("WireGatePlugin/1.0");
+
+ $requestURL = sprintf($url."?apikey=%s&priority=%s&event=%s&description=%s&application=%s&url=%s",
+ uri_escape($apikey),
+ uri_escape($priority),
+ uri_escape(encode("utf8", $event)),
+ uri_escape(encode("utf8", $description)),
+ uri_escape(encode("utf8", $application)),
+ uri_escape($targetUrl));
+
+ $request = HTTP::Request->new(GET => $requestURL);
+ #$request->timeout(5);
+
+ $response = $userAgent->request($request);
+ if ($response->is_success) {
+ plugin_log($plugname, "NMA-Nachricht erfolgreich abgesetzt: $priority, $event, $description, $application") if $parameters{debug};
+ } elsif ($response->code == 401) {
+ plugin_log($plugname, "NMA-Nachricht nicht abgesetzt: API key gültig?");
+ } else {
+ plugin_log($plugname, "NMA-Nachricht ($requestURL) nicht abgesetzt: " . $response->content);
+ }
+
+ return undef;
+}
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mi...@us...> - 2015-01-02 23:33:28
|
Revision: 2304
http://sourceforge.net/p/openautomation/code/2304
Author: mivola
Date: 2015-01-02 23:33:26 +0000 (Fri, 02 Jan 2015)
Log Message:
-----------
add ability to define custom holidays for Logikprozessor.pl
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2015-01-02 23:21:52 UTC (rev 2303)
+++ wiregate/plugin/generic/Logikprozessor.pl 2015-01-02 23:33:26 UTC (rev 2304)
@@ -986,6 +986,10 @@
# und die auf Ostern bezogenen Kirchenfeiertage: Karfreitag, Ostern (2x), Christi Himmelfahrt, Pfingsten (2x), Fronleichnam
my @holidays=(1,121+$leapyear,276+$leapyear,359+$leapyear,360+$leapyear,$J-2,$J,$J+1,$J+39,$J+49,$J+50,$J+60);
+ # settings aus der .conf auslesen
+ my $settings=$plugin_cache{$plugname}{settings};
+ push @holidays, @{$settings->{holidays}} if defined $settings->{holidays};
+
return (grep { $_==$doy } @holidays) ? 1 : 0;
}
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample 2015-01-02 23:21:52 UTC (rev 2303)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample 2015-01-02 23:33:26 UTC (rev 2304)
@@ -15,7 +15,16 @@
description => '',
url => ''
},
+
samurai => "https://user:pass\@samurai.sipgate.net/RPC2",
+
+ # Hiermit erhaelt man die Moeglichkeit "persoenliche" Feiertage oder Ferien zu verwalten. Diese
+ # wirken additiv zu den bereits vom Logikprozessor als allgemein angesehen Feiertage. Allgemeine
+ # Feiertage sind unter Punkt 6 beschrieben.
+ # Die Variable enthaelt eine Liste von "Day-of-Year"-Zahlen, zb "2" entspricht dem zweiten Tag
+ # des Jahres, also dem 02.01. des aktuellen Jahres. Die Angaben hier wirken sich auf $holiday
+ # und $workingday aus.
+ holidays=>[364,365,2],
);
%logic=(
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|