|
From: <sw...@us...> - 2011-07-03 18:35:40
|
Revision: 380
http://openautomation.svn.sourceforge.net/openautomation/?rev=380&view=rev
Author: swiss1
Date: 2011-07-03 18:35:33 +0000 (Sun, 03 Jul 2011)
Log Message:
-----------
Es wurde die Berechnung der Kalenderwoche erg?\195?\164nzt, da diese nicht ?\195?\188ber localtime ausgegeben wird. Das Plugin wurde gr?\195?\188ndlich auf Funktion getestet. Version 0.4 BETA
Modified Paths:
--------------
wiregate/plugin/generic/schaltuhr.pl
Modified: wiregate/plugin/generic/schaltuhr.pl
===================================================================
--- wiregate/plugin/generic/schaltuhr.pl 2011-07-03 14:41:35 UTC (rev 379)
+++ wiregate/plugin/generic/schaltuhr.pl 2011-07-03 18:35:33 UTC (rev 380)
@@ -1,5 +1,5 @@
# Plugin zum Zeit abh\xE4ngigem schaten von GA's (Schaltuhr)
-# Version 0.3 BETA 03.07.2011
+# Version 0.4 BETA 03.07.2011
# Copyright: swiss (http://knx-user-forum.de/members/swiss.html)
# License: GPL (v2)
# Aufbau m\xF6glichst so, dass man unterhalb der Einstellungen nichts ver\xE4ndern muss!
@@ -12,40 +12,44 @@
#Pro Schaltpunkt einfach den unten stehenden Eintrag kopieren und anpassen.
-push @Schaltzeiten, { name => "bew\xE4sserung_ein", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 1, Stunden => 15, Minuten => 45, Wert => 1, DPT => 1, ga => '2/0/0', KW => '', Monat => '' };
+push @Schaltzeiten, { name => "bew\xE4sserung_ein", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 1, Stunden => 20, Minuten => 30, Wert => 1, DPT => 1, ga => '2/0/0', KW => '', Monat => '' };
-push @Schaltzeiten, { name => "bew\xE4sserung_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 1, Stunden => 15, Minuten => 46, Wert => 0, DPT => 1, ga => '2/0/0', KW => '', Monat => '' };
+push @Schaltzeiten, { name => "bew\xE4sserung_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 1, Stunden => 20, Minuten => 31, Wert => 0, DPT => 1, ga => '2/0/0', KW => '', Monat => '' };
######################
##ENDE Einstellungen##
######################
use POSIX;
+use Time::Local;
-# Eigenen Aufruf-Zyklus auf 30sek. setzen
-$plugin_info{$plugname.'_cycle'} = 30;
+# Eigenen Aufruf-Zyklus auf 20sek. setzen
+$plugin_info{$plugname.'_cycle'} = 20;
#Hier wird ein Array angelegt, um die Wochentagsnummer von localtime zu \xFCbersetzen
my @Wochentag = ('sonntag', 'montag', 'dienstag', 'mittwoch', 'donnerstag', 'freitag', 'samstag');
-my $sec;
-my $min;
-my $hour;
-my $mday;
-my $mon;
-my $year;
-my $wday;
-my $yday;
+my $sec; #Sekunde
+my $min; # Minute
+my $hour; #Stunde
+my $mday; #Monatstag
+my $mon; #Monatsnummer
+my $year; #Jahr
+my $wday; #Wochentag 0-6
+my $yday; #Tag ab 01.01.xxxx
my $isdst;
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+$year += 1900;
+$mon += 1;
+my $kw = getWeekNumber($year, $mon, $mday);
+$plugin_info{$plugname.'_debug'} = $kw;
+
foreach my $element (@Schaltzeiten) {
- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
- $year += 1900;
-
if ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} ne '') {
- if ($element->{KW} == $yday) {
+ if ($element->{KW} == $kw) {
knx_write($element->{ga},$element->{Wert},$element->{DPT});
next;
} else {
@@ -63,4 +67,68 @@
next;
}
next;
+}
+
+sub getWeekNumber {
+my ($year, $month, $day) = @_;
+my $weekNumber = checkWeekNumber($year, $month, $day);
+# wenn Wochennummer gleich 0, dann ist das aktuelle Datum
+# in der Woche vor dem 4. Januar
+# also in der letzten Woche des letzten Jahres
+if ($weekNumber eq 0)
+{
+# Wochennummer des letzten Woche des letzten Jahres suchen
+$weekNumber = checkWeekNumber(($year - 1), 12, 31);
+
+# wenn die Wochennummer gr\xF6\xDFer als 52 ist
+# dann pr\xFCfen ob diese Wochennummer korrekt ist oder
+# sie bereits die erste Woche des aktuellen Jahres ist
+if ($weekNumber gt 52)
+{
+$weekNumber = checkWeekNumber($year, 1, 1);
+# wenn der 1. Januar des aktuellen Jahres in der Woche 0 liegt
+# dann ist es die Woche 53
+if ($weekNumber eq 0)
+{
+$weekNumber = 53;
+}
+}
+}
+# wenn die Wochennummer gr\xF6\xDFer als 52 ist
+# dann pr\xFCfen ob diese Wochennummer korrekt ist oder
+# sie bereits die erste Woche des n\xE4chsten Jahres ist
+elsif ($weekNumber gt 52)
+{
+$weekNumber = checkWeekNumber(($year + 1), 1, 1);
+# wenn der 1. Januar des n\xE4chsten Jahres in der Woche 0 liegt
+# dann ist es die Woche 53
+if ($weekNumber eq 0)
+{
+$weekNumber = 53;
+}
+}
+
+return ($weekNumber);
+}
+
+sub checkWeekNumber {
+my ($year, $month, $day) = @_;
+
+# 4. Januar als erste Woche erstellen
+my $firstDateTime = timelocal(0, 0, 12, 4, 0, $year);
+# Wochentag des 4. Januar ermitteln
+my $dayOfWeek = (localtime($firstDateTime))[6];
+$dayOfWeek = abs((($dayOfWeek + 6) % 7));
+# geh zu Wochenanfang (Montag) zur\xFCck
+$firstDateTime -= ($dayOfWeek * 3600 * 24);
+
+# aktuelles Datum erstellen
+my $currentDateTime = timelocal(0, 0, 14, $day, ($month - 1),$year);
+
+# Differenz in Tagen berechnen
+my $diffInDay = ($currentDateTime - $firstDateTime) / 3600 / 24;
+# Anzahl der Wochen zwischen aktuellem Datum und 4. Januar berechnen
+my $weekNumber = floor($diffInDay / 7) + 1;
+
+return ($weekNumber);
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|