|
From: <ma...@us...> - 2011-05-31 20:06:01
|
Revision: 351
http://openautomation.svn.sourceforge.net/openautomation/?rev=351&view=rev
Author: makki1
Date: 2011-05-31 20:05:55 +0000 (Tue, 31 May 2011)
Log Message:
-----------
Add WG-plugins for VPN/SSL controlled by KNX-GA
Added Paths:
-----------
wiregate/plugin/generic/SSL-User-by-GA
wiregate/plugin/generic/VPN-User-by-GA
Added: wiregate/plugin/generic/SSL-User-by-GA
===================================================================
--- wiregate/plugin/generic/SSL-User-by-GA (rev 0)
+++ wiregate/plugin/generic/SSL-User-by-GA 2011-05-31 20:05:55 UTC (rev 351)
@@ -0,0 +1,48 @@
+# Plugin zu (de)aktivieren von SSL(Apache)-Usern per KNX-GA
+# Einrichtung Apache mit Reverse-SSL Proxy sep. notwendig!
+# Hinweise:
+# Umlaute, Sonderzeichen, Leerzeichen etc. in VPN-Clientnamen vermeiden!
+# (default) hier nicht genannte VPN-User sind aktiviert
+
+# Eigenen Aufruf-Zyklus auf 300 Sekunden setzen
+$plugin_info{$plugname.'_cycle'} = 86400;
+##############################################################################
+### Definitionen
+##############################################################################
+my $install = 1; # Installiere skripte/config bei Bedarf
+my %ssl_usermap; # Eintrag darf nicht auskommentiert werden
+my %ssl_passwd; # Eintrag darf nicht auskommentiert werden
+my %ssl_usermap_status; # Eintrag darf nicht auskommentiert werden
+$ssl_usermap{'0/4/8'} = '/C=DE/ST=Bayern/L=Hohenbrunn/O=WireGate/OU=SSL-Userzertifikat/CN=zertifikat/emailAddress=ssl-user@wiregateXXX';
+$ssl_passwd{'0/4/8'} = 'password'; # xxj31ZMTZzkVA
+
+$ssl_usermap{'0/4/1'} = 'admin';
+$ssl_passwd{'0/4/1'} = 'password123';
+$ssl_usermap{'0/4/2'} = 'user1';
+$ssl_passwd{'0/4/2'} = 'password456';
+##############################################################################
+### Ende Definitionen
+##############################################################################
+
+if (%msg) {
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $ssl_usermap{$msg{'dst'}}) {
+ if($msg{'data'}+0) {
+ #enable
+ my $dummy = `htpasswd -b /etc/apache2/htpasswd $ssl_usermap{$msg{'dst'}} "$ssl_passwd{$msg{'dst'}}"`;
+ return "enabled $ssl_usermap{$msg{'dst'}} by $msg{'dst'}: $dummy";
+ } else {
+ #disable
+ my $dummy = `htpasswd -D /etc/apache2/htpasswd $ssl_usermap{$msg{'dst'}}`;
+ return "DISabled $ssl_usermap{$msg{'dst'}} by $msg{'dst'}: $dummy";
+ }
+ }
+} else {
+ # cyclic/init/change
+ # subscribe GA's
+ while( my ($k, $v) = each(%ssl_usermap) ) {
+ # Plugin an Gruppenadresse "anmelden"
+ $plugin_subscribe{$k}{$plugname} = 1;
+ }
+}
+return;
+
Added: wiregate/plugin/generic/VPN-User-by-GA
===================================================================
--- wiregate/plugin/generic/VPN-User-by-GA (rev 0)
+++ wiregate/plugin/generic/VPN-User-by-GA 2011-05-31 20:05:55 UTC (rev 351)
@@ -0,0 +1,97 @@
+# Plugin zu (de)aktivieren von VPN-Usern per KNX-GA
+# Hinweise:
+# Umlaute, Sonderzeichen, Leerzeichen etc. in VPN-Clientnamen vermeiden!
+# Gross/Kleinschreibung beachten!
+# (default) hier nicht genannte VPN-User sind aktiviert
+
+# Eigenen Aufruf-Zyklus auf 300 Sekunden setzen
+$plugin_info{$plugname.'_cycle'} = 86400;
+my %vpn_usermap; # Eintrag darf nicht auskommentiert werden
+my %vpn_usermap_status; # Eintrag darf nicht auskommentiert werden
+
+##############################################################################
+### Definitionen
+##############################################################################
+my $install = 1; # Installiere skripte/config bei Bedarf
+# KNX-Ga zum freigeben der User - Namen wie in VPN-config
+$vpn_usermap{'0/7/202'} = "kunde-hsbetreuer";
+$vpn_usermap{'0/7/204'} = "kunde-notebook";
+$vpn_usermap{'0/7/206'} = "kunde-knx-betreuer";
+$vpn_usermap{'0/7/210'} = "kunde-netzwerkbetreuer";
+# KNX-GA Verbindungs-Status der User - Namen wie in VPN-config
+$vpn_usermap_status{'0/7/203'} = "kunde-hsbetreuer";
+$vpn_usermap_status{'0/7/205'} = "kunde-notebook";
+$vpn_usermap_status{'0/7/207'} = "kunde-knx-betreuer";
+$vpn_usermap_status{'0/7/211'} = "kunde-netzwerkbetreuer";
+##############################################################################
+### Ende Definitionen
+##############################################################################
+
+if (%msg) {
+ if ($msg{'apci'} eq "A_GroupValue_Write" and $vpn_usermap{$msg{'dst'}}) {
+ if($msg{'data'}+0) {
+ #enable
+ unlink("/etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled");
+ return "enabled $vpn_usermap{$msg{'dst'}} by $msg{'dst'}";
+ } else {
+ #disable
+ my $dummy = `echo "disabled" > /etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled`;
+ my $resp = `echo kill $vpn_usermap{$msg{'dst'}} | nc localhost 8001 -q 1`;
+ return "DISabled $vpn_usermap{$msg{'dst'}} by $msg{'dst'} - VPN-server said: $resp";
+ }
+ } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $vpn_usermap{$msg{'dst'}}) {
+ my $status = 0;
+ $status = 1 unless (-e "/etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled");
+ my @args = ($eib_grpresp_bin, $eib_url, $msg{'dst'},sprintf("%02X", $status));
+ system(@args);
+ } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $vpn_usermap_status{$msg{'dst'}}) {
+ my $status = `grep "^$vpn_usermap_status{$msg{'dst'}}" /var/run/openvpn.server.status`;
+ $status = 1 unless (!$status);
+ my @args = ($eib_grpresp_bin, $eib_url, $msg{'dst'},sprintf("%02X", $status));
+ system(@args);
+ }
+} else {
+ # cyclic/init/change
+ # subscribe GA's
+ while( my ($k, $v) = each(%vpn_usermap) ) {
+ # Plugin an Gruppenadresse "anmelden"
+ $plugin_subscribe{$k}{$plugname} = 1;
+ }
+ open(OUT, ">/etc/openvpn/servers/VPNGA_MAP");
+ while( my ($k, $v) = each(%vpn_usermap_status) ) {
+ # Plugin an Gruppenadresse "anmelden"
+ $plugin_subscribe{$k}{$plugname} = 1;
+ # Write VPNGA_MAP
+ print OUT "$v=$k\n";
+ }
+ close(OUT);
+ # Self-installer ;) Multiline-print doesn't work somehow
+ return unless $install;
+ if (! -e '/etc/openvpn/connect.sh' or ! -e '/etc/openvpn/disconnect.sh') {
+ open(OUT, ">/etc/openvpn/connect.sh");
+ print OUT "#!/bin/bash\n\nif [ -e /etc/openvpn/servers/\$common_name.disabled ]; then\n";
+ print OUT "\tlogger -t VPN 'refused disabled VPN-user \$common_name from \$trusted_ip'\n";
+ print OUT "\texit 1\nelse \n";
+ print OUT "\tlogger -t VPN '\$common_name logged in from \$trusted_ip (\$ifconfig_pool_remote_ip)'\n";
+ print OUT "\tVPNGA=`grep \"^\$common_name=\" /etc/openvpn/servers/VPNGA_MAP | cut -d'=' -f 2`\n";
+ print OUT "\tgroupswrite local:/tmp/eib \$VPNGA 1\nfi\nexit 0\n";
+ close(OUT);
+ open(OUT, ">/etc/openvpn/disconnect.sh");
+ print OUT "#!/bin/bash\n\n";
+ print OUT "logger -t VPN '\$common_name logged out from \$trusted_ip (\$ifconfig_pool_remote_ip) T: \$time_duration S: \$bytes_sent R: \$bytes_received'\n";
+ print OUT "VPNGA=`grep \"^\$common_name\" /etc/openvpn/servers/VPNGA_MAP | cut -d'=' -f 2`\n";
+ print OUT "groupswrite local:/tmp/eib \$VPNGA 0\n";
+ close(OUT);
+ chmod 0755, "/etc/openvpn/connect.sh","/etc/openvpn/disconnect.sh";
+ `sync`;
+ }
+ if (! `grep '^client-connect' /etc/openvpn/server.conf` ) {
+ open(OUT, ">>/etc/openvpn/server.conf");
+ print OUT "script-security 2\nclient-connect connect.sh\nclient-disconnect disconnect.sh\n";
+ close OUT;
+ `/etc/init.d/openvpn restart`;
+ `sync`;
+ }
+}
+return;
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <kle...@us...> - 2011-06-25 13:43:06
|
Revision: 374
http://openautomation.svn.sourceforge.net/openautomation/?rev=374&view=rev
Author: kleinklausi
Date: 2011-06-25 13:42:59 +0000 (Sat, 25 Jun 2011)
Log Message:
-----------
Renamed Rolladen-Automatik2.pl to RollladenAutomatik.pl
Added Paths:
-----------
wiregate/plugin/generic/RollladenAutomatik.pl
Removed Paths:
-------------
wiregate/plugin/generic/Rolladen-Automatik2.pl
Deleted: wiregate/plugin/generic/Rolladen-Automatik2.pl
===================================================================
--- wiregate/plugin/generic/Rolladen-Automatik2.pl 2011-06-25 13:39:10 UTC (rev 373)
+++ wiregate/plugin/generic/Rolladen-Automatik2.pl 2011-06-25 13:42:59 UTC (rev 374)
@@ -1,224 +0,0 @@
-######################################################################################
-#
-# Plugin RollladenAutomatik
-# V0.5 2011-06-10
-# Ben\xF6tigt: libastro-satpass-perl -> 'apt-get install libastro-satpass-perl'
-#
-# Ein Wiregate Plugin zum automatischen Fahren der Rolll\xE4den. Es berechnet unter Anderem
-# den Stand der Sonne und f\xE4hrt je nach Winkel der Sonne zum Fenster, den Rollladen in
-# eine Beschattungsposition. Folgende Funktionen werden unterst\xFCtzt:
-# - Sonnenstand (Azimuth)
-# - Anfangs- und Endwinkel (Azimuth) ab dem das Fenster beschienen wird
-# - Globale Sperre duch eine Gruppenadresse
-# - Sperre eines einzelnen Rollladens durch eine Gruppenadresse
-# - Fahren des Rollladen zu (1) oder auf (0) oder Positionsfahren mit Prozentwert
-# - Zufahren bei Dunkelheit am Abend und Hell am Morgen
-# - Bugfix f\xFCr Busch-J\xE4ger USB Schnittstelle (muss eingeschaltet werden)
-#
-# TODO: Was teilweise integriert ist aber noch nicht komplett ist:
-# - Nur zufahren, wenn es im Raum warm genug ist
-# - Wetterstation einbinden: Helligkeit, Sonnenschein, D\xE4mmerung
-# - Bei Fensterdefinition auch Elevation oben bzw. unten angeben
-# - Jalousie Lamellenf\xFChrung
-# - Vorwarnpositionsfahrten?
-# - Englisch oder Deutsch?
-# - Au\xDFentemperaur
-######################################################################################
-
-
-#########################
-### BEGINN DEFINITION ###
-#########################
-
-# Die Koordinaten des Hauses. Sehr einfach \xFCber http://www.getlatlon.com/ zu ermitteln.
-# Und die H\xF6he \xFCber NN
-my ($lat, $lon, $elev) = (
- 49.02917390736781, # Breitengrad in Grad
- 8.570709228515625, # L\xE4ngengrad in Grad
- 180 / 1000 # H\xF6he \xFCber NN in Kilometer (dewegen geteilt durch 1000)
- );
-
-# Elevation der Sonne, ab der es abends dunkel ist bzw. morgens hell ist.
-# B\xFCrgerliche D\xE4mmerung ist bei -6 Grad.
-my $daemmerung = -3;
-
-# Gruppenadresse, \xFCber welche die komplette Automatik f\xFCr alle Rolll\xE4den gesperrt werden kann
-my $GASperreAlle = "0/0/125";
-
-# Bugfix f\xFCr KNX-Schnittstellen die sich bei zu schneller Telegrammabfolge
-# verschlucken, und denen wir deshalb die Geschwindigkeit der Telegramme drosseln m\xFCssen
-# 0 = nicht anschalten (Telegramme mit voller Geschwindigkeit abfeuern)
-# 1 = anschalten (Telegramme um 20 millisekunden verz\xF6gern)
-# nur f\xFCr "Busch-J\xE4ger 6196 USB REG" ist bekannt das dies ben\xF6tigt wird
-my $bugfixSlowInterface = 0;
-
-# Ein Array von Hashes, wobei jeder Hash ein Rollladen/Fenster/Raum ist.
-my @AlleRolllaeden;
-# Name des Rolladen
-# name => "Speisekammer"
-# Winkel zum Norden, ab dem das Fenster beschienen wird.
-# Echter Osten = 90\xB0, echter S\xFCden = 180\xB0, echter Westen = 270\xB0, echter Norden = 0\xB0
-# winkel1 => 66
-# Winkel zum Norden, bis zu dem das Fenster beschienen wird
-# winkel2 => 186
-# Richtung bei Beschattung: wenn 1 wird DPT3 angenommen und ganz zugefahren.
-# Bei ungleich 1, wird DPT5 angenommen und Position angefahren
-# wertZuBesch => 1
-# Richtung bei keiner Beschattung: wenn 0 wird DPT3 angenommen und ganz aufgefahren.
-# Bei ungleich 0, wird DPT5 angenommen und Position angefahren
-# wertAufBesch => 0
-# Richtung bei Nacht: wenn 1 wird DPT3 angenommen und ganz zugefahren.
-# Bei ungleich 1, wird DPT5 angenommen und Position angefahren
-# wertZuNacht => 1
-# Richtung bei keiner Nacht: wenn 0 wird DPT3 angenommen und ganz aufgefahren.
-# Bei ungleich 0, wird DPT5 angenommen und Position angefahren
-# wertAufNacht => 0
-# Ob der Rollladen in die Automatik f\xFCr Sonnenauf- und untergang einbezogen werden soll
-# sonnenAufUnter => 1
-# Raum-Solltemperatur, wenn keine GA angegeben wurde oder kein Wert vom Bus gelesen wurde
-# raumSollTemp => 22
-# GA der Raum-Solltemperatur
-# GAraumsollTemp => "0/0/127"
-# GA der Raum-Isttemperatur
-# GAraumIstTemp => "0/0/128"
-# GA um Rollladen zu fahren TODO:Sollte man hier mehrere GAs angeben k\xF6nnen?
-# GAfahren => "0/0/126"
-# GA um die Automatik dieses einen Rollladen zu sperren
-# GAsperre=> "0/0/129"
-push @AlleRolllaeden, { name => "Speisekammer", winkel1 => 66, winkel2 => 186, wertZuBesch => 1, wertAufBesch => 0,
- wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
- GAraumIstTemp => "0/0/128", GAfahren => "2/1/11", GAsperre => "0/0/129" };
-push @AlleRolllaeden, { name => "K\xFCche", winkel1 => 194, winkel2 => 294, wertZuBesch => 80, wertAufBesch => 2,
- wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
- GAraumIstTemp => "0/0/128", GAfahren => "2/2/3", GAsperre => "0/0/129" };
-push @AlleRolllaeden, { name => "Kind Strasse", winkel1 => 182, winkel2 => 294, wertZuBesch => 86, wertAufBesch => 2,
- wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
- GAraumIstTemp => "0/0/128", GAfahren => "2/3/13", GAsperre => "0/0/129" };
-push @AlleRolllaeden, { name => "Kind Friedhof", winkel1 => 182, winkel2 => 294, wertZuBesch => 86, wertAufBesch => 2,
- wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
- GAraumIstTemp => "0/0/128", GAfahren => "2/3/23", GAsperre => "0/0/129" };
-push @AlleRolllaeden, { name => "Schlafen", winkel1 => 359, winkel2 => 359, wertZuBesch => 82, wertAufBesch => 2,
- wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
- GAraumIstTemp => "0/0/128", GAfahren => "2/3/3", GAsperre => "0/0/129" };
-
-#######################
-### ENDE DEFINITION ###
-#######################
-
-
-# Festlegen, dass das Plugin alle 5 Minuten laufen soll
-$plugin_info{$plugname.'_cycle'} = 300;
-
-# Auf die GA der globalen Sperre anmelden
-#TODO: muss man sich \xFCberhaupt auf die GA anmelden. Sollte doch reichen wenn man den letzten Stand liest...
-$plugin_subscribe{$GASperreAlle}{$plugname} = 1;
-# Fals global gesperrt, Plugin-Durchgang beenden
-if (knx_read($GASperreAlle, 0, 1) == 1) {
- return "Global gesperrt";
-}
-
-# Sonnenstands-Berechnungen durchf\xFChren
-my ($azimuth, $elevation) = berechneSonnenstand($lat, $lon, $elev);
-# Auslesen wo die Sonne beim letzten Durchgang war
-my $lastAzimuth = $plugin_info{$plugname.'_lastAzimuth'};
-my $lastElevation = $plugin_info{$plugname.'_lastElevation'};
-
-# Teste ob es Nacht ist, oder gerade Abend- oder Morgend\xE4mmerung ist
-my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
-my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
-my $testNacht = ($elevation < deg2rad($daemmerung)) || 0;
-# Los gehts. Jeden Rolladen/Fenster/Raum abarbeiten.
-foreach my $element (@AlleRolllaeden) {
- # Falls gesperrt, mit n\xE4chstem Rollladen fortfahren
- if (knx_read($element->{GAsperre}, 0, 1) == 1) {
- next;
- }
- # Die Einfallwinkel in Radians umrechnen
- my $winkel1 = deg2rad($element->{winkel1});
- my $winkel2 = deg2rad($element->{winkel2});
-
- # Teste ob das Fenster beschienen wird
- my $testAktuellBeschienen = ($azimuth > $winkel1 && $azimuth < $winkel2) || 0;
- my $testVoherBeschienen = ($lastAzimuth > $winkel1 && $lastAzimuth < $winkel2) || 0;
-
- # Fenster war nicht beschienen, ist jetzt beschienen, keine Nacht
- if (!$testVoherBeschienen && $testAktuellBeschienen && !$testNacht) {
- fahreRollladen($element->{wertZuBesch}, $element->{GAfahren});
- plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Sonne zufahren bei: " . round(rad2deg($azimuth)));
- }
- # Fenster ist nicht beschienen, war beschienen, keine Nacht
- if ($testVoherBeschienen && !$testAktuellBeschienen && !$testNacht) {
- fahreRollladen($element->{wertAufBesch}, $element->{GAfahren});
- plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Sonne auffahren bei: " . round(rad2deg($azimuth)));
- }
- # AbendDaemmerung
- if ($testAbendDaemmerung && $element->{sonnenAufUnter}) {
- fahreRollladen($element->{wertZuNacht}, $element->{GAfahren});
- plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Abenddaemmerung zufahren bei: " . round(rad2deg($azimuth)));
- }
- # MorgenDaemmerung
- if ($testMorgenDaemmerung && $element->{sonnenAufUnter}) {
- fahreRollladen($element->{wertAufNacht}, $element->{GAfahren});
- plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Morgendaemmerung auffahren bei: " . round(rad2deg($azimuth)));
- }
-}
-
-# F\xFCr die n\xE4chste Iteration den aktuellen Sonnenstand merken
-# TODO: M\xFCsste man sich nicht eigentlich f\xFCr jedes Element den Zustand merken, ob es auf- oder zugefahren wurde???
-# lastAzimuth ging noch als nur der Sonnenstand entscheidend war, ob gefahren wird. Jetzt aber auch lokale Sperre,
-# IstTemperatur, Sonnenschein.
-$plugin_info{$plugname.'_lastAzimuth'} = $azimuth;
-$plugin_info{$plugname.'_lastElevation'} = $elevation;
-# Ende
-return "Grad gegen Norden: " . round(rad2deg($azimuth)) . "; Grad ueber Horizont: " . round(rad2deg($elevation));
-
-
-####################################################
-# Aufruf mit berechneSonnenstand($lat, $lon, $elev);
-####################################################
-sub berechneSonnenstand {
- # Module laden
- use Astro::Coord::ECI;
- use Astro::Coord::ECI::Sun;
- use Astro::Coord::ECI::TLE;
- use Astro::Coord::ECI::Utils qw{rad2deg deg2rad};
- # Aktuelle Zeit
- my $time = time ();
- # Die eigenen Koordinaten
- my $loc = Astro::Coord::ECI->geodetic(deg2rad(shift), deg2rad(shift), shift);
- # Sonne instanzieren
- my $sun = Astro::Coord::ECI::Sun->universal($time);
- # Feststellen wo die Sonne gerade ist
- my ($azimuth, $elevation, $range) = $loc->azel($sun);
- return ($azimuth, $elevation);
-
-
-}
-
-
-####################################################
-# Aufruf mit fahreRollladen($richtung, $GA);
-####################################################
-sub fahreRollladen {
- # Falls $richtung 0 oder 1 ist, wird angenommen, dass der Rollladen
- # komplett zu- bzw. aufgefahren werden soll (DPT3).
- # Bei $richtung>1 wird angenommen, dass eine Positionsfahrt
- # durchgef\xFChrt werden soll (DPT5).
- # TODO: man muss bei Positionsfahrt f\xFCr den Offen-Zustand mindestens 2% angeben...
- # hm, wenn man die GAs ins Wiregate importiert hat, br\xE4uchte man keinerlei
- # Unterscheidung mehr! Und man kann auch 0% bzw 1% benutzen
- my ($richtung, $GA) = @_;
- if ($richtung == 0 || $richtung == 1) {
- # Auf/Zu fahren
- knx_write($GA,$richtung,3);
- }
- else {
- # Position anfahren
- knx_write($GA,$richtung,5);
- }
- # kurze Pause, falls das benutzte Interface das braucht...
- if ($bugfixSlowInterface) {
- usleep(20000);
- }
-}
-
Copied: wiregate/plugin/generic/RollladenAutomatik.pl (from rev 373, wiregate/plugin/generic/Rolladen-Automatik2.pl)
===================================================================
--- wiregate/plugin/generic/RollladenAutomatik.pl (rev 0)
+++ wiregate/plugin/generic/RollladenAutomatik.pl 2011-06-25 13:42:59 UTC (rev 374)
@@ -0,0 +1,224 @@
+######################################################################################
+#
+# Plugin RollladenAutomatik
+# V0.5 2011-06-10
+# Ben\xF6tigt: libastro-satpass-perl -> 'apt-get install libastro-satpass-perl'
+#
+# Ein Wiregate Plugin zum automatischen Fahren der Rolll\xE4den. Es berechnet unter Anderem
+# den Stand der Sonne und f\xE4hrt je nach Winkel der Sonne zum Fenster, den Rollladen in
+# eine Beschattungsposition. Folgende Funktionen werden unterst\xFCtzt:
+# - Sonnenstand (Azimuth)
+# - Anfangs- und Endwinkel (Azimuth) ab dem das Fenster beschienen wird
+# - Globale Sperre duch eine Gruppenadresse
+# - Sperre eines einzelnen Rollladens durch eine Gruppenadresse
+# - Fahren des Rollladen zu (1) oder auf (0) oder Positionsfahren mit Prozentwert
+# - Zufahren bei Dunkelheit am Abend und Hell am Morgen
+# - Bugfix f\xFCr Busch-J\xE4ger USB Schnittstelle (muss eingeschaltet werden)
+#
+# TODO: Was teilweise integriert ist aber noch nicht komplett ist:
+# - Nur zufahren, wenn es im Raum warm genug ist
+# - Wetterstation einbinden: Helligkeit, Sonnenschein, D\xE4mmerung
+# - Bei Fensterdefinition auch Elevation oben bzw. unten angeben
+# - Jalousie Lamellenf\xFChrung
+# - Vorwarnpositionsfahrten?
+# - Englisch oder Deutsch?
+# - Au\xDFentemperaur
+######################################################################################
+
+
+#########################
+### BEGINN DEFINITION ###
+#########################
+
+# Die Koordinaten des Hauses. Sehr einfach \xFCber http://www.getlatlon.com/ zu ermitteln.
+# Und die H\xF6he \xFCber NN
+my ($lat, $lon, $elev) = (
+ 49.02917390736781, # Breitengrad in Grad
+ 8.570709228515625, # L\xE4ngengrad in Grad
+ 180 / 1000 # H\xF6he \xFCber NN in Kilometer (dewegen geteilt durch 1000)
+ );
+
+# Elevation der Sonne, ab der es abends dunkel ist bzw. morgens hell ist.
+# B\xFCrgerliche D\xE4mmerung ist bei -6 Grad.
+my $daemmerung = -3;
+
+# Gruppenadresse, \xFCber welche die komplette Automatik f\xFCr alle Rolll\xE4den gesperrt werden kann
+my $GASperreAlle = "0/0/125";
+
+# Bugfix f\xFCr KNX-Schnittstellen die sich bei zu schneller Telegrammabfolge
+# verschlucken, und denen wir deshalb die Geschwindigkeit der Telegramme drosseln m\xFCssen
+# 0 = nicht anschalten (Telegramme mit voller Geschwindigkeit abfeuern)
+# 1 = anschalten (Telegramme um 20 millisekunden verz\xF6gern)
+# nur f\xFCr "Busch-J\xE4ger 6196 USB REG" ist bekannt das dies ben\xF6tigt wird
+my $bugfixSlowInterface = 0;
+
+# Ein Array von Hashes, wobei jeder Hash ein Rollladen/Fenster/Raum ist.
+my @AlleRolllaeden;
+# Name des Rolladen
+# name => "Speisekammer"
+# Winkel zum Norden, ab dem das Fenster beschienen wird.
+# Echter Osten = 90\xB0, echter S\xFCden = 180\xB0, echter Westen = 270\xB0, echter Norden = 0\xB0
+# winkel1 => 66
+# Winkel zum Norden, bis zu dem das Fenster beschienen wird
+# winkel2 => 186
+# Richtung bei Beschattung: wenn 1 wird DPT3 angenommen und ganz zugefahren.
+# Bei ungleich 1, wird DPT5 angenommen und Position angefahren
+# wertZuBesch => 1
+# Richtung bei keiner Beschattung: wenn 0 wird DPT3 angenommen und ganz aufgefahren.
+# Bei ungleich 0, wird DPT5 angenommen und Position angefahren
+# wertAufBesch => 0
+# Richtung bei Nacht: wenn 1 wird DPT3 angenommen und ganz zugefahren.
+# Bei ungleich 1, wird DPT5 angenommen und Position angefahren
+# wertZuNacht => 1
+# Richtung bei keiner Nacht: wenn 0 wird DPT3 angenommen und ganz aufgefahren.
+# Bei ungleich 0, wird DPT5 angenommen und Position angefahren
+# wertAufNacht => 0
+# Ob der Rollladen in die Automatik f\xFCr Sonnenauf- und untergang einbezogen werden soll
+# sonnenAufUnter => 1
+# Raum-Solltemperatur, wenn keine GA angegeben wurde oder kein Wert vom Bus gelesen wurde
+# raumSollTemp => 22
+# GA der Raum-Solltemperatur
+# GAraumsollTemp => "0/0/127"
+# GA der Raum-Isttemperatur
+# GAraumIstTemp => "0/0/128"
+# GA um Rollladen zu fahren TODO:Sollte man hier mehrere GAs angeben k\xF6nnen?
+# GAfahren => "0/0/126"
+# GA um die Automatik dieses einen Rollladen zu sperren
+# GAsperre=> "0/0/129"
+push @AlleRolllaeden, { name => "Speisekammer", winkel1 => 66, winkel2 => 186, wertZuBesch => 1, wertAufBesch => 0,
+ wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
+ GAraumIstTemp => "0/0/128", GAfahren => "2/1/11", GAsperre => "0/0/129" };
+push @AlleRolllaeden, { name => "K\xFCche", winkel1 => 194, winkel2 => 294, wertZuBesch => 80, wertAufBesch => 2,
+ wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
+ GAraumIstTemp => "0/0/128", GAfahren => "2/2/3", GAsperre => "0/0/129" };
+push @AlleRolllaeden, { name => "Kind Strasse", winkel1 => 182, winkel2 => 294, wertZuBesch => 86, wertAufBesch => 2,
+ wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
+ GAraumIstTemp => "0/0/128", GAfahren => "2/3/13", GAsperre => "0/0/129" };
+push @AlleRolllaeden, { name => "Kind Friedhof", winkel1 => 182, winkel2 => 294, wertZuBesch => 86, wertAufBesch => 2,
+ wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
+ GAraumIstTemp => "0/0/128", GAfahren => "2/3/23", GAsperre => "0/0/129" };
+push @AlleRolllaeden, { name => "Schlafen", winkel1 => 359, winkel2 => 359, wertZuBesch => 82, wertAufBesch => 2,
+ wertZuNacht => 100, wertAufNacht => 2, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "0/0/127",
+ GAraumIstTemp => "0/0/128", GAfahren => "2/3/3", GAsperre => "0/0/129" };
+
+#######################
+### ENDE DEFINITION ###
+#######################
+
+
+# Festlegen, dass das Plugin alle 5 Minuten laufen soll
+$plugin_info{$plugname.'_cycle'} = 300;
+
+# Auf die GA der globalen Sperre anmelden
+#TODO: muss man sich \xFCberhaupt auf die GA anmelden. Sollte doch reichen wenn man den letzten Stand liest...
+$plugin_subscribe{$GASperreAlle}{$plugname} = 1;
+# Fals global gesperrt, Plugin-Durchgang beenden
+if (knx_read($GASperreAlle, 0, 1) == 1) {
+ return "Global gesperrt";
+}
+
+# Sonnenstands-Berechnungen durchf\xFChren
+my ($azimuth, $elevation) = berechneSonnenstand($lat, $lon, $elev);
+# Auslesen wo die Sonne beim letzten Durchgang war
+my $lastAzimuth = $plugin_info{$plugname.'_lastAzimuth'};
+my $lastElevation = $plugin_info{$plugname.'_lastElevation'};
+
+# Teste ob es Nacht ist, oder gerade Abend- oder Morgend\xE4mmerung ist
+my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
+my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
+my $testNacht = ($elevation < deg2rad($daemmerung)) || 0;
+# Los gehts. Jeden Rolladen/Fenster/Raum abarbeiten.
+foreach my $element (@AlleRolllaeden) {
+ # Falls gesperrt, mit n\xE4chstem Rollladen fortfahren
+ if (knx_read($element->{GAsperre}, 0, 1) == 1) {
+ next;
+ }
+ # Die Einfallwinkel in Radians umrechnen
+ my $winkel1 = deg2rad($element->{winkel1});
+ my $winkel2 = deg2rad($element->{winkel2});
+
+ # Teste ob das Fenster beschienen wird
+ my $testAktuellBeschienen = ($azimuth > $winkel1 && $azimuth < $winkel2) || 0;
+ my $testVoherBeschienen = ($lastAzimuth > $winkel1 && $lastAzimuth < $winkel2) || 0;
+
+ # Fenster war nicht beschienen, ist jetzt beschienen, keine Nacht
+ if (!$testVoherBeschienen && $testAktuellBeschienen && !$testNacht) {
+ fahreRollladen($element->{wertZuBesch}, $element->{GAfahren});
+ plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Sonne zufahren bei: " . round(rad2deg($azimuth)));
+ }
+ # Fenster ist nicht beschienen, war beschienen, keine Nacht
+ if ($testVoherBeschienen && !$testAktuellBeschienen && !$testNacht) {
+ fahreRollladen($element->{wertAufBesch}, $element->{GAfahren});
+ plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Sonne auffahren bei: " . round(rad2deg($azimuth)));
+ }
+ # AbendDaemmerung
+ if ($testAbendDaemmerung && $element->{sonnenAufUnter}) {
+ fahreRollladen($element->{wertZuNacht}, $element->{GAfahren});
+ plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Abenddaemmerung zufahren bei: " . round(rad2deg($azimuth)));
+ }
+ # MorgenDaemmerung
+ if ($testMorgenDaemmerung && $element->{sonnenAufUnter}) {
+ fahreRollladen($element->{wertAufNacht}, $element->{GAfahren});
+ plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Morgendaemmerung auffahren bei: " . round(rad2deg($azimuth)));
+ }
+}
+
+# F\xFCr die n\xE4chste Iteration den aktuellen Sonnenstand merken
+# TODO: M\xFCsste man sich nicht eigentlich f\xFCr jedes Element den Zustand merken, ob es auf- oder zugefahren wurde???
+# lastAzimuth ging noch als nur der Sonnenstand entscheidend war, ob gefahren wird. Jetzt aber auch lokale Sperre,
+# IstTemperatur, Sonnenschein.
+$plugin_info{$plugname.'_lastAzimuth'} = $azimuth;
+$plugin_info{$plugname.'_lastElevation'} = $elevation;
+# Ende
+return "Grad gegen Norden: " . round(rad2deg($azimuth)) . "; Grad ueber Horizont: " . round(rad2deg($elevation));
+
+
+####################################################
+# Aufruf mit berechneSonnenstand($lat, $lon, $elev);
+####################################################
+sub berechneSonnenstand {
+ # Module laden
+ use Astro::Coord::ECI;
+ use Astro::Coord::ECI::Sun;
+ use Astro::Coord::ECI::TLE;
+ use Astro::Coord::ECI::Utils qw{rad2deg deg2rad};
+ # Aktuelle Zeit
+ my $time = time ();
+ # Die eigenen Koordinaten
+ my $loc = Astro::Coord::ECI->geodetic(deg2rad(shift), deg2rad(shift), shift);
+ # Sonne instanzieren
+ my $sun = Astro::Coord::ECI::Sun->universal($time);
+ # Feststellen wo die Sonne gerade ist
+ my ($azimuth, $elevation, $range) = $loc->azel($sun);
+ return ($azimuth, $elevation);
+
+
+}
+
+
+####################################################
+# Aufruf mit fahreRollladen($richtung, $GA);
+####################################################
+sub fahreRollladen {
+ # Falls $richtung 0 oder 1 ist, wird angenommen, dass der Rollladen
+ # komplett zu- bzw. aufgefahren werden soll (DPT3).
+ # Bei $richtung>1 wird angenommen, dass eine Positionsfahrt
+ # durchgef\xFChrt werden soll (DPT5).
+ # TODO: man muss bei Positionsfahrt f\xFCr den Offen-Zustand mindestens 2% angeben...
+ # hm, wenn man die GAs ins Wiregate importiert hat, br\xE4uchte man keinerlei
+ # Unterscheidung mehr! Und man kann auch 0% bzw 1% benutzen
+ my ($richtung, $GA) = @_;
+ if ($richtung == 0 || $richtung == 1) {
+ # Auf/Zu fahren
+ knx_write($GA,$richtung,3);
+ }
+ else {
+ # Position anfahren
+ knx_write($GA,$richtung,5);
+ }
+ # kurze Pause, falls das benutzte Interface das braucht...
+ if ($bugfixSlowInterface) {
+ usleep(20000);
+ }
+}
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <csc...@us...> - 2011-08-30 07:28:07
|
Revision: 412
http://openautomation.svn.sourceforge.net/openautomation/?rev=412&view=rev
Author: cschleiffer
Date: 2011-08-30 07:28:00 +0000 (Tue, 30 Aug 2011)
Log Message:
-----------
v0.2 of Kaco datalogger plugin
Added Paths:
-----------
wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog.pl
Removed Paths:
-------------
wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog
Deleted: wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog
===================================================================
--- wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog 2011-08-22 21:16:39 UTC (rev 411)
+++ wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog 2011-08-30 07:28:00 UTC (rev 412)
@@ -1,151 +0,0 @@
-# Monitoring a PV system with Kaco ProLOG
-# v0.1
-
-use LWP::Simple;
-
-# Configuration
-# ****************************
-
-my $myProLogIP = "192.168.178.116"; # IP address of Kaco ProLOG
-my $myCurrentPowerGA = "0/4/236"; # GA for sending current power [W], DPT 14.056
-# ToDo
-my $myEnergy15minGA = "0/4/231"; # GA for sending energy produced in last 15min [Wh], DPT 13.010
-my $myEnergy60minGA = "0/4/232"; # GA for sending energy produced in last 60min [Wh], DPT 13.010
-
-# Arrays to hold GAs for detailed values from the single power converters
-# Use their RS485 bus address as array index
-# If a GA is left empty, it is not send to the bus
-my @myDcVoltageGA; # DC voltage in [V], DPT 14.027
-my @myDcCurrentGA; # DC current in [A], DPT 14.019
-my @myDcPowerGA; # DC power [W], DPT 13.010
-my @myAcVoltageGA; # AC voltage in [V], DPT 14.027
-my @myAcCurrentGA; # AC current in [A], DPT 14.019
-my @myAcPowerGA; # AC power in [W], DPT 13.010
-my @myAcDailyEnergyGA; # Energy output, daily accumulation in [kWh], DPT 13.013
-my @myTemperatureGA; # Temperature of inverter in [°C], DPT 9.001
-my @myStatusGA; # Status of inverter, DPT 5.010
-
-# WR1 Powador 6002
-$myDcVoltageGA[1] = "0/4/237";
-$myDcCurrentGA[1] = "0/4/238";
-$myDcPowerGA[1] = "0/4/239";
-$myAcVoltageGA[1] = "0/4/240";
-$myAcCurrentGA[1] = "0/4/241";
-$myAcPowerGA[1] = "0/4/242";
-$myAcDailyEnergyGA[1] = "0/4/243";
-$myTemperatureGA[1] = "0/4/244";
-$myStatusGA[1] = "0/4/245";
-# WR2 Powador 2002
-$myDcVoltageGA[2] = "0/4/246";
-$myDcCurrentGA[2] = "0/4/247";
-$myDcPowerGA[2] = "0/4/248";
-$myAcVoltageGA[2] = "0/4/249";
-$myAcCurrentGA[2] = "0/4/250";
-$myAcPowerGA[2] = "0/4/251";
-$myAcDailyEnergyGA[2] = "0/4/252";
-$myTemperatureGA[2] = "0/4/253";
-$myStatusGA[2] = "0/4/254";
-
-
-# End Configuration
-# *****************************
-# Do not change below here
-
-my $mySummaryDataDownloadPath = "/html/de/locale_live_standard.html";
-my $myDetailedDataDownloadPath = "/get_online_wr.cgi?q=U_DC_0;I_DC_0;P_DC_WR;U_AC_0;I_AC_0;P_AC_WR;T_WR;E_D_WR;S";
-my @myWRStatusMsg;
-
-$myWRStatusMsg[ 0] = 'WR gerade eingeschaltet';
-$myWRStatusMsg[ 1] = 'Warten auf Start';
-$myWRStatusMsg[ 2] = 'Warten auf Ausschalten';
-$myWRStatusMsg[ 3] = 'Konstantspannungsregler';
-$myWRStatusMsg[ 5] = 'Einspeisung (MPP-Tracker)';
-$myWRStatusMsg[ 8] = 'Selbsttest';
-$myWRStatusMsg[ 9] = 'Testbetrieb';
-$myWRStatusMsg[10] = 'Gerätetemperatur zu hoch';
-$myWRStatusMsg[11] = 'Leistungsbegrenzung';
-$myWRStatusMsg[29] = 'Erdschluss Sicherung prüfen!';
-$myWRStatusMsg[30] = 'Störung Messwandler';
-$myWRStatusMsg[32] = 'Fehler Selbsttest';
-$myWRStatusMsg[33] = 'Fehler DC-Einspeisung';
-$myWRStatusMsg[34] = 'Fehler Kommunikation';
-$myWRStatusMsg[35] = 'Schutzabschaltung (SW)';
-$myWRStatusMsg[36] = 'Schutzabschaltung (HW)';
-$myWRStatusMsg[38] = 'Fehler PV-Überspannung';
-$myWRStatusMsg[41] = 'Netzstörung Unterspannung';
-$myWRStatusMsg[42] = 'Netzstörung Überspannung';
-$myWRStatusMsg[48] = 'Netzstörung Unterfrequenz';
-$myWRStatusMsg[49] = 'Netzstörung Überfrequenz';
-$myWRStatusMsg[50] = 'Netzstörung Mittelwert Spg';
-$myWRStatusMsg[51] = 'Netzstörung Überspannung L1';
-$myWRStatusMsg[52] = 'Netzstörung Unterspannung L1';
-$myWRStatusMsg[53] = 'Netzstörung Überspannung L2';
-$myWRStatusMsg[54] = 'Netzstörung Unterspannung L2';
-$myWRStatusMsg[55] = 'Fehler Zwischenkreis';
-$myWRStatusMsg[57] = 'Warten auf Wiederzuschalten';
-$myWRStatusMsg[58] = 'Übertemperatur Steuerkarte';
-$myWRStatusMsg[59] = 'Fehler Selbsttest';
-$myWRStatusMsg[60] = 'PV-Spannung zu hoch';
-$myWRStatusMsg[61] = 'Power-Control';
-$myWRStatusMsg[62] = 'Inselbetrieb';
-$myWRStatusMsg[63] = 'Frequenzabhängige Leistungsreduzierung';
-$myWRStatusMsg[64] = 'Ausgangsstrombegrenzung';
-$myWRStatusMsg[''] = 'Nicht verfügbar/ausgeschaltet';
-
-$plugin_info{$plugname.'_cycle'} = 30;
-
-my $content = get( "http://$myProLogIP$mySummaryDataDownloadPath" );
-return "Übersichts-Webabfrage fehlgeschlagen" unless defined $content;
-
-my @myOverview = split( /\|/, $content );
-
-# calculate W from kW
-$myOverview[0] *= 1000;
-
-knx_write( $myCurrentPowerGA , $myOverview[0], 14 );
-update_rrd("PV", "P_total", $myOverview[0] );
-
-
-# more detailed data are requested here
-
-$content = get( "http://$myProLogIP$myDetailedDataDownloadPath" );
-return "Detail-Webabfrage fehlgeschlagen" unless defined $content;
-
-my @myDetails = split( /\n/, $content );
-my $myWRStatusChanges = '';
-
-for my $i (2 .. $#myDetails - 1) {
- $myDetails[$i] =~ s/\r//g; # remove carrige return
- my @myWRDetails = split( /;/, $myDetails[$i] );
-
- # only process if system supplies values
- if( $myWRDetails[2] != '' ) {
- # store and send values
- update_rrd( 'PV', "DcVoltage_WR$myWRDetails[1]", $myWRDetails[2] );
- if( $myDcVoltageGA[ $myWRDetails[1] ] ) { knx_write( $myDcVoltageGA[ $myWRDetails[1] ], $myWRDetails[2], 14 ); }
- update_rrd( 'PV', "DcCurrent_WR$myWRDetails[1]", $myWRDetails[3] );
- if( $myDcCurrentGA[ $myWRDetails[1] ] ) { knx_write( $myDcCurrentGA[ $myWRDetails[1] ], $myWRDetails[3], 14 ); }
- update_rrd( 'PV', "DcPower_WR$myWRDetails[1]", $myWRDetails[4] );
- if( $myDcPowerGA[ $myWRDetails[1] ] ) { knx_write( $myDcPowerGA[ $myWRDetails[1] ], $myWRDetails[4], 13 ); }
- update_rrd( 'PV', "AcVoltage_WR$myWRDetails[1]", $myWRDetails[5] );
- if( $myAcVoltageGA[ $myWRDetails[1] ] ) { knx_write( $myAcVoltageGA[ $myWRDetails[1] ], $myWRDetails[5], 14 ); }
- update_rrd( 'PV', "AcCurrent_WR$myWRDetails[1]", $myWRDetails[6] );
- if( $myAcCurrentGA[ $myWRDetails[1] ] ) { knx_write( $myAcCurrentGA[ $myWRDetails[1] ], $myWRDetails[6], 14 ); }
- update_rrd( 'PV', "AcPower_WR$myWRDetails[1]", $myWRDetails[7] );
- if( $myAcPowerGA[ $myWRDetails[1] ] ) { knx_write( $myAcPowerGA[ $myWRDetails[1] ], $myWRDetails[7], 13 ); }
- update_rrd( 'PV', "Temperature_WR$myWRDetails[1]", $myWRDetails[8] );
- if( $myTemperatureGA[ $myWRDetails[1] ] ) { knx_write( $myTemperatureGA[ $myWRDetails[1] ], $myWRDetails[8], 9 ); }
- update_rrd( 'PV', "DailyEnergy_WR$myWRDetails[1]", $myWRDetails[9] / 1000 );
- if( $myAcDailyEnergyGA[ $myWRDetails[1] ] ) { knx_write( $myAcDailyEnergyGA[ $myWRDetails[1] ], $myWRDetails[9]/1000, 13 ); }
- update_rrd( 'PV', "Status_WR$myWRDetails[1]", $myWRDetails[10] );
- if( $myStatusGA[ $myWRDetails[1] ] ) { knx_write( $myStatusGA[ $myWRDetails[1] ], $myWRDetails[10], 5 ); }
-
- # save last status of inverter
- if ( $myWRDetails[10] != $plugin_info{$plugname."_WRState$myWRDetails[1]"} ) {
- $myWRStatusChanges .= "WR$myWRDetails[1] Status ".$plugin_info{$plugname."_WRState$myWRDetails[1]"}." (".$myWRStatusMsg[$plugin_info{$plugname."_WRState$myWRDetails[1]"}].") -> ".$myWRDetails[10]." ($myWRStatusMsg[$myWRDetails[10]]) , ";
- $plugin_info{$plugname."_WRState$myWRDetails[1]"} = $myWRDetails[10];
- }
- }
-}
-return $myWRStatusChanges;
-
Copied: wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog.pl (from rev 411, wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog)
===================================================================
--- wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog.pl (rev 0)
+++ wiregate/plugin/generic/Datenlogger-PV-Kaco-Prolog.pl 2011-08-30 07:28:00 UTC (rev 412)
@@ -0,0 +1,186 @@
+# Monitoring a PV system with Kaco ProLOG
+# v0.2
+# License: GPL v2
+
+use LWP::Simple;
+use HTML::TableExtract; # get it with 'apt-get install libhtml-tableextract-perl'
+
+# Configuration
+# ****************************
+
+my $myProLogIP = "192.168.178.116"; # IP address of Kaco ProLOG
+my $myCurrentPowerGA = "0/4/236"; # GA for sending current power [W], DPT 14.056
+my $myEnergyTodayGA = "0/4/233"; # GA for sending energy produced this day [Wh], DPT 13.010
+my $myEneryYesterdayGA = "";
+my $myEnergyThisMonthGA = "0/4/234"; # GA for sending energy produced this month [kWh], DPT 13.013
+my $myEnergyThisYearGA = "0/4/235"; # GA for sending energy produced this year [Wh], DPT 13.013
+my $myEnergyTotalGA = "0/4/230"; # GA for sending total accumulated enery production [kWh], DPT 13.013
+# ToDo
+my $myEnergy15minGA = "0/4/231"; # GA for sending energy produced in last 15min [Wh], DPT 13.010
+my $myEnergy60minGA = "0/4/232"; # GA for sending energy produced in last 60min [Wh], DPT 13.010
+
+
+# Arrays to hold GAs for detailed values from the single power converters
+# Use their RS485 bus address as array index
+# If a GA is left empty, it is not send to the bus
+my @myDcVoltageGA; # DC voltage in [V], DPT 14.027
+my @myDcCurrentGA; # DC current in [A], DPT 14.019
+my @myDcPowerGA; # DC power [W], DPT 13.010
+my @myAcVoltageGA; # AC voltage in [V], DPT 14.027
+my @myAcCurrentGA; # AC current in [A], DPT 14.019
+my @myAcPowerGA; # AC power in [W], DPT 13.010
+my @myAcDailyEnergyGA; # Energy output, daily accumulation in [kWh], DPT 13.013
+my @myTemperatureGA; # Temperature of inverter in [°C], DPT 9.001
+my @myStatusGA; # Status of inverter, DPT 5.010
+
+# WR1 Powador 6002
+$myDcVoltageGA[1] = "0/4/237";
+$myDcCurrentGA[1] = "0/4/238";
+$myDcPowerGA[1] = "0/4/239";
+$myAcVoltageGA[1] = "0/4/240";
+$myAcCurrentGA[1] = "0/4/241";
+$myAcPowerGA[1] = "0/4/242";
+$myAcDailyEnergyGA[1] = "0/4/243";
+$myTemperatureGA[1] = "0/4/244";
+$myStatusGA[1] = "0/4/245";
+# WR2 Powador 2002
+$myDcVoltageGA[2] = "0/4/246";
+$myDcCurrentGA[2] = "0/4/247";
+$myDcPowerGA[2] = "0/4/248";
+$myAcVoltageGA[2] = "0/4/249";
+$myAcCurrentGA[2] = "0/4/250";
+$myAcPowerGA[2] = "0/4/251";
+$myAcDailyEnergyGA[2] = "0/4/252";
+$myTemperatureGA[2] = "0/4/253";
+$myStatusGA[2] = "0/4/254";
+
+
+# End Configuration
+# *****************************
+# Do not change below here
+
+my $mySummaryDataDownloadPath = "/html/de/locale_live_standard.html";
+my $myDetailedDataDownloadPath = "/get_online_wr.cgi?q=U_DC_0;I_DC_0;P_DC_WR;U_AC_0;I_AC_0;P_AC_WR;T_WR;E_D_WR;S";
+my $myWrOverviewPath = "/html/de/onlineOverWr.html";
+my @myWRStatusMsg;
+
+$myWRStatusMsg[ 0] = 'WR gerade eingeschaltet';
+$myWRStatusMsg[ 1] = 'Warten auf Start';
+$myWRStatusMsg[ 2] = 'Warten auf Ausschalten';
+$myWRStatusMsg[ 3] = 'Konstantspannungsregler';
+$myWRStatusMsg[ 5] = 'Einspeisung (MPP-Tracker)';
+$myWRStatusMsg[ 8] = 'Selbsttest';
+$myWRStatusMsg[ 9] = 'Testbetrieb';
+$myWRStatusMsg[10] = 'Gerätetemperatur zu hoch';
+$myWRStatusMsg[11] = 'Leistungsbegrenzung';
+$myWRStatusMsg[29] = 'Erdschluss Sicherung prüfen!';
+$myWRStatusMsg[30] = 'Störung Messwandler';
+$myWRStatusMsg[32] = 'Fehler Selbsttest';
+$myWRStatusMsg[33] = 'Fehler DC-Einspeisung';
+$myWRStatusMsg[34] = 'Fehler Kommunikation';
+$myWRStatusMsg[35] = 'Schutzabschaltung (SW)';
+$myWRStatusMsg[36] = 'Schutzabschaltung (HW)';
+$myWRStatusMsg[38] = 'Fehler PV-Überspannung';
+$myWRStatusMsg[41] = 'Netzstörung Unterspannung';
+$myWRStatusMsg[42] = 'Netzstörung Überspannung';
+$myWRStatusMsg[48] = 'Netzstörung Unterfrequenz';
+$myWRStatusMsg[49] = 'Netzstörung Überfrequenz';
+$myWRStatusMsg[50] = 'Netzstörung Mittelwert Spg';
+$myWRStatusMsg[51] = 'Netzstörung Überspannung L1';
+$myWRStatusMsg[52] = 'Netzstörung Unterspannung L1';
+$myWRStatusMsg[53] = 'Netzstörung Überspannung L2';
+$myWRStatusMsg[54] = 'Netzstörung Unterspannung L2';
+$myWRStatusMsg[55] = 'Fehler Zwischenkreis';
+$myWRStatusMsg[57] = 'Warten auf Wiederzuschalten';
+$myWRStatusMsg[58] = 'Übertemperatur Steuerkarte';
+$myWRStatusMsg[59] = 'Fehler Selbsttest';
+$myWRStatusMsg[60] = 'PV-Spannung zu hoch';
+$myWRStatusMsg[61] = 'Power-Control';
+$myWRStatusMsg[62] = 'Inselbetrieb';
+$myWRStatusMsg[63] = 'Frequenzabhängige Leistungsreduzierung';
+$myWRStatusMsg[64] = 'Ausgangsstrombegrenzung';
+$myWRStatusMsg[''] = 'Nicht verfügbar/ausgeschaltet';
+
+$plugin_info{$plugname.'_cycle'} = 30;
+
+my $content = get( "http://$myProLogIP$mySummaryDataDownloadPath" );
+return "Übersichts-Webabfrage fehlgeschlagen" unless defined $content;
+
+my @myOverview = split( /\|/, $content );
+
+# calculate W from kW
+$myOverview[0] *= 1000;
+
+knx_write( $myCurrentPowerGA , $myOverview[0], 14 );
+update_rrd("PV", "P_total", $myOverview[0] );
+
+# more detailed data are requested here
+$content = get( "http://$myProLogIP$myDetailedDataDownloadPath" );
+return "Detail-Webabfrage fehlgeschlagen" unless defined $content;
+
+my @myDetails = split( /\n/, $content );
+my $myWRStatusChanges = '';
+
+for my $i (2 .. $#myDetails - 1) {
+ $myDetails[$i] =~ s/\r//g; # remove carrige return
+ my @myWRDetails = split( /;/, $myDetails[$i] );
+
+ # only process if system supplies values
+ if( $myWRDetails[2] != '' ) {
+ # store and send values
+ update_rrd( 'PV', "DcVoltage_WR$myWRDetails[1]", $myWRDetails[2] );
+ if( $myDcVoltageGA[ $myWRDetails[1] ] ) { knx_write( $myDcVoltageGA[ $myWRDetails[1] ], $myWRDetails[2], 14 ); }
+ update_rrd( 'PV', "DcCurrent_WR$myWRDetails[1]", $myWRDetails[3] );
+ if( $myDcCurrentGA[ $myWRDetails[1] ] ) { knx_write( $myDcCurrentGA[ $myWRDetails[1] ], $myWRDetails[3], 14 ); }
+ update_rrd( 'PV', "DcPower_WR$myWRDetails[1]", $myWRDetails[4] );
+ if( $myDcPowerGA[ $myWRDetails[1] ] ) { knx_write( $myDcPowerGA[ $myWRDetails[1] ], $myWRDetails[4], 13 ); }
+ update_rrd( 'PV', "AcVoltage_WR$myWRDetails[1]", $myWRDetails[5] );
+ if( $myAcVoltageGA[ $myWRDetails[1] ] ) { knx_write( $myAcVoltageGA[ $myWRDetails[1] ], $myWRDetails[5], 14 ); }
+ update_rrd( 'PV', "AcCurrent_WR$myWRDetails[1]", $myWRDetails[6] );
+ if( $myAcCurrentGA[ $myWRDetails[1] ] ) { knx_write( $myAcCurrentGA[ $myWRDetails[1] ], $myWRDetails[6], 14 ); }
+ update_rrd( 'PV', "AcPower_WR$myWRDetails[1]", $myWRDetails[7] );
+ if( $myAcPowerGA[ $myWRDetails[1] ] ) { knx_write( $myAcPowerGA[ $myWRDetails[1] ], $myWRDetails[7], 13 ); }
+ update_rrd( 'PV', "Temperature_WR$myWRDetails[1]", $myWRDetails[8] );
+ if( $myTemperatureGA[ $myWRDetails[1] ] ) { knx_write( $myTemperatureGA[ $myWRDetails[1] ], $myWRDetails[8], 9 ); }
+ update_rrd( 'PV', "DailyEnergy_WR$myWRDetails[1]", $myWRDetails[9] / 1000 );
+ if( $myAcDailyEnergyGA[ $myWRDetails[1] ] ) { knx_write( $myAcDailyEnergyGA[ $myWRDetails[1] ], $myWRDetails[9]/1000, 13 ); }
+ update_rrd( 'PV', "Status_WR$myWRDetails[1]", $myWRDetails[10] );
+ if( $myStatusGA[ $myWRDetails[1] ] ) { knx_write( $myStatusGA[ $myWRDetails[1] ], $myWRDetails[10], 5 ); }
+
+ # save last status of inverter
+ if ( $myWRDetails[10] != $plugin_info{$plugname."_WRState$myWRDetails[1]"} ) {
+ $myWRStatusChanges .= "WR$myWRDetails[1] Status ".$plugin_info{$plugname."_WRState$myWRDetails[1]"}." (".$myWRStatusMsg[$plugin_info{$plugname."_WRState$myWRDetails[1]"}].") -> ".$myWRDetails[10]." ($myWRStatusMsg[$myWRDetails[10]]) , ";
+ $plugin_info{$plugname."_WRState$myWRDetails[1]"} = $myWRDetails[10];
+ }
+ }
+}
+
+
+$content = get( "http://$myProLogIP$myWrOverviewPath" );
+return "Übersichts-Webabfrage fehlgeschlagen" unless defined $content;
+
+my $tables = HTML::TableExtract->new( );
+$tables->parse($content);
+
+my $lastElement = "";
+foreach my $table ($tables->tables) {
+ foreach my $rowCols ($table->rows) {
+ foreach my $col (@$rowCols) {
+ if( $lastElement eq "Aktuelle Monatsenergie" ) {
+ knx_write( $myEnergyThisMonthGA , $col, 13 );
+ } elsif ( $lastElement eq "Aktuelle Tagesenergie" ) {
+ knx_write( $myEnergyTodayGA , $col, 13 );
+ } elsif ( $lastElement eq "Aktuelle Jahresenergie" ) {
+ knx_write( $myEnergyThisYearGA , $col, 13 );
+ } elsif ( $lastElement eq "Tagesenergie Vortag" ) {
+ knx_write( $myEneryYesterdayGA , $col, 13 );
+ } elsif ( $lastElement eq "Gesamtenergie" ) {
+ knx_write( $myEnergyTotalGA , $col, 13 );
+ }
+ $lastElement = $col;
+ }
+ }
+}
+
+
+return $myWRStatusChanges;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <j-...@us...> - 2011-09-24 19:32:42
|
Revision: 426
http://openautomation.svn.sourceforge.net/openautomation/?rev=426&view=rev
Author: j-n-k
Date: 2011-09-24 19:32:35 +0000 (Sat, 24 Sep 2011)
Log Message:
-----------
Kleinere Fixes Heizung.pl Fensterstatus.pl
Modified Paths:
--------------
wiregate/plugin/generic/Fensterstatus.pl
Added Paths:
-----------
wiregate/plugin/generic/Heizung.pl
Removed Paths:
-------------
wiregate/plugin/generic/Heizung
Modified: wiregate/plugin/generic/Fensterstatus.pl
===================================================================
--- wiregate/plugin/generic/Fensterstatus.pl 2011-09-24 19:05:53 UTC (rev 425)
+++ wiregate/plugin/generic/Fensterstatus.pl 2011-09-24 19:32:35 UTC (rev 426)
@@ -1,34 +1,43 @@
+# Plugin zum Erfassen des Gesamt-Fenster-Status
+# Version 0.3 / 24.09.2011
+# Copyright: JNK (http://knx-user-forum.de/members/jnk.html)
+# License: GPL (v2)
#
-# Fensterstatus v0.2
-#
-# by JNK, 2011-09-19
+####################
+###Einstellungen:###
+####################
my @Fenster_GA = ('7/7/7', '7/7/8'); # hier alle Fenster-Einzel-GA
my $Sammel_GA = '7/7/9'; # hier die Sammel-GA
my $zustand_geschlossen = 01; # auf richtige polarit\xE4t achten!
my $zustand_offen = 00;
-
+######################
+##ENDE Einstellungen##
+######################
+
+#
# Flossen weg, der Rest geht automatisch
+#
$plugin_info{$plugname.'_cycle'} = 0; # nur bei Telegramm aufrufen
if (($msg{'apci'} eq 'A_GroupValue_Write') && (grep {$_ eq $msg{'dst'};} @Fenster_GA)) {
- # Telegramm auf einer Einzel-GA erhalten
- my $status = $zustand_geschlossen; # mit geschlossen anfangen
- my $old_status = $plugin_info{$plugname.'_oldstatus'};
- foreach my $GA (@Fenster_GA) {
- if (knx_read($GA, 0, 1) == $zustand_offen) { # da war eine 'offen', also Status auf 1 setzen
- $status = $zustand_offen;
- last;
- }
- }
- if ($old_status != $status){ #
- knx_write($Sammel_GA, $status, 1); # Status hat sich geaendert, senden
- $plugin_info{$plugname.'_oldstatus'} = $status; # neuen Status speichern
- }
-
- return 'Sent Value'.$status;
+ # Telegramm auf einer Einzel-GA erhalten
+ my $status = $zustand_geschlossen; # mit geschlossen anfangen
+ my $old_status = $plugin_info{$plugname.'_oldstatus'};
+ foreach my $GA (@Fenster_GA) {
+ if (knx_read($GA, 0, 1) == $zustand_offen) { # da war eine 'offen', also Status auf 1 setzen
+ $status = $zustand_offen;
+ last;
+ }
+ }
+ if ($old_status != $status){ #
+ knx_write($Sammel_GA, $status, 1); # Status hat sich geaendert, senden
+ $plugin_info{$plugname.'_oldstatus'} = $status; # neuen Status speichern
+ return 'Sent Value'.$status;
+ }
+ return 0; # nichts gesendet, Also
}
# keine Telegramme, also Init
Deleted: wiregate/plugin/generic/Heizung
===================================================================
--- wiregate/plugin/generic/Heizung 2011-09-24 19:05:53 UTC (rev 425)
+++ wiregate/plugin/generic/Heizung 2011-09-24 19:32:35 UTC (rev 426)
@@ -1,53 +0,0 @@
-# Heizungsregelung
-# Plugin h\xF6rt auf GA des Auf/Ab-Befehles und schickt neuen Sollwert
-# V0.1 2011-05-18
-# by Jan N. Klug
-
-### Definitionen
-my $schritt_ga = '4/1/3'; # Gruppenadresse Sollwert Auf = 1 / Ab = 0
-my $sollwert_ga = '4/2/3'; # Gruppenadresse Sollwert
-my $sollwert = 15;
-my $sollwertmin = 10; # Sollwert Minimum
-my $sollwertmax = 25; # Sollwert Maximum
-### Ende Definitionen
-
-# Eigenen Aufruf-Zyklus auf 1x st\xFCndlich setzen, h\xF6rt ja auf GA
-$plugin_info{$plugname.'_cycle'} = 3600;
-$sollwert = $plugin_info{$plugname.'_sollwert'};
-
-# Plugin an Gruppenadresse "anmelden"
-$plugin_subscribe{$schritt_ga}{$plugname} = 1;
-$plugin_subscribe{$sollwert_ga}{$plugname} = 1;
-
-# 1=auf, 0=ab
-if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $schritt_ga && defined $msg{'value'} && $msg{'value'} == "0" ) {
- if($sollwert>$sollwertmin) {
- $sollwert -= 0.5;
- knx_write($sollwert_ga,$sollwert,9);
- $plugin_info{$plugname.'_sollwert'} = $sollwert;
- return 1;
- }
-}
-
-if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $schritt_ga && defined $msg{'value'} && $msg{'value'} == "1" ) {
- if($sollwert<$sollwertmax) {
- $sollwert += 0.5;
- knx_write($sollwert_ga,$sollwert,9);
- $plugin_info{$plugname.'_sollwert'} = $sollwert;
- return 1;
- }
-}
-
-#Sollwert vom Bus lesen, wenn von dort gesendet
-if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $sollwert_ga ) {
-# if (!defined $msg{'value'}) {
- # falls GA/DPT nicht importiert
- $msg{'value'} = decode_dpt9($msg{'data'});
-# }
- $plugin_info{$plugname.'_sollwert'} = $msg{'value'};
- return 2;
-}
-
-knx_write($sollwert_ga,$sollwert,9);
-
-return 0;
Added: wiregate/plugin/generic/Heizung.pl
===================================================================
--- wiregate/plugin/generic/Heizung.pl (rev 0)
+++ wiregate/plugin/generic/Heizung.pl 2011-09-24 19:32:35 UTC (rev 426)
@@ -0,0 +1,58 @@
+# Plugin zum Erfassen des Gesamt-Fenster-Status
+# Version 0.1 / 18.05.2011
+# Copyright: JNK (http://knx-user-forum.de/members/jnk.html)
+# License: GPL (v2)
+#
+
+####################
+###Einstellungen:###
+####################
+
+my $schritt_ga = '4/1/3'; # Gruppenadresse Sollwert Auf = 1 / Ab = 0
+my $sollwert_ga = '4/2/3'; # Gruppenadresse Sollwert
+my $sollwert = 15;
+my $sollwertmin = 10; # Sollwert Minimum
+my $sollwertmax = 25; # Sollwert Maximum
+
+
+######################
+##ENDE Einstellungen##
+######################
+
+# Eigenen Aufruf-Zyklus auf 1x st\xFCndlich setzen, h\xF6rt ja auf GA
+$plugin_info{$plugname.'_cycle'} = 3600;
+$sollwert = $plugin_info{$plugname.'_sollwert'};
+
+# Plugin an Gruppenadresse "anmelden"
+$plugin_subscribe{$schritt_ga}{$plugname} = 1;
+$plugin_subscribe{$sollwert_ga}{$plugname} = 1;
+
+# 1=auf, 0=ab
+if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $schritt_ga && defined $msg{'value'} && $msg{'value'} == "0" ) {
+ if($sollwert>$sollwertmin) {
+ $sollwert -= 0.5;
+ knx_write($sollwert_ga,$sollwert,9);
+ $plugin_info{$plugname.'_sollwert'} = $sollwert;
+ return 1;
+ }
+}
+
+if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $schritt_ga && defined $msg{'value'} && $msg{'value'} == "1" ) {
+ if($sollwert<$sollwertmax) {
+ $sollwert += 0.5;
+ knx_write($sollwert_ga,$sollwert,9);
+ $plugin_info{$plugname.'_sollwert'} = $sollwert;
+ return 1;
+ }
+}
+
+#Sollwert vom Bus lesen, wenn von dort gesendet
+if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $sollwert_ga ) {
+ $msg{'value'} = decode_dpt9($msg{'data'});
+ $plugin_info{$plugname.'_sollwert'} = $msg{'value'};
+ return 2;
+}
+
+knx_write($sollwert_ga,$sollwert,9);
+
+return 0;
Property changes on: wiregate/plugin/generic/Heizung.pl
___________________________________________________________________
Added: svn:executable
+ *
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <e....@us...> - 2011-10-23 13:30:34
|
Revision: 471
http://openautomation.svn.sourceforge.net/openautomation/?rev=471&view=rev
Author: e.max
Date: 2011-10-23 13:30:28 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
Konfigurationsverzeichnis fuer Plugins, die externe Konfigurationen nutzen
Added Paths:
-----------
wiregate/plugin/generic/conf.d/
wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample
wiregate/plugin/generic/conf.d/emx_dcode.conf_sample
wiregate/plugin/generic/conf.d/emx_sonne.conf_sample
wiregate/plugin/generic/conf.d/emx_uhr.conf.sample
Added: wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,49 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# Einstellungen: Alle zu loeschenden Schluessel aus %plugin_info
+# Vorsicht: man kann leicht alles loeschen, da es sich um regulaere Ausdruecke
+# handelt. Ein Punkt zum Beispiel entspricht einem beliebigen
+# Zeichen. Ohne die Zeichen '^' und '$' sind dabei auch Teilvergleiche
+# gueltig:
+#
+# 'abc' loescht alles, was 'abc' _enthaelt_ !!
+# '^abc' loescht alles, was mit 'abc' _beginnt_ !!
+# 'abc$' loescht alles, was mit 'abc' _endet_ !!
+#
+# Wer nicht sicher ist, sollte im Forum fragen, auf jeden Fall aber
+# die Variable $Loeschen erst mal nicht auf 'Y' setzen.
+#
+# Nur wenn $Loeschen auf 'Y' steht, wird auch wirklich geloescht,
+# ansonsten wird nur ein Logeintrag geschrieben: '... matches /$key/'
+#
+# Wenn $Loeschen auf 'Y' gesetzt wird, loescht das Beispiel alle
+# Eintraege, die mit einem '#' beginnen oder eine Tilde enthalten.
+# Das sind die typischen Editor-Arbeitsdateien des 'emacs' Editors,
+# die bei der Aenderung eines Plugins entstehen und vom wiregated
+# wie Plugins behandelt werden, und dann im %plugin_info hash
+# auftauchen (und da natuerlich auch wieder raus sollten).
+#
+# Es empfiehlt sich, das Script nach der Bereinigung zu loeschen,
+# und nur bei Bedarf wieder einzustellen, da es natuerlich
+# Ressourcen verbraucht.
+#
+# Wer auf die Ausfuehrung nicht warten moechte, bis die naechste
+# Zykluszeit abgelaufen ist, kann die sofortige Ausfuehrung per
+# Kommandozeilen-Eingabe mit einem 'touch emx_cleanup.pl' erzwingen.
+#-----------------------------------------------------------------------------
+
+$cycleTime = 24*3600;
+$Loeschen = 'N';
+@Keys = ('^#', '~');
+
+#-----------------------------------------------------------------------------
+# ENDE Einstellungen
+#-----------------------------------------------------------------------------
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample
___________________________________________________________________
Added: svn:keywords
+ Id
Added: wiregate/plugin/generic/conf.d/emx_dcode.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_dcode.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_dcode.conf_sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# ACHTUNG: Variablen duerfen nur (und muessen) im Plugin
+# mit 'my' definiert werden,
+# 'my' hier nicht verwenden!
+#-----------------------------------------------------------------------------
+
+#------------------------
+# Konfigurierbare Werte
+#------------------------
+
+$pauseSec = 1.0; # Pausenzeit, nach der eine Ziffer komplett ist
+$completeAfter = 4; # Wartezeit in Sekunden, nach der der Code ausgewertet wird
+$maxFails = 3; # Anzahl Fehlversuche
+$blockPeriod = 30; # anfaengliche Blockadezeit in Sekunden.
+$maxBlockPeriod = 3600; # maximale Blockadezeit
+
+#-----------------------------------------------------------------------------
+# - Es koennen beliebig viele Eintraege fuer ein und den selben Code gemacht
+# werden, sie werden alle ausgefuehrt.
+# - Wird ein 'FromPA' Wert angegeben, wird der Code nur von dieser PA akzeptiert.
+# - 'FromGA' und 'ToGA' duerfen nicht identisch sein.
+# - Der Code darf nur aus Ziffern bestehen, muss aber in Hochkommas angegeben
+# werden. So gehen auch fuehrende Nullen. Zehn Tastendruecke sind eine Null.
+#-----------------------------------------------------------------------------
+@Codes =
+ (
+ { Active=>1, Code=>'123',FromGA=>'1/1/121', FromPA=>undef, Value=>'1', DPT=>'1', ToGA=>'1/1/123', Log=>'1' },
+ { Active=>1, Code=>'123',FromGA=>'1/1/121', FromPA=>undef, Value=>'1', DPT=>'1', ToGA=>'3/2/1', Log=>'1' },
+ { Active=>1, Code=>'321',FromGA=>'1/1/121', FromPA=>undef, Value=>'0', DPT=>'1', ToGA=>'1/1/123', Log=>'1' },
+ { Active=>1, Code=>'456',FromGA=>'1/1/121', FromPA=>undef, Value=>'1', DPT=>'1', ToGA=>'1/1/121', Log=>'1' },
+ );
+
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_dcode.conf_sample
___________________________________________________________________
Added: svn:keywords
+ Id
Added: wiregate/plugin/generic/conf.d/emx_sonne.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_sonne.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_sonne.conf_sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# Einstellungen: Laengen- und Breitengrad
+#-----------------------------------------------------------------------------
+$Breite = 50.0;
+$Laenge = 8.03;
+
+#-----------------------------------------------------------------------------
+# ENDE Einstellungen
+#-----------------------------------------------------------------------------
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_sonne.conf_sample
___________________________________________________________________
Added: svn:keywords
+ Id
Added: wiregate/plugin/generic/conf.d/emx_uhr.conf.sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_uhr.conf.sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_uhr.conf.sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# ACHTUNG: Variablen duerfen nur im Plugin mit 'my' definiert werden,
+# 'my' hier nicht verwenden!
+#-----------------------------------------------------------------------------
+
+#------------------------
+# Konfigurierbare Werte
+#------------------------
+
+@Zeiten =
+ (
+ # Aussenlicht und Aussensteckdosen zyklisch ausschalten
+ { Name=>'ELW_Terrassenlicht', Aktiv=>'1', Min=>'0-59', Wert=>'0', DPT=>'1', GA=>'1/5/92', Log=>'1' },
+ );
+
+#-----------------------------------------------------------------
+# $slotEnd definiert die Sekunde, ab der neu synchronisiert wird
+# ACHTUNG: Sollte nicht kleiner als 1 Sekunde sein.
+#-----------------------------------------------------------------
+$slotEnd = 3;
+
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_uhr.conf.sample
___________________________________________________________________
Added: svn:keywords
+ Id
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-23 16:34:08
|
Revision: 472
http://openautomation.svn.sourceforge.net/openautomation/?rev=472&view=rev
Author: makki1
Date: 2011-10-23 16:34:01 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
wiregate-plugins: MinMaxRRD2GA, RolladenLuetung, HHK
Added Paths:
-----------
wiregate/plugin/generic/Handtuchtrockner.pl
wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl
wiregate/plugin/generic/RolladenLueftungsPos.pl
Added: wiregate/plugin/generic/Handtuchtrockner.pl
===================================================================
--- wiregate/plugin/generic/Handtuchtrockner.pl (rev 0)
+++ wiregate/plugin/generic/Handtuchtrockner.pl 2011-10-23 16:34:01 UTC (rev 472)
@@ -0,0 +1,71 @@
+# Plugin zur Steuerung eines Handtuchtrockners
+# http://knx-user-forum.de/wiregate/16209-plugin-zur-steuerung-eines-handtuchtrockners-2.html
+# Sommer > Heizen über E-Patrone
+# Winter > Heizen über WW-Heizung
+### Definitionen
+my $hk_ga = '4/2/100'; # Gruppenadresse zur Steuerung Handtuchtrockner (An/Aus)
+my $sommer_ga = '4/0/0'; # Gruppenadresse Sommerbetrieb (An/Aus)
+my $patrone_ga = '4/2/110'; # Gruppenadresse E-Heizpatrone (An/Aus)
+my $stellantrieb_ga = '4/2/105'; # Gruppenadresse Stellantrieb (%-Wert)
+my $stellantrieb_auf = 100; # Wert für Stellantrieb offen (%-Wert)
+my $stellantrieb_zu = 0; # Wert für Stellantrieb geschlossen (%-Wert)
+my $modus_hk = '1'; # Konnex Betriebsmudus RTR wenn Handtuchtrockner läuft
+my $modus_ga = '4/2/91'; # Zwangsbetriebsmodus RTR Bad
+my $zwang_fbh_ga = '4/2/97'; # Zwangsmodus für Stellantrieb FBH offen
+my $laufzeit = 60*60*2; # Laufzeit bis Auto Aus in sek.
+### Ende Definitionen
+# Eigenen Aufruf-Zyklus auf 0 Sekunden setzen
+$plugin_info{$plugname.'_cycle'} = 0;
+# Plugin an Gruppenadresse "anmelden"
+$plugin_subscribe{$hk_ga}{$plugname} = 1;
+
+#Prüfung, ob GA durch Schreibtransaktion angesprochen wurde
+if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $hk_ga ) {
+ #Wert für Handtuchtrockner lesen
+ my $hk_wert = knx_read($hk_ga,300,1);
+ #Ausführungszeit setzen
+ $plugin_info{$plugname.'_last'} = time();
+
+ #Wert für Sommerbetrieb lesen
+ my $sommer_wert = knx_read($sommer_ga,300,1);
+ #Kenner Laufzeit gestartet und Aufrufintervall des Plugin setzen
+ if ($hk_wert == 1) {
+ $plugin_info{$plugname.'_sema'} = 1;
+ $plugin_info{$plugname.'_cycle'} = $laufzeit;
+ }
+ if ($sommer_wert == 1) {
+ if ($hk_wert == 1) {
+ knx_write($patrone_ga, 1, 1); ##Heizpatrone einschalten
+ knx_write($stellantrieb_ga, $stellantrieb_zu, 5.001); ##Stellantrieb für HK schließen
+ return "E-Patrone An";
+ }
+ else {
+ knx_write($patrone_ga,0,1); ##Heizpatrone ausschalten
+ knx_write($stellantrieb_ga, $stellantrieb_auf, 5.001); ##Stellantrieb für HK öffnen
+ return "E-Patrone Aus";
+ }
+ }
+ else {
+ knx_write($patrone_ga,0,1);
+ if ($hk_wert == 1) {
+ knx_write($stellantrieb_ga, $stellantrieb_auf, 5.001); ##Stellantrieb für HK öffnen
+ knx_write($modus_ga, $modus_hk, 5.010); ##Betriebsmodus auf Anwesend zwingen
+ knx_write($zwang_fbh_ga, 1, 1); ##Stellanrieb zwingen 100% öffnen
+ return "WW-Heizung An";
+ }
+ else {
+ knx_write($stellantrieb_ga, $stellantrieb_zu, 5.001); ##Stellantrieb für HK schließen
+ knx_write($modus_ga, 0, 5.010); ##Betriebsmodus Zwang zurücksetzen
+ knx_write($zwang_fbh_ga, 0, 1); ##Stellanrieb Zwang zurücksetzen
+ return "WW-Heizung Aus";
+ }
+ }
+ }
+#Ausführung wenn Aufrufintervall/Laufzeit abgelaufen ist
+elsif ($plugin_info{$plugname.'_sema'} == 1) {
+ #Heizkörper ausschalten,Kenner Laufzeit gestartet und Aufrufintervall des Plugin zurücksetzen
+ $plugin_info{$plugname.'_sema'} = 0;
+ $plugin_info{$plugname.'_cycle'} = 0;
+ knx_write($hk_ga,0,1);
+ }
+return "Warte auf Telegramm";
Added: wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl
===================================================================
--- wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl (rev 0)
+++ wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl 2011-10-23 16:34:01 UTC (rev 472)
@@ -0,0 +1,46 @@
+### Plugin Min/Max values from RRD auf den Bus
+my $RRDName = "28.7FD4EB010000_temp";
+my $ds = "MIN"; # Datasource: MIN AVERAGE MAX - egal bei Werten <180h
+my $start = "now-20h"; # AT-STYLE TIME SPECIFICATION
+my $end = "now";
+$plugin_info{$plugname.'_cycle'} = 3600; # alle x sekunden
+my $debug = 0;
+my $gamin = '11/2/20'; # DPT9.001 leer um Versand zu unterbinden-> ''
+my $gamax = '11/2/21'; # leer um Versand zu unterbinden-> ''
+### ENDE Definitionen
+
+# return early on write/response (telegram from myself!)
+if ($msg{'apci'} && $msg{'apci'} ne "A_GroupValue_Read") {
+ return;
+}
+
+my ($min,$max) = (0,0);
+my ($dbstart, $step, $names, $data) =
+ RRDs::fetch('/var/www/rrd/'.$RRDName.'.rrd', "--start=$start","--end=$end", $ds);
+
+foreach my $line (@$data) {
+ foreach my $val (@$line) {
+ next unless defined $val;
+ $min = $val if $val < $min;
+ $max = $val if $val > $max;
+ }
+}
+
+if ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamin) {
+ knx_write($gamin,$min,9,1);
+ return;
+} elsif ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamax) {
+ knx_write($gamax,$max,9,1);
+ return;
+}
+
+if ($gamin) {
+ knx_write($gamin,$min,9);
+ $plugin_subscribe{$gamin}{$plugname} = 1;
+}
+if ($gamax) {
+ knx_write($gamax,$max,9);
+ $plugin_subscribe{$gamax}{$plugname} = 1;
+}
+return("Min $min Max $max in $start") if $debug;
+return;
Added: wiregate/plugin/generic/RolladenLueftungsPos.pl
===================================================================
--- wiregate/plugin/generic/RolladenLueftungsPos.pl (rev 0)
+++ wiregate/plugin/generic/RolladenLueftungsPos.pl 2011-10-23 16:34:01 UTC (rev 472)
@@ -0,0 +1,77 @@
+## Dieses Plugin steuert die Rolläden
+# http://knx-user-forum.de/wiregate/16384-plugin-rolladen-lueftungsposition.html
+## Rolladen unten + Fenster auf >> Rolladen in Lüftungsposition fahren
+## Globale Definitionen ##
+my $zustand_geschlossen = 00; # Wert Fensterstatus geschlossen
+my $zustand_offen = 01; # Wert Fensterstatus geöffnet
+my $GA_Gesamt_SperreAuto = '3/0/4'; # Gruppenadresse, die die Lüftungsautomatik sperrt
+#Definition aller Rolläden über ein Array von Hashes, wobei jeder Hash ein Rollladen/Fenster ist.
+my @AlleRolllaeden;
+# Name = Name des Rolladen
+# GA_Fensterstatus = Gruppenadresse für Öffnungsüberwachung des Fensters
+# GA_RolloUnten = Gruppenadresse für Meldung, daß Rolladen ganz runter gefahren wurde
+# GA_RolloPos = Gruppenadresse zum Anfahren einer Position
+# GA_RolloAufAb = Gruppenadresse zu Auf/Abfahren des Rollos
+# GA_RolloPosInfo = Gruppenadresse auf der die Rückmeldung der Position erfolgt
+# PosRolloLuft = Position des Rolladen im % für Lüftungsposition
+push @AlleRolllaeden, { Name => "Schlafzimmer", GA_Fensterstatus => "6/2/50", GA_RolloUnten => "3/2/57", GA_RolloPos => "3/2/52",
+ GA_RolloAufAb => "3/2/50", GA_RolloPosInfo => "3/2/55", PosRolloLuft => 70};
+push @AlleRolllaeden, { Name => "Bad", GA_Fensterstatus => "6/2/90", GA_RolloUnten => "3/2/97", GA_RolloPos => "3/2/92",
+ GA_RolloAufAb => "3/2/90", GA_RolloPosInfo => "3/2/95", PosRolloLuft => 85};
+push @AlleRolllaeden, { Name => "Kind A", GA_Fensterstatus => "6/2/130", GA_RolloUnten => "3/2/137", GA_RolloPos => "3/2/132",
+ GA_RolloAufAb => "3/2/130", GA_RolloPosInfo => "3/2/135", PosRolloLuft => 85};
+push @AlleRolllaeden, { Name => "Kind B", GA_Fensterstatus => "6/2/170", GA_RolloUnten => "3/2/177", GA_RolloPos => "3/2/172",
+ GA_RolloAufAb => "3/2/170", GA_RolloPosInfo => "3/2/175", PosRolloLuft => 96};
+push @AlleRolllaeden, { Name => "Arbeitszimmer Fenster", GA_Fensterstatus => "6/2/220", GA_RolloUnten => "3/2/227", GA_RolloPos => "3/2/222",
+ GA_RolloAufAb => "3/2/220", GA_RolloPosInfo => "3/2/225", PosRolloLuft => 70};
+push @AlleRolllaeden, { Name => "Arbeitszimmer Tuer", GA_Fensterstatus => "6/2/230", GA_RolloUnten => "3/2/237", GA_RolloPos => "3/2/232",
+ GA_RolloAufAb => "3/2/230", GA_RolloPosInfo => "3/2/235", PosRolloLuft => 80};
+
+## Plugin nur bei Telegramm aufrufen
+$plugin_info{$plugname.'_cycle'} = 0; # nur bei Telegramm aufrufen
+
+## Rolladensperre beachten
+#Anmeldung an Gruppenadresse für Rolladensperre
+$plugin_subscribe{$GA_Gesamt_SperreAuto}{$plugname} = 1;
+#Sperrkennzeichen setzen, wenn Telegramm eintrifft
+if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $GA_Gesamt_SperreAuto) {
+ $plugin_info{$plugname.'_sperre'} = knx_read($GA_Gesamt_SperreAuto,0,1);
+ }
+#Wenn Sperrkennzeichen gesetzt ist, dann soll der Code beendet werden
+if ($plugin_info{$plugname.'_sperre'} == 1) {
+ return "Sperre";
+ }
+
+##Ausführen des Codes je definiereten Rolladen
+foreach my $element (@AlleRolllaeden) {
+
+ #Anmeldung an Gruppenadresse für Fensterstatus
+ $plugin_subscribe{$element->{GA_Fensterstatus}}{$plugname} = 1;
+
+ #Anmeldung an Gruppenadresse für Status, daß Rolladen unten
+ $plugin_subscribe{$element->{GA_RolloUnten}}{$plugname} = 1;
+
+ #Wenn Telegramm für Fensterstatus, Rollo unten oder Sperre eintrifft, dann soll das Rollo ggf. bewegt werden
+ if ($msg{'apci'} eq "A_GroupValue_Write" and
+ ($msg{'dst'} eq $element->{GA_Fensterstatus} or $msg{'dst'} eq $element->{GA_RolloUnten}) or $msg{'dst'} eq $GA_Gesamt_SperreAuto) {
+
+ my $Fensterstatus = knx_read($element->{GA_Fensterstatus}, 300, 1); #Lesen Fensterstatus
+ my $RolloUnten = knx_read($element->{GA_RolloUnten} ,300, 1); #Lesen ob Rolladen unten
+ my $RolloPosInfo = knx_read($element->{GA_RolloPosInfo}, 300, 5.001); #Lesen der aktuellen Rolladenpositon in %
+
+ #Wenn Fenster=zu und Rolladen innerhalb Lüftung, dann soll der Rollo komplett runter gefahren werden
+ if (($Fensterstatus==$zustand_geschlossen ) && ($RolloPosInfo >= $element->{PosRolloLuft}) && ($msg{'dst'} eq $element->{GA_Fensterstatus} )) {
+ knx_write($element->{GA_RolloAufAb} , 1, 1);
+ return "Ab";
+ }
+
+ #Wenn Fenster=offen und Rolladen komplet unten, dann soll der Rollo in die Lüftungsposition gefahren werden
+ if (($Fensterstatus==$zustand_offen) && ($RolloUnten==1)) {
+ knx_write($element->{GA_RolloPos}, $element->{PosRolloLuft}, 5.001);
+ return "Lüftung";
+ }
+ }
+ }
+
+#Rückgabewert falls noch kein Telegramm eingetroffen ist
+return "Warte";
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-11-20 16:34:25
|
Revision: 531
http://openautomation.svn.sourceforge.net/openautomation/?rev=531&view=rev
Author: mayerch
Date: 2011-11-20 16:34:18 +0000 (Sun, 20 Nov 2011)
Log Message:
-----------
change to external config (-> conf.d)
Modified Paths:
--------------
wiregate/plugin/generic/Multi-RTR.pl
Added Paths:
-----------
wiregate/plugin/generic/conf.d/Multi-RTR.conf_sample
Modified: wiregate/plugin/generic/Multi-RTR.pl
===================================================================
--- wiregate/plugin/generic/Multi-RTR.pl 2011-11-20 16:24:27 UTC (rev 530)
+++ wiregate/plugin/generic/Multi-RTR.pl 2011-11-20 16:34:18 UTC (rev 531)
@@ -1,6 +1,6 @@
#############################################################################
# Plugin: Multi RTR
-# V0.6 2011-09-18
+# V0.7 2011-11-20
# Copyright: Christian Mayer (mail at ChristianMayer.de)
# License: GPL (v3)
#
@@ -23,39 +23,48 @@
#############################################################################
# Configuration:
-my %controllers = (
- '130_Hobby1_HK' => {
- 'SetPointGA' => '3/3/130', 'SetPointRRD' => '130_Hobby1_HK_Sollwert',
- 'SensorGA' => '4/0/130',
- 'ActuatorGA' => '3/0/130', 'ActuatorRRD' => '130_Hobby1_HK_Regelung',
- 'ProportionalGain' => 5, 'IntegralTime' => 150
- },
- '140_Hobby2_HK' => {
- 'SetPointGA' => '3/3/140', 'SetPointRRD' => '140_Hobby2_HK_Sollwert',
- 'SensorGA' => '4/0/140',
- 'ActuatorGA' => '3/0/140', 'ActuatorRRD' => '140_Hobby2_HK_Regelung',
- 'ProportionalGain' => 5, 'IntegralTime' => 240
- },
-);
-my %default = (
- 'SetPointDPT' => 9.001,
- 'SensorDPT' => 9.001,
- 'ActuatorDPT' => 5,
- 'DisableDPT' => 1,
- 'SetPointInit' => 21.0,
- 'SetPointLFlag' => 1, # true
- 'ActuatorLFlag' => 1, # true
- 'MinUpdateRate' => 5 * 60, # 5 minutes
-);
+# --> change values in the conf.d directory!
+my %controllers = ();
+my %default = ();
my $GlobalDisableGA = '14/5/50';
my $reset = 0; # set to 1 to reset the states, run script and change to 0 again
-my $show_debug = 1; # switches debug information that will be shown in the log
+my $show_debug = 0; # switches debug information that will be shown in the log
#############################################################################
# Do NOT change anything below!
#############################################################################
+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].") 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);
+ }
+ }
+}
+
+#############################################################################
+# main()
+#############################################################################
my $busActive = !(!keys %msg); # true if script was called due to bus traffic
my $ret_val = '';
@@ -174,7 +183,7 @@
{
my $dt = time() - $plugin_info{ $plugname . '_tlast' };
$plugin_info{ $plugname . '_tlast' } = time();
- $ret_val .= 'dt: ' . $dt . '; ';
+ $ret_val .= sprintf( ' dt: %.3f; ', $dt );
for my $this_controller_name ( keys %controllers )
{
@@ -239,6 +248,8 @@
# Version history:
# ================
#
+# 0.7:
+# * change to external config (-> conf.d)
# 0.6:
# * Bug fix for setups where the WireGate didn't know the ActuatorGA
# * Force sending of actuator after x seconds/minutes so that the watchdog in
Added: wiregate/plugin/generic/conf.d/Multi-RTR.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Multi-RTR.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/Multi-RTR.conf_sample 2011-11-20 16:34:18 UTC (rev 531)
@@ -0,0 +1,45 @@
+#-----------------------------------------------------------------------------
+# ACHTUNG: Variablen duerfen nur im Plugin mit 'my' definiert werden,
+# 'my' hier nicht verwenden!
+#-----------------------------------------------------------------------------
+
+#############################################################################
+# Configuration:
+%controllers = (
+ '130_Hobby1_HK' => {
+ 'SetPointGA' => '3/3/130', 'SetPointRRD' => '130_Hobby1_HK_Sollwert',
+ 'SensorGA' => '4/0/130',
+ 'ActuatorGA' => '3/0/130', 'ActuatorRRD' => '130_Hobby1_HK_Regelung',
+ 'ProportionalGain' => 5, 'IntegralTime' => 150
+ },
+ '140_Hobby2_HK' => {
+ 'SetPointGA' => '3/3/140', 'SetPointRRD' => '140_Hobby2_HK_Sollwert',
+ 'SensorGA' => '4/0/140',
+ 'ActuatorGA' => '3/0/140', 'ActuatorRRD' => '140_Hobby2_HK_Regelung',
+ 'ProportionalGain' => 5, 'IntegralTime' => 240
+ },
+);
+%default = (
+ 'SetPointDPT' => 9.001,
+ 'SensorDPT' => 9.001,
+ 'ActuatorDPT' => 5,
+ 'DisableDPT' => 1,
+ 'SetPointInit' => 21.0,
+ 'SetPointLFlag' => 1, # true
+ 'ActuatorLFlag' => 1, # true
+ 'MinUpdateRate' => 5 * 60, # 5 minutes
+);
+
+$GlobalDisableGA = '14/5/50';
+
+$reset = 0; # set to 1 to reset the states, run script and change to 0 again
+$show_debug = 1; # switches debug information that will be shown in the log
+
+#############################################################################
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
+# vim: set filetype=perl expandtab tabstop=8 shiftwidth=2 autoindent smartindent:
\ 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: <j-...@us...> - 2011-12-08 17:00:26
|
Revision: 554
http://openautomation.svn.sourceforge.net/openautomation/?rev=554&view=rev
Author: j-n-k
Date: 2011-12-08 17:00:19 +0000 (Thu, 08 Dec 2011)
Log Message:
-----------
Unwetterzentrale: changed to conf.d, added heiht detection (thanks ctr)
Modified Paths:
--------------
wiregate/plugin/generic/Unwetterzentrale.pl
Added Paths:
-----------
wiregate/plugin/generic/conf.d/Unwetterzentrale.conf_sample
Modified: wiregate/plugin/generic/Unwetterzentrale.pl
===================================================================
--- wiregate/plugin/generic/Unwetterzentrale.pl 2011-12-06 22:22:46 UTC (rev 553)
+++ wiregate/plugin/generic/Unwetterzentrale.pl 2011-12-08 17:00:19 UTC (rev 554)
@@ -1,34 +1,37 @@
# Plugin zum Auslesen der Unwettermeldungen
-# Version 0.2 14.11.2011
+# Version 0.3 07.12.2011
# Copyright: JNK (http://knx-user-forum.de/members/jnk.html)
# In Anlehnung an HS/FS Logikbaustein 19909 by Michael Grosalski
+# Hoehenerkennung angeregt von ctr (http://knx-user-forum.de/members/ctr.html)
# License: GPL (v2)
-# Aufbau m\xF6glichst so, dass man unterhalb der Einstellungen nichts ver\xE4ndern muss!
-
####################
###Einstellungen:###
####################
-# fuer alle Adressen gilt: wenn = '', dann kein senden an diese Adresse
+# !!!!!! config-file beachten !!!!!
-my $unwetter_txt_GA = '0/1/1'; # sendet Textmeldung DPT 16
-my $unwetter_max_stufe_GA = '0/1/2'; # sendet h\xF6chste Warnstufe als DPT 5.005
-my $unwetter_max_typ_GA = '0/1/3'; # sendet h\xF6chsten Warntyp als DPT 5.005
-my $unwetter_max_neu_GA = '0/1/4'; # sendet 1=neue Meldungen, 0=alte Meldungen, DPT 1
+my $unwetter_txt_GA; # sendet Textmeldung DPT 16
+my $unwetter_max_stufe_GA; # sendet h\xF6chste Warnstufe als DPT 5.005
+my $unwetter_max_typ_GA; # sendet h\xF6chsten Warntyp als DPT 5.005
+my $unwetter_max_neu_GA; # sendet 1=neue Meldungen, 0=alte Meldungen, DPT 1
-my $plz = '45886'; #PLZ
+my $plz; #PLZ
my $baseurl = 'http://www.unwetterzentrale.de/uwz/getwarning_de.php?plz='; # Basis-URL
my $country = 'DE'; # Land
my $lang = 'de'; # deutsch
+my $hoehe; # Hoehenbegrenzung
-my $udp_addr = '192.168.0.51:50018'; # udp Adresse fuer Textmeldung (z.B. an PROWL Plugin)
+my $udp_addr; # udp Adresse fuer Textmeldung (z.B. an PROWL Plugin)
+my $show_debug = 0;
+
######################
##ENDE Einstellungen##
######################
use LWP::Simple;
+use Encode;
my %warnstufen = ( gelb => 1, orange => 2, rot => 3, violett => 4 );
my %warntyp = ( gewitter => 1, glatteisregen => 2, regen => 3, schnee => 4, sturm => 5, temperatur => 6, strassenglaette => 7);
@@ -36,6 +39,33 @@
my @warnstufen_txt = ( 'keine Meldung', 'Vorwarn.', '', 'stark. ', 'extr. ' );
my @warntyp_txt = ( '', 'Gewitter', 'Glatteis', 'Regen', 'Schnee', 'Sturm', 'Temperatur', 'Glaette' );
+my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl');
+if (! -f $confFile)
+{
+ plugin_log($plugname, " 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);
+ }
+ }
+}
+
$plugin_info{$plugname.'_cycle'} = 900;
# Abfrage
@@ -43,24 +73,69 @@
my $url = $baseurl.$plz.'&uwz=UWZ-'.$country.'&lang='.$lang;
my $content = get($url);
-if ($content eq undef) {
+if ($content eq undef)
+{
return 'HTTP failed.';
}
-my @LINES = split (/\n/, $content);
+my @LINES = split (/\n/, decode('UTF-8', $content));
my $high_typ = 0;
my $high_stufe = 0;
my $all_str = '';
my $typ;
my $stufe;
+my $process_next = 1; # 1 = beachten, 0= nicht beachten, standard ist: beachten.
-for (my $i=0;$i<@LINES;$i++) {
- if ($LINES[$i] =~ /<div style="float:left;display:block;width:117px;height:110px;padding-top:6px;"><img src="..\/images\/icons\/(.*?)-(.*?).gif" width="117" height="104"><\/div>/i) {
+for (my $i=0;$i<@LINES;$i++)
+{
+ if ($LINES[$i] =~ /\s*<span style="\s*color:.*?;">g.?ltig f.?r:<\/span> <b>(.*?)<\/b>/i)
+ {
+ my $warnung_hoehe_text = $1;
+ if ($warnung_hoehe_text =~ /\s*H.hen bis (\d+) m/i)
+ {
+ if ($show_debug > 1)
+ {
+ plugin_log($plugname, "naechste Meldung bis ".$1 );
+ }
+ $process_next = ($1 ge $hoehe);
+ }
+ elsif ($warnung_hoehe_text =~ /\s*H.hen ab (\d+) m/i)
+ {
+ if ($show_debug > 1)
+ {
+ plugin_log($plugname, "naechste Meldung ab ".$1 );
+ }
+ $process_next = ($1 le $hoehe);
+ }
+ elsif ($warnung_hoehe_text =~ /\s*H.hen von (\d+) bis (\d+) m/i)
+ {
+ if ($show_debug > 1)
+ {
+ plugin_log($plugname, "naechste Meldung von ".$1." bis ".$2 );
+ }
+ $process_next = (($1 le $hoehe) && ($2 ge $hoehe));
+ }
+ else
+ {
+ if ($show_debug > 1)
+ {
+ plugin_log($plugname, "naechste Meldung Hoehe nicht erkannt/alle Hoehen" );
+ }
+ $process_next = 1;
+ }
+ if ($show_debug > 1)
+ {
+ plugin_log($plugname, "naechste Meldung prozessieren: ".$process_next );
+ }
+ }
+ elsif (($process_next || ($hoehe eq undef)) && ($LINES[$i] =~ /<div style="float:left;display:block;width:117px;height:110px;padding-top:6px;"><img src="..\/images\/icons\/(.*?)-(.*?).gif" width="117" height="104"><\/div>/i))
+ {
$typ = $warntyp{$1};
$stufe = $warnstufen{$2};
my $str = $stufe.$typ;
- if ($stufe>$high_stufe) {
+ if ($stufe>$high_stufe)
+ {
$high_stufe = $stufe;
$high_typ = $typ;
}
@@ -68,38 +143,44 @@
}
}
-
-
-if ($unwetter_txt_GA) {
+if ($unwetter_txt_GA)
+{
knx_write($unwetter_txt_GA, $warnstufen_txt[$high_stufe].$warntyp_txt[$high_typ], 16);
}
-if ($unwetter_max_stufe_GA) {
+if ($unwetter_max_stufe_GA)
+{
knx_write($unwetter_max_stufe_GA, $high_stufe, 5.005);
}
-if ($unwetter_max_typ_GA) {
+if ($unwetter_max_typ_GA)
+{
knx_write($unwetter_max_typ_GA, $high_typ, 5.005);
}
-if ($plugin_info{$plugname.'_allstr'} == $all_str) {
- if ($unwetter_max_neu_GA) {
+if ($plugin_info{$plugname.'_allstr'} == $all_str)
+{
+ if ($unwetter_max_neu_GA)
+ {
knx_write($unwetter_max_neu_GA, 0, 1);
}
-} else {
- if ($unwetter_max_neu_GA) {
+}
+else
+{
+ if ($unwetter_max_neu_GA)
+ {
knx_write($unwetter_max_neu_GA, 1, 1);
}
- if ($udp_addr) {
+ if ($udp_addr)
+ {
my $sock = IO::Socket::INET->new(
Proto => 'udp',
PeerAddr => $udp_addr,
);
- my $meldung = $warnstufen_txt[$high_stufe].' '.$warntyp_txt[$high_typ];
+ my $meldung = $warnstufen_txt[$high_stufe].$warntyp_txt[$high_typ];
$sock->send("0;Unwetterwarnung;Unwetterwarnung;$meldung\n");
}
$plugin_info{$plugname.'_allstr'} = $all_str;
-
}
-return $all_str;
\ No newline at end of file
+return 0;
\ No newline at end of file
Added: wiregate/plugin/generic/conf.d/Unwetterzentrale.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Unwetterzentrale.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/Unwetterzentrale.conf_sample 2011-12-08 17:00:19 UTC (rev 554)
@@ -0,0 +1,67 @@
+#############################################################################
+# Konfiguration
+#############################################################################
+
+#############################################################################
+# Adress-Optionen
+#############################################################################
+#
+# $unwetter_txt_GA = '0/1/1';
+# => sendet Textmeldung DPT 16 auf die angebene GA
+#
+# $unwetter_max_stufe_GA = '0/1/2';
+# => sendet h\xF6chste Warnstufe als DPT 5.005
+#
+# $unwetter_max_typ_GA = '0/1/3';
+# => sendet h\xF6chsten Warntyp als DPT 5.005
+#
+# $unwetter_max_neu_GA = '0/1/4';
+# => sendet 1=neue Meldungen, 0=alte Meldungen, DPT 1
+#
+# $udp_addr = '192.168.0.51:50018';
+# => UDP Adresse fuer Textmeldung (z.B. an PROWL Plugin)
+#
+# fuer alle Adressen gilt: wenn NICHT definiert => Funktion unbenutzt
+# wenn definiert: Funktion benutzt
+#
+
+$unwetter_txt_GA = '0/1/1';
+$unwetter_max_stufe_GA = '0/1/2';
+$unwetter_max_typ_GA = '0/1/3';
+$unwetter_max_neu_GA = '0/1/4';
+$udp_addr = '192.168.0.51:50018';
+
+#############################################################################
+# Orts-Optionen
+#############################################################################
+#
+# $plz = '45886';
+# => PLZ des Warnortes, wird unbedingt benoetigt
+#
+# $baseurl = 'http://www.unwetterzentrale.de/uwz/getwarning_de.php?plz=';
+# => Basis-URL der Unwetterzentrale, Voreinstellung: Deutschland
+# fuer Deutschland: 'http://www.unwetterzentrale.de/uwz/getwarning_de.php?plz=';
+# fuer die Schweiz: 'http://alarm.meteocentrale.ch/getwarning_de.php?plz='
+#
+# $country = 'DE';
+# => Laenderkuerzel, Voreinstellung: DE
+#
+# $lang = 'de';
+# => Mitteilungssprache, Voreinstellung: deutsch
+#
+# $hoehe = 430;
+# => Hoehe des Ortes in m, wenn nicht definiert: alle Meldungen werden bearbeitet
+#
+
+$plz = '45886'; # Gelsenkirchen-Ueckendorf
+
+
+#############################################################################
+
+#############################################################################
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
+# vim: set filetype=perl expandtab tabstop=8 shiftwidth=2 autoindent smartindent:
\ 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: <ma...@us...> - 2011-12-26 15:12:25
|
Revision: 608
http://openautomation.svn.sourceforge.net/openautomation/?rev=608&view=rev
Author: mayerch
Date: 2011-12-26 15:12:18 +0000 (Mon, 26 Dec 2011)
Log Message:
-----------
Added new plugin: Russound communication via the RIO protocol
Added Paths:
-----------
wiregate/plugin/generic/Russound_RIO.pl
wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample
Added: wiregate/plugin/generic/Russound_RIO.pl
===================================================================
--- wiregate/plugin/generic/Russound_RIO.pl (rev 0)
+++ wiregate/plugin/generic/Russound_RIO.pl 2011-12-26 15:12:18 UTC (rev 608)
@@ -0,0 +1,178 @@
+#############################################################################
+# Plugin: Russound RIO
+# V0.1 2011-12-26
+# Copyright: Christian Mayer (mail at ChristianMayer.de)
+# License: GPL (v3)
+#
+# Plugin for talking to the Russound multi room amplifiers via the RIO
+# protocoll over the IP interface
+#
+# Suggested settings:
+# ===================
+#
+#############################################################################
+
+#############################################################################
+# Configuration:
+# --> change values in the conf.d directory!
+my $IP_of_Russound;
+my $MAC_of_Russound;
+my $numzones;
+my $KNX_Start_Address;
+
+my $reset ; # set to 1 to reset the states, run script and change to 0 again
+my $show_debug; # switches debug information that will be shown in the log
+
+#############################################################################
+# Do NOT change anything below!
+#############################################################################
+
+#############################################################################
+# External libraries:
+use Net::Telnet ();
+
+#############################################################################
+# Constants:
+my $MAX_ZONES = 31;
+my $ZONES_PER_CONTROLLER = 6;
+
+#############################################################################
+# Collect log information
+my $retval = '';
+
+my $destReadable = $msg{'dst'};
+my $val = hex $msg{'data'};
+
+# Convert to numeric GA
+(my $a, my $b, my $c) = split(/\//, $KNX_Start_Address );
+my $knxstartaddress = (($a << 11) + ($b << 8) + $c);
+
+# Convert to numeric GA
+($a,$b,$c) = split(/\//, $destReadable );
+my $dest = (($a << 11) + ($b << 8) + $c);
+
+# Eigenen Aufruf-Zyklus ausschalten
+$plugin_info{$plugname.'_cycle'} = 0;
+
+# aboniere alle relevanten GAs
+for (my $zone=0;$zone<$numzones;$zone++)
+{
+ my $ctrl = int($zone/$ZONES_PER_CONTROLLER);
+ my $czone = int($zone%$ZONES_PER_CONTROLLER);
+ my $base = $knxstartaddress + 10 + ($czone*40) + ($ctrl*256);
+ for( my $i = 0; $i < 13; $i++ ) # iterate funcnames
+ {
+ my $a = $base + $i;
+ my $gastr = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
+ $plugin_subscribe{$gastr}{$plugname} = 1;
+ }
+ for( my $i = 0; $i < 10; $i++ ) # iterate stateames
+ {
+ my $a = $base + $i + 20;
+ my $gastr = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
+ $plugin_subscribe{$gastr}{$plugname} = 1;
+ }
+}
+
+$retval .= $msg{'apci'} . '->' . $msg{'dst'} . ';'. $msg{'data'} . ';' if $show_debug;
+
+#############################################################################
+# Main function
+if($msg{'apci'} eq "A_GroupValue_Write")
+{
+ # Transfere KNX Address to Russound Function similarly
+ # to the rusconnectd
+ my $func;
+ my $zone;
+ my $controller;
+ {
+ use integer;
+ $func = ($dest - $knxstartaddress) % 256;
+ $zone = ($func - 10) / 40;
+ $func = ($func - 10) % 40;
+ $controller = ($dest - $knxstartaddress) / 256;
+ }
+
+ sendrussFunc( $controller, $zone, $func, $val );
+}
+
+return $retval;
+
+#############################################################################
+# Helper funtions
+sub sendcmd
+{
+ my $cmd = shift;
+ my $t = new Net::Telnet (
+ Timeout => 10,
+ Host => $IP_of_Russound,
+ Port => 9621,
+ Prompt => '/^/',
+ Telnetmode => 0
+ );
+ $t->open();
+ $t->print( $cmd );
+ $t->close();
+ my $res = $t->getline();
+ $retval .= $cmd . '->' . $res if $show_debug;
+ return $res;
+}
+
+sub sendrussFunc
+{
+ my $controller = shift;
+ my $zone = shift;
+ my $func = shift;
+ my $val = shift;
+
+ my $cz = 'C[' . ($controller+1) . '].Z[' . ($zone+1) . ']';
+
+ if( -9 == $func ) #all zones
+ {
+ return 'Func ' . $func . ' not implemented or known';
+ } elsif( 0 == $func ) #power
+ {
+ `wakeonlan $MAC_of_Russound`; # just to be sure
+ sendcmd("EVENT $cz!ZoneOff") if( $val == 0 );
+ sendcmd("EVENT $cz!ZoneOn" ) if( $val == 1 );
+ } elsif( 1 == $func ) #src
+ {
+ my $mapped = $val + 1;
+ sendcmd("EVENT $cz!SelectSource $mapped");
+ } elsif( 2 == $func ) #volume
+ {
+ my $mapped = int( $val * 50/255 );
+ sendcmd("EVENT $cz!KeyPress Volume $mapped");
+ } elsif( 3 == $func ) #bass
+ {
+ my $mapped = $val > 10 ? $val-256 : $val;
+ sendcmd("SET $cz.bass=\"$mapped\"");
+ } elsif( 4 == $func ) #treb
+ {
+ my $mapped = $val > 10 ? $val-256 : $val;
+ sendcmd("SET $cz.treble=\"$mapped\"");
+ } elsif( 5 == $func ) #loud
+ {
+ return 'Func ' . $func . ' not implemented or known';
+ } elsif( 6 == $func ) #bal
+ {
+ my $mapped = $val > 10 ? $val-256 : $val;
+ sendcmd("SET $cz.balance=\"$mapped\"");
+ } elsif( 7 == $func ) #party
+ {
+ return 'Func ' . $func . ' not implemented or known';
+ } elsif( 8 == $func ) #dnd
+ {
+ return 'Func ' . $func . ' not implemented or known';
+ } elsif( 9 == $func ) #turnonvol
+ {
+ my $mapped = int( $val * 50/255 );
+ sendcmd("SET $cz.turnOnVolume=\"$mapped\"");
+ #TODO: 10 src cmd and 11 keypadcmd
+ } elsif( 12 == $func ) #volume relative up/down
+ {
+ return 'Func ' . $func . ' not implemented or known';
+ } else {
+ return 'Func ' . $func . ' not implemented or known';
+ }
+}
Added: wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample 2011-12-26 15:12:18 UTC (rev 608)
@@ -0,0 +1,22 @@
+#-----------------------------------------------------------------------------
+# ACHTUNG: Variablen duerfen nur im Plugin mit 'my' definiert werden,
+# 'my' hier nicht verwenden!
+#-----------------------------------------------------------------------------
+
+#############################################################################
+# Configuration:
+$IP_of_Russound = '192.168.0.118';
+$MAC_of_Russound = '00:21:xx:xx:xx:xx';
+$numzones = 6;
+$KNX_Start_Address = '10/1/0';
+
+$reset = 0; # set to 1 to reset the states, run script and change to 0 again
+$show_debug = 1; # switches debug information that will be shown in the log
+#############################################################################
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
+# vim: set filetype=perl expandtab tabstop=8 shiftwidth=2 autoindent smartindent:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-12-29 01:50:49
|
Revision: 615
http://openautomation.svn.sourceforge.net/openautomation/?rev=615&view=rev
Author: makki1
Date: 2011-12-29 01:50:42 +0000 (Thu, 29 Dec 2011)
Log Message:
-----------
WireGate-Plugin: Template for sending eMail by SMTP with auth
Modified Paths:
--------------
wiregate/plugin/generic/VPN-User-by-GA
Added Paths:
-----------
wiregate/plugin/generic/SMTP-eMail.pl
Added: wiregate/plugin/generic/SMTP-eMail.pl
===================================================================
--- wiregate/plugin/generic/SMTP-eMail.pl (rev 0)
+++ wiregate/plugin/generic/SMTP-eMail.pl 2011-12-29 01:50:42 UTC (rev 615)
@@ -0,0 +1,55 @@
+# Demo-Plugin zum eMail-Versand - einfache Version mit Text-only
+# das macht nichts sinnvolles, sendet jede Stunde ein eMail,
+# soll nur als Vorlage dienen
+
+# Aufbau moeglichst so, dass man unterhalb der Definitionen nichts aendern muss!
+
+my $hostname = `hostname`;
+
+##################
+### DEFINITION ###
+##################
+
+my $Empfaenger = 'me...@do...'; # Anpassen, mehrere mit ,
+
+my $Absender = 'WireGate <ab...@gm...>'; # unbedingt anpassen, die Absenderadresse sollte gültig sein um Probleme zu vermeiden
+my $Betreff = "eMail von $hostname";
+my $text = "email-Body";
+my $username = 'ab...@gm...'; #Anpassen! Username fuer SMTP-Server
+my $password = "meinpasswort"; #Anpassen! Passwort fuer SMTP-Server
+my $mailserver='mail.gmx.net'; # SMTP-Relay: das muss natuerlich angepasst werden!
+$plugin_info{$plugname.'_cycle'} = 3600;
+
+#######################
+### ENDE DEFINITION ###
+#######################
+
+use Net::SMTP;
+use MIME::Base64;
+
+my $smtp = Net::SMTP->new($mailserver, Timeout => 5, Debug =>1) or return "Fehler beim verbinden zu $mailserver $!";
+my $ret .= ' auth:'. $smtp->auth($username,$password);
+$smtp->status() < 5
+or do {
+ # Die smtp->auth Methode schlaegt fehl, also dann so
+ $smtp->datasend("AUTH LOGIN\n") or return 'auth login problem';
+ $smtp->response();
+ $smtp->datasend(encode_base64( $username ) ) or return "username $username cannot be encoded or wrong";
+ $smtp->response();
+ $smtp->datasend(encode_base64( $password ) ) or return "password $password cannot be encoded or wrong";
+ $smtp->response();
+};
+$ret .= 'status:' . $smtp->status();
+$ret .= ' send:'. $smtp->mail($Absender);
+$ret .= ' rcpt:'. $smtp->to($Empfaenger);
+$ret .= $smtp->data();
+$ret .= $smtp->datasend("To: $Empfaenger\n"); # Empfänger (Header)
+$ret .= $smtp->datasend("Subject: $Betreff\n"); # Betreff
+$ret .= $smtp->datasend("\n");
+$ret .= $smtp->datasend("$text\n");
+$ret .= $smtp->dataend();
+$ret .= $smtp->quit;
+
+# FIXME: check if we succeeded
+return;
+
Modified: wiregate/plugin/generic/VPN-User-by-GA
===================================================================
--- wiregate/plugin/generic/VPN-User-by-GA 2011-12-28 18:37:09 UTC (rev 614)
+++ wiregate/plugin/generic/VPN-User-by-GA 2011-12-29 01:50:42 UTC (rev 615)
@@ -70,15 +70,15 @@
if (! -e '/etc/openvpn/connect.sh' or ! -e '/etc/openvpn/disconnect.sh') {
open(OUT, ">/etc/openvpn/connect.sh");
print OUT "#!/bin/bash\n\nif [ -e /etc/openvpn/servers/\$common_name.disabled ]; then\n";
- print OUT "\tlogger -t VPN 'refused disabled VPN-user \$common_name from \$trusted_ip'\n";
+ print OUT "\tlogger -t VPN \"refused disabled VPN-user \$common_name from \$trusted_ip\"\n";
print OUT "\texit 1\nelse \n";
- print OUT "\tlogger -t VPN '\$common_name logged in from \$trusted_ip (\$ifconfig_pool_remote_ip)'\n";
+ print OUT "\tlogger -t VPN \"\$common_name logged in from \$trusted_ip (\$ifconfig_pool_remote_ip)\"\n";
print OUT "\tVPNGA=`grep \"^\$common_name=\" /etc/openvpn/servers/VPNGA_MAP | cut -d'=' -f 2`\n";
print OUT "\tgroupswrite local:/tmp/eib \$VPNGA 1\nfi\nexit 0\n";
close(OUT);
open(OUT, ">/etc/openvpn/disconnect.sh");
print OUT "#!/bin/bash\n\n";
- print OUT "logger -t VPN '\$common_name logged out from \$trusted_ip (\$ifconfig_pool_remote_ip) T: \$time_duration S: \$bytes_sent R: \$bytes_received'\n";
+ print OUT "logger -t VPN \"\$common_name logged out from \$trusted_ip (\$ifconfig_pool_remote_ip) T: \$time_duration S: \$bytes_sent R: \$bytes_received\"\n";
print OUT "VPNGA=`grep \"^\$common_name\" /etc/openvpn/servers/VPNGA_MAP | cut -d'=' -f 2`\n";
print OUT "groupswrite local:/tmp/eib \$VPNGA 0\n";
close(OUT);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-01 20:50:08
|
Revision: 622
http://openautomation.svn.sourceforge.net/openautomation/?rev=622&view=rev
Author: makki1
Date: 2012-01-01 20:50:01 +0000 (Sun, 01 Jan 2012)
Log Message:
-----------
WireGate-Plugins: Cleanup SMTP-Watchdog and example, add error-handling
Modified Paths:
--------------
wiregate/plugin/generic/SMTP-eMail.pl
wiregate/plugin/generic/Watchdog-SMTP-eMail
Modified: wiregate/plugin/generic/SMTP-eMail.pl
===================================================================
--- wiregate/plugin/generic/SMTP-eMail.pl 2011-12-31 18:20:12 UTC (rev 621)
+++ wiregate/plugin/generic/SMTP-eMail.pl 2012-01-01 20:50:01 UTC (rev 622)
@@ -11,7 +11,6 @@
##################
my $Empfaenger = 'me...@do...'; # Anpassen, mehrere mit ,
-
my $Absender = 'WireGate <ab...@gm...>'; # unbedingt anpassen, die Absenderadresse sollte gültig sein um Probleme zu vermeiden
my $Betreff = "eMail von $hostname";
my $text = "email-Body";
@@ -27,29 +26,29 @@
use Net::SMTP;
use MIME::Base64;
-my $smtp = Net::SMTP->new($mailserver, Timeout => 5, Debug =>1) or return "Fehler beim verbinden zu $mailserver $!";
-my $ret .= ' auth:'. $smtp->auth($username,$password);
+my $smtp = Net::SMTP->new($mailserver, Timeout => 20, Debug =>1) or return "Fehler beim verbinden zu $mailserver $!; $@";
+$smtp->auth($username,$password);
$smtp->status() < 5
or do {
- # Die smtp->auth Methode schlaegt fehl, also dann so
- $smtp->datasend("AUTH LOGIN\n") or return 'auth login problem';
+ #Die smtp->auth Methode schlaegt fehl, also dann so
+ $smtp->datasend("AUTH LOGIN\n") or return 'auth login problem $!';
$smtp->response();
- $smtp->datasend(encode_base64( $username ) ) or return "username $username cannot be encoded or wrong";
+ $smtp->datasend(encode_base64( $username ) ) or return "username $username cannot be encoded or wrong $!";
$smtp->response();
- $smtp->datasend(encode_base64( $password ) ) or return "password $password cannot be encoded or wrong";
+ $smtp->datasend(encode_base64( $password ) ) or return "password $password cannot be encoded or wrong $!";
$smtp->response();
};
-$ret .= 'status:' . $smtp->status();
-$ret .= ' send:'. $smtp->mail($Absender);
-$ret .= ' rcpt:'. $smtp->to($Empfaenger);
-$ret .= $smtp->data();
-$ret .= $smtp->datasend("To: $Empfaenger\n"); # Empfänger (Header)
-$ret .= $smtp->datasend("Subject: $Betreff\n"); # Betreff
-$ret .= $smtp->datasend("\n");
-$ret .= $smtp->datasend("$text\n");
-$ret .= $smtp->dataend();
-$ret .= $smtp->quit;
+$smtp->status() < 5 or return "Auth failed: $! ". $smtp->status();
+$smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
+$smtp->to($Empfaenger) or return "Empfaenger $Empfaenger abgelehnt $!";
+$smtp->data() or return "Data failed $!";
+$smtp->datasend("To: $Empfaenger\n") or return "Empfanger $Empfaenger (Header-To) abgelehnt $!";
+$smtp->datasend("Subject: $Betreff\n") or return "Subject $Betreff abgelehnt $!";
+$smtp->datasend("\n") or return "Data failed $!";
+$smtp->datasend("$text\n") or return "Data failed $!";
+$smtp->dataend() or return "Data failed $!";
+$smtp->quit or return "Quit failed $!";
-# FIXME: check if we succeeded
-return;
+return; # keine Logausgabe
+return "eMail von $Absender an $Empfaenger Betreff $Betreff gesendet: $text";
Modified: wiregate/plugin/generic/Watchdog-SMTP-eMail
===================================================================
--- wiregate/plugin/generic/Watchdog-SMTP-eMail 2011-12-31 18:20:12 UTC (rev 621)
+++ wiregate/plugin/generic/Watchdog-SMTP-eMail 2012-01-01 20:50:01 UTC (rev 622)
@@ -1,17 +1,30 @@
-# Demo-Plugin zum prüfen auf Timeout-Fehler und eMail-Versand
-use Net::SMTP;
+# Demo-Plugin zum prüfen auf Plugin Timeout-Fehler
+# und eMail-Versand
-my $Empfaenger = 'me...@ke...';
-my $Absender = 'WireGate <wir...@el...>';
-my $Betreff = "Plugin-Alarm!";
-my $mailserver='mail-out.elabnet.de'; # SMTP-Relay: das muss natuerlich angepasst werden!
-# Das kann tricky sein mit GMX&co..
-# Fix-me: besser waere den lokale Exim-Mailserver zu verwenden
-# Dieser muesste jedoch erst mit einem entspr. Relay konfiguriert werden
+my $hostname = `hostname`;
+##################
+### DEFINITION ###
+##################
+
+my $Empfaenger = 'me...@do...'; # Anpassen, mehrere mit ,
+my $Absender = 'WireGate <ab...@gm...>'; # unbedingt anpassen, die Absenderadresse sollte gültig sein um Probleme zu vermeiden
+my $Betreff = "Plugin-Alarm von $hostname !";
+my $username = 'ab...@gm...'; #Anpassen! Username fuer SMTP-Server
+my $password = "meinpasswort"; #Anpassen! Passwort fuer SMTP-Server
+my $mailserver='mail.gmx.net'; # SMTP-Relay: das muss natuerlich angepasst werden!
$plugin_info{$plugname.'_cycle'} = 300;
-my $ret;
+#######################
+### ENDE DEFINITION ###
+#######################
+
+use Net::SMTP;
+use MIME::Base64;
+# FIXME: require Authen/SASL ?
+
+my ($ret,$err);
+
foreach (@plugins) {
my $plugname2 = basename($_);
if ($plugin_info{$plugname2.'_timeout_err'} >= $plugin_max_errors) {
@@ -19,18 +32,31 @@
# Alert
if (!$plugin_info{$plugname2.'_timeout_alarm'}) {
# sende Warn-eMail
- my $smtp = Net::SMTP->new($mailserver, Timeout => 5);
- $smtp->mail($Absender);
- $smtp->to($Empfaenger);
- $smtp->data();
- $smtp->datasend("To: $Empfaenger\n"); # Empfänger (Header)
- $smtp->datasend("Subject: $Betreff\n"); # Betreff
- $smtp->datasend("\n");
- $smtp->datasend("$ret\n");
- $smtp->dataend();
- $smtp->quit;
- }
- $plugin_info{$plugname2.'_timeout_alarm'} = 1;
+ my $smtp = Net::SMTP->new($mailserver, Timeout => 20, Debug =>1) or return "Fehler beim verbinden zu $mailserver $!; $@";
+ $smtp->auth($username,$password);
+ $smtp->status() < 5
+ or do {
+ #Die smtp->auth Methode schlaegt fehl, also dann so
+ $smtp->datasend("AUTH LOGIN\n") or return 'auth login problem $!';
+ $smtp->response();
+ $smtp->datasend(encode_base64( $username ) ) or return "username $username cannot be encoded or wrong $!";
+ $smtp->response();
+ $smtp->datasend(encode_base64( $password ) ) or return "password $password cannot be encoded or wrong $!";
+ $smtp->response();
+ };
+ $smtp->status() < 5 or return "Auth failed: $! ". $smtp->status();
+ $smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
+ $smtp->to($Empfaenger) or return "Empfaenger $Empfaenger abgelehnt $!";
+ $smtp->data() or return "Data failed $!";
+ $smtp->datasend("To: $Empfaenger\n") or return "Empfanger $Empfaenger (Header-To) abgelehnt $!";
+ $smtp->datasend("Subject: $Betreff\n") or return "Subject $Betreff abgelehnt $!";
+ $smtp->datasend("\n") or return "Data failed $!";
+ $smtp->datasend("$ret\n") or return "Data failed $!";
+ $smtp->dataend() or return "Data failed $!";
+ $smtp->quit or return "Quit failed $!";
+ $plugin_info{$plugname2.'_timeout_alarm'} = 1;
+ return "eMail gesendet: $ret";
+ }
} else {
# Reset Merker
$plugin_info{$plugname2.'_timeout_alarm'} = 0;
@@ -38,5 +64,5 @@
#$ret .= "$plugname2 Timeouts: $plugin_info{$plugname2.'_timeout_err'}";
}
-return $ret;
+return; #alles ok oder eMail bereits gesendet
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-02 12:08:35
|
Revision: 625
http://openautomation.svn.sourceforge.net/openautomation/?rev=625&view=rev
Author: makki1
Date: 2012-01-02 12:08:29 +0000 (Mon, 02 Jan 2012)
Log Message:
-----------
WireGate-Plugins: SMTP with SSL-only to simplify plugin as any provider supports SSL anyway
Modified Paths:
--------------
wiregate/plugin/generic/SMTP-eMail.pl
wiregate/plugin/generic/Watchdog-SMTP-eMail
Modified: wiregate/plugin/generic/SMTP-eMail.pl
===================================================================
--- wiregate/plugin/generic/SMTP-eMail.pl 2012-01-01 21:57:46 UTC (rev 624)
+++ wiregate/plugin/generic/SMTP-eMail.pl 2012-01-02 12:08:29 UTC (rev 625)
@@ -1,6 +1,8 @@
# Demo-Plugin zum eMail-Versand - einfache Version mit Text-only
# das macht nichts sinnvolles, sendet jede Stunde ein eMail,
# soll nur als Vorlage dienen
+# - mit SSL (alte Version ohne SSL sieh SVN rev 622)
+# - benoetigt Paket libnet-smtp-ssl-perl
# Aufbau moeglichst so, dass man unterhalb der Definitionen nichts aendern muss!
@@ -16,29 +18,20 @@
my $text = "email-Body";
my $username = 'ab...@gm...'; #Anpassen! Username fuer SMTP-Server
my $password = "meinpasswort"; #Anpassen! Passwort fuer SMTP-Server
-my $mailserver='mail.gmx.net'; # SMTP-Relay: das muss natuerlich angepasst werden!
+my $mailserver='mail.gmx.net:465'; # SMTP-Relay mit SSL: das muss natuerlich angepasst werden!
+# oder z.B. smtp.gmail.com:465 fuer Gmail;
$plugin_info{$plugname.'_cycle'} = 3600;
#######################
### ENDE DEFINITION ###
#######################
-use Net::SMTP;
+use Net::SMTP::SSL;
use MIME::Base64;
-my $smtp = Net::SMTP->new($mailserver, Timeout => 20, Debug =>1) or return "Fehler beim verbinden zu $mailserver $!; $@";
-$smtp->auth($username,$password);
-$smtp->status() < 5
-or do {
- #Die smtp->auth Methode schlaegt fehl, also dann so
- $smtp->datasend("AUTH LOGIN\n") or return 'auth login problem $!';
- $smtp->response();
- $smtp->datasend(encode_base64( $username ) ) or return "username $username cannot be encoded or wrong $!";
- $smtp->response();
- $smtp->datasend(encode_base64( $password ) ) or return "password $password cannot be encoded or wrong $!";
- $smtp->response();
-};
-$smtp->status() < 5 or return "Auth failed: $! ". $smtp->status();
+my $smtp = Net::SMTP::SSL->new($mailserver, Timeout => 10) or return "Fehler beim verbinden zu $mailserver $!; $@";
+$smtp->auth($username,$password) or return "SASL Auth failed $!;$@"; # try SASL
+$smtp->status() < 5 or return "Auth failed: $!; $@ ". $smtp->status();
$smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
$smtp->to($Empfaenger) or return "Empfaenger $Empfaenger abgelehnt $!";
$smtp->data() or return "Data failed $!";
Modified: wiregate/plugin/generic/Watchdog-SMTP-eMail
===================================================================
--- wiregate/plugin/generic/Watchdog-SMTP-eMail 2012-01-01 21:57:46 UTC (rev 624)
+++ wiregate/plugin/generic/Watchdog-SMTP-eMail 2012-01-02 12:08:29 UTC (rev 625)
@@ -1,5 +1,7 @@
# Demo-Plugin zum prüfen auf Plugin Timeout-Fehler
-# und eMail-Versand
+# und eMail-Versand
+# - mit SSL (alte Version ohne SSL sieh SVN rev 622)
+# - benoetigt Paket libnet-smtp-ssl-perl
my $hostname = `hostname`;
@@ -12,16 +14,16 @@
my $Betreff = "Plugin-Alarm von $hostname !";
my $username = 'ab...@gm...'; #Anpassen! Username fuer SMTP-Server
my $password = "meinpasswort"; #Anpassen! Passwort fuer SMTP-Server
-my $mailserver='mail.gmx.net'; # SMTP-Relay: das muss natuerlich angepasst werden!
+my $mailserver='mail.gmx.net:465'; # SMTP-Relay mit SSL: das muss natuerlich angepasst werden!
+# oder z.B. smtp.gmail.com:465 fuer Gmail;
$plugin_info{$plugname.'_cycle'} = 300;
#######################
### ENDE DEFINITION ###
#######################
-use Net::SMTP;
+use Net::SMTP::SSL;
use MIME::Base64;
-# FIXME: require Authen/SASL ?
my ($ret,$err);
@@ -32,18 +34,8 @@
# Alert
if (!$plugin_info{$plugname2.'_timeout_alarm'}) {
# sende Warn-eMail
- my $smtp = Net::SMTP->new($mailserver, Timeout => 20, Debug =>1) or return "Fehler beim verbinden zu $mailserver $!; $@";
- $smtp->auth($username,$password);
- $smtp->status() < 5
- or do {
- #Die smtp->auth Methode schlaegt fehl, also dann so
- $smtp->datasend("AUTH LOGIN\n") or return 'auth login problem $!';
- $smtp->response();
- $smtp->datasend(encode_base64( $username ) ) or return "username $username cannot be encoded or wrong $!";
- $smtp->response();
- $smtp->datasend(encode_base64( $password ) ) or return "password $password cannot be encoded or wrong $!";
- $smtp->response();
- };
+ my $smtp = Net::SMTP::SSL->new($mailserver, Timeout => 10) or return "Fehler beim verbinden zu $mailserver $!; $@";
+ $smtp->auth($username,$password) or return "SASL Auth failed $!;$@"; # try SASL
$smtp->status() < 5 or return "Auth failed: $! ". $smtp->status();
$smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
$smtp->to($Empfaenger) or return "Empfaenger $Empfaenger abgelehnt $!";
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-03 15:40:07
|
Revision: 630
http://openautomation.svn.sourceforge.net/openautomation/?rev=630&view=rev
Author: makki1
Date: 2012-01-03 15:39:57 +0000 (Tue, 03 Jan 2012)
Log Message:
-----------
WireGate-Plugins: SMTP revisited.. fix multiple recipients
Modified Paths:
--------------
wiregate/plugin/generic/SMTP-eMail.pl
wiregate/plugin/generic/Watchdog-SMTP-eMail
wiregate/plugin/generic/email_triggered_by_ga.pl
Modified: wiregate/plugin/generic/SMTP-eMail.pl
===================================================================
--- wiregate/plugin/generic/SMTP-eMail.pl 2012-01-03 12:28:27 UTC (rev 629)
+++ wiregate/plugin/generic/SMTP-eMail.pl 2012-01-03 15:39:57 UTC (rev 630)
@@ -2,7 +2,8 @@
# das macht nichts sinnvolles, sendet jede Stunde ein eMail,
# soll nur als Vorlage dienen
# - mit SSL (alte Version ohne SSL sieh SVN rev 622)
-# - benoetigt Paket libnet-smtp-ssl-perl
+# - benoetigt Paket libnet-smtp-ssl-perl libauthen-sasl-perl
+# (Updates->Pakete installieren oder apt-get install ..)
# Aufbau moeglichst so, dass man unterhalb der Definitionen nichts aendern muss!
@@ -17,7 +18,7 @@
my $Betreff = "eMail von $hostname";
my $text = "email-Body";
my $username = 'ab...@gm...'; #Anpassen! Username fuer SMTP-Server
-my $password = "meinpasswort"; #Anpassen! Passwort fuer SMTP-Server
+my $password = 'meinpasswort'; #Anpassen! Passwort fuer SMTP-Server
my $mailserver='mail.gmx.net:465'; # SMTP-Relay mit SSL: das muss natuerlich angepasst werden!
# oder z.B. smtp.gmail.com:465 fuer Gmail;
$plugin_info{$plugname.'_cycle'} = 3600;
@@ -33,7 +34,7 @@
$smtp->auth($username,$password) or return "SASL Auth failed $!;$@"; # try SASL
$smtp->status() < 5 or return "Auth failed: $!; $@ ". $smtp->status();
$smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
-$smtp->to($Empfaenger) or return "Empfaenger $Empfaenger abgelehnt $!";
+$smtp->to(split(',',$Empfaenger)) or return "Empfaenger $Empfaenger abgelehnt: $!";
$smtp->data() or return "Data failed $!";
$smtp->datasend("To: $Empfaenger\n") or return "Empfanger $Empfaenger (Header-To) abgelehnt $!";
$smtp->datasend("Subject: $Betreff\n") or return "Subject $Betreff abgelehnt $!";
Modified: wiregate/plugin/generic/Watchdog-SMTP-eMail
===================================================================
--- wiregate/plugin/generic/Watchdog-SMTP-eMail 2012-01-03 12:28:27 UTC (rev 629)
+++ wiregate/plugin/generic/Watchdog-SMTP-eMail 2012-01-03 15:39:57 UTC (rev 630)
@@ -1,7 +1,8 @@
# Demo-Plugin zum prüfen auf Plugin Timeout-Fehler
# und eMail-Versand
# - mit SSL (alte Version ohne SSL sieh SVN rev 622)
-# - benoetigt Paket libnet-smtp-ssl-perl
+# - benoetigt Paket libnet-smtp-ssl-perl libauthen-sasl-perl
+# (Updates->Pakete installieren oder apt-get install ..)
my $hostname = `hostname`;
@@ -13,7 +14,7 @@
my $Absender = 'WireGate <ab...@gm...>'; # unbedingt anpassen, die Absenderadresse sollte gültig sein um Probleme zu vermeiden
my $Betreff = "Plugin-Alarm von $hostname !";
my $username = 'ab...@gm...'; #Anpassen! Username fuer SMTP-Server
-my $password = "meinpasswort"; #Anpassen! Passwort fuer SMTP-Server
+my $password = 'meinpasswort'; #Anpassen! Passwort fuer SMTP-Server
my $mailserver='mail.gmx.net:465'; # SMTP-Relay mit SSL: das muss natuerlich angepasst werden!
# oder z.B. smtp.gmail.com:465 fuer Gmail;
$plugin_info{$plugname.'_cycle'} = 300;
@@ -38,7 +39,7 @@
$smtp->auth($username,$password) or return "SASL Auth failed $!;$@"; # try SASL
$smtp->status() < 5 or return "Auth failed: $! ". $smtp->status();
$smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
- $smtp->to($Empfaenger) or return "Empfaenger $Empfaenger abgelehnt $!";
+ $smtp->to(split(',',$Empfaenger)) or return "Empfaenger $Empfaenger abgelehnt $!";
$smtp->data() or return "Data failed $!";
$smtp->datasend("To: $Empfaenger\n") or return "Empfanger $Empfaenger (Header-To) abgelehnt $!";
$smtp->datasend("Subject: $Betreff\n") or return "Subject $Betreff abgelehnt $!";
Modified: wiregate/plugin/generic/email_triggered_by_ga.pl
===================================================================
--- wiregate/plugin/generic/email_triggered_by_ga.pl 2012-01-03 12:28:27 UTC (rev 629)
+++ wiregate/plugin/generic/email_triggered_by_ga.pl 2012-01-03 15:39:57 UTC (rev 630)
@@ -44,7 +44,7 @@
$smtp->auth($username,$password) or return "SASL Auth failed $!;$@"; # try SASL
$smtp->status() < 5 or return "Auth failed: $!; $@ ". $smtp->status();
$smtp->mail($Absender) or return "Absender $Absender abgelehnt $!";
- $smtp->to($email_adress) or return "Empfaenger $email_adress abgelehnt $!";
+ $smtp->to(split(',',$email_adress)) or return "Empfaenger $email_adress abgelehnt $!";
$smtp->data() or return "Data failed $!";
$smtp->datasend("To: $email_adress\n") or return "Empfanger $email_adress (Header-To) abgelehnt $!";
$smtp->datasend("Subject: $email_subject\n") or return "Subject $email_subject abgelehnt $!";
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-03 21:07:09
|
Revision: 632
http://openautomation.svn.sourceforge.net/openautomation/?rev=632&view=rev
Author: mayerch
Date: 2012-01-03 21:07:03 +0000 (Tue, 03 Jan 2012)
Log Message:
-----------
* Change from Telnet to Socket
* Implement a few missing commands for the Russound
* Write status messages of the Russound (aquired by the WATCH command) to the KNX status addresses
Modified Paths:
--------------
wiregate/plugin/generic/Russound_RIO.pl
wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample
Modified: wiregate/plugin/generic/Russound_RIO.pl
===================================================================
--- wiregate/plugin/generic/Russound_RIO.pl 2012-01-03 18:03:24 UTC (rev 631)
+++ wiregate/plugin/generic/Russound_RIO.pl 2012-01-03 21:07:03 UTC (rev 632)
@@ -12,6 +12,8 @@
#
#############################################################################
+#return; # uncomment to disable plugin
+
#############################################################################
# Configuration:
# --> change values in the conf.d directory!
@@ -20,6 +22,8 @@
my $numzones;
my $KNX_Start_Address;
+my $socknum; # unique number of the Socket
+
my $reset ; # set to 1 to reset the states, run script and change to 0 again
my $show_debug; # switches debug information that will be shown in the log
#############################################################################
@@ -27,6 +31,15 @@
#############################################################################
#############################################################################
+# Constants:
+my $MAX_ZONES = 31;
+my $ZONES_PER_CONTROLLER = 6;
+
+#############################################################################
+# Collect log information
+my $retval = '';
+
+#############################################################################
# Read config file in conf.d
my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
if (! -f $confFile)
@@ -56,49 +69,88 @@
}
#############################################################################
-# External libraries:
-use Net::Telnet ();
+# Configure socket
+if (!$socket[$socknum]) { # if it doesn't exist: create socket
+ if ($IP_of_Russound) {
+ $socket[$socknum] = IO::Socket::INET->new(
+ PeerAddr => $IP_of_Russound,
+ PeerPort => '9621',
+ Proto => 'tcp',
+ Timeout => 120,
+ Blocking => 0
+ );
+ if(!$socket[$socknum]) # retry with WOL if first try didn't work
+ {
+ `wakeonlan $MAC_of_Russound`;
+ $socket[$socknum] = IO::Socket::INET->new(
+ PeerAddr => $IP_of_Russound,
+ PeerPort => '9621',
+ Proto => 'tcp',
+ Timeout => 120,
+ Blocking => 0
+ );
+ }
+ if(!$socket[$socknum]) { # fail if second try also didn't work
+ return "open of $IP_of_Russound failed: $!";
+ }
+ } else {
+ return "ERROR: No IP address configured!";
+ }
-#############################################################################
-# Constants:
-my $MAX_ZONES = 31;
-my $ZONES_PER_CONTROLLER = 6;
+ $socksel->add($socket[$socknum]); # add socket to select
+ $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
+ $retval .= "opened Socket $socknum!" if $show_debug;
+}
+
#############################################################################
-# Collect log information
-my $retval = '';
-
my $destReadable = $msg{'dst'};
my $val = hex $msg{'data'};
# Convert to numeric GA
-(my $a, my $b, my $c) = split(/\//, $KNX_Start_Address );
-my $knxstartaddress = (($a << 11) + ($b << 8) + $c);
+my $knxstartaddress = str2addr( $KNX_Start_Address );
+my $dest = str2addr( $destReadable );
-# Convert to numeric GA
-($a,$b,$c) = split(/\//, $destReadable );
-my $dest = (($a << 11) + ($b << 8) + $c);
-
# Eigenen Aufruf-Zyklus ausschalten
$plugin_info{$plugname.'_cycle'} = 0;
-# aboniere alle relevanten GAs
-for (my $zone=0;$zone<$numzones;$zone++)
-{
- my $ctrl = int($zone/$ZONES_PER_CONTROLLER);
- my $czone = int($zone%$ZONES_PER_CONTROLLER);
- my $base = $knxstartaddress + 10 + ($czone*40) + ($ctrl*256);
- for( my $i = 0; $i < 13; $i++ ) # iterate funcnames
+if (%msg) { # KNX telegramm
+ $retval .= 'KNX:' if $show_debug;
+} elsif ($fh) { # incoming network message
+ my $sockInfo .= 'Socket: [';
+ my $cnt = 0;
+ my $line;
+ $/ = "\r\n"; # remove all new line
+ while( defined ($line = <$fh>) )
{
- my $a = $base + $i;
- my $gastr = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
- $plugin_subscribe{$gastr}{$plugname} = 1;
+ chomp( $line );
+ $sockInfo .= ($cnt++) . ': ' . $line .';';
+ handleRussResponse( $line );
}
- for( my $i = 0; $i < 10; $i++ ) # iterate stateames
+ $retval .= $sockInfo if $show_debug;
+} else
+{ # called during init or on cycle intervall
+ syswrite( $socket[$socknum], "VERSION\r" );
+ syswrite( $socket[$socknum], "WATCH System ON\r" );
+
+ # aboniere alle relevanten GAs
+ for (my $zone=0;$zone<$numzones;$zone++)
{
- my $a = $base + $i + 20;
- my $gastr = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
- $plugin_subscribe{$gastr}{$plugname} = 1;
+ my $ctrl = int($zone/$ZONES_PER_CONTROLLER);
+ my $czone = int($zone%$ZONES_PER_CONTROLLER);
+ my $base = $knxstartaddress + 10 + ($czone*40) + ($ctrl*256);
+ for( my $i = 0; $i < 13; $i++ ) # iterate funcnames
+ {
+ my $a = $base + $i;
+ my $gastr = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
+ $plugin_subscribe{$gastr}{$plugname} = 1;
+ }
+ for( my $i = 0; $i < 10; $i++ ) # iterate stateames
+ {
+ my $a = $base + $i + 20;
+ my $gastr = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
+ $plugin_subscribe{$gastr}{$plugname} = 1;
+ }
}
}
@@ -121,7 +173,10 @@
$controller = ($dest - $knxstartaddress) / 256;
}
- sendrussFunc( $controller, $zone, $func, $val );
+ if( $func < 20) # >= 20 = response addresses
+ {
+ $retval .= sendrussFunc( $controller, $zone, $func, $val );
+ }
}
return $retval;
@@ -131,19 +186,8 @@
sub sendcmd
{
my $cmd = shift;
- my $t = new Net::Telnet (
- Timeout => 10,
- Host => $IP_of_Russound,
- Port => 9621,
- Prompt => '/^/',
- Telnetmode => 0
- );
- $t->open();
- $t->print( $cmd );
- $t->close();
- my $res = $t->getline();
- $retval .= $cmd . '->' . $res if $show_debug;
- return $res;
+ syswrite( $socket[$socknum], "$cmd\r" );
+ return;
}
sub sendrussFunc
@@ -160,9 +204,15 @@
return 'Func ' . $func . ' not implemented or known';
} elsif( 0 == $func ) #power
{
- `wakeonlan $MAC_of_Russound`; # just to be sure
- sendcmd("EVENT $cz!ZoneOff") if( $val == 0 );
- sendcmd("EVENT $cz!ZoneOn" ) if( $val == 1 );
+ if( $val == 0 )
+ {
+ sendcmd("EVENT $cz!ZoneOff");
+ sendcmd("WATCH $cz OFF" );
+ } else {
+ `wakeonlan $MAC_of_Russound`; # just to be sure
+ sendcmd("EVENT $cz!ZoneOn" );
+ sendcmd("WATCH $cz ON" );
+ }
} elsif( 1 == $func ) #src
{
my $mapped = $val + 1;
@@ -181,17 +231,17 @@
sendcmd("SET $cz.treble=\"$mapped\"");
} elsif( 5 == $func ) #loud
{
- return 'Func ' . $func . ' not implemented or known';
+ sendcmd("SET $cz.loudness=\"" . ($val?'ON':'OFF') . '"');
} elsif( 6 == $func ) #bal
{
my $mapped = $val > 10 ? $val-256 : $val;
sendcmd("SET $cz.balance=\"$mapped\"");
} elsif( 7 == $func ) #party
{
- return 'Func ' . $func . ' not implemented or known';
+ sendcmd("EVENT $cz!PartyMode " . ($val?'ON':'OFF') );
} elsif( 8 == $func ) #dnd
{
- return 'Func ' . $func . ' not implemented or known';
+ sendcmd("EVENT $cz!DoNotDisturb " . ($val?'ON':'OFF') );
} elsif( 9 == $func ) #turnonvol
{
my $mapped = int( $val * 50/255 );
@@ -199,8 +249,104 @@
#TODO: 10 src cmd and 11 keypadcmd
} elsif( 12 == $func ) #volume relative up/down
{
- return 'Func ' . $func . ' not implemented or known';
+ sendcmd("EVENT $cz!KeyPress Volume" . ($val?'Up':'Down') );
} else {
- return 'Func ' . $func . ' not implemented or known';
+ return 'Func ' . $func . ' not implemented or known('.$val.')';
}
}
+
+sub handleRussResponse
+{
+ my $response = shift;
+
+ return if $response eq 'S';
+
+ if( $response =~ /^N C\[([0-9]*)\].Z\[([0-9]*)\].(.*)="(.*)"/ )
+ { # WATCH message from a controller
+ my $index = "${plugname}_$1_$2_$3";
+ return if $plugin_info{$index} eq $4; # no change
+
+ $plugin_info{$index} = $4;
+ sendKNXfuncCZ( $1, $2, $3, $4 );
+ } elsif( $response =~ /^N S\[([0-9]*)\].(.*)="(.*)"/ )
+ {
+ #$retval .= 'S:'.$1.'>'.$2.'>'.$3.';';
+ } elsif( $response =~ /^N System.(.*)="(.*)"/ )
+ {
+ #$retval .= 'System:'.$1.'>'.$2.';';
+ } elsif( $response =~ /^S / )
+ {
+ return; # don't care about response code...
+ } else {
+ $retval .= "<Unknown: $response>";
+ }
+}
+
+sub sendKNXfuncCZ
+{
+ my $C = shift;
+ my $Z = shift;
+ my $state = shift;
+ my $val = shift;
+ my $func; # KNX func number
+ my $dpt;
+
+ if( $state eq 'status' )
+ {
+ $func = 0;
+ $val = $val eq 'ON' ? 1 : 0;
+ $dpt = 1;
+ } elsif( $state eq 'currentSource' )
+ {
+ $func = 1;
+ $val = $val - 1;
+ $dpt = 5.004;
+ } elsif( $state eq 'volume' )
+ {
+ $func = 2;
+ $val = int($val * 255 / 50);
+ $dpt = 5.004;
+ } elsif( $state eq 'bass' )
+ {
+ $func = 3;
+ $val = $val < 0 ? 256+$val : $val;
+ $dpt = 5.004;
+ } elsif( $state eq 'treble')
+ {
+ $func = 4;
+ $val = $val < 0 ? 256+$val : $val;
+ $dpt = 5.004;
+ } elsif( $state eq 'loudness' )
+ {
+ $func = 5;
+ $val = $val eq 'ON' ? 1 : 0;
+ $dpt = 1;
+ } elsif( $state eq 'balance' )
+ {
+ $func = 6;
+ $val = $val < 0 ? 256+$val : $val;
+ $dpt = 5.004;
+ } elsif( $state eq 'partyMode' )
+ {
+ $func = 7;
+ $val = ($val eq 'ON' || $val eq 'MASTER') ? 1 : 0;
+ $dpt = 1;
+ } elsif( $state eq 'doNotDisturb' )
+ {
+ $func = 8;
+ $val = $val eq 'ON' ? 1 : 0;
+ $dpt = 1;
+ } elsif( $state eq 'turnOnVolume' )
+ {
+ $func = 9;
+ $val = int($val * 255 / 50);
+ $dpt = 5.004;
+ } else {
+ $retval .= "ERROR: Unknown state '$state' with value '$val'!";
+ return;
+ }
+
+ my $knxGA = $knxstartaddress+30+$func + (($Z-1)*40) + (($C-1)*256);
+ knx_write( addr2str( $knxGA, 1 ), $val, $dpt );
+ $retval .= 'KNX[' . addr2str( $knxGA, 1 ) . ',' . $dpt . ']:' . $val . ';' if $show_debug;
+}
\ No newline at end of file
Modified: wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample 2012-01-03 18:03:24 UTC (rev 631)
+++ wiregate/plugin/generic/conf.d/Russound_RIO.conf_sample 2012-01-03 21:07:03 UTC (rev 632)
@@ -10,6 +10,8 @@
$numzones = 6;
$KNX_Start_Address = '10/1/0';
+$socknum = 4711; # unique number of the Socket
+
$reset = 0; # set to 1 to reset the states, run script and change to 0 again
$show_debug = 1; # switches debug information that will be shown in the log
#############################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-05 16:25:23
|
Revision: 634
http://openautomation.svn.sourceforge.net/openautomation/?rev=634&view=rev
Author: makki1
Date: 2012-01-05 16:25:17 +0000 (Thu, 05 Jan 2012)
Log Message:
-----------
WireGat-Plugins: remove debug-code, cleanup, add maskver-Watchdog
Modified Paths:
--------------
wiregate/plugin/generic/DMX-Plugin.pl
wiregate/plugin/generic/EiWoMiSa
wiregate/plugin/generic/RFID-Leser
wiregate/plugin/generic/Taupunkt.pl
Added Paths:
-----------
wiregate/plugin/generic/EIB-Watchdog_maskver
Modified: wiregate/plugin/generic/DMX-Plugin.pl
===================================================================
--- wiregate/plugin/generic/DMX-Plugin.pl 2012-01-05 13:32:10 UTC (rev 633)
+++ wiregate/plugin/generic/DMX-Plugin.pl 2012-01-05 16:25:17 UTC (rev 634)
@@ -1,5 +1,5 @@
# Plugin DMX-Gateway
-# Version: 0.3 2011-05-28
+# Version: 0.4 2012-01-05
# Ben\xF6tigt DMX USB-Interface
##################
@@ -44,12 +44,6 @@
# Hauptverarbeitung
if (!$socket[$socknum]) { # socket erstellen
- if (defined $socket[$socknum]) { #debug
- if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
- undef $socket[$socknum];
- } #debug my $dgram = sprintf("C%03dL%03d\r\n",$dmxchan,hex($msg{'data'}));
-
- $socksel->remove($socket[$socknum]);
$socket[$socknum] = IO::Socket::INET->new(LocalPort => $dmx_recv_port,
Proto => "udp",
LocalAddr => $dmx_recv_ip,
Added: wiregate/plugin/generic/EIB-Watchdog_maskver
===================================================================
--- wiregate/plugin/generic/EIB-Watchdog_maskver (rev 0)
+++ wiregate/plugin/generic/EIB-Watchdog_maskver 2012-01-05 16:25:17 UTC (rev 634)
@@ -0,0 +1,21 @@
+### Variante maskver
+# Watchdog für KNX-Schnittstelle
+# relevant nur bei USB und evtl. FT1.2 !
+
+### Config physikalische Adresse - maskver muss lesbar sein!
+my $check_pa = "1.1.211";
+my $check_time = 120;
+### ENDE config
+
+# Eigenen Aufruf-Zyklus setzen
+$plugin_info{$plugname.'_cycle'} = $check_time;
+
+my $result=system("maskver local:/tmp/eib $check_pa");
+if ($result != 0) {
+ my $dummy = `/etc/init.d/eibd restart`;
+ return "EIB-Lesefehler!";
+}
+
+return 0;
+
+
Modified: wiregate/plugin/generic/EiWoMiSa
===================================================================
--- wiregate/plugin/generic/EiWoMiSa 2012-01-05 13:32:10 UTC (rev 633)
+++ wiregate/plugin/generic/EiWoMiSa 2012-01-05 16:25:17 UTC (rev 634)
@@ -1,5 +1,5 @@
# Plugin Eiwomisa RGB DMX-Controller
-# Version: 0.1 2011-01-21
+# Version: 0.11 2012-01-05
# Benötigt Eiwomisa RGB DMX Controller und socat Eintrag für USB-RS232 Wandler
##################
@@ -33,11 +33,6 @@
# Hauptverarbeitung
if (!$socket[$socknum]) { # socket erstellen
- if (defined $socket[$socknum]) { #debug
- if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
- undef $socket[$socknum];
- } #debug
- $socksel->remove($socket[$socknum]);
$socket[$socknum] = IO::Socket::INET->new(
Proto => "udp",
PeerPort => $dmx_send_port,
Modified: wiregate/plugin/generic/RFID-Leser
===================================================================
--- wiregate/plugin/generic/RFID-Leser 2012-01-05 13:32:10 UTC (rev 633)
+++ wiregate/plugin/generic/RFID-Leser 2012-01-05 16:25:17 UTC (rev 634)
@@ -1,5 +1,5 @@
# Plugin R.S-Systems RFID-Reader to KNX
-# Version: 0.2 2010-10-02
+# Version: 0.21 2012-01-05
# Ben\xF6tigt
# - RSS RFID-Reader an einem USB-Seriell-Wandler
# - Eintrag unter Socketverbindungen (socat)
@@ -27,11 +27,6 @@
# Hauptverarbeitung
# or ($fh and eof($socket[$socknum]))
if (!$socket[$socknum]) { # socket erstellen
- if (defined $socket[$socknum]) { #debug
- if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
- undef $socket[$socknum];
- } #debug
- $socksel->remove($socket[$socknum]);
$socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
Proto => "udp",
LocalAddr => $recv_ip
Modified: wiregate/plugin/generic/Taupunkt.pl
===================================================================
--- wiregate/plugin/generic/Taupunkt.pl 2012-01-05 13:32:10 UTC (rev 633)
+++ wiregate/plugin/generic/Taupunkt.pl 2012-01-05 16:25:17 UTC (rev 634)
@@ -1,4 +1,8 @@
# Plugin zur Taupunktberechnung
+# *** ACHTUNG ***
+# Dieses Plugin ist im Prinzip obsolet, da Taupunkt seit PL29 direkter Bestandteil ist
+# *** ACHTUNG ***
+#
# Details zur N\xE4herungsformel unter http://www.wettermail.de/wetter/feuchte.html
# Das Plugin geht davon aus, das Temperatur&Luftfeuchte zyklisch
# auf den Bus geschrieben werden und/oder lesbar sind (Lese-Flag gesetzt)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-08 19:33:14
|
Revision: 646
http://openautomation.svn.sourceforge.net/openautomation/?rev=646&view=rev
Author: makki1
Date: 2012-01-08 19:33:07 +0000 (Sun, 08 Jan 2012)
Log Message:
-----------
WireGate-Plugins: FTP-Upload/create PNG-graphs, RSSlog
Added Paths:
-----------
wiregate/plugin/generic/FTP_UploadGraph.pl
wiregate/plugin/generic/RSSlog.pl
Added: wiregate/plugin/generic/FTP_UploadGraph.pl
===================================================================
--- wiregate/plugin/generic/FTP_UploadGraph.pl (rev 0)
+++ wiregate/plugin/generic/FTP_UploadGraph.pl 2012-01-08 19:33:07 UTC (rev 646)
@@ -0,0 +1,66 @@
+### Plugin zum erstellen von Grafiken aus RRD's und FTP-Upload (SMTP-Versand, ...)
+# v0.1
+# 2012-01-04
+# Kann aktuell nur einen Wert pro Grafik!
+# Hinweise: Die Grafikerstellung ist sehr resourcenintensiv -
+# stark abhängig von der Groesse der Grafik - und sollte nicht zu haeufig laufen!
+# Dringend empfohlen: nicht mehr als 10 Werte pro Plugin!
+
+###################
+### DEFINITION ###
+###################
+
+$plugin_info{$plugname . '_cycle'} = 3600; # Aufrufzyklus
+
+# FTP Zugangsdaten
+my $host = 'mein.ftpserver.de';
+my $user = 'meinuser';
+my $password = 'meinpasswort';
+my $path = '/public_html/graph'; # Pfad auf dem FTP-Server
+
+my $datasource = 'AVERAGE'; # MIN,AVERAGE,MAX
+
+my %graphics;
+# hash fuer RRD / Grafik-Name
+$graphics{'28.2C0E66010000_temp'} = 'WP_HGL-VL.png';
+$graphics{'28.5F1966010000_temp'} = 'WP_VL.png';
+$graphics{'28.480266010000_temp'} = 'WP_RL.png';
+
+# kann bis auf diesen Teil direkt aus der graph-URL uebernommen werden:
+# DEF:ds0=28.2C0E66010000_temp.rrd:value:AVERAGE;
+# (DEF:ds0.. bis ;)
+# kann man anpassen
+my $url1 = 'http://localhost/graph.pl?--start=-24h;--end=now;-X=0;-W=WireGate;--slope-mode;--lazy;-h=200;-w=650;--full-size-mode;--vertical-label=%B0%20Celsius;';
+my $url2 = 'LINE1:ds0%23ff0000:Wert;VDEF:ds0_LAST=ds0,LAST;GPRINT:ds0_LAST:%2.2lf%B0C;;VDEF:ds0_MIN=ds0,MINIMUM;GPRINT:ds0_MIN:Min\:%20%8.2lf%B0C;VDEF:ds0_AVERAGE=ds0,AVERAGE;GPRINT:ds0_AVERAGE:Mittel\:%20%8.2lf%B0C;VDEF:ds0_MAX=ds0,MAXIMUM;GPRINT:ds0_MAX:Max\:%20%8.2lf%B0C\n;';
+
+########################
+### Ende DEFINITION ###
+########################
+
+
+use Net::FTP;
+my $rrd_ret;
+
+my $ftp = Net::FTP->new($host, Debug => 0, Passive => 1, Timeout => 10)
+ or return "Cannot connect to host $!";
+$ftp->login($user,$password)
+ or return "Cannot login " . $ftp->message . "$!";
+$ftp->cwd($path)
+ or return "Cannot change working directory: " . $ftp->message . "$!";
+$ftp->binary;
+
+# durch den Hash gehen und senden
+while ( my ($rrd,$filename) = each(%graphics) ) {
+ my $url = $url1 . "DEF:ds0=$rrd.rrd:value:$datasource;" . $url2;
+ $rrd_ret .= `wget "$url" -O /tmp/$filename -o /tmp/wget.log`;
+ $ftp->put("/tmp/$filename",$filename)
+ or return "Cannot send $filename: $!";
+
+ # oder hier z.B. eMails verschicken oder...
+}
+
+$ftp->quit;
+
+#return; # ohne Logeintrag
+return "FTP said " . $ftp->message;
+
Added: wiregate/plugin/generic/RSSlog.pl
===================================================================
--- wiregate/plugin/generic/RSSlog.pl (rev 0)
+++ wiregate/plugin/generic/RSSlog.pl 2012-01-08 19:33:07 UTC (rev 646)
@@ -0,0 +1,79 @@
+### Plugin zum erstellen von RSS-logs
+# Fuer Verwendung mit rsslog.php / CometVisu
+# man koennte natuerlich ebenso das rsslog.php direkt mit LWP::Useragent oder
+# wget aufrufen, hier soll aber auch die Verwendung von SQLite Datenbanken
+# demonstriert werden.
+# Wichtig:
+# - benoetigt Paket libdbd-sqlite2-perl
+# - weil in PHP nur sqlite2 verfuegbar
+#
+# v0.1
+# 2012-01-08
+
+###################
+### DEFINITION ###
+###################
+
+$plugin_info{$plugname . '_cycle'} = 0; # Aufrufzyklus - never
+
+my @actionGA;
+# Datenpunkttypen MUESSEN in der globalen config angegeben sein!
+# Logeintrag bei bestimmtem Wert
+push @actionGA, { title => "Eintrag1 ohne Wert", content => 'Textinhalt1', tags => "tag1,tag3", trigger_ga => "1/1/11", value => 1 };
+# Logeintrag beliebigem Wert: value weglassen
+# %s wird mit sprintf durch den Wert ersetzt, anderes wie %.2f geht auch in content oder title!
+# man printf ;)
+push @actionGA, { title => "Eintrag2 mit Wert unabhaengig vom Wert %.2f", content => 'Textinhalt %s', tags => "tag4", trigger_ga => "1/1/11"};
+
+# Nun einge Beispiele aus der Praxis:
+push @actionGA, { title => "Haustuere", content => 'Haustuere auf', tags => "security,sensoren", trigger_ga => "5/1/10", value => 1};
+push @actionGA, { title => "Haustuere", content => 'Haustuere zu', tags => "security,sensoren", trigger_ga => "5/1/10", value => 0};
+push @actionGA, { title => "Garagentor", content => 'Garagentor %d (0=zu, 1=auf)', tags => "security,sensoren", trigger_ga => "5/4/103"};
+push @actionGA, { content => 'Trittmatte', tags => "security,sensoren", trigger_ga => "5/1/11", value => 1};
+push @actionGA, { content => 'Bluetooth Zutritt', tags => "security,sensoren", trigger_ga => "5/1/12", value => 1};
+# title & tags darf auch leer sein
+
+########################
+### Ende DEFINITION ###
+########################
+
+use DBI;
+my $logdb = '/etc/wiregate/rss/rsslog.db';
+
+# check setup, rights, DB
+if (! -d dirname($logdb)) {
+ mkdir(dirname($logdb),0777);
+}
+if (! -e $logdb) {
+ return "$logdb existiert nicht! Bitte mit rsslog.php anlegen"; # FIXME: create sqlite-db
+}
+
+if ($msg{'apci'} eq "A_GroupValue_Write") { # Telegramm eingetroffen
+ foreach my $element (@actionGA) {
+ if ($msg{'dst'} eq "$element->{trigger_ga}") {
+ if (defined $element->{value}) { # skip if value is defined and not what we like
+ next unless "$msg{'value'}" eq "$element->{value}"; }
+
+ my $dbargs = {AutoCommit => 0, PrintError => 1};
+ my $dbh = DBI->connect("dbi:SQLite2:dbname=$logdb", "", "", $dbargs);
+
+ $dbh->do('INSERT INTO Logs(content, title, tags, t) VALUES( ' .
+ " '" . sprintf($element->{content},$msg{'value'}) . "'," .
+ " '" . sprintf($element->{title},$msg{'value'}) . "'," .
+ " '" . $element->{tags} . "'," .
+ " datetime('now') );");
+
+ if ($dbh->err()) { return "DB-Fehler: $DBI::errstr\n"; }
+ $dbh->commit();
+ $dbh->disconnect();
+ return; # "V: " . $dbh->{sqlite_version};
+ }
+ }
+} else { # zyklischer Aufruf/initialisierung
+ #subscribe GAs
+ foreach my $element (@actionGA) {
+ $plugin_subscribe{$element->{trigger_ga}}{$plugname} = 1;
+ }
+}
+return; # "Noop";
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-02-09 19:27:52
|
Revision: 692
http://openautomation.svn.sourceforge.net/openautomation/?rev=692&view=rev
Author: makki1
Date: 2012-02-09 19:27:42 +0000 (Thu, 09 Feb 2012)
Log Message:
-----------
Plugin Prowl and some enhancement on DaemonStartStop
Modified Paths:
--------------
wiregate/plugin/generic/DaemonStartStop
wiregate/plugin/generic/Prowl.pl
Modified: wiregate/plugin/generic/DaemonStartStop
===================================================================
--- wiregate/plugin/generic/DaemonStartStop 2012-02-08 19:13:45 UTC (rev 691)
+++ wiregate/plugin/generic/DaemonStartStop 2012-02-09 19:27:42 UTC (rev 692)
@@ -1,6 +1,8 @@
# Plugin um daemons (Dienste) per KNX Gruppenadresse zu starten/beenden
# pptpd in diesem Beispiel, geht natuerlich auch fuer alle anderen
# Eigenen Aufruf-Zyklus auf taeglich setzen
+# v0.2 - auch nach reboot deaktivieren
+
$plugin_info{$plugname.'_cycle'} = 86400;
##############################################################################
@@ -17,10 +19,12 @@
if (%msg) {
if ($msg{'apci'} eq "A_GroupValue_Write" and $ga eq $msg{'dst'}) {
if($msg{'data'}+0) {
+ $dummy = `update-rc.de $daemon defaults`;
$dummy = `/etc/init.d/$daemon restart`;
return; # "started $daemon
} else {
$dummy = `/etc/init.d/$daemon stop`;
+ $dummy = `update-rc.de $daemon remove`;
return; # "stopped $daemon
}
}
@@ -29,4 +33,4 @@
# subscribe GA's
$plugin_subscribe{$ga}{$plugname} = 1;
}
-return;
\ No newline at end of file
+return;
Modified: wiregate/plugin/generic/Prowl.pl
===================================================================
--- wiregate/plugin/generic/Prowl.pl 2012-02-08 19:13:45 UTC (rev 691)
+++ wiregate/plugin/generic/Prowl.pl 2012-02-09 19:27:42 UTC (rev 692)
@@ -1,6 +1,7 @@
# Plugin um Nachrichten an Prowl zu senden
-# Version: 0.1 2010-10-14
-# Ben\xF6tigt einen Prowl-Account sowie API-Key
+# Version: 0.2 2012-01-09
+# Mit Wertabhaengigkeit, low/high-Filter
+# Benötigt einen Prowl-Account sowie API-Key
##################
### DEFINITION ###
@@ -8,19 +9,29 @@
my $socknum = 8; # Eindeutige Nummer des Sockets
-# Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches pr\xFCfen)
+# Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
$plugin_info{$plugname.'_cycle'} = 300;
my %options = ();
$options{'apikey'} = "xyzxyz";
-# Zwei M\xF6glichkeiten zur Nutzung:
+# Zwei Möglichkeiten zur Nutzung:
# VARIANTE 1: Bitwert auf GA sendet fixes Nachricht:
my %prowl_ga; # Eintrag darf nicht auskommentiert werden, solange nachfolgend keine GA definiert erfolgt kein Versand!
$prowl_ga{'14/5/208'} = '0;Event;Description Hallo;Application'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
-# VARIANTE 2: Plugin horcht auf UDP-Port und empf\xE4ngt Format PRIO;Event;Description;Application\n
+# VARIANTE 1a: Wert im Text mit ausgeben, printf-Syntax - DPT der GA muss konfiuriert sein!
+$prowl_ga{'14/5/208'} = '0;Event;Wert %.2f;Application'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
+$prowl_ga{'5/0/1'}[0] = '0;ausgeschaltet;Description Hallo;Buero Beleuchtung'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
+$prowl_ga{'5/0/1'}[1] = '0;eingeschaltet;Description Hallo;Buero Beleuchtung'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
+$prowl_ga{'4/0/0'} = '0;eingeschaltet;Description Hallo;Temperatur %.2f'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
+my %prowl_ga_limit_high;
+my %prowl_ga_limit_low;
+$prowl_ga_limit_high{'4/0/0'} = 28;
+$prowl_ga_limit_low{'4/0/0'} = 25;
+
+# VARIANTE 2: Plugin horcht auf UDP-Port und empf�ngt Format PRIO;Event;Description;Application\n
my $recv_ip = "0.0.0.0"; # Empfangs-IP
my $recv_port = "50018"; # Empfangsport
@@ -40,20 +51,34 @@
LocalAddr => $recv_ip,
ReuseAddr => 1
)
- or return ("open of $recv_ip : $recv_port failed: $!");
+ 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
# subscribe GA's
- while( my ($k, $v) = each(%prowl_ga) ) {
+ while( my ($k, $v) = each(%prowl_ga) ) {
# Plugin an Gruppenadresse "anmelden"
$plugin_subscribe{$k}{$plugname} = 1;
- }
+ }
return "opened UDP-Socket $socknum";
}
if (%msg) { # telegramm vom KNX
if ($msg{'apci'} eq "A_GroupValue_Write" and $prowl_ga{$msg{'dst'}}) {
- return sendProwl($prowl_ga{$msg{'dst'}});
+ if ($msg{'data'} eq "00") {
+ return sendProwl($prowl_ga{$msg{'dst'}}[0]);
+ }
+ elsif ($msg{'data'} eq "01") {
+ return sendProwl($prowl_ga{$msg{'dst'}}[1]);
+ }
+ elsif (defined $prowl_ga_limit_high{$msg{'dst'}} && $msg{'value'} > $prowl_ga_limit_high{$msg{'dst'}}) {
+ return sendProwl(sprintf($prowl_ga{$msg{'dst'}},$msg{'value'}));
+ }
+ elsif (defined $prowl_ga_limit_high{$msg{'dst'}} && $msg{'value'} < $prowl_ga_limit_low{$msg{'dst'}}) {
+ return sendProwl(sprintf($prowl_ga{$msg{'dst'}},$msg{'value'}));
+ }
+ else {
+ return sendProwl(sprintf($prowl_ga{$msg{'dst'}},$msg{'value'}));
+ }
}
} elsif ($fh) { # UDP-Packet
my $buf = <$fh>;
@@ -62,10 +87,10 @@
} else {
# cyclic/init/change
# subscribe GA's
- while( my ($k, $v) = each(%prowl_ga) ) {
+ while( my ($k, $v) = each(%prowl_ga) ) {
# Plugin an Gruppenadresse "anmelden"
$plugin_subscribe{$k}{$plugname} = 1;
- }
+ }
return; # ("return dunno");
}
@@ -84,11 +109,11 @@
$userAgent->agent("WireGatePlugin/1.0");
$requestURL = sprintf("https://prowl.weks.net/publicapi/add?apikey=%s&application=%s&event=%s&description=%s&priority=%d",
- $options{'apikey'},
- $options{'application'},
- $options{'event'},
- $options{'notification'},
- $options{'priority'});
+ $options{'apikey'},
+ $options{'application'},
+ $options{'event'},
+ $options{'notification'},
+ $options{'priority'});
$request = HTTP::Request->new(GET => $requestURL);
#$request->timeout(5);
@@ -96,13 +121,12 @@
$response = $userAgent->request($request);
if ($response->is_success) {
- return "Notification successfully posted: $options{'priority'},$options{'event'},$options{'description'},$options{'application'}";
+ return "Notification successfully posted: $options{'priority'},$options{'event'},$options{'description'},$options{'application'}";
} elsif ($response->code == 401) {
- return "Notification not posted: incorrect API key.";
+ return "Notification not posted: incorrect API key.";
} else {
- return "Notification not posted: " . $response->content;
+ return "Notification not posted: " . $response->content;
}
}
-return;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-04-13 11:31:15
|
Revision: 750
http://openautomation.svn.sourceforge.net/openautomation/?rev=750&view=rev
Author: pfry
Date: 2012-04-13 11:31:06 +0000 (Fri, 13 Apr 2012)
Log Message:
-----------
Konfiguration in ein separates File im conf.d-Verzeichnis verschoben
Modified Paths:
--------------
wiregate/plugin/generic/Ansagen.pl
Added Paths:
-----------
wiregate/plugin/generic/conf.d/Ansagen.conf
Modified: wiregate/plugin/generic/Ansagen.pl
===================================================================
--- wiregate/plugin/generic/Ansagen.pl 2012-04-13 08:14:14 UTC (rev 749)
+++ wiregate/plugin/generic/Ansagen.pl 2012-04-13 11:31:06 UTC (rev 750)
@@ -8,92 +8,21 @@
use POSIX qw(floor);
-# Voraussetzungen:
-
-# 1. Im Verzeichnis $speechdir/Zahlen muessen folgende Dateien vorhanden sein:
-
-# 1.1. Kardinalzahlen ("Null", "Eins"):
-# c0.wav...c19.wav, c20.wav...c90.wav, c100.wav, c1000.wav
-
-# 1.2. Ordinalzahlen ("Erster", "Zweiter"):
-# o0.wav...o19.wav, o20.wav...o90.wav, o100.wav, o1000.wav
-
-# 1.3. Zahlteile mit "und" wie "...undzwanzig", "...unddreissigster":
-# uc20.wav...uc90.wav, uo20.wav...uo90.wav
-
-# 1.4. Ziffern zur Zahlbildung ("ein"):
-# u1.wav...u9.wav (u1.wav="ein" als Bestandteil von "einunzwanzig",
-# u2.wav...u9.wav koennen identisch mit c2.wav...c9.wav sein)
-
-# 1.7. Spezielle Woerter:
-# minus.wav, Komma.wav, Grad.wav, Prozent.wav
-# auf.wav, zu.wav, hoch.wav, runter.wav, an.wav, aus.wav
-
-# 2. Im Verzeichnis $speechdir/Monate muessen die Namen der Monate liegen:
-# Januar.wav ... Dezember.wav
-
-# 3. Im Verzeichnis $speechdir/Wochentage muessen die Wochentagsnamen liegen:
-# Mo.wav ... So.wav
-
-# 4. Ein Piepton $speechdir/beep.wav mit Pieptoenen, die vor der Sprachausgabe
-# gesendet werden (weckt bei mir den Russound-Paging-Kanal auf, der sonst die
-# ersten Silben verschluckt). Bei mir ist das wiederum ein ganzes Verzeichnis
-# Beep mit Dateien 01.wav ... 32.wav in aufsteigender Dauer sortiert
-
-# 5. Im Verzeichnis $speechdir ausserdem:
-# Alle Woerter bzw. ganze Saetze, die vorgelesen werden sollen,
-# wobei zB ein Satz "Willkommen Fry" in der Datei $speechdir/Willkommen/Fry.wav
-# liegen darf
-
-# alle diese Audiodateien kann man sich online generieren, zB bei SVOX.
-
-# Plugin-Konfiguration ################################################
-
-# Ausgabekanal:
-# Die ALSA-Kanalunterscheidung wird durch die Namensgebung der GA
-# in eibga.conf getroffen. Das Muster ffuer dieKanalunterscheidung
-# steht in %channels.
-
-# Textteil: Der Rest des GA-Namens wird als Text "vorgelesen".
-# Das Plugin sucht dabei zunaechst nach einem "exact match" einer Datei
-# im Sprachverzeichnis. Wenn dieser Match nicht existieren sollte, werden
-# die Woerter getrennt und jedes einzeln gesucht.
-
-# Datenteil:
-# Am Ende des Textteils wird der Telegramminhalt aufgesagt,
-# wobei folgende Datentypen erlaubt sind:
-# 1.017: (keine Daten, nur den GA-Namen vorlesen)
-# 1.001: "An/Aus"
-# 1.008: "Hoch/Runter"
-# 1.009: "Auf/Zu"
-# 5.010 / 7.001: Ordinalzahl ("Einundzwanzigster")
-# 6.010 / 8.001: Kardinalzahl ("Einundzwanzig")
-# 6.001 / 5.001: Prozentwert ("dreiundfuenfzig Prozent")
-# 9.001: Temperatur ("minus drei komma fuenf Grad")
-# 11.001: # Datum ("elfter April")
-# 10.001: # Wochentag+Uhrzeit ("Montag elf Uhr fuenfzehn")
-
-# Hier meine Konfiguration als Beispiel:
-
-# ANsagen gehen auf ALSA-Kanal 'welcome' und kommen ueber einen eigenen
-# kleinen Verstaerker im Eingangsflur raus
-
-# DURCHsagen gehen auf ALSA-Kanal 'paging' und gehen ueber die Russound an
-# alle Lautsprecher im Haus. Dort muss ein Beep vorweggesendet werden
-
+# Konfiguration vorbereiten und einlesen
my $logfile='/var/log/Ansagen.log';
my $speechdir='/var/lib/Ansagen/Sprache/';
-my %channels=(
- '^WA_'=>'welcome', # zB "WA_Die Aussentemperatur betraegt"
- '^WD_'=>'paging', # zB "WD_Folgende Fenster sind geoeffnet"
- 'default'=>'welcome' # die GAs in additional_subscriptions
-);
+my %channels=('default'=>'welcome');
my $beepchannel='paging';
-my $beep = sprintf "Beep/%02d.wav", 3; # int(rand(32))+1 fuer Zufallsbeep
-#my @additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
+my $beep = "Beep/03d.wav";
my @additional_subscriptions=();
-############### Ende der Konfiguration #########################
+# Konfigurationsfile einlesen
+my $conf=$plugname; $conf=~s/\.pl$/.conf/;
+open FILE, "</etc/wiregate/plugin/generic/conf.d/$conf" || return "no config found";
+my @lines = <FILE>;
+close FILE;
+eval("@lines");
+return "config error" if $@;
# Aufrufgrund ermitteln
my $event=undef;
Added: wiregate/plugin/generic/conf.d/Ansagen.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Ansagen.conf (rev 0)
+++ wiregate/plugin/generic/conf.d/Ansagen.conf 2012-04-13 11:31:06 UTC (rev 750)
@@ -0,0 +1,86 @@
+# Voraussetzungen:
+
+# 1. Im Verzeichnis $speechdir/Zahlen muessen folgende Dateien vorhanden sein:
+
+# 1.1. Kardinalzahlen ("Null", "Eins"):
+# c0.wav...c19.wav, c20.wav...c90.wav, c100.wav, c1000.wav
+
+# 1.2. Ordinalzahlen ("Erster", "Zweiter"):
+# o0.wav...o19.wav, o20.wav...o90.wav, o100.wav, o1000.wav
+
+# 1.3. Zahlteile mit "und" wie "...undzwanzig", "...unddreissigster":
+# uc20.wav...uc90.wav, uo20.wav...uo90.wav
+
+# 1.4. Ziffern zur Zahlbildung ("ein"):
+# u1.wav...u9.wav (u1.wav="ein" als Bestandteil von "einunzwanzig",
+# u2.wav...u9.wav koennen identisch mit c2.wav...c9.wav sein)
+
+# 1.7. Spezielle Woerter:
+# minus.wav, Komma.wav, Grad.wav, Prozent.wav
+# auf.wav, zu.wav, hoch.wav, runter.wav, an.wav, aus.wav
+
+# 2. Im Verzeichnis $speechdir/Monate muessen die Namen der Monate liegen:
+# Januar.wav ... Dezember.wav
+
+# 3. Im Verzeichnis $speechdir/Wochentage muessen die Wochentagsnamen liegen:
+# Mo.wav ... So.wav
+
+# 4. Ein Piepton $speechdir/beep.wav mit Pieptoenen, die vor der Sprachausgabe
+# gesendet werden (weckt bei mir den Russound-Paging-Kanal auf, der sonst die
+# ersten Silben verschluckt). Bei mir ist das wiederum ein ganzes Verzeichnis
+# Beep mit Dateien 01.wav ... 32.wav in aufsteigender Dauer sortiert
+
+# 5. Im Verzeichnis $speechdir ausserdem:
+# Alle Woerter bzw. ganze Saetze, die vorgelesen werden sollen,
+# wobei zB ein Satz "Willkommen Fry" in der Datei $speechdir/Willkommen/Fry.wav
+# liegen darf
+
+# alle diese Audiodateien kann man sich online generieren, zB bei SVOX.
+
+# Plugin-Konfiguration ################################################
+
+# Ausgabekanal:
+# Die ALSA-Kanalunterscheidung wird durch die Namensgebung der GA
+# in eibga.conf getroffen. Das Muster ffuer dieKanalunterscheidung
+# steht in %channels.
+
+# Textteil: Der Rest des GA-Namens wird als Text "vorgelesen".
+# Das Plugin sucht dabei zunaechst nach einem "exact match" einer Datei
+# im Sprachverzeichnis. Wenn dieser Match nicht existieren sollte, werden
+# die Woerter getrennt und jedes einzeln gesucht.
+
+# Datenteil:
+# Am Ende des Textteils wird der Telegramminhalt aufgesagt,
+# wobei folgende Datentypen erlaubt sind:
+# 1.017: (keine Daten, nur den GA-Namen vorlesen)
+# 1.001: "An/Aus"
+# 1.008: "Hoch/Runter"
+# 1.009: "Auf/Zu"
+# 5.010 / 7.001: Ordinalzahl ("Einundzwanzigster")
+# 6.010 / 8.001: Kardinalzahl ("Einundzwanzig")
+# 6.001 / 5.001: Prozentwert ("dreiundfuenfzig Prozent")
+# 9.001: Temperatur ("minus drei komma fuenf Grad")
+# 11.001: # Datum ("elfter April")
+# 10.001: # Wochentag+Uhrzeit ("Montag elf Uhr fuenfzehn")
+
+# Hier meine Konfiguration als Beispiel:
+
+# ANsagen gehen auf ALSA-Kanal 'welcome' und kommen ueber einen eigenen
+# kleinen Verstaerker im Eingangsflur raus
+
+# DURCHsagen gehen auf ALSA-Kanal 'paging' und gehen ueber die Russound an
+# alle Lautsprecher im Haus. Dort muss ein Beep vorweggesendet werden
+
+$logfile='/var/log/Ansagen.log';
+$speechdir='/var/lib/Ansagen/Sprache/';
+%channels=(
+ '^WA_'=>'welcome', # zB "WA_Die Aussentemperatur betraegt"
+ '^WD_'=>'paging', # zB "WD_Folgende Fenster sind geoeffnet"
+ 'default'=>'welcome' # die GAs in additional_subscriptions
+);
+$beepchannel='paging';
+$beep = sprintf "Beep/%02d.wav", 3; # int(rand(32))+1 fuer Zufallsbeep
+#my @additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
+@additional_subscriptions=();
+
+############### Ende der Konfiguration #########################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-04-13 11:56:02
|
Revision: 751
http://openautomation.svn.sourceforge.net/openautomation/?rev=751&view=rev
Author: pfry
Date: 2012-04-13 11:55:56 +0000 (Fri, 13 Apr 2012)
Log Message:
-----------
Modified Paths:
--------------
wiregate/plugin/generic/Ansagen.pl
wiregate/plugin/generic/conf.d/Ansagen.conf
Modified: wiregate/plugin/generic/Ansagen.pl
===================================================================
--- wiregate/plugin/generic/Ansagen.pl 2012-04-13 11:31:06 UTC (rev 750)
+++ wiregate/plugin/generic/Ansagen.pl 2012-04-13 11:55:56 UTC (rev 751)
@@ -8,7 +8,7 @@
use POSIX qw(floor);
-# Konfiguration vorbereiten und einlesen
+# Defaultkonfiguration
my $logfile='/var/log/Ansagen.log';
my $speechdir='/var/lib/Ansagen/Sprache/';
my %channels=('default'=>'welcome');
Modified: wiregate/plugin/generic/conf.d/Ansagen.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Ansagen.conf 2012-04-13 11:31:06 UTC (rev 750)
+++ wiregate/plugin/generic/conf.d/Ansagen.conf 2012-04-13 11:55:56 UTC (rev 751)
@@ -1,3 +1,7 @@
+#!/usr/bin/perl
+#
+# Ansagen.pl - Konfiguration
+
# Voraussetzungen:
# 1. Im Verzeichnis $speechdir/Zahlen muessen folgende Dateien vorhanden sein:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-04-25 17:48:20
|
Revision: 764
http://openautomation.svn.sourceforge.net/openautomation/?rev=764&view=rev
Author: pfry
Date: 2012-04-25 17:48:08 +0000 (Wed, 25 Apr 2012)
Log Message:
-----------
Das Plugin wurde nun auf mpd/pulseaudio optimiert (aplay immer noch moeglich).
MissGoogle.pl ist KEIN Plugin, sondern ein Tool zur Erzeugung der Audiodateien mit angenehmer Stimme per Google Translate.
Modified Paths:
--------------
wiregate/plugin/generic/Ansagen.pl
wiregate/plugin/generic/conf.d/Ansagen.conf
Added Paths:
-----------
wiregate/plugin/generic/MissGoogle.pl
Modified: wiregate/plugin/generic/Ansagen.pl
===================================================================
--- wiregate/plugin/generic/Ansagen.pl 2012-04-25 17:11:27 UTC (rev 763)
+++ wiregate/plugin/generic/Ansagen.pl 2012-04-25 17:48:08 UTC (rev 764)
@@ -9,12 +9,14 @@
use POSIX qw(floor);
# Defaultkonfiguration
-my $logfile='/var/log/Ansagen.log';
-my $speechdir='/var/lib/Ansagen/Sprache/';
+my $speechdir='/var/lib/mpd/music/Ansagen';
+my $mpddir='/var/lib/mpd/music';
my %channels=('default'=>'welcome');
my $beepchannel='paging';
my $beep = "Beep/03d.wav";
my @additional_subscriptions=();
+my %mpdhost=('default'=>'127.0.0.1/6600');
+my $mode='mpd';
# Konfigurationsfile einlesen
my $conf=$plugname; $conf=~s/\.pl$/.conf/;
@@ -22,8 +24,12 @@
my @lines = <FILE>;
close FILE;
eval("@lines");
-return "config error" if $@;
+# speechdir muss im mpddir liegen!
+$speechdir=~s!/$!!;
+$mpddir=~s!/$!!;
+return "config error" if $@ || ($mode eq 'mpd' && $speechdir !~ /^$mpddir/);
+
# Aufrufgrund ermitteln
my $event=undef;
if (!$plugin_initflag)
@@ -41,6 +47,11 @@
my %gas=();
# Erstaufruf - an GAs anmelden, auf die die Muster in %channels zutreffen
+ for my $k (grep /^$plugname\_/, keys %plugin_info)
+ {
+ delete $plugin_info{$k};
+ }
+
for my $ga (keys %eibgaconf)
{
my $name=$eibgaconf{$ga}{'name'};
@@ -90,8 +101,8 @@
# Hole alle verfuegbaren Durchsagedateien
my $find=checkexec('find');
- my @speech=split /\n/, `$find . -name "*.wav"`;
-
+ my @speech=split /\n/, `$find . -name '*.wav'`;
+ map s!^\./!!, @speech; # Pfade relativ zum speechdir
return 'no speech files found' unless @speech;
my @statement=();
@@ -171,7 +182,7 @@
{
push(@statement, number(\@speech, $2));
push(@statement, "Zeiten/Uhr.wav");
- push(@statement, number(\@speech, $3));
+ push(@statement, number(\@speech, $3)) if $3;
}
else
{
@@ -184,9 +195,7 @@
{ return "Datentyp $dpt nicht implementiert"; }
}
# Das komplette Statement in die Ausgabe geben
- speak($channel, $name, @statement);
-
- return $name.' '.$msg{value};
+ return speak($channel, $name, @statement);
}
return;
@@ -386,17 +395,13 @@
my $channel=shift; # ALSA-Channel
my $name=shift; # Name der Ansage (aus eibga.conf) - fuers Log
- open LOG, ">>$logfile";
+ my $retval='';
my $date=checkexec('date');
my $datetime=`$date +"%F %X"`;
$datetime=~s/\s*$//s;
if(@_)
{
- my $aplay=checkexec('aplay');
- my $mpc=checkexec('mpc');
- system $mpc, 'pause';
-
# Nur fuer Russound-Paging: Star Trek 'Beep' vorweg weckt Russound auf
if($channel=~/$beepchannel/)
{
@@ -410,18 +415,54 @@
}
}
- system $aplay, '-c2', "-D$channel", @_;
+ if($mode eq 'aplay')
+ {
+ my $aplay=checkexec('aplay');
+ system $aplay, '-c2', "-D$channel", @_;
-# map s!^.*/(.*?)\.wav!$1!, @_;
- print LOG $datetime.' '.$channel.':'.(join ' ', @_)."\n";
+ map s!^.*/(.*?)\.wav!$1!, @_;
+ $retval.=$channel.':'.(join ' ', @_);
+ }
+ elsif($mode eq 'mpd')
+ {
+ push @_, "silence.wav"; # kurze Pause zwischen Ansagen
- system $mpc, 'toggle';
+ map s!^/*!$speechdir/!, @_; # alle Eintraege relativ zum speechdir
+ map s!^$mpddir/!!, @_; # mpd braucht einen Pfadnamen relativ zum music-Dir
+ map s!/+!/!, @_; # zur Sicherheit
+
+ $mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
+ my $host=$1; my $port=$2;
+
+ # aus irgendeinem Grund funktioniert %ENV im wiregate-Plugin nicht
+ # also so:
+ my $mpc=checkexec('mpc');
+ $mpc="export MPD_HOST=$host; export MPD_PORT=$port; $mpc";
+ system "$mpc update"; # Aktualisierung verfuegbarer Soundclips
+
+ # wird momentan noch was gespielt?
+ my $playing = grep /playing/, `$mpc`;
+
+ system "$mpc clear" unless $playing; # aufraeumen
+ system "$mpc add \"".(join "\" \"", @_)."\"";
+ system "$mpc play" unless $playing; # nur dann noetig
+
+# $playing=`$mpc; $mpc outputs`;
+# $playing=~s/\s+/ /sg;
+# plugin_log($plugname, $playing);
+ map s!^.*/(.*?)\.wav!$1!, @_;
+ $retval.=$channel.':'.(join ' ', @_);
+ }
+ else
+ {
+ $retval.="$name - no output (mpd or aplay) defined";
+ }
}
else
{
- print LOG "$datetime $name - keine akustische Ansage moeglich\n";
+ $retval.="$name - no audio output possible (file not found)";
}
-
- close LOG;
+
+ return $retval;
}
Added: wiregate/plugin/generic/MissGoogle.pl
===================================================================
--- wiregate/plugin/generic/MissGoogle.pl (rev 0)
+++ wiregate/plugin/generic/MissGoogle.pl 2012-04-25 17:48:08 UTC (rev 764)
@@ -0,0 +1,248 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+system "mkdir", "-p", "/var/lib/mpd/music/Ansagen";
+chdir "/var/lib/mpd/music/Ansagen";
+
+my %text=(
+ "./Achtung, es wurde ein Einbruch detektiert. Die Polizei wird automatisch benachrichtigt.wav"=>"Achtung, es wurde ein Einbruch detektiert. Die Polizei wird automatisch benachrichtigt",
+ "./AufWiedersehen.wav"=>"Auf Wiedersehen",
+ "./Tschuess.wav"=>"tschüss",
+ "./Ciao.wav"=>"tschau",
+ "./Bitte Schluesselbund ans Schluesselbrett haengen.wav"=>"Bitte Schluesselbund ans Schluesselbrett haengen",
+ "./Der Trockner ist fertig.wav"=>"Der Trockner ist fertig",
+ "./Die Alarmanlage ist aktiviert.wav"=>"Die Alarmanlage ist aktiviert",
+ "./Die Alarmanlage ist deaktiviert.wav"=>"Die Alarmanlage ist deaktiviert",
+ "./Die Alarmanlage wird in fuenf Minuten aktiviert.wav"=>"Die Alarmanlage wird in fuenf Minuten aktiviert",
+ "./Die Waschmaschine ist fertig.wav"=>"Die Waschmaschine ist fertig",
+ "./Es liegt neue Post im Briefkasten.wav"=>"Es liegt neue Post im Briefkasten",
+ "./Essen ist fertig.wav"=>"Essen ist fertig",
+ "./Fenster offen.wav"=>"Fenster offen",
+ "./Kaffee ist fertig.wav"=>"Kaffee ist fertig",
+ "./Monate/April.wav"=>"April",
+ "./Monate/August.wav"=>"August",
+ "./Monate/Dezember.wav"=>"Dezember",
+ "./Monate/Februar.wav"=>"Februar",
+ "./Monate/Januar.wav"=>"Januar",
+ "./Monate/Juli.wav"=>"Juli",
+ "./Monate/Juni.wav"=>"Juni",
+ "./Monate/Maerz.wav"=>"Maerz",
+ "./Monate/Mai.wav"=>"Mai",
+ "./Monate/November.wav"=>"November",
+ "./Monate/Oktober.wav"=>"Oktober",
+ "./Monate/September.wav"=>"September",
+ "./Personen/Alois.wav"=>"Alois",
+ "./Personen/Andrea.wav"=>"Andrea",
+ "./Personen/Christoph.wav"=>"Christoph",
+ "./Personen/Chris.wav"=>"Chris",
+ "./Personen/Guenther.wav"=>"Guenther",
+ "./Personen/Helena.wav"=>"Helena",
+ "./Personen/Jakob.wav"=>"Jakob",
+ "./Personen/Jasmin.wav"=>"Jasmin",
+ "./Personen/Julius.wav"=>"Julius",
+ "./Personen/Kim.wav"=>"Kim",
+ "./Personen/Lynn.wav"=>"Lynn",
+ "./Personen/Michael.wav"=>"Michael",
+ "./Personen/Nils.wav"=>"Nils",
+ "./Personen/Rita.wav"=>"Rita",
+ "./Personen/Tanja.wav"=>"Tanja",
+ "./Personen/Uta.wav"=>"Uta",
+ "./Personen/Wigbert.wav"=>"Wigbert",
+ "./Personen/Gast.wav"=>"Gast",
+ "./Rauchalarm.wav"=>"Rauchalarm",
+ "./Raum/A1.wav"=>"Aussenbereich unten",
+ "./Raum/A2.wav"=>"Aussenbereich oben",
+ "./Raum/AT.wav"=>"Aussentreppe",
+ "./Raum/AZ.wav"=>"Arbeitszimmer",
+ "./Raum/BA.wav"=>"Grosses Bad",
+ "./Raum/D1.wav"=>"Dusche Keller",
+ "./Raum/D2.wav"=>"Dusche Erdgeschoss",
+ "./Raum/DA.wav"=>"Dach",
+ "./Raum/EK.wav"=>"Esskueche",
+ "./Raum/E.wav"=>"Eingangsflur",
+ "./Raum/F2.wav"=>"Flur Erdgeschoss",
+ "./Raum/GA.wav"=>"Galerie",
+ "./Raum/GL.wav"=>"Global",
+ "./Raum/G.wav"=>"Garage",
+ "./Raum/HE.wav"=>"Heizung",
+ "./Raum/HW.wav"=>"Hauswirtschaftsraum",
+ "./Raum/K1.wav"=>"K1",
+ "./Raum/K2.wav"=>"K2",
+ "./Raum/K3b.wav"=>"K3",
+ "./Raum/K3.wav"=>"K3",
+ "./Raum/SZ.wav"=>"Schlafzimmer",
+ "./Raum/TE2.wav"=>"Terrasse",
+ "./Raum/TE3.wav"=>"Balkon",
+ "./Raum/TR1.wav"=>"Eingangstreppe",
+ "./Raum/TR2.wav"=>"Galerietreppe",
+ "./Raum/UT.wav"=>"Unter der Treppe",
+ "./Raum/VO.wav"=>"Vorratsraum",
+ "./Raum/WF.wav"=>"Windfang",
+ "./Raum/WZ.wav"=>"Wohnzimmer",
+ "./Sensor/KA.wav"=>"Aufzug",
+ "./Sensor/KF.wav"=>"Fenster",
+ "./Sensor/KO.wav"=>"Kontakt",
+ "./Sensor/KR.wav"=>"Relais",
+ "./Sensor/KS.wav"=>"Stromfluss",
+ "./Sensor/KT.wav"=>"Tuer",
+ "./Sensor/LF.wav"=>"Luftfeuchte",
+ "./Sensor/PM.wav"=>"Praesenz",
+ "./Sensor/TA.wav"=>"Aussentemperatur",
+ "./Sensor/TE.wav"=>"Estrich",
+ "./Sensor/TL.wav"=>"Innentemperatur",
+ "./Sensor/TO.wav"=>"Temperatur",
+ "./Sensor/TP.wav"=>"Taupunkt",
+ "./Sensor/VC.wav"=>"Wok",
+ "./Willkommen.wav"=>"Willkommen",
+ "./Hi.wav"=>"Hai",
+ "./Hallo.wav"=>"Hallo",
+ "./Wochentage/Di.wav"=>"Dienstag",
+ "./Wochentage/Do.wav"=>"Donnerstag",
+ "./Wochentage/Fri.wav"=>"Freitag",
+ "./Wochentage/Fr.wav"=>"Freitag",
+ "./Wochentage/Mi.wav"=>"Mittwoch",
+ "./Wochentage/Mon.wav"=>"Montag",
+ "./Wochentage/Mo.wav"=>"Montag",
+ "./Wochentage/Sat.wav"=>"Samstag",
+ "./Wochentage/Sa.wav"=>"Samstag",
+ "./Wochentage/So.wav"=>"Sonntag",
+ "./Wochentage/Sun.wav"=>"Sonntag",
+ "./Wochentage/Thu.wav"=>"Donnerstag",
+ "./Wochentage/Tue.wav"=>"Dienstag",
+ "./Wochentage/Wed.wav"=>"Mittwoch",
+ "./Woerter/Bett.wav"=>"Bett",
+ "./Woerter/Decke.wav"=>"Decke",
+ "./Woerter/Herd.wav"=>"Herd",
+ "./Woerter/Kamin.wav"=>"Kamin",
+ "./Woerter/links.wav"=>"links",
+ "./Woerter/rechts.wav"=>"rechts",
+ "./Woerter/Spuele.wav"=>"Spuele",
+ "./Woerter/unter_Galerie.wav"=>"unter_Galerie",
+ "./Woerter/unter_Treppe.wav"=>"unter_Treppe",
+ "./Zahlen/an.wav"=>"an",
+ "./Zahlen/auf.wav"=>"auf",
+ "./Zahlen/aus.wav"=>"aus",
+ "./Zahlen/c0.wav"=>"Null",
+ "./Zahlen/c1000.wav"=>"tausend",
+ "./Zahlen/c100.wav"=>"hundert",
+ "./Zahlen/c10.wav"=>"zehn",
+ "./Zahlen/c11.wav"=>"elf",
+ "./Zahlen/c12.wav"=>"zwoelf",
+ "./Zahlen/c13.wav"=>"dreizehn",
+ "./Zahlen/c14.wav"=>"vierzehn",
+ "./Zahlen/c15.wav"=>"fuenfzehn",
+ "./Zahlen/c16.wav"=>"sechzehn",
+ "./Zahlen/c17.wav"=>"siebzehn",
+ "./Zahlen/c18.wav"=>"achtzehn",
+ "./Zahlen/c19.wav"=>"neunzehn",
+ "./Zahlen/c1.wav"=>"eins",
+ "./Zahlen/c20.wav"=>"zwanzig",
+ "./Zahlen/c2.wav"=>"zwei",
+ "./Zahlen/c30.wav"=>"dreissig",
+ "./Zahlen/c3.wav"=>"drei",
+ "./Zahlen/c40.wav"=>"vierzig",
+ "./Zahlen/c4.wav"=>"vier",
+ "./Zahlen/c50.wav"=>"fuenfzig",
+ "./Zahlen/c5.wav"=>"fuenf",
+ "./Zahlen/c60.wav"=>"sechzig",
+ "./Zahlen/c6.wav"=>"sechs",
+ "./Zahlen/c70.wav"=>"siebzig",
+ "./Zahlen/c7.wav"=>"sieben",
+ "./Zahlen/c80.wav"=>"achtzig",
+ "./Zahlen/c8.wav"=>"acht",
+ "./Zahlen/c90.wav"=>"neunzig",
+ "./Zahlen/c9.wav"=>"neun",
+ "./Zahlen/Grad.wav"=>"Grad",
+ "./Zahlen/hoch.wav"=>"hoch",
+ "./Zahlen/Komma.wav"=>"Komma",
+ "./Zahlen/minus.wav"=>"minus",
+ "./Zahlen/o0.wav"=>"Nullter",
+ "./Zahlen/o1000.wav"=>"Tausendster",
+ "./Zahlen/o100.wav"=>"Hundertster",
+ "./Zahlen/o10.wav"=>"Zehnter",
+ "./Zahlen/o11.wav"=>"Elfter",
+ "./Zahlen/o12.wav"=>"Zwoelfter",
+ "./Zahlen/o13.wav"=>"Dreizehnter",
+ "./Zahlen/o14.wav"=>"Vierzehnter",
+ "./Zahlen/o15.wav"=>"Fuenfzehnter",
+ "./Zahlen/o16.wav"=>"Sechzehnter",
+ "./Zahlen/o17.wav"=>"Siebzehnter",
+ "./Zahlen/o18.wav"=>"Achtzehnter",
+ "./Zahlen/o19.wav"=>"Neunzehnter",
+ "./Zahlen/o1.wav"=>"Erster",
+ "./Zahlen/o20.wav"=>"Zwanzigster",
+ "./Zahlen/o2.wav"=>"Zweiter",
+ "./Zahlen/o30.wav"=>"Dreissigster",
+ "./Zahlen/o3.wav"=>"Dritter",
+ "./Zahlen/o40.wav"=>"Vierzigster",
+ "./Zahlen/o4.wav"=>"Vierter",
+ "./Zahlen/o50.wav"=>"Fuenfzigster",
+ "./Zahlen/o5.wav"=>"Fuenfter",
+ "./Zahlen/o60.wav"=>"Sechzigster",
+ "./Zahlen/o6.wav"=>"Sechster",
+ "./Zahlen/o70.wav"=>"Siebzigster",
+ "./Zahlen/o7.wav"=>"Siebter",
+ "./Zahlen/o80.wav"=>"Achtzigster",
+ "./Zahlen/o8.wav"=>"Achter",
+ "./Zahlen/o90.wav"=>"Neunzigster",
+ "./Zahlen/o9.wav"=>"Neunter",
+ "./Zahlen/Prozent.wav"=>"Prozent",
+ "./Zahlen/runter.wav"=>"runter",
+ "./Zahlen/u1.wav"=>"ein",
+ "./Zahlen/u2.wav"=>"zwei",
+ "./Zahlen/u3.wav"=>"drei",
+ "./Zahlen/u4.wav"=>"vier",
+ "./Zahlen/u5.wav"=>"fuenf",
+ "./Zahlen/u6.wav"=>"sechs",
+ "./Zahlen/u7.wav"=>"sieben",
+ "./Zahlen/u8.wav"=>"acht",
+ "./Zahlen/u9.wav"=>"neun",
+ "./Zahlen/uc20.wav"=>"und zwanzig",
+ "./Zahlen/uc30.wav"=>"und dreissig",
+ "./Zahlen/uc40.wav"=>"und vierzig",
+ "./Zahlen/uc50.wav"=>"und fuenfzig",
+ "./Zahlen/uc60.wav"=>"und sechzig",
+ "./Zahlen/uc70.wav"=>"und siebzig",
+ "./Zahlen/uc80.wav"=>"und achtzig",
+ "./Zahlen/uc90.wav"=>"und neunzig",
+ "./Zahlen/uo20.wav"=>"und zwanzigster",
+ "./Zahlen/uo30.wav"=>"und dreissigster",
+ "./Zahlen/uo40.wav"=>"und vierzigster",
+ "./Zahlen/uo50.wav"=>"und fuenfzigster",
+ "./Zahlen/uo60.wav"=>"und sechzigster",
+ "./Zahlen/uo70.wav"=>"und siebzigster",
+ "./Zahlen/uo80.wav"=>"und achtzigster",
+ "./Zahlen/uo90.wav"=>"und neunzigster",
+ "./Zahlen/zu.wav"=>"zu",
+ "./Zeiten/Minuten.wav"=>"Minuten",
+ "./Zeiten/Sekunden.wav"=>"Sekunden",
+ "./Zeiten/Stunden.wav"=>"Stunden",
+ "./Zeiten/Uhr.wav"=>"Uhr");
+
+for my $f (keys %text)
+{
+ my $t=$text{$f};
+ 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 "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%";
+ system "sox", "tmp.wav", "tmp2.wav", "tempo", "1.5";
+ system "mv", "tmp2.wav", $f;
+ system "rm", "-f", "tmp.wav";
+ system "rm", "-f", $m;
+}
+
+for my $d (1..5)
+{
+ my $l=sprintf("%0.1f",0.2*$d);
+ my $f=sprintf("sil%dms.wav", 1000*$l);
+ next if -f $f;
+ system "sox", "-n", "-r", "44100", "-c", "2", $f, "trim", "0.0", $l;
+}
+
+system "ln -sf sil200ms.wav silence.wav";
Property changes on: wiregate/plugin/generic/MissGoogle.pl
___________________________________________________________________
Added: svn:executable
+ *
Modified: wiregate/plugin/generic/conf.d/Ansagen.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Ansagen.conf 2012-04-25 17:11:27 UTC (rev 763)
+++ wiregate/plugin/generic/conf.d/Ansagen.conf 2012-04-25 17:48:08 UTC (rev 764)
@@ -75,8 +75,8 @@
# DURCHsagen gehen auf ALSA-Kanal 'paging' und gehen ueber die Russound an
# alle Lautsprecher im Haus. Dort muss ein Beep vorweggesendet werden
-$logfile='/var/log/Ansagen.log';
-$speechdir='/var/lib/Ansagen/Sprache/';
+# Directories, Kanaele, Gruppenadressen
+$speechdir='/var/lib/mpd/music/Ansagen/';
%channels=(
'^WA_'=>'welcome', # zB "WA_Die Aussentemperatur betraegt"
'^WD_'=>'paging', # zB "WD_Folgende Fenster sind geoeffnet"
@@ -84,7 +84,17 @@
);
$beepchannel='paging';
$beep = sprintf "Beep/%02d.wav", 3; # int(rand(32))+1 fuer Zufallsbeep
-#my @additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
+#@additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
@additional_subscriptions=();
+# Ausgabeoptionen
+$mode='mpd'; # mpd or aplay
+
+# die folgenden Eintraege nur fuer mpd benoetigt
+$mpddir='/var/lib/mpd/music';
+%mpdhost=(
+ 'welcome'=>'127.0.0.1/6600',
+ 'paging'=>'127.0.0.1/6601'
+);
+
############### Ende der Konfiguration #########################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-05-02 22:03:51
|
Revision: 780
http://openautomation.svn.sourceforge.net/openautomation/?rev=780&view=rev
Author: pfry
Date: 2012-05-02 22:03:43 +0000 (Wed, 02 May 2012)
Log Message:
-----------
siehe KNX-Forum
Modified Paths:
--------------
wiregate/plugin/generic/MissGoogle.pl
Added Paths:
-----------
wiregate/plugin/generic/Szenencontroller.pl
wiregate/plugin/generic/Translator.pl
wiregate/plugin/generic/conf.d/Szenencontroller.conf
wiregate/plugin/generic/conf.d/Translator.conf
Modified: wiregate/plugin/generic/MissGoogle.pl
===================================================================
--- wiregate/plugin/generic/MissGoogle.pl 2012-05-02 06:57:30 UTC (rev 779)
+++ wiregate/plugin/generic/MissGoogle.pl 2012-05-02 22:03:43 UTC (rev 780)
@@ -8,7 +8,7 @@
my %text=(
"./Achtung, es wurde ein Einbruch detektiert. Die Polizei wird automatisch benachrichtigt.wav"=>"Achtung, es wurde ein Einbruch detektiert. Die Polizei wird automatisch benachrichtigt",
"./AufWiedersehen.wav"=>"Auf Wiedersehen",
- "./Tschuess.wav"=>"tschüss",
+ "./Tschuess.wav"=>"tschuess",
"./Ciao.wav"=>"tschau",
"./Bitte Schluesselbund ans Schluesselbrett haengen.wav"=>"Bitte Schluesselbund ans Schluesselbrett haengen",
"./Der Trockner ist fertig.wav"=>"Der Trockner ist fertig",
Added: wiregate/plugin/generic/Szenencontroller.pl
===================================================================
--- wiregate/plugin/generic/Szenencontroller.pl (rev 0)
+++ wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 22:03:43 UTC (rev 780)
@@ -0,0 +1,220 @@
+####################
+# Szenencontroller #
+####################
+# Wiregate-Plugin
+# (c) 2012 Fry under the GNU Public License
+
+# $plugin_info{$plugname.'_cycle'}=0; return "deaktiviert";
+
+my $use_short_names=0; # 1 fuer GA-Kuerzel (erstes Wort des GA-Namens), 0 fuer die "nackte" Gruppenadresse
+
+# eibgaconf fixen falls nicht komplett indiziert
+if($use_short_names && !exists $eibgaconf{ZV_Uhrzeit})
+{
+ for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
+ {
+ $eibgaconf{$ga}{ga}=$ga;
+ my $name=$eibgaconf{$ga}{name};
+ next unless defined $name;
+ $eibgaconf{$name}=$eibgaconf{$ga};
+
+ next unless $name=~/^\s*(\S+)/;
+ my $short=$1;
+ $short='ZV_'.$1 if $eibgaconf{$ga}{name}=~/^Zeitversand.*(Uhrzeit|Datum)/;
+
+ $eibgaconf{$ga}{short}=$short;
+ $eibgaconf{$short}=$eibgaconf{$ga};
+ }
+}
+
+# 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:
+elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'})
+{ $event='modified'; } # Plugin modifiziert
+elsif (%msg) { $event='bus'; } # 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 %scene=();
+my $err=read_from_config();
+return "config err" if $err;
+
+# Dynamisch definierte Szenen aus plugin_info einlesen
+recall_from_plugin_info();
+
+if($event=~/restart|modified/)
+{
+ # Cleanup aller Szenenvariablen in %plugin_info
+ for my $k (grep /^$plugname\_/, keys %plugin_info)
+ {
+ delete $plugin_info{$k};
+ }
+
+ # Alle Szenen-GAs abonnieren
+ my $count=0;
+ my $scene_lookup='';
+
+ for my $room (keys %scene)
+ {
+ next if $room eq 'storage';
+
+ my $store=$scene{$room}{store};
+ my $recall=$scene{$room}{recall};
+
+ $store=$scene{$room}{store}=$eibgaconf{$store}{ga} if $store!~/^[0-9\/]+$/ && defined $eibgaconf{$store};
+ $recall=$scene{$room}{recall}=$eibgaconf{$recall}{ga} if $recall!~/^[0-9\/]+$/ && defined $eibgaconf{$recall};
+
+ next unless defined $store && defined $recall;
+
+ $scene_lookup.="St($store)=>'$room', Rc($recall)=>'$room', ";
+
+ $plugin_subscribe{$store}{$plugname}=1;
+ $plugin_subscribe{$recall}{$plugname}=1;
+
+ $count++;
+ }
+
+ $plugin_info{$plugname.'__SceneLookup'}=$scene_lookup;
+ $plugin_info{$plugname.'_cycle'}=0;
+
+ return $count." initialisiert";
+}
+
+if($event=~/bus/)
+{
+ # nur auf Write-Telegramme reagieren
+ return if $msg{apci} ne 'A_GroupValue_Write';
+
+ # Aufruf durch GA
+ my $ga=$msg{dst};
+ my $n=int($msg{value}); # die Szenennummer
+
+ # die betreffende Szene finden
+ unless($plugin_info{$plugname.'__SceneLookup'}=~/(St|Rc)\($ga\)=>\'(.+?)\',/)
+ {
+ delete $plugin_subscribe{$ga}{$plugname}; # unbekannte GA
+ return;
+ }
+
+ my $cmd=$1; chop $cmd;
+ my $room=$2;
+
+ if($eibgaconf{$ga}{DPTSubId} eq '1.017')
+ {
+ # Szenennummer aus physikalischer Adresse ableiten falls DPTSubId==1.017
+ return unless $msg{src}=~/[0-9]+\.[0-9]+\.([0-9]+)/;
+ $n=$1;
+ }
+ elsif($scene{$room}{store} eq $scene{$room}{recall})
+ {
+ # Speichern oder Abrufen? Falls beides die gleiche GA, aus 7. Bit der Szenennummer ableiten
+ $cmd = ($n & 0x80)?'S':'R';
+ $n = ($n & 0x7f)+1;
+ }
+ else # Aufruf mit Wert = Szenennummer
+ {
+ $n = 128 if $n>128; # begrenzen auf max. 128
+ }
+
+ # Szenencode
+ my $z="$room\__$n";
+
+ # Debugging
+# plugin_log($plugname, "Szene $z ".($cmd eq 'S'?'speichern':'abrufen'));
+
+ if($cmd eq 'S') # Szene speichern
+ {
+ delete $scene{$z};
+
+ for my $ga (keys %{$scene{$room}{gas}})
+ {
+ my $wga=$scene{$room}{gas}{$ga}; # auf diese GA muss spaeter geschrieben werden
+ $wga=$eibgaconf{$wga}{short} if $wga=~/^[0-9\/]+$/ && $use_short_names && defined $eibgaconf{$wga}{short};
+ $ga=$eibgaconf{$ga}{ga} if $ga!~/^[0-9\/]+$/ && defined $eibgaconf{$ga};
+ $scene{$z}{$wga}=knx_read($ga,300);
+ delete $scene{$z}{$wga} unless defined $scene{$z}{$wga};
+ }
+
+ if($scene{storage} eq 'configfile')
+ {
+ store_to_config($z);
+ }
+ else
+ {
+ store_to_plugin_info($z);
+ }
+ }
+ else # Szene abrufen
+ {
+ for my $v (keys %{$scene{$z}})
+ {
+ my $ga=$v;
+ $ga=$eibgaconf{$ga}{ga} if $ga!~/^[0-9\/]+$/ && defined $eibgaconf{$ga};
+ knx_write($ga,$scene{$z}{$v});
+ }
+ }
+}
+
+return;
+
+########## Datenpersistenz - Speichern und Einlesen ###############
+
+sub read_from_config
+{
+ open CONFIG, "<$conf" || return "no config found";
+ my @lines = <CONFIG>;
+ close CONFIG;
+ eval("@lines");
+ return "config error" if $@;
+}
+
+sub store_to_config
+{
+ my $z=shift; # die Szenenbezeichnung
+
+ open CONFIG, ">>$conf";
+ print CONFIG "\$scene{$z}={";
+ for my $v (sort keys %{$scene{$z}})
+ {
+ print CONFIG sprintf "'$v'=>%.2f, ", $scene{$z}{$v};
+ }
+ print CONFIG "};\n";
+ close CONFIG;
+}
+
+# alternativ: speichern ins globale Hash plugin_info
+
+sub store_to_plugin_info
+{
+ my $z=shift; # die Szenenbezeichnung
+
+ # Alle Laufzeitvariablen im Hash %{$dyn}
+ # in das (flache) Hash plugin_info schreiben
+ for my $k (grep /^$plugname\__$z/, keys %plugin_info)
+ {
+ delete $plugin_info{$k};
+ }
+
+ for my $v (keys %{$scene{$z}})
+ {
+ $plugin_info{$plugname.'__'.$z.'__'.$v}=$scene{$z}{$v};
+ }
+}
+
+sub recall_from_plugin_info
+{
+ for my $k (grep /^$plugname\__/, keys %plugin_info)
+ {
+ next unless($k=~/^$plugname\__([A-Z0-9 ]+__[0-9]+)__(.*)$/i);
+ my ($z,$v)=($1,$2);
+ $scene{$z}{$v}=$plugin_info{$k};
+ }
+}
+
Added: wiregate/plugin/generic/Translator.pl
===================================================================
--- wiregate/plugin/generic/Translator.pl (rev 0)
+++ wiregate/plugin/generic/Translator.pl 2012-05-02 22:03:43 UTC (rev 780)
@@ -0,0 +1,189 @@
+##############
+# Translator #
+##############
+# Wiregate-Plugin
+# (c) 2012 Fry under the GNU Public License
+
+#$plugin_info{$plugname.'_cycle'}=0; return 'deaktiviert';
+
+my $use_short_names=0; # 1 fuer GA-Kuerzel (erstes Wort des GA-Namens), 0 fuer die "nackte" Gruppenadresse
+
+# eibgaconf fixen falls nicht komplett indiziert
+if($use_short_names && !exists $eibgaconf{ZV_Uhrzeit})
+{
+ for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
+ {
+ $eibgaconf{$ga}{ga}=$ga;
+ my $name=$eibgaconf{$ga}{name};
+ next unless defined $name;
+ $eibgaconf{$name}=$eibgaconf{$ga};
+
+ next unless $name=~/^\s*(\S+)/;
+ my $short=$1;
+ $short='ZV_'.$1 if $eibgaconf{$ga}{name}=~/^Zeitversand.*(Uhrzeit|Datum)/;
+
+ $eibgaconf{$ga}{short}=$short;
+ $eibgaconf{$short}=$eibgaconf{$ga};
+ }
+}
+
+sub limit { my ($lo,$x,$hi)=@_; return $x<$lo?$lo:($x>$hi?$hi:$x); }
+
+# Konfigurationsfile einlesen
+my %trans=();
+my $conf=$plugname; $conf=~s/\.pl$/.conf/;
+open FILE, "</etc/wiregate/plugin/generic/conf.d/$conf" || return "no config found";
+my @lines = <FILE>;
+close FILE;
+eval("@lines");
+return "config error: $@" if $@;
+
+# Aufrufgrund ermitteln
+my $event=undef;
+if (!$plugin_initflag)
+{ $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
+else { $event='cycle'; } # Zyklus
+
+# Plugin-Code
+if($event=~/restart|modified/)
+{
+ # alle Variablen loeschen und neu initialisieren, alle GAs abonnieren
+ for my $k (grep /^$plugname\_/, keys %plugin_info)
+ {
+ delete $plugin_info{$k};
+ }
+
+ my $count=0;
+ my $rxtx_lookup='';
+
+ for my $t (keys %trans)
+ {
+ my $receive=$trans{$t}{receive};
+ my $transmit=$trans{$t}{transmit};
+
+ $receive=$eibgaconf{$receive}{ga} if $receive!~/^[0-9\/]+$/ && defined $eibgaconf{$receive};
+ $transmit=$eibgaconf{$transmit}{ga} if $transmit!~/^[0-9\/]+$/ && defined $eibgaconf{$transmit};
+
+ next unless defined $receive && defined $transmit;
+
+ $rxtx_lookup.="Rx($receive)=>'$t', Tx($transmit)=>'$t', ";
+
+ $plugin_subscribe{$receive}{$plugname}=1;
+ $plugin_subscribe{$transmit}{$plugname}=1;
+
+ $count++;
+
+ $plugin_info{$plugname.'_'.$t.'_result'}=undef;
+
+ if(ref $trans{$t}{state})
+ {
+ for my $v (keys %{$trans{$t}{state}})
+ {
+ $plugin_info{$plugname.'_'.$t.'_'.$v}=$trans{$t}{state}{$v};
+ }
+ }
+ elsif(defined $trans{$t}{state})
+ {
+ $plugin_info{$plugname.'_'.$t.'_result'}=$trans{$t}{state};
+ }
+ }
+
+ $plugin_info{$plugname.'__RxTxLookup'}=$rxtx_lookup;
+ $plugin_info{$plugname.'_cycle'}=0;
+
+ return $count." initialisiert";
+}
+
+# Bustraffic bedienen - nur Schreibzugriffe der iButtons interessieren
+if($event=~/bus/)
+{
+ return if $msg{apci} eq "A_GroupValue_Response";
+
+ my $ga=$msg{dst};
+
+ unless($plugin_info{$plugname.'__RxTxLookup'}=~/(Tx|Rx)\($ga\)=>\'(.+?)\',/)
+ {
+ delete $plugin_subscribe{$ga}{$plugname}; # unbekannte GA
+ return;
+ }
+
+ my $cmd=$1; chop $cmd;
+ my $t=$2;
+
+ if($msg{apci} eq "A_GroupValue_Read")
+ {
+ # Ein Read-Request auf einer Transmit-GA wird mit dem letzten Ergebnis beantwortet
+ knx_write($ga, $plugin_info{$plugname.'_'.$t.'_result'}) if $cmd eq 'T';
+ return;
+ }
+ elsif($msg{apci} eq "A_GroupValue_Write")
+ {
+ my $input=$msg{value};
+
+ # Write-Telegramm auf unserer Transmit-Adresse?
+ # Vorsicht! - das koennten wir selbst gewesen sein, also nicht antworten!
+ if($cmd eq 'T')
+ {
+ $plugin_info{$plugname.'_'.$t.'_result'}=$input; # einfach Input ablegen
+ return;
+ }
+
+ my $result=undef;
+
+ # Ein Write-Request auf einer Receive-GA wird uebersetzt und das Resultat auf der Transmit-GA uebertragen
+ if(ref $trans{$t}{state})
+ {
+ # Komplexer state-Hash: Basis sind die Werte im Configfile
+ my $state=$trans{$t}{state};
+
+ # Nun die dynamischen Variablen aus plugin_info hinzufuegen
+ for my $k (keys %plugin_info)
+ {
+ next unless $k=~/^$plugname\_$t\_(.*)$/;
+ my $v=$1;
+ $state->{$v}=$plugin_info{$plugname.'_'.$t.'_'.$v};
+ }
+
+ # Funktionsaufruf, das Ergebnis vom letzten Mal steht in $state->{result}
+ $result=$trans{$t}{translate}($state,$input);
+
+ # Alle dynamischen Variablen wieder nach plugin_info schreiben
+ # Damit plugin_info nicht durch Konfigurationsfehler vollgemuellt wird,
+ # erlauben wir nur vorhandene Eintraege
+ for my $v (keys %{$state})
+ {
+ next unless exists $plugin_info{$plugname.'_'.$t.'_'.$v};
+ $plugin_info{$plugname.'_'.$t.'_'.$v}=$state->{$v};
+ }
+ }
+ else # Einfacher Fall - skalare state-Variable
+ {
+ # Einfache state-Skalar: Ergebnis des letzten Aufrufs
+ my $state=$plugin_info{$plugname.'_'.$t.'_result'};
+
+ # Funktionsaufruf, das Ergebnis vom letzten Mal steht in $state
+ $result=$trans{$t}{translate}($state,$input);
+ }
+
+ # Ergebnis des letzten Aufrufs zurueckschreiben
+ $plugin_info{$plugname.'_'.$t.'_result'}=$result;
+
+ # Uebersetzung auf Bus schreiben, ausser im Sonderfall receive==transmit, dann nur auf Anfrage senden
+ my $receive=$trans{$t}{receive};
+ my $transmit=$trans{$t}{transmit};
+
+ # Debugging
+ plugin_log($plugname, "$input ($receive) -> $result ($transmit)");
+
+ $receive=$eibgaconf{$receive}{ga} if $receive!~/^[0-9\/]+$/ && defined $eibgaconf{$receive};
+ $transmit=$eibgaconf{$transmit}{ga} if $transmit!~/^[0-9\/]+$/ && defined $eibgaconf{$transmit};
+
+ knx_write($transmit, $result) unless($transmit eq $receive);
+ }
+}
+
+return;
Added: wiregate/plugin/generic/conf.d/Szenencontroller.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Szenencontroller.conf (rev 0)
+++ wiregate/plugin/generic/conf.d/Szenencontroller.conf 2012-05-02 22:03:43 UTC (rev 780)
@@ -0,0 +1,67 @@
+#!/usr/bin/perl
+#
+# Konfiguration Szenencontroller ######################################
+#
+
+%scene=(
+
+ # Storage auf 'configfile' setzen, wenn die Szenen hier im Konfigfile gespeichert werden sollen.
+ # Sie ueberleben in diesem Fall sogar das Loeschen des plugin_info und gelten somit als "fest verdrahtet".
+ # Ansonsten 'plugin_info' setzen, dann werden die Szenen im %plugin_info gespeichert.
+ # 'configfile' hat allerdings noch die Vorteile, dass die Werte hier editierbar werden und dass plugin_info
+ # nicht so "zugemuellt" wird.
+ storage=>'configfile', # 'plugin_info' oder 'configfile'
+
+ # Das folgende Beispiel konfiguriert Szenen fuer ein Zimmer (Schlafzimmer).
+ #
+ Schlafzimmer => {store=>'0/1/2', recall=>'0/1/3', gas=>{'1/2/3'=>'1/2/3', '1/2/4'=>'1/2/5'}},
+ #
+ # Die GA zum Aufrufen "Recall" einer Szene (zB kurzer Tastendruck am Taster) ist 0/1/3,
+ # die GA zum Speichern "Store" einer Szene (langer Druck) ist 0/1/2.
+ # Beim Speichern werden die Werte aus 1/2/3 und 1/2/4 ausgelesen und in die entsprechende Szenennummer
+ # abgelegt, beim Abrufen dieser Szenennummer werden genau diese Werte wieder in 1/2/3 und 1/2/5 zurueck-
+ # geschrieben.
+ #
+ # (Die Zuordnungen unter gas enthalten immer ein Paar: die erste GA wird beim Speichern (Store) der Szene
+ # ausgelesen und ihr Wert gespeichert, die zweite GA wird beim Aufrufen (Recall) mit dem gespeicherten Wert
+ # beschrieben.)
+ #
+ # Noch einige Details:
+ #
+ # 1. Szenennummer bei "Wert uebermitteln"-Taster (DPTSubId 5.010, in ETS als "Wert" konfiguriert):
+ # Sowohl bei Store als auch bei Recall wird der Inhalt des Bustelegramms als Index der Szene verwendet.
+ # Geschickterweise konfiguriert man das so, dass jeder Taster einen eindeutigen, festen Wert uebermittelt.
+ # So kann jede Taste im Raum jeweils eine Szene speichern und wieder aufrufen, sie muss dafuer einfach eine
+ # Zahl (sinnvollerweise einen 8bit-Wert, DPTSubId 5.010), uebermitteln.
+ #
+ # 2. Szene abrufen/speichern bei "Szenen"-Tastern (in ETS als "Szene" konfiguriert):
+ # Hier wird die Szenennummer wie oben im Taster konfiguriert, dieselbe (!) GA fuer store und recall
+ # gesetzt und wieder die DPTSubId 5.010 in /etc/wiregate/eibga.conf konfiguriert.
+ # In diesem Fall wird die Unterscheidung zwischen Store und Recall durch das 7. Bit des Wertes getroffen,
+ # was kompatibel mit "Szenen"-Tastern ist (zumindest klappt es mit meinen MDTs).
+ #
+ # 3. Szenennummer bei "Schalten"-Taster (DPTSubId 1.017, in ETS als einfaches "Schalten" ohne Wert konfiguriert):
+ # Falls die DPTSubId 1.017 ist (Trigger) - typisch fuer "Schalten"-Taster, kann der Inhalt des Telegramms
+ # keine Szenennummer uebermitteln. Dann wird als Szenennummer einfach die physikalische Adresse des Tasters
+ # genommen. So koennen auch Taster, die ueber eine lang-kurz-Schaltung verfuegen aber keine Werte senden,
+ # jeweils eine eigene Szene ablegen.
+ #
+ # 4. Schlussendlich wieder mal Werbung fuer die GA-Kurznamen. Setzt man im Skript Translator.pl $use_short_names=1
+ # und verwendet GA-Namen mit eindeutigem Kuerzel (=erstes Wort des Namens), so funktioniert auch das folgende:
+ Schlafzimmer2 => {store=>'ZS_SZ', recall=>'ZA_SZ', gas=>{'LI_SZ'=>'LI_SZ', 'JX_SZ'=>'JW_SZ', 'JQ_SZ'=>'JP_SZ'}},
+ # ist doch leserlicher, oder? SZ=Schlafzimmer, ZA=Szene abrufen, ZS=Szene speichern, LI=Licht,
+ # JX=Jalousiewinkel abfragen, JW=Jalousiewinkel einstellen, JQ=Jalousieposition abfragen, JP=Jalousie positionieren
+
+ );
+
+
+# Im folgenden werden Szenen abgelegt, die auch ein Editierien Neuinitialisieren
+# des Szenencontrollers ueberleben.
+
+# Wenn oben als "storage" die Angabe "configfile" gemacht wird, werden
+# neue Szenen hier abgelegt und ueberleben damit auch eine Neuinitialisierung
+
+# Wenn oben "plugin_info" festgelegt wurde, so dienen die hier festgelegten
+# Szenen als Grundstock bei einer Initialisierung, die danach per Tastendruck
+# gespeicherten Szenen werden aber in plugin_info geschrieben und
+# haben dann hoehere Prioritaet, ueberleben aber eben keinen Reset.
Added: wiregate/plugin/generic/conf.d/Translator.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Translator.conf (rev 0)
+++ wiregate/plugin/generic/conf.d/Translator.conf 2012-05-02 22:03:43 UTC (rev 780)
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+#
+# Translator.pl - Konfiguration
+
+%trans=(
+
+ # 1. Alle Werte, die auf einer GA gesendet werden, werden mit 2 multipliziert auf einer anderen GA weitergegeben
+ mal2 => { receive=>'9/5/201', transmit=>'9/5/202', translate => sub { my ($state,$input)=@_; 2*$input; }, },
+
+ # 2. Die Werte auf der ersten GA werden aufsummiert, das Ergebis auf der anderen GA gesendet.
+ # Damit kann man bspw aus einem relativen Dimmwert einen absoluten Dimmwert machen.
+ sum => { receive=>'9/5/207', transmit=>'9/5/208', translate => sub { my ($state,$input)=@_; $state+$input; }, },
+ # $state enthaelt das jeweils letzte Ergebnis.
+
+ # 3. Wie oben, aber das Ergebnis limitiert auf den Bereich 0-100
+ lsum => { receive=>'1/2/7', transmit=>'1/2/8', translate => sub { my ($state,$input)=@_; limit(0,$state+$input,100); }, },
+
+ # 4. Schliesslich eine Memory-Funktion: wenn receive==transmit, so wird nur auf eine Leseanfrage gesendet.
+ # Hier speichert Translator also den Input ab und sendet den errechneten (=gespeicherten) Wert NUR AUF ANFRAGE
+ memory => { receive=>'1/2/9', transmit=>'1/2/10', translate => sub { my ($state,$input)=@_; $input; }, },
+
+ # 5. Ein komplexerer Fall: hier besteht der Status des Translators aus mehreren Werten.
+ # Es wird immer die Summe aus letztem, vorletztem und aktuellem Wert gesendet.
+ complex => { receive=>'9/5/205', transmit=>'9/5/206', state => {val1=>0, val2=>0},
+ translate => sub { my ($state,$input)=@_;
+ $state->{val2}=$state->{val1}; $state->{val1}=$state->{result};
+ $state->{val2}+$state->{val1}+$input; }, },
+ # Wenn state ein Hash ist, wird der letzte gesendete Wert in $state->{result} gespeichert.
+
+ # 6. Schlussendlich wieder mal Werbung fuer die GA-Kurznamen. Setzt man im Skript Translator.pl $use_short_names=1
+ # und verwendet GA-Namen mit eindeutigem Kuerzel (=erstes Wort des Namens), so funktioniert auch das folgende:
+ D_SZ_Decke => { receive=>'LR_SZ_Decke', transmit=>'LK_SZ_Decke',
+ translate => sub { my ($state,$input)=@_; limit(0,$state+20*$input,100); }, },
+ # ist doch leserlicher, oder? Hier wird ein relativer Dimmwert durch Skalierung und Summierung
+ # in einen absoluten Wert umgewandelt
+
+ );
+
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-05-02 22:36:56
|
Revision: 781
http://openautomation.svn.sourceforge.net/openautomation/?rev=781&view=rev
Author: pfry
Date: 2012-05-02 22:36:50 +0000 (Wed, 02 May 2012)
Log Message:
-----------
Modified Paths:
--------------
wiregate/plugin/generic/Szenencontroller.pl
wiregate/plugin/generic/Translator.pl
Modified: wiregate/plugin/generic/Szenencontroller.pl
===================================================================
--- wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 22:03:43 UTC (rev 780)
+++ wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 22:36:50 UTC (rev 781)
@@ -1,3 +1,4 @@
+#!/usr/bin/perl -w
####################
# Szenencontroller #
####################
@@ -127,7 +128,7 @@
my $z="$room\__$n";
# Debugging
-# plugin_log($plugname, "Szene $z ".($cmd eq 'S'?'speichern':'abrufen'));
+ plugin_log($plugname, "Szene $z ".($cmd eq 'S'?'speichern':'abrufen'));
if($cmd eq 'S') # Szene speichern
{
Modified: wiregate/plugin/generic/Translator.pl
===================================================================
--- wiregate/plugin/generic/Translator.pl 2012-05-02 22:03:43 UTC (rev 780)
+++ wiregate/plugin/generic/Translator.pl 2012-05-02 22:36:50 UTC (rev 781)
@@ -1,3 +1,4 @@
+#!/usr/bin/perl -w
##############
# Translator #
##############
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-05-02 23:05:24
|
Revision: 782
http://openautomation.svn.sourceforge.net/openautomation/?rev=782&view=rev
Author: pfry
Date: 2012-05-02 23:05:18 +0000 (Wed, 02 May 2012)
Log Message:
-----------
Modified Paths:
--------------
wiregate/plugin/generic/Szenencontroller.pl
wiregate/plugin/generic/Translator.pl
Modified: wiregate/plugin/generic/Szenencontroller.pl
===================================================================
--- wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 22:36:50 UTC (rev 781)
+++ wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 23:05:18 UTC (rev 782)
@@ -128,8 +128,16 @@
my $z="$room\__$n";
# Debugging
- plugin_log($plugname, "Szene $z ".($cmd eq 'S'?'speichern':'abrufen'));
-
+
+ if($cmd eq 'S')
+ {
+ plugin_log($plugname, "Szene $z speichern: ".join(',', (keys %{$scene{$room}{gas}})));
+ }
+ else
+ {
+ plugin_log($plugname, "Szene $z abrufen: ".join(',', (values %{$scene{$room}{gas}})));
+ }
+
if($cmd eq 'S') # Szene speichern
{
delete $scene{$z};
Modified: wiregate/plugin/generic/Translator.pl
===================================================================
--- wiregate/plugin/generic/Translator.pl 2012-05-02 22:36:50 UTC (rev 781)
+++ wiregate/plugin/generic/Translator.pl 2012-05-02 23:05:18 UTC (rev 782)
@@ -118,7 +118,14 @@
if($msg{apci} eq "A_GroupValue_Read")
{
# Ein Read-Request auf einer Transmit-GA wird mit dem letzten Ergebnis beantwortet
- knx_write($ga, $plugin_info{$plugname.'_'.$t.'_result'}) if $cmd eq 'T';
+ if($cmd eq 'T')
+ {
+ my $transmit=$ga;
+ $transmit=$eibgaconf{$ga}{short} if $use_short_names;
+ my $result=$plugin_info{$plugname.'_'.$t.'_result'};
+ plugin_log($plugname, "memory: $result ($transmit)");
+ knx_write($ga, $result);
+ }
return;
}
elsif($msg{apci} eq "A_GroupValue_Write")
@@ -177,13 +184,15 @@
my $receive=$trans{$t}{receive};
my $transmit=$trans{$t}{transmit};
- # Debugging
- plugin_log($plugname, "$input ($receive) -> $result ($transmit)");
-
$receive=$eibgaconf{$receive}{ga} if $receive!~/^[0-9\/]+$/ && defined $eibgaconf{$receive};
$transmit=$eibgaconf{$transmit}{ga} if $transmit!~/^[0-9\/]+$/ && defined $eibgaconf{$transmit};
- knx_write($transmit, $result) unless($transmit eq $receive);
+ # Debugging
+ unless($transmit eq $receive)
+ {
+ plugin_log($plugname, "$input ($receive) -> $result ($transmit)");
+ knx_write($transmit, $result);
+ }
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-05-02 23:37:37
|
Revision: 783
http://openautomation.svn.sourceforge.net/openautomation/?rev=783&view=rev
Author: pfry
Date: 2012-05-02 23:37:31 +0000 (Wed, 02 May 2012)
Log Message:
-----------
Modified Paths:
--------------
wiregate/plugin/generic/Szenencontroller.pl
wiregate/plugin/generic/Translator.pl
Modified: wiregate/plugin/generic/Szenencontroller.pl
===================================================================
--- wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 23:05:18 UTC (rev 782)
+++ wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 23:37:31 UTC (rev 783)
@@ -62,19 +62,19 @@
my $count=0;
my $scene_lookup='';
- for my $room (keys %scene)
+ for my $sc (sort keys %scene)
{
- next if $room eq 'storage';
+ next if $sc eq 'storage';
- my $store=$scene{$room}{store};
- my $recall=$scene{$room}{recall};
+ my $store=$scene{$sc}{store};
+ my $recall=$scene{$sc}{recall};
- $store=$scene{$room}{store}=$eibgaconf{$store}{ga} if $store!~/^[0-9\/]+$/ && defined $eibgaconf{$store};
- $recall=$scene{$room}{recall}=$eibgaconf{$recall}{ga} if $recall!~/^[0-9\/]+$/ && defined $eibgaconf{$recall};
+ $store=$scene{$sc}{store}=$eibgaconf{$store}{ga} if $store!~/^[0-9\/]+$/ && defined $eibgaconf{$store};
+ $recall=$scene{$sc}{recall}=$eibgaconf{$recall}{ga} if $recall!~/^[0-9\/]+$/ && defined $eibgaconf{$recall};
next unless defined $store && defined $recall;
- $scene_lookup.="St($store)=>'$room', Rc($recall)=>'$room', ";
+ $scene_lookup.="St($store)=>'$sc', Rc($recall)=>'$sc', ";
$plugin_subscribe{$store}{$plugname}=1;
$plugin_subscribe{$recall}{$plugname}=1;
@@ -105,7 +105,7 @@
}
my $cmd=$1; chop $cmd;
- my $room=$2;
+ my $sc=$2;
if($eibgaconf{$ga}{DPTSubId} eq '1.017')
{
@@ -113,7 +113,7 @@
return unless $msg{src}=~/[0-9]+\.[0-9]+\.([0-9]+)/;
$n=$1;
}
- elsif($scene{$room}{store} eq $scene{$room}{recall})
+ elsif($scene{$sc}{store} eq $scene{$sc}{recall})
{
# Speichern oder Abrufen? Falls beides die gleiche GA, aus 7. Bit der Szenennummer ableiten
$cmd = ($n & 0x80)?'S':'R';
@@ -125,26 +125,18 @@
}
# Szenencode
- my $z="$room\__$n";
+ my $z="$sc\__$n";
- # Debugging
-
- if($cmd eq 'S')
- {
- plugin_log($plugname, "Szene $z speichern: ".join(',', (keys %{$scene{$room}{gas}})));
- }
- else
- {
- plugin_log($plugname, "Szene $z abrufen: ".join(',', (values %{$scene{$room}{gas}})));
- }
-
if($cmd eq 'S') # Szene speichern
{
+ # Debugging
+ plugin_log($plugname, "Szene $z speichern: ".join(',', (sort keys %{$scene{$sc}{gas}})));
+
delete $scene{$z};
- for my $ga (keys %{$scene{$room}{gas}})
+ for my $ga (keys %{$scene{$sc}{gas}})
{
- my $wga=$scene{$room}{gas}{$ga}; # auf diese GA muss spaeter geschrieben werden
+ my $wga=$scene{$sc}{gas}{$ga}; # auf diese GA muss spaeter geschrieben werden
$wga=$eibgaconf{$wga}{short} if $wga=~/^[0-9\/]+$/ && $use_short_names && defined $eibgaconf{$wga}{short};
$ga=$eibgaconf{$ga}{ga} if $ga!~/^[0-9\/]+$/ && defined $eibgaconf{$ga};
$scene{$z}{$wga}=knx_read($ga,300);
@@ -162,6 +154,9 @@
}
else # Szene abrufen
{
+ # Debugging
+ plugin_log($plugname, "Szene $z abrufen: ".join(',', (sort values %{$scene{$sc}{gas}})));
+
for my $v (keys %{$scene{$z}})
{
my $ga=$v;
Modified: wiregate/plugin/generic/Translator.pl
===================================================================
--- wiregate/plugin/generic/Translator.pl 2012-05-02 23:05:18 UTC (rev 782)
+++ wiregate/plugin/generic/Translator.pl 2012-05-02 23:37:31 UTC (rev 783)
@@ -61,7 +61,7 @@
my $count=0;
my $rxtx_lookup='';
- for my $t (keys %trans)
+ for my $t (sort keys %trans)
{
my $receive=$trans{$t}{receive};
my $transmit=$trans{$t}{transmit};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pf...@us...> - 2012-05-03 09:27:27
|
Revision: 784
http://openautomation.svn.sourceforge.net/openautomation/?rev=784&view=rev
Author: pfry
Date: 2012-05-03 09:27:17 +0000 (Thu, 03 May 2012)
Log Message:
-----------
Modified Paths:
--------------
wiregate/plugin/generic/Szenencontroller.pl
wiregate/plugin/generic/Translator.pl
Modified: wiregate/plugin/generic/Szenencontroller.pl
===================================================================
--- wiregate/plugin/generic/Szenencontroller.pl 2012-05-02 23:37:31 UTC (rev 783)
+++ wiregate/plugin/generic/Szenencontroller.pl 2012-05-03 09:27:17 UTC (rev 784)
@@ -45,7 +45,7 @@
$conf="/etc/wiregate/plugin/generic/conf.d/$conf";
my %scene=();
my $err=read_from_config();
-return "config err" if $err;
+return $err if $err;
# Dynamisch definierte Szenen aus plugin_info einlesen
recall_from_plugin_info();
@@ -88,6 +88,8 @@
return $count." initialisiert";
}
+my $retval='';
+
if($event=~/bus/)
{
# nur auf Write-Telegramme reagieren
@@ -129,18 +131,25 @@
if($cmd eq 'S') # Szene speichern
{
- # Debugging
- plugin_log($plugname, "Szene $z speichern: ".join(',', (sort keys %{$scene{$sc}{gas}})));
+ $retval.="Szene $z speichern: ";
delete $scene{$z};
- for my $ga (keys %{$scene{$sc}{gas}})
+ for my $ga (sort keys %{$scene{$sc}{gas}})
{
my $wga=$scene{$sc}{gas}{$ga}; # auf diese GA muss spaeter geschrieben werden
$wga=$eibgaconf{$wga}{short} if $wga=~/^[0-9\/]+$/ && $use_short_names && defined $eibgaconf{$wga}{short};
$ga=$eibgaconf{$ga}{ga} if $ga!~/^[0-9\/]+$/ && defined $eibgaconf{$ga};
$scene{$z}{$wga}=knx_read($ga,300);
- delete $scene{$z}{$wga} unless defined $scene{$z}{$wga};
+
+ if(defined $scene{$z}{$wga})
+ {
+ $retval.=$wga.'->'.$scene{$z}{$wga}.' ';
+ }
+ else
+ {
+ delete $scene{$z}{$wga};
+ }
}
if($scene{storage} eq 'configfile')
@@ -154,19 +163,20 @@
}
else # Szene abrufen
{
- # Debugging
- plugin_log($plugname, "Szene $z abrufen: ".join(',', (sort values %{$scene{$sc}{gas}})));
+ $retval.="Szene $z abrufen: ";
for my $v (keys %{$scene{$z}})
{
my $ga=$v;
$ga=$eibgaconf{$ga}{ga} if $ga!~/^[0-9\/]+$/ && defined $eibgaconf{$ga};
knx_write($ga,$scene{$z}{$v});
+ $retval.=$ga.'->'.$scene{$z}{$v}.' ';
}
}
}
-return;
+return unless $retval;
+return $retval;
########## Datenpersistenz - Speichern und Einlesen ###############
@@ -176,7 +186,7 @@
my @lines = <CONFIG>;
close CONFIG;
eval("@lines");
- return "config error" if $@;
+ return "config error: $@" if $@;
}
sub store_to_config
Modified: wiregate/plugin/generic/Translator.pl
===================================================================
--- wiregate/plugin/generic/Translator.pl 2012-05-02 23:37:31 UTC (rev 783)
+++ wiregate/plugin/generic/Translator.pl 2012-05-03 09:27:17 UTC (rev 784)
@@ -78,7 +78,7 @@
$count++;
- $plugin_info{$plugname.'_'.$t.'_result'}=undef;
+ delete $plugin_info{$plugname.'_'.$t.'_result'};
if(ref $trans{$t}{state})
{
@@ -123,8 +123,8 @@
my $transmit=$ga;
$transmit=$eibgaconf{$ga}{short} if $use_short_names;
my $result=$plugin_info{$plugname.'_'.$t.'_result'};
- plugin_log($plugname, "memory: $result ($transmit)");
knx_write($ga, $result);
+ return "Memory: $result ($transmit)";
}
return;
}
@@ -136,7 +136,14 @@
# Vorsicht! - das koennten wir selbst gewesen sein, also nicht antworten!
if($cmd eq 'T')
{
- $plugin_info{$plugname.'_'.$t.'_result'}=$input; # einfach Input ablegen
+ if(defined $input)
+ {
+ $plugin_info{$plugname.'_'.$t.'_result'}=$input; # einfach Input ablegen
+ }
+ else
+ {
+ delete $plugin_info{$plugname.'_'.$t.'_result'};
+ }
return;
}
@@ -164,8 +171,14 @@
# erlauben wir nur vorhandene Eintraege
for my $v (keys %{$state})
{
- next unless exists $plugin_info{$plugname.'_'.$t.'_'.$v};
- $plugin_info{$plugname.'_'.$t.'_'.$v}=$state->{$v};
+ if(defined $state->{$v})
+ {
+ $plugin_info{$plugname.'_'.$t.'_'.$v}=$state->{$v};
+ }
+ else
+ {
+ delete $plugin_info{$plugname.'_'.$t.'_'.$v};
+ }
}
}
else # Einfacher Fall - skalare state-Variable
@@ -178,7 +191,14 @@
}
# Ergebnis des letzten Aufrufs zurueckschreiben
- $plugin_info{$plugname.'_'.$t.'_result'}=$result;
+ if(defined $result)
+ {
+ $plugin_info{$plugname.'_'.$t.'_result'}=$result;
+ }
+ else
+ {
+ delete $plugin_info{$plugname.'_'.$t.'_result'};
+ }
# Uebersetzung auf Bus schreiben, ausser im Sonderfall receive==transmit, dann nur auf Anfrage senden
my $receive=$trans{$t}{receive};
@@ -187,11 +207,10 @@
$receive=$eibgaconf{$receive}{ga} if $receive!~/^[0-9\/]+$/ && defined $eibgaconf{$receive};
$transmit=$eibgaconf{$transmit}{ga} if $transmit!~/^[0-9\/]+$/ && defined $eibgaconf{$transmit};
- # Debugging
unless($transmit eq $receive)
{
- plugin_log($plugname, "$input ($receive) -> $result ($transmit)");
knx_write($transmit, $result);
+ return "$input ($receive) -> $result ($transmit)";
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|