Ankündigung

Einklappen
Keine Ankündigung bisher.

Automatik für Rollläden - Ideen & Hilfe für Wollmilchsau

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

    [WireGate-Plugin] Automatik für Rollläden - Ideen & Hilfe für Wollmilchsau

    Hallo Zusammen,

    Entschuldigt, dass es etwas mehr Text wird!

    Nachdem Julian (netzkind) hier https://knx-user-forum.de/forum/supp...wiregate/10132 sein Plugin Hitzeschild fürs Wiregate vorgestellt hat, habe ich mal darauf aufbauend angefangen ein etwas umfangreicheres und hoffentlich allgemein funktionierendes Plugin zu schreiben.

    Ich habe einige kleinere Sachen angepasst. Neu angefangen habe ich aber, um folgende Funktionen nachzurüsten:
    • Sperren eines einzelnen Rollladens (z.B. durch Reedkontakt und GA)
    • Positionsfahren und nur auf/zu
    • Integration von Nacht/Morgen über die Evaluation der Sonne
    • Berücksichtigen der Raumsoll- sowie Raumisttemperatur und der Außentemperatur

    Angedacht habe ich:
    • Helligkeit einer Wetterstation oder des Wiregate-Multisensors berücksichtigen
    • Lamellenführung für die, die Jalousien haben
    • Vorwarnpositionsfahrten


    Bei folgenden Punkten bräuchte ich Eure Hilfe / Euren Ideen:

    ? Ich würde die bürgerliche Dämmerung (Evaluation der Sonne -6°) als Grenzwert für "Abends Dunkel" und "Morgens Hell" nehmen wollen. Was haltet Ihr davon?

    ? Braucht man extra Positionen für Nacht/Morgen zusätzlich zu Beschattungspositionen?

    ? Bisher wird der aktuelle Winkel der Sonne mit dem Winkel verglichen, der beim letzen Aufruf des Plugins berechnet wurde. Damit kann man recht einfach rausfinden, ob der Rollladen bereits zu- bzw. aufgefahren wurde. Jetzt wird die Logik aber etwas aufwendiger: Einzel-Sperre, Ist- zu Solltemperatur, Dunkelheitsfahrt,...
    Wenn ich das richtig sehe, müsste man sinnvollerweise für jeden Rollladen den Status beim Durchlauf-Ende des Plugins speichern. Einfach könnte man jetzt n Variablen für n Rollläden anlegen. Nicht so schön, oder? Man könnte die Status hinterneinander komma-getrennt in einen String schreiben und dann beim Auslesen wieder splitten? Kann man ein Hash oder Array speichern? Irgendwie muss man den Status aller Elemente zum nächsten Plug-Aufruf retten...

    Alle Ideen, Meinungen und Kritik sind willkommen!
    Grüße Moritz

    #2
    Code

    hier mal noch der aktuelle Code. Auch hier: immer her mit Ideen und Änderungswünschen:

    Code:
    ###################################################################################### 
    # 
    # Plugin RollladenAutomatik 
    # V0.2 2011-05-30 
    # Benötigt: libastro-satpass-perl 
    # 
    # Ein Wiregate Plugin zum automatischen Fahren der Rollläden. Es berechnet unter Anderem 
    # den Stand der Sonne und fährt je nach Winkel der Sonne zum Fenster, den Rollladen in 
    # eine Beschattungsposition. Folgende Funktionen werden unterstützt: 
    #    - 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 
    #    - Bugfix für Busch-Jäger USB Schnittstelle (muss eingeschaltet werden) 
    # 
    # TODO: Was teilweise integriert ist aber noch nicht komplett ist:
    #    - Zufahren bei Dunkelheit am Abend und Hell am Morgen
    #    - Nur zufahren, wenn es im Raum warm genug ist
    #    - Wetterstation einbinden: Helligkeit, Sonnenschein, Dämmerung 
    #     - Bei Fensterdefinition auch Elevation oben bzw. unten angeben 
    #    - Jalousie Lamellenführung 
    #    - Vorwarnpositionsfahrten? 
    #    - Englisch oder Deutsch?
    #    - Aussentemperatur: im Winter ist es draussen kalt :-) 
    # 
    ###################################################################################### 
     
     
    ######################### 
    ### BEGINN DEFINITION ### 
    ######################### 
     
    # Die Koordinaten des Hauses. Sehr einfach über http://www.getlatlon.com/ zu ermitteln. 
    # Und die Höhe über NN 
    my ($lat, $lon, $elev) = ( 
        49.02917390736781, # Breitengrad in Grad 
        8.570709228515625, # Längengrad in Grad 
        180 / 1000 # Höhe über NN in Kilometer (dewegen geteilt durch 1000) 
        ); 
     
    # Gruppenadresse, über welche die komplette Automatik für alle Rollläden gesperrt werden kann 
    my $GASperreAlle = "0/0/125"; 
     
    # Bugfix für KNX-Schnittstellen die sich bei zu schneller Telegrammabfolge 
    # verschlucken, und denen wir deshalb die Geschwindigkeit der Telegramme drosseln müssen 
    # 0 = nicht anschalten (Telegramme mit voller Geschwindigkeit abfeuern) 
    # 1 = anschalten (Telegramme um 20 millisekunden verzögern) 
    # nur für "Busch-Jäger 6196 USB REG" ist bekannt das dies benötigt 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°, echter Süden = 180°, echter Westen = 270°, echter Norden = 0° 
    #     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 
    #     richtungZu => 1 
    # Richtung bei keiner Beschattung: wenn 0 wird DPT3 angenommen und ganz aufgefahren. 
    # Bei ungleich 0, wird DPT5 angenommen und Position angefahren 
    #     richtungAuf => 0 
    # Ob der Rollladen in die Automatik für 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önnen? 
    #     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, richtungZu => 1, richtungAuf => 0,  
                sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127", GAraumIstTemp => "0/0/128", 
                GAfahren => "2/1/11", GAsperre => "0/0/129" }; 
    push @AlleRolllaeden, { name => "Kind Strasse", winkel1 => 182, winkel2 => 290, richtungZu => 86, richtungAuf => 2,  
                sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127", GAraumIstTemp => "0/0/128", 
                GAfahren => "2/3/13", GAsperre => "0/0/129" }; 
    push @AlleRolllaeden, { name => "Küche", winkel1 => 194, winkel2 => 310, richtungZu => 80, richtungAuf => 2,  
                sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127", GAraumIstTemp => "0/0/128", 
                GAfahren => "2/2/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 überhaupt 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ühren 
    my ($azimuth, $elevation) = berechneSonnenstand($lat, $lon, $elev); 
    # Auslesen wo die Sonne beim letzten Durchgang war 
    my $lastAzimuth = $plugin_info{$plugname.'_lastAzimuth'}; 
    
    #berechneSonnenaufgang(); 
    #berechneSonnenuntergang(); 
     
    #Los gehts. Jeden Rolladen/Fenster/Raum abarbeiten. 
    foreach my $element (@AlleRolllaeden) { 
        # Falls gesperrt, mit nächstem 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}); 
    
        # Beachtet werden muss: Letzter Zustand; Sonnenstand; Tag oder Nacht; IstTemp;  
        my $testAktuellBeschienen = ($azimuth > $winkel1 && $azimuth < $winkel2) || 0; 
        my $testVoherBeschienen = ($lastAzimuth > $winkel1 && $lastAzimuth < $winkel2) || 0;
        my $testAbendDaemmerung;
        my $testMorgenDaemmerung; 
        
        # Falls Rollladen in Offen-Position ist 
        if (!$testVoherBeschienen && $testAktuellBeschienen) { 
            fahreRollladen($element->{richtungZu}, $element->{GAfahren}); 
            plugin_log($plugname,"Name: " . $element->{name} . "; Zufahren bei: " . round(rad2deg($azimuth))); 
        }
        # Falls Rollladen in Geschlossen-Position ist 
        if ($testVoherBeschienen && !$testAktuellBeschienen) { 
            fahreRollladen($element->{richtungAuf}, $element->{GAfahren}); 
            plugin_log($plugname,"Name: " . $element->{name} . "; Auffahren bei: " . round(rad2deg($azimuth))); 
        } 
    } 
     
    # Für die nächste Iteration den aktuellen Sonnenstand merken 
    # TODO: Müsste man sich nicht eigentlich für 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, Tag/Nacht etc. 
    $plugin_info{$plugname.'_lastAzimuth'} = $azimuth; 
    # Ende 
    return "Grad gegen Norden: " . round(rad2deg($azimuth)) . "; Grad über 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ührt werden soll (DPT5). 
        # TODO: man muss bei Positionsfahrt für den Offen-Zustand mindestens 2% angeben... 
        #    hm, wenn man die GAs ins Wiregate importiert hat, braucht 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); 
        } 
    }

    Kommentar


      #3
      Sorry, das geht in dem Unterforum immer leicht unter.. Deswegen hatte ich mich kürzlich durchgerungen die diversen Plugins lieber in SF/openautomation zu schieben. Eine Revisionierung ist IMHO hilfreich..
      (Beweis: das von Julian fehlt bisher, Überblick fehlt..)

      Jeder der will, kann sich da nen User anlegen und solange er halbwegs weiss, was er tut auch Schreibrechte bekommen..
      Ansonsten schiebe ich das auch gerne weiter..

      Zum Thema: ich denke Rolladen/Jalousiensteuerung ist mit eines der komplexesten und individuellsten Themen! Es ist einfach Geschmackssache..

      Makki

      P.S.: Der Workaround für das kaputte ABB//BJ USB-if ist glaube ich schon drin aber muss ich morgen noch nachsehen..
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Moin, ich wollt das Plugin mal testen, bekomms aber garnicht erst zum laufen mit folgendem Error:
        Can't locate Astro/Coord/ECI.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 230) line 155, line 36456. BEGIN failed--compilation aborted at (eval 230) line 155, line 36456.
        Astro hab ich versucht zu installieren, obs geklappt hat weis ich iwie nich so richtig, weis da vlt jmd Hilfe?
        Hab jetzt bald ne Stunde dran rumgedoktort aber das ganze nich zum laufen bekommen.

        Kommentar


          #5
          Steht zwar sicher da (weil ich das dafür gepacked habe bin ich mir recht sicher), aber mach mal im Webif unter Updates -> Paket installieren:
          libastro-satpass-perl
          (oder ssh-konsole: "apt-get install libastro-satpass-perl")

          Dann tut das..

          Makki
          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
          -> Bitte KEINE PNs!

          Kommentar


            #6
            Makki du bist der König.

            Wunderbar, nun gibts kein Error mehr, dann morgen mal sehen ob die BErechnung stimmt.


            Gruß
            David

            Kommentar


              #7
              Gerne, die Berechnung des Sonnenstandes stimmt, wir freuen uns auf Deine Anwendungsbeispiele dafür

              Makki
              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
              -> Bitte KEINE PNs!

              Kommentar


                #8
                Hi,

                habe da mittlerweile einiges weitergebastelt. Ich stelle mal ein Update rein, wenn ich wieder zu Hause bin.

                Gruß Moritz

                Kommentar


                  #9
                  Hallo Moritz,

                  du wolltest ein Update hochladen. Leider finde ich weder hier noch bei Sourceforge ein Update. Ich warte doch schon sehnsüchtigst.

                  Bitte, bitte. Lass uns am Fortschritt teilhaben.

                  Gruß,
                  David

                  Kommentar


                    #10
                    Die grösste Herausforderung ist hier das schnell entstehende Chaos zu verwalten, deswegen haben wir uns auch kürzlich entschlossen die Plugins ins openautomation-Projekt in SF zu packen.
                    Da darf&kann jeder, wer mit SVN nicht mag&kann mache ich die Sachen auch gerne da rein! Aber eine Revisionierung ist mittlerweile schon essentiell, schon alleine um den Überblick zu behalten..
                    Ich schätze es gibt sicher nochmal doppelt soviele Plugins wie bekannt.. her damit!

                    Makki
                    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                    -> Bitte KEINE PNs!

                    Kommentar


                      #11
                      Zitat von DK178 Beitrag anzeigen
                      du wolltest ein Update hochladen.
                      Hi David,

                      Hast Recht, ich bin spät dran...

                      Ich stelle es hier mal in den nächsten Post. Werde Makki aber auch mal eine PN wg SF schicken. Oder muss/sollte ich die lieber Chris schicken?

                      Gruß Moritz

                      Kommentar


                        #12
                        Aktuelle Version:
                        Im Wesentlichen fahren damit meine Rollläden abends runter, morgens hoch und Beschatten. Ich merke aber immer mehr, dass es ohne Helligkeitssensor wohl nie richtig smart werden wird...

                        Gruß Moritz

                        Code:
                        ###################################################################################### 
                        # 
                        # Plugin RollladenAutomatik 
                        # V0.5 2011-06-10 
                        # Benötigt: libastro-satpass-perl -> 'apt-get install libastro-satpass-perl' 
                        # 
                        # Ein Wiregate Plugin zum automatischen Fahren der Rollläden. Es berechnet unter Anderem  
                        # den Stand der Sonne und fährt je nach Winkel der Sonne zum Fenster, den Rollladen in  
                        # eine Beschattungsposition. Folgende Funktionen werden unterstützt: 
                        #    - 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ür Busch-Jäger 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ämmerung 
                        #     - Bei Fensterdefinition auch Elevation oben bzw. unten angeben 
                        #    - Jalousie Lamellenführung 
                        #    - Vorwarnpositionsfahrten? 
                        #    - Englisch oder Deutsch? 
                        #    - Außentemperaur 
                        ###################################################################################### 
                         
                         
                        ######################### 
                        ### BEGINN DEFINITION ### 
                        ######################### 
                         
                        # Die Koordinaten des Hauses. Sehr einfach über http://www.getlatlon.com/ zu ermitteln. 
                        # Und die Höhe über NN 
                        my ($lat, $lon, $elev) = ( 
                            49.02917390736781, # Breitengrad in Grad 
                            8.570709228515625, # Längengrad in Grad 
                            180 / 1000 # Höhe über NN in Kilometer (dewegen geteilt durch 1000) 
                            ); 
                         
                        # Elevation der Sonne, ab der es abends dunkel ist bzw. morgens hell ist. 
                        # Bürgerliche Dämmerung ist bei -6 Grad. 
                        my $daemmerung = -3; 
                         
                        # Gruppenadresse, über welche die komplette Automatik für alle Rollläden gesperrt werden kann 
                        my $GASperreAlle = "0/0/125"; 
                         
                        # Bugfix für KNX-Schnittstellen die sich bei zu schneller Telegrammabfolge 
                        # verschlucken, und denen wir deshalb die Geschwindigkeit der Telegramme drosseln müssen 
                        # 0 = nicht anschalten (Telegramme mit voller Geschwindigkeit abfeuern) 
                        # 1 = anschalten (Telegramme um 20 millisekunden verzögern) 
                        # nur für "Busch-Jäger 6196 USB REG" ist bekannt das dies benötigt 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°, echter Süden = 180°, echter Westen = 270°, echter Norden = 0° 
                        #     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ür 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önnen? 
                        #     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üche", 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" }; 
                          
                        ####################### 
                        ### 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 überhaupt 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ühren 
                        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ämmerung 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ächstem 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ür die nächste Iteration den aktuellen Sonnenstand merken 
                        # TODO: Müsste man sich nicht eigentlich für 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ührt werden soll (DPT5). 
                            # TODO: man muss bei Positionsfahrt für den Offen-Zustand mindestens 2% angeben... 
                            #    hm, wenn man die GAs ins Wiregate importiert hat, bräuchte 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); 
                            } 
                        }

                        Kommentar


                          #13
                          Hi Moritz,

                          besten Dank. Werde mir deine Updates mal zu Gemüt führen.

                          Gruß,
                          David

                          Kommentar


                            #14
                            Mal zwei Fragen/Anmerkungen, kann aber sein, dass ich es überlesen habe...

                            1. Fahren bei Sonnenschein die Rolläden auf eine zwischenposition also quasi auf Ritze, oder immer ganz runter?

                            2. Was passiert, wenn keine Sonne scheint? Was verhindert, dass dann die Rolläden auch runter fahren, oder hab ich den Lichtsensor irgendwo gerade übersehen?

                            Der verwirrte René

                            Kommentar


                              #15
                              Zitat von NeubauRe Beitrag anzeigen
                              1. Fahren bei Sonnenschein die Rolläden auf eine zwischenposition also quasi auf Ritze, oder immer ganz runter?
                              Du kannst für die Beschattung die Position separat von der Position bei Nacht konfigurieren. Von daher ja.

                              Zitat von NeubauRe Beitrag anzeigen
                              2. Was passiert, wenn keine Sonne scheint? Was verhindert, dass dann die Rolläden auch runter fahren, oder hab ich den Lichtsensor irgendwo gerade übersehen?
                              Bisher leider noch nicht smart. Wenn der neue Multisensor fürs Wiregate raus ist, wird der bei mir den Helligkeitswert liefern. Im Moment fahren die Läden in Beschattung auch wenn die Sonne hinter Wolken ist. Da ich aber zu der Zeit eh meist arbeiten bin, komme ich damit erstmal klar...

                              Gruß Moritz

                              Kommentar

                              Lädt...
                              X