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

    #16
    Hi wollte dein Plugin mal testen, leider passiert bei mir gar nichts.

    ich kann mit der ETS keine einzige Read anfrage feststellen. Als return bekomme ich nur die grad gegen Norden, und den Elevationswinkel. Nur an die angegebenen GA´s wird nichts gesendet.
    Das einzigste was ich ändern musste war der DPT wert. Bei mir fahren die mit DPT1 also wie ein schalter? (Jung Rolladen Aktor)



    Gruß

    Edit: ich ahb mal unter den Punkten "war vorher beschienen" und "war vorher nicht beschienen" ein knx_write angehängt ob er das überhaupt ausführt. Aber mir scheint das er bei mir bei dem Return azimuth und elevation hängen bleibt

    Kommentar


      #17
      Hi Volker,

      Am DPT solltest Du eigentlich nichts ändern müssen. Schau bitte mal im SVN nach dem letzten Stand.

      Sonst poste doch mal Deine Änderungen.

      Gruß

      Kommentar


        #18
        Also das ist mein plugin:

        ich hab die tag/nacht schaltung auskommentiert.
        Die $fahren GA geht bei mir vorerst auf eine Freigabe GA. Linknx macht den Rest, da ich die Rolläden per Zeit in position fahre.

        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) = (
            48.0284223,  # Breitengrad in Grad
            12.3691071, # Längengrad in Grad
            530 / 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 = "7/0/1";
        
        # 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 => "Wohzi_sued", winkel1 => 180, winkel2 => 360, wertZuBesch => 1, wertAufBesch => 0, 
                    wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 1, raumSollTemp => 22, GAraumSollTemp => "0/0/127", 
                    GAraumIstTemp => "11/2/0", GAfahren => "13/5/0", GAsperre => "13/5/0" };
        #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" };
        # 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 ü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  && !$testNacht
            if (!$testVoherBeschienen && $testAktuellBeschienen) {
                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  && !$testNacht
            if ($testVoherBeschienen && !$testAktuellBeschienen) {
                fahreRollladen($element->{wertAufBesch}, $element->{GAfahren});
                plugin_log($plugname,"Name: " . $element->{name} . "; Wegen Sonne auffahren bei: " . round(rad2deg($azimuth)));
            }
           [COLOR=Red] # 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)));
        #    }
        }
        [/COLOR]
        # 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,[COLOR=Red]1[/COLOR]);        
            }
            else {
                # Position anfahren
                knx_write($GA,$richtung,5);
            }
            # kurze Pause, falls das benutzte Interface das braucht...
                if ($bugfixSlowInterface) {
                    usleep(20000);
            }
        }
        ich nutze eine Jung USB Schnittstelle. Muss ich da auch SlowInterface = 1 setzen?

        Gruß

        Kommentar


          #19
          Zitat von vlamers Beitrag anzeigen
          ich nutze eine Jung USB Schnittstelle. Muss ich da auch SlowInterface = 1 setzen?
          Gruß
          Nee, das braucht man AFAIK nur für das offenbar einfach nicht KNX-konforme dingens von ABB/BJ.
          Also gehört das KNX-Logo runtergekratzt und dann dem Hersteller auf den Hof legen

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

          Kommentar


            #20
            Hallo,

            hab heute nochmal wegen dem Plugin geschaut warum das bei mir nicht wirklich funktioniert.

            Meine Überlegung war folgende:

            wenn ich die Zeile 133 auskommentiere

            Code:
            # return "Grad gegen Norden: " . round(rad2deg($azimuth)) . "; Grad ueber Horizont: " . round(rad2deg($elevation));
            (Hier wird Grad gegen Norden noch richtig angezeigt)

            müsste zeile 153

            Code:
            return ($azimuth, $elevation);
            angezeigt werden.

            angezeigt wird aber nur eine Zahl (1.00009 irgendwas) wenn ich $azimuth entferne ist die Zahl noch da. Wenn ich $elevation entferne ist die Zeile leer.

            d.h. dass bei meinem $azimuth nichts gemerkt wird und deshalb die Rolladen nicht gefahren werden, da später darauf zurück gegriffen wird?

            libastro ist in der neuesten version installiert.

            Weiß hier jemand Rat? Leider sind meine Perl / programmierkenntnisse sehr beschränkt, sodass ich den Fehler nicht finden kann.

            Gruß Volker

            PS: Hier mein Code des Plugins:

            Code:
            #########################
            ### 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) = (
                48.0284223, # Breitengrad in Grad
                12.3691071, # L�ngengrad in Grad
                530 / 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;
            
            # 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 => "Wohnzimmer_Tuer", winkel1 => 135, winkel2 => 200, wertZuBesch => 1, wertAufBesch => 0, 
                        wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 0, raumSollTemp => 22, GAraumSollTemp => "11/2/1", 
                        GAraumIstTemp => "11/2/0", GAfahren => "7/2/4", GAsperre => "7/2/5" };
            #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" };
            #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'} = 60;
            
            # 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{$GAsperre}{$plugname} = 1;
            # Fals global gesperrt, Plugin-Durchgang beenden
            
            
            # 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) {
                    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) {
                    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,1);        
                }
                else {
                    # Position anfahren
                    knx_write($GA,$richtung,5);
                }
            }
            Hier die Ausgabe von $azimuth, $elevation:

            Code:
            [URL="http://192.168.178.33:10000/wiregate/edit_plugins.cgi?edit=Terrassent%C3%BCr%20versuch"]Terrassentür versuch[/URL]2011-07-17 13:02:196030      1.10053399479476

            Kommentar


              #21
              Hat das Plugin schonmal jemand als "Standalone" Perl Modul erstellt, so dass man mit Perl & LinKNX arbeiten kann. Habe kein WireGate und dementsprechend auch nix, wo ich es "pluggen" kann.

              Müsste ja auch gehen, wenn man den Prozess mittels Cron alle 5 Minuten startet und dann über LinKNX steuert, oder?

              Kommentar


                #22
                Zitat von netsrac Beitrag anzeigen
                Hat das Plugin schonmal jemand als "Standalone" Perl Modul erstellt, so dass man mit Perl & LinKNX arbeiten kann.
                Hoi Carsten

                Wie heisst es im Radio Eriwan immer: "Im Prinzip schon, aber ...."
                also dieses Script hab' ich nicht "standalone" aber eines zum prowlen z.B.

                Man wird dann mit knxwrite arbeiten müssen oder etwas Ähnlichem (vom eibd).

                Leider hab' ich gerade kaum Zeit für solche Sachen.
                Grüsse Bodo
                Fragen gehören ins Forum, und nicht in mein Postfach;
                EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                Kommentar


                  #23
                  Zitat von Bodo Beitrag anzeigen
                  Leider hab' ich gerade kaum Zeit für solche Sachen.
                  Ja, das Problem habe ich...deshalb frage ich ja vorher.

                  Mal schauen, ob ich da was schaffe, dann werde ich es hier natürlich posten...

                  Kommentar


                    #24
                    Hi,

                    ich benutze zwar nicht das Wiregate aber meine Steuerung läuft ebenfalls über Perl und ich hole mir hier gerne Anregungen.
                    Für meinen Anwendungsfall habe ich die Abschattungslogik so angepasst, dass ich über beliebig viele Koordinaten (Azimut/Elevation) den Schattenwurf von Hindernissen berücksichtigen kann.
                    Man kann z.B. die Koordinaten des Giebels eines Nachbarhauses angeben und die Zwischenwerte werden über eine simple Geradengleichung interpoliert.
                    Nur wenn die Sonne über dieser Fläche steht wird dann die Beschattung aktiviert.

                    Hier sind Auszüge aus der Logik:
                    Code:
                    my @Fenster = (
                    { Name=>'Fenster HWR Giebel', RL=>'211/153', ML=>'210/207',
                        Koordinaten=>['185/5','222/5','222/9','276/34','300/9'],      
                        AbschPos=>'47', NachtPos=>'100', LueftPos=>'80', VorwPos=>'0'
                      },
                    ...
                    Ergänzung in Schleife über die Rollos:

                    Code:
                    # Koordinaten für Beschattungsfläche auslesen
                        foreach my $Koordinaten (@{ $val->{Koordinaten} }) {
                           $Koordinaten =~ /(\d+)\/(\d+)/;
                           $az = $1;
                           $el = $2;
                           if ($az_alt == 0 || $az == $az_alt) {
                             $az_alt = $az;
                             $el_alt = $el;
                             next;
                           }
                           # Steigung berechnen
                           $m = ($el - $el_alt) / ($az - $az_alt);
                           $el_schwelle = $m * ($azimut - $az_alt) + $el_alt;
                           if ($azimut >= $az_alt && $azimut <= $az) {
                             $AktuellBeschienen = ($elevation > $el_schwelle) || 0;
                             last;
                           }
                           $az_alt = $az;
                           $el_alt = $el;
                        }
                    Bei Interesse ließe sich dies bestimmt einfach in das Wiregateplugin einbauen.

                    Gruß
                    Carsten

                    Kommentar


                      #25
                      Zitat von derwolff2010 Beitrag anzeigen
                      Hi,

                      ich benutze zwar nicht das Wiregate aber meine Steuerung läuft ebenfalls über Perl und ich hole mir hier gerne Anregungen.

                      Gruß
                      Carsten
                      Hallo Carsten,

                      würdest Du das Ganze Script mit uns Sharen?! Ich nutzt ebenfalls "nur" Perl und nicht das komplette Wiregate. Hatte bis jetzt leider noch nicht die Zeit, eine Standalone-Version aus dem Wiregate Plugin zu bauen.

                      Danke...Netsrac

                      Kommentar


                        #26
                        @ Netsrac

                        Das Problem ist dass ich auch kein EIB/KNX einsetze sondern einen CAN-Bus basierten Hausbus habe. Die Skripte sind demnach schon erheblich verändert.

                        Gruß
                        Carsten

                        Kommentar


                          #27
                          Servus,

                          Zitat von derwolff2010 Beitrag anzeigen
                          Für meinen Anwendungsfall habe ich die Abschattungslogik so angepasst, dass ich über beliebig viele Koordinaten (Azimut/Elevation) den Schattenwurf von Hindernissen berücksichtigen kann.
                          wow, ich finde, das ist eine super Erweiterung, dass so nicht nur ein ebener Horizont (ohne Bebauung) sondern eben auch eine individuelle Horizontlinie berücksichtig werden kann. Das ist IMHO gerade im städtischen Bereich mit geringen Bauabständen nicht zu verachten...

                          Kommentar

                          Lädt...
                          X