Ankündigung

Einklappen
Keine Ankündigung bisher.

Rolladen per Sonnenauf-/untergang und Min/Max

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Rolladen per Sonnenauf-/untergang und Min/Max

    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.)

    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);
    }
    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.

    #2
    Hallo, ich versuche grade das Plugin auf meinem Wiregate zum laufen zu bekommen. Anfangs hatte ich in der Plugin-Logdatei eine Fehlermeldung, das er sunrise.pm nicht finden könnte. Nachdem ich Sunrise.pm nun in den Ordner auf das Wiregate kopiert habe, kommt folgende Meldung:

    2012-06-04 17:09:27.833,rollladen,,0s,Attempt to reload Astro/Sunrise.pm aborted.
    Compilation failed in require at (eval 981) line 40.
    BEGIN failed--compilation aborted at (eval 981) line 40.


    Ich komme grade nicht wirklich weiter und bin für jede Hilfe dankbar!

    Gruß Adrian

    Edit: Mein Problem hat sich erledigt, DateTime hat noch gefehlt. Habe es nachinstalliert und jetzt läuft das Plugin

    Kommentar


      #3
      Hallo nipponichi,
      Bei der Abfrage Begrenzung der Max-Zeiten wird "==" verwendet.
      Müsste es daher in
      Code:
              } elsif ($Std_astro < $element->{Auf_Std_min} && $Min_astro < $element->{Auf_Min_min} ) {
                   $Min_astro = $element->{Auf_Min_min};
      [...]
              } elsif ($Std_astro < $element->{Ab_Std_min} && $Min_astro < $element->{Ab_Min_min} ) {
                   $Min_astro = $element->{Ab_Min_min};
      nicht analog zu den Max-Zeiten heißen
      Code:
              } elsif ($Std_astro == $element->{Auf_Std_min} && $Min_astro < $element->{Auf_Min_min} ) {
                   $Min_astro = $element->{Auf_Min_min};
      [...]
              } elsif ($Std_astro == $element->{Ab_Std_min} && $Min_astro < $element->{Ab_Min_min} ) {
                   $Min_astro = $element->{Ab_Min_min};
      Soweit ich es verstehe, soll an der Stelle ja bei gleicher Stunde und kleinerer Minute die Minute überschrieben werden.

      Gruß, Sebastian
      Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
      Ruhri? -> Komm zum Stammtisch

      Kommentar


        #4
        Ja, ich glaube, da hast Du recht . Ich habs oben verbessert.

        Kommentar


          #5
          Gibts eine Möglichkeit, sich die Astrozeit anzeigen zu lassen, sodas man in der Visu z.B. ein Info Feld hin bekommt, in dem dann die Astrozeit steht.
          Noch besser wäre, wenn man sich alle Zeitschaltpunkte anzeigen lassen könnte.

          gruß
          lo4dro
          --
          Gruß
          Lothar

          Kommentar


            #6
            Damit schreibt man Sonnenuntergang/Aufgang als String in Variable/auf Bus (Winkel -3°/0).
            Code:
            # Plugin Sonnenaufgang/-untergang
            # Version 0.2 12.03.2013, License: GPL (v2)
            
            ####################
            ###Einstellungen:###
            ####################
            
            # Die Standortdaten
            # Die Koordinaten des Hauses. Sehr einfach über http://www.getlatlon.com/ zu ermitteln.
            my ($lat, $lon) = (
                51.1234, # Breitengrad in Grad
                6.1234  # 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 $sonnenaufgang_ga = '0/0/123';
            my $sonnenuntergang_ga = '0/0/124';
            
            ########################
            ## ENDE Einstellungen ##
            ########################
            
            use POSIX;
            use Astro::Sunrise;    # Sonnenstandsberechnung
            
            # Eigenen Aufruf-Zyklus setzen
            $plugin_info{$plugname.'_cycle'} = 3600;
            
            knx_write($sonnenaufgang_ga,sun_rise($lon,$lat,0),16);
            knx_write($sonnenuntergang_ga,sun_set($lon,$lat,0),16);
            
            $plugin_info{$plugname.'_sunrise'}=sun_rise($lon,$lat,$winkel);
            $plugin_info{$plugname.'_sunset'}=sun_set($lon,$lat,$winkel);
            
            return 0;
            Damit kann man die Zeiten in anderem Script verarbeiten:
            Code:
            my @sunrise=split ':', $plugin_info{'SunRiseSet'.'_sunrise'};
            my @sunset=split ':', $plugin_info{'SunRiseSet'.'_sunset'};
            #...
            my $Std=$sunrise[0];
            my $Min=$sunrise[1];

            Kommentar


              #7
              Winkel pro Schaltzeit möglich?

              Hallo,

              könnte man das Script nicht so erweitern, das man pro Schaltzeit den Winkle definieren kann?

              Ich könnte mir vorstellen, das ein kurze Erklärung der Winkel in Plugin sinnvoll wäre.

              Anbei die Daten die ich mir eingetragen habe.


              # 0 Grad Center of Sonnenscheibe berührt einen mathematischen Horizont
              # -0,25 Sonne oberer Rand berührt einen mathematischen Horizont
              # -0,583 Grad Das Zentrum der Sonnenscheibe berührt den Horizont; atmosphärische Refraktion entfielen
              # -0,833 Grad Sonne unterer Rand berührt den Horizont; atmosphärische Refraktion entfielen
              # -6 Grad Bürgerliche Dämmerung (man kann nicht mehr außerhalb lesen, ohne künstliche Beleuchtung)
              # -12 Grad Nautische Dämmerung (Navigation mittels Meer Horizont nicht mehr möglich)
              # -15 Grad Amateur astronomische Dämmerung (der Himmel ist dunkel genug für die meisten astronomischen Beobachtungen)
              # -18 GradAstronomische Dämmerung (der Himmel ist völlig dunkel)
              --
              Gruß
              Lothar

              Kommentar


                #8
                Klar könnte man das. Nur ist der Einfluß der Bewölkung und im speziellen Fall der Schnedecke viel viel größer, als daß der exakte Winkel wirklich interessant wäre. Zumindest ist das mein Eindruck. Man sollte eher +/-10 Minuten um Sonnenauf/-untergang die aktuelle Helligkeit auswerten und dann entscheiden.

                Kommentar


                  #9
                  Zitat von nipponichi Beitrag anzeigen
                  Klar könnte man das. Nur ist der Einfluß der Bewölkung und im speziellen Fall der Schnedecke viel viel größer, als daß der exakte Winkel wirklich interessant wäre. Zumindest ist das mein Eindruck. Man sollte eher +/-10 Minuten um Sonnenauf/-untergang die aktuelle Helligkeit auswerten und dann entscheiden.
                  Da hast du recht das wäre auch super.
                  Vielleicht noch mit Auswertung von zwei frei definierbaren sperr Objekte.

                  z.B. ein Sonnenfühler meldet sehr viel Sonne, dann soll der Rollo zu fahren und zu bleiben. und zwar Abhängig von Ausen- und Innen- Raum Temperatur.
                  --
                  Gruß
                  Lothar

                  Kommentar


                    #10
                    Code:
                    knx_write($sonnenaufgang_ga,sun_rise($lon,$lat,0),16);
                    knx_write($sonnenuntergang_ga,sun_set($lon,$lat,0),16);
                    
                    $plugin_info{$plugname.'_sunrise'}=sun_rise($lon,$lat,$winkel);
                    $plugin_info{$plugname.'_sunset'}=sun_set($lon,$lat,$winkel);
                    Hallo,

                    ich glaube hier ist noch ein Fehler drinnen.
                    Beim knx_write fehlt der Winkel.
                    Code:
                    knx_write($sonnenaufgang_ga,sun_rise($lon,$lat,$winkel),16);
                    knx_write($sonnenuntergang_ga,sun_set($lon,$lat,$winkel),16);
                    --
                    Gruß
                    Lothar

                    Kommentar


                      #11
                      Das war eigentlich Absicht. In der Visu möchte ich Sonnenaufgang/-untergang wie im Kalender angezeigt haben (unter der Annahme, daß der Winkel dafür zu 0 gesetzt wird.)

                      Kommentar

                      Lädt...
                      X