Angeregt vom Schaltuhr - Plugin erweitert um Sonnenauf- und Untergang sowie dem ursprünglichen Rolladenplugin habe ich eine Version gebastelt, bei der man die Zeiten begrenzen kann. (Im Sommer müssen die Rolladen nicht um 6:00 hochgehen, im Winter nicht um 16:30 runter.)
Die Zeit des Sonnenauf-/untergangs wird mit der Max-Zeit verglichen und ggfs nach unten korrigiert, dann mit der Min-Zeit verglichen und ggfs nach oben korrigiert. Ist die erhaltene Zeit gleich der aktuellen, wird geschaltet.
Dies bedingt mindestens einen Aufruf pro Minute, 60s könnte wegen Laufzeit und anderen Skripten schiefgehen, daher < 60s.
Man kann auch den DTP ändern und andere Dinge als Rolladen schalten.
Code:
# Plugin zum Rolladenfahren abhaengig von Sonnenaufgang/-untergang mit Min/Max-Begrenzung # Version 0.1 07.02.2012 # Copyright: swiss (https://knx-user-forum.de/members/swiss.html) # License: GPL (v2) # Aufbau möglichst so, dass man unterhalb der Einstellungen nichts verändern muss! # Erweitert um Sonnenauf / - untergang von ZeitlerW (https://knx-user-forum.de/members/zeitlerw.html) # Inspiriert von kleinklausi's Rolladen - Plugin, und Zeitler's Schaltuhr #################### ###Einstellungen:### #################### # Die Standortdaten # Die Koordinaten des Hauses. Sehr einfach über http://www.getlatlon.com/ zu ermitteln. my ($lat, $lon) = ( 51.123456789012345, # Breitengrad in Grad 6.1234567890123456 # Längengrad in Grad ); #Winkel für Beginn der Dämmerung # siehe auch: http://search.cpan.org/~rkhill/Astro-Sunrise-0.91/Sunrise.pm#DESCRIPTION my $winkel=-3; my @Schaltzeiten; #Pro Schaltpunkt einfach den unten stehenden Eintrag kopieren und anpassen. push @Schaltzeiten, { name => "Rollade", mo => 1, di => 1, mi => 1, do => 1, fr => 1, sa => 1, so => 1, Auf_Std_min => 7, Auf_Min_min => 30, Auf_Std_max => 8, Auf_Min_max => 30, Wert_auf => 1, Ab_Std_min => 18, Ab_Min_min => 30, Ab_Std_max => 21, Ab_Min_max => 30, Wert_ab => 0, DPT => 3, ga => '1/1/20'}; ###################### ##ENDE Einstellungen## ###################### use POSIX; use Time::Local; # Wir brauchen auch Sonnenstandsberechnung use Astro::Sunrise; # Eigenen Aufruf-Zyklus setzen, mind. 1 x pro Minute! $plugin_info{$plugname.'_cycle'} = 50; #Hier wird ein Array angelegt, um die Wochentagsnummer von localtime zu übersetzen my @Wochentag = ('so', 'mo', 'di', 'mi', 'do', 'fr', 'sa'); my @sunrise=split(/:/,sun_rise($lon,$lat,$winkel)); my @sunset=split(/:/,sun_set($lon,$lat,$winkel)); 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; if ($plugin_info{$plugname.'_lastCall'} == $min) { return 0; # in dieser Minute bereits gelaufen }; my $Std_astro; my $Min_astro; foreach my $element (@Schaltzeiten) { if ($hour <= 12) { # Sonnenaufgang $Std_astro=$sunrise[0]; $Min_astro=$sunrise[1]; if ($Std_astro > $element->{Auf_Std_max} ) { # hochfahren zeitlich nach später begrenzen $Std_astro = $element->{Auf_Std_max}; $Min_astro = $element->{Auf_Min_max}; } elsif ($Std_astro == $element->{Auf_Std_max} && $Min_astro > $element->{Auf_Min_max} ) { $Min_astro = $element->{Auf_Min_max} } if ($Std_astro < $element->{Auf_Std_min} ) { # hochfahren zeitlich nach früher begrenzen $Std_astro = $element->{Auf_Std_min}; $Min_astro = $element->{Auf_Min_min}; } elsif ($Std_astro == $element->{Auf_Std_min} && $Min_astro < $element->{Auf_Min_min} ) { $Min_astro = $element->{Auf_Min_min}; } if ( $element->{$Wochentag[$wday]} == 1 && $Std_astro == $hour && $Min_astro == $min ) { fahreRollladen($element->{Wert_auf}, $element->{ga}, $element->{DPT}); plugin_log($plugname,"Name: " . $element->{name} . " auffahren" . 0 ); } } else { # Sonnenuntergang $Std_astro=$sunset[0]; $Min_astro=$sunset[1]; if ($Std_astro > $element->{Ab_Std_max} ) { # runterfahren zeitlich nach später begrenzen $Std_astro = $element->{Ab_Std_max}; $Min_astro = $element->{Ab_Min_max}; } elsif ($Std_astro == $element->{Ab_Std_max} && $Min_astro > $element->{Ab_Min_max} ) { $Min_astro = $element->{Ab_Min_max}; } if ($Std_astro < $element->{Ab_Std_min} ) { # runterfahren zeitlich nach früher begrenzen $Std_astro = $element->{Ab_Std_min}; $Min_astro = $element->{Ab_Min_min}; } elsif ($Std_astro == $element->{Ab_Std_min} && $Min_astro < $element->{Ab_Min_min} ) { $Min_astro = $element->{Ab_Min_min}; } if ( $element->{$Wochentag[$wday]} == 1 && $Std_astro == $hour && $Min_astro == $min ) { fahreRollladen($element->{Wert_ab}, $element->{ga}, $element->{DPT}); plugin_log($plugname,"Name: " . $element->{name} . " zufahren" . 0 ); } } next; } $plugin_info{$plugname.'_lastCall'} = $min; return 0; #################################################### # Aufruf mit fahreRollladen($richtung, $GA, $DPT); #################################################### sub fahreRollladen { my ($richtung, $GA, $DPT) = @_; knx_write($GA,$richtung,$DPT); }
Dies bedingt mindestens einen Aufruf pro Minute, 60s könnte wegen Laufzeit und anderen Skripten schiefgehen, daher < 60s.
Man kann auch den DTP ändern und andere Dinge als Rolladen schalten.
Kommentar