Ankündigung

Einklappen
Keine Ankündigung bisher.

Schaltuhr - Plugin erweitert um Sonnenauf- und Untergang

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

    #46
    Ja das Problem tritt auf, wenn du zuviele andere Plugins parallel am laufen hast oder wenn ein Plugin nicht schnell abgearbeitet wird. Sollte zwar nicht sein aber auch bei mir tritt das ab und zu auf. Bei mir ist es oft das rrd Plugin dass sehr lange braucht. In Konbination mit weiteren Plugins wird die Sache immer wackliger. Da gibt es im grunde 3 Lösungen.

    1. Die klemmenden Plugins zähmen oder entfernen
    2. Das Schaltuhrplugin standalone alle 20 sekunden über cron ausführen lassen
    3. Ein Statusspeicher für die GA's einrichten die überprüft ob der Schaltpunkt ausgeführt wurde. Dann kann es aber relativ grosse Differenzen geben.

    Ich sehe mir das mal an. Kann auch sein dass die Astrofunktion mit seiner Berechnung die Zuverlässigkeit zusätzlich negativ beeinflusst.
    Gruss Patrik alias swiss

    Kommentar


      #47
      Zitat von swiss Beitrag anzeigen
      wenn du zuviele andere Plugins parallel am laufen hast oder wenn ein Plugin nicht schnell abgearbeitet wird
      Was passiert dann? Werden die Plugins denn nicht trotzdem alle ausgeführt?
      Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

      Kommentar


        #48
        Doch das Plugin wir trotzdem ausgeführt. Da abet per if abfrage überprüft wird ob Stunde und Minute überein stimmen kann es im schlechtesten Fall vorkommen das das Plugin in der betreffenden Minute nicht ausgeführt wird. Desshalb sollte ich da noch ein Statusspeicher einbauen. Ich sehe es mir heute abend mal an.
        Gruss Patrik alias swiss

        Kommentar


          #49
          Auf dem Wiregate läuft im Moment nur dieses eine Plugin, neben einem Temperatursensor und dem Zeitsender.
          Es sind auch nur 5 Schaltzeiten programmiert, davon zwei zum Sonnenuntergang.
          An der Ausführungdauer sollte es also nicht liegen.

          Gruß,
          Dennis

          Kommentar


            #50
            Sehr seltsam...

            Bei mir funktioniert es zuverlässig wenn ich das rrdplugin deaktiviere. Allerdings nutze ich auch nicht die Astroversion da ich die nie zum laufen bekommen habe. Vieleicht liegt es daran, dass ab und zu die Berechnung zu langasm ausgeführt wird. Vieleicht sollte man die Astrozeit nur einmal pro Tag für alle Schaltzeiten berechnen die nach Astrozeit gesteuert werden sollen und diese in einer Variable zwischenspeichern. Das würde warscheinlich auch schon etwas bringen. Ich sehe mir das die Tage mal an
            Gruss Patrik alias swiss

            Kommentar


              #51
              Also gestern Abend wurden die zwei Schaltzeiten zum Sonnenuntergang ausgeführt. Geändert habe ich vorher nichts.
              Ich werde die Sache mal beobachten. Vielleicht lässt es sich an ein Ereignis oder eine Aktion knüpfen und somit lokalisieren.

              Kommentar


                #52
                Statusbericht:

                Gestern lief wieder wieder nur eine Schaltzeit per ASTRO-Funktion. Licht ging an, Rolläden blieben aber oben.
                Beides sollte per Sonnenuntergang geschaltet werden.
                Per Sonnenaufgang soll auch ein Schaltbefehl ausgeführt werden: Licht aus (zur Sicherheit, falls nicht schon aus ist).

                Den EIN-Befehl per Sonnenuntergang sehe ich im log, den AUS zum Sonnenaufgang nicht.

                Beides sollte per ASTRO laufen!?

                Die beiden Zeilen
                Code:
                [COLOR=Magenta]my @sunrise=split(/:/,sun_rise($lon,$lat,$winkel)); 
                my @sunset=split(/:/,sun_set($lon,$lat,$winkel));
                [/COLOR]
                sind bei mir eingefügt.

                Kommentar


                  #53
                  Hast du die aktuelle Version oder deine Version von Hand auf den aktuellen Stand gebracht? Die von die eingefügten Zeilen gehören zum aktuellen Stand. Wo hast du die eingefügt??

                  Ich kann mir immer noch gut vorstellen, dass die Berechnung nicht zuverlässig funktioniert. bzw zu langsam berechnent wird. Das Problem kann speziell dann auftreten wenn mehrere, per Astrofunktion auszuführende Schalthandlungen zur selben Zeit ausgeführt werden sollen.

                  Hast du mal eine Kopie deiner Version mit Schaltzeiten wie sie bei dir im Einsatz ist?

                  Ich werde mir zu diesem Punkt mal noch was einfallen lassen. Leider bin ich momentan beruflich und privat recht stark eingebunden wesshalb ich etwas Zeit benötige um das zu ändern.
                  Gruss Patrik alias swiss

                  Kommentar


                    #54
                    Hallo Patrik,

                    ich schieb heute Abend mal meinen Code des Plugins hier rein.
                    Vielleicht hast Du mal Zeit, drüber zu schauen.

                    Danke.

                    Kommentar


                      #55
                      So, hier der derzeitige Code des Plugins.
                      Es ist das einzige Plugin, was läuft.
                      In der Plugin-Logdatei sind keine Einträge.
                      Code:
                      # Plugin zum Zeit abhängigem schalten von GA's (Schaltuhr)
                      # Version 0.6 BETA 29.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
                      
                      
                      ####################
                      ###Einstellungen:###
                      ####################
                      
                      # Die Standortdaten 
                      # Die Koordinaten des Hauses. Sehr einfach ?ber http://www.getlatlon.com/ zu ermitteln.
                      my ($lat, $lon) = (
                          51.66787081407156, # Breitengrad in Grad
                          13.64227294921875  # 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.
                      #Sollen Schaltzeiten astronomisch geschaltet werden, so muss bei Astro 'a' für Sonnenaufgang
                      #und 'u' für Sonnenuntergang eingetragen werden. Der Stunden und Minutenwert wird dann ignoriert.
                      
                      
                      
                      #push @Schaltzeiten, { name => "Rolladen_hoch", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 0, Stunden => 8, Minuten => 32, Wert => 0, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                      #push @Schaltzeiten, { name => "Rolladen_hoch", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 0, freitag => 0, samstag => 1, sonntag => 1, Stunden => 10, Minuten => 32, Wert => 0, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                      #push @Schaltzeiten, { name => "Licht_Whz_an", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 20, Minuten => 20, Wert => 1, DPT => 1, ga => '1/0/2', KW => '', Monat => '', Astro => '' };
                      #push @Schaltzeiten, { name => "licht_Whz_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 11, Wert => 0, DPT => 1, ga => '1/0/2', KW => '', Monat => '', Astro => '' };
                      
                      #Beschattung nachmittags runter
                      #push @Schaltzeiten, { name => "Rolladen_runter", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 15, Minuten => 43, Wert => 1, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                      #push @Schaltzeiten, { name => "Rolladen_hoch", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 18, Minuten => 32, Wert => 0, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                      
                      #push @Schaltzeiten, { name => "licht_Blumen_Whz_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 35, Wert => 1, DPT => 1, ga => '1/0/13', KW => '', Monat => '', Astro => '' };
                      #push @Schaltzeiten, { name => "licht_Blumen_Whz_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 20, Minuten => 25, Wert => 0, DPT => 1, ga => '1/0/13', KW => '', Monat => '', Astro => '' };
                      
                      push @Schaltzeiten, { name => "Rolladen_runter", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 03, Wert => 1, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => 'u' };
                      push @Schaltzeiten, { name => "Licht_Einfahrt_WE_ON", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 0, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 56, Wert => 1, DPT => 1, ga => '1/2/0', KW => '', Monat => '', Astro => '' };
                      push @Schaltzeiten, { name => "Licht_Einfahrt_WE_OFF", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 0, freitag => 1, samstag => 1, sonntag => 1, Stunden => 23, Minuten => 47, Wert => 0, DPT => 1, ga => '1/2/0', KW => '', Monat => '', Astro => '' };
                      push @Schaltzeiten, { name => "Licht_Haustuer_WE_ON", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 47, Wert => 1, DPT => 1, ga => '1/0/33', KW => '', Monat => '', Astro => '' };
                      push @Schaltzeiten, { name => "Licht_Haustuer_WE_OFF", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 23, Minuten => 58, Wert => 0, DPT => 1, ga => '1/0/33', KW => '', Monat => '', Astro => '' };
                      
                      
                      push @Schaltzeiten, { name => "Licht_Traufe_ON", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten =>50 , Wert => 1, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => 'u' };
                      #push @Schaltzeiten, { name => "Licht_Traufe_ON", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 20, Wert => 1, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => '' };
                      push @Schaltzeiten, { name => "Licht_Traufe_OFF", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 23, Minuten => 30, Wert => 0, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => '' };
                      push @Schaltzeiten, { name => "Licht_Traufe_OFF", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 5, Minuten => 00, Wert => 0, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => 'a' };
                      ######################
                      ##ENDE Einstellungen##
                      ######################
                      
                      use POSIX;
                      use Time::Local;
                      # Wir brauchen auch Sonnenstandsberechnung
                      use Astro::Sunrise;
                      
                      # Eigenen Aufruf-Zyklus auf 20sek. setzen
                      $plugin_info{$plugname.'_cycle'} = 20;
                      
                      #Hier wird ein Array angelegt, um die Wochentagsnummer von localtime zu übersetzen
                      my @Wochentag = ('sonntag', 'montag', 'dienstag', 'mittwoch', 'donnerstag', 'freitag', 'samstag');
                      
                      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;
                      
                      my $kw = getWeekNumber($year, $mon, $mday);
                      
                      foreach my $element (@Schaltzeiten) {
                          if (knx_read($element->{ga},0,$element->{DPT}) ne $element->{Wert}) {
                                  if ($element->{Astro} ne '') {
                                      if ($element->{Astro} eq 'a') {
                                          $element->{Stunden}=$sunrise[0];
                                          $element->{Minuten}=$sunrise[1];
                                      } elsif ($element->{Astro} eq 'u') {
                                                          $element->{Stunden}=$sunset[0];
                                                          $element->{Minuten}=$sunset[1];
                                      }
                              }
                              if ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} ne '') {
                                  if ($element->{KW} == $kw) {
                                      knx_write($element->{ga},$element->{Wert},$element->{DPT});
                                      next;
                                  } else {
                                      next;
                                  }
                              } elsif ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{Monat} ne '') {
                                  if ($element->{Monat} == $mon) {
                                      knx_write($element->{ga},$element->{Wert},$element->{DPT});
                                      next;
                                  } else {
                                      next;
                                  }
                              } elsif ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} eq '' && $element->{Monat} eq '') {
                                  knx_write($element->{ga},$element->{Wert},$element->{DPT});
                                  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??er als 52 ist
                      # dann prüfen 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össer als 52 ist
                      # dann prüfen ob diese Wochennummer korrekt ist oder
                      # sie bereits die erste Woche des nächsten Jahres ist
                      elsif ($weekNumber gt 52)
                      {
                      $weekNumber = checkWeekNumber(($year + 1), 1, 1);
                      # wenn der 1. Januar des nächsten 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ück
                      $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);
                      }

                      Kommentar


                        #56
                        Also...

                        Ich habe um der Ursache auf den Grund zu gehen mal ein paar Debugzeilen eingefügt...

                        Du kannst das Plugin so 1:1 übernehmen da ich deine Schaltzeiten nicht verändert habe. Eine Version mit separater Config folgt demnächst.

                        Code:
                        # Plugin zum Zeit abhängigem schalten von GA's (Schaltuhr)
                        # Version 0.6 BETA 29.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
                        
                        
                        ####################
                        ###Einstellungen:###
                        ####################
                        
                        # Die Standortdaten 
                        # Die Koordinaten des Hauses. Sehr einfach ?ber http://www.getlatlon.com/ zu ermitteln.
                        my ($lat, $lon) = (
                            51.66787081407156, # Breitengrad in Grad
                            13.64227294921875  # 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.
                        #Sollen Schaltzeiten astronomisch geschaltet werden, so muss bei Astro 'a' für Sonnenaufgang
                        #und 'u' für Sonnenuntergang eingetragen werden. Der Stunden und Minutenwert wird dann ignoriert.
                        
                        
                        
                        #push @Schaltzeiten, { name => "Rolladen_hoch", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 0, Stunden => 8, Minuten => 32, Wert => 0, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                        #push @Schaltzeiten, { name => "Rolladen_hoch", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 0, freitag => 0, samstag => 1, sonntag => 1, Stunden => 10, Minuten => 32, Wert => 0, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                        #push @Schaltzeiten, { name => "Licht_Whz_an", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 20, Minuten => 20, Wert => 1, DPT => 1, ga => '1/0/2', KW => '', Monat => '', Astro => '' };
                        #push @Schaltzeiten, { name => "licht_Whz_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 11, Wert => 0, DPT => 1, ga => '1/0/2', KW => '', Monat => '', Astro => '' };
                        
                        #Beschattung nachmittags runter
                        #push @Schaltzeiten, { name => "Rolladen_runter", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 15, Minuten => 43, Wert => 1, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                        #push @Schaltzeiten, { name => "Rolladen_hoch", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 18, Minuten => 32, Wert => 0, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => '' };
                        
                        #push @Schaltzeiten, { name => "licht_Blumen_Whz_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 35, Wert => 1, DPT => 1, ga => '1/0/13', KW => '', Monat => '', Astro => '' };
                        #push @Schaltzeiten, { name => "licht_Blumen_Whz_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 20, Minuten => 25, Wert => 0, DPT => 1, ga => '1/0/13', KW => '', Monat => '', Astro => '' };
                        
                        push @Schaltzeiten, { name => "Rolladen_runter", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 03, Wert => 1, DPT => 1, ga => '0/2/5', KW => '', Monat => '', Astro => 'u' };
                        push @Schaltzeiten, { name => "Licht_Einfahrt_WE_ON", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 0, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 56, Wert => 1, DPT => 1, ga => '1/2/0', KW => '', Monat => '', Astro => '' };
                        push @Schaltzeiten, { name => "Licht_Einfahrt_WE_OFF", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 0, freitag => 1, samstag => 1, sonntag => 1, Stunden => 23, Minuten => 47, Wert => 0, DPT => 1, ga => '1/2/0', KW => '', Monat => '', Astro => '' };
                        push @Schaltzeiten, { name => "Licht_Haustuer_WE_ON", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 47, Wert => 1, DPT => 1, ga => '1/0/33', KW => '', Monat => '', Astro => '' };
                        push @Schaltzeiten, { name => "Licht_Haustuer_WE_OFF", montag => 0, dienstag => 0, mittwoch => 0, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 23, Minuten => 58, Wert => 0, DPT => 1, ga => '1/0/33', KW => '', Monat => '', Astro => '' };
                        
                        
                        push @Schaltzeiten, { name => "Licht_Traufe_ON", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten =>50 , Wert => 1, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => 'u' };
                        #push @Schaltzeiten, { name => "Licht_Traufe_ON", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 21, Minuten => 20, Wert => 1, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => '' };
                        push @Schaltzeiten, { name => "Licht_Traufe_OFF", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 23, Minuten => 30, Wert => 0, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => '' };
                        push @Schaltzeiten, { name => "Licht_Traufe_OFF", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 5, Minuten => 00, Wert => 0, DPT => 1, ga => '1/3/0', KW => '', Monat => '', Astro => 'a' };
                        ######################
                        ##ENDE Einstellungen##
                        ######################
                        
                        use POSIX;
                        use Time::Local;
                        # Wir brauchen auch Sonnenstandsberechnung
                        use Astro::Sunrise;
                        
                        # Eigenen Aufruf-Zyklus auf 20sek. setzen
                        $plugin_info{$plugname.'_cycle'} = 20;
                        
                        #Hier wird ein Array angelegt, um die Wochentagsnummer von localtime zu übersetzen
                        my @Wochentag = ('sonntag', 'montag', 'dienstag', 'mittwoch', 'donnerstag', 'freitag', 'samstag');
                        
                        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;
                        
                        my $kw = getWeekNumber($year, $mon, $mday);
                        
                        foreach my $element (@Schaltzeiten) {
                        plugin_log($plugname,'------');
                            if (knx_read($element->{ga},0,$element->{DPT}) ne $element->{Wert}) {
                                plugin_log($plugname,'Schaltzeit: ' . $element->{name} . ' verarbeiten...');
                                    if ($element->{Astro} ne '') {
                                        plugin_log($plugname,'Schaltzeit: ' . $element->{name} . ' reagiert auf Astrozeit');
                                        if ($element->{Astro} eq 'a') {
                                            $element->{Stunden}=$sunrise[0];
                                            $element->{Minuten}=$sunrise[1];
                                        } elsif ($element->{Astro} eq 'u') {
                                                            $element->{Stunden}=$sunset[0];
                                                            $element->{Minuten}=$sunset[1];
                                        }
                                        plugin_log($plugname,'Schaltzeit: ' . $element->{name} . ' neue Schaltzeit: ' . $element->{Stunden} . ':' . $element->{Minuten});
                                }
                                if ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} ne '') {
                                    if ($element->{KW} == $kw) {
                                        knx_write($element->{ga},$element->{Wert},$element->{DPT});
                                        next;
                                    } else {
                                        next;
                                    }
                                } elsif ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{Monat} ne '') {
                                    if ($element->{Monat} == $mon) {
                                        knx_write($element->{ga},$element->{Wert},$element->{DPT});
                                        next;
                                    } else {
                                        next;
                                    }
                                } elsif ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} eq '' && $element->{Monat} eq '') {
                                    knx_write($element->{ga},$element->{Wert},$element->{DPT});
                                    plugin_log($plugname,'GA: ' . $element->{ga} . ' mit Wert ' . $element->{Wert} . ' beschreiben');
                                    next;
                                }
                            }else{
                            plugin_log($plugname,'Schaltzeit: ' . $element->{name} . ' überspringen da bereits auf ' . $element->{Wert});
                            }    
                        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??er als 52 ist
                        # dann prüfen 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össer als 52 ist
                        # dann prüfen ob diese Wochennummer korrekt ist oder
                        # sie bereits die erste Woche des nächsten Jahres ist
                        elsif ($weekNumber gt 52)
                        {
                        $weekNumber = checkWeekNumber(($year + 1), 1, 1);
                        # wenn der 1. Januar des nächsten 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ück
                        $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);
                        }
                        Bitte den Code mal so laufen lassen. Wenn wieder Schaltzeiten verschluckt werden, sollte aus dem Pluginlog ersichtlich sein wesshalb.
                        Gruss Patrik alias swiss

                        Kommentar


                          #57
                          Erstmal Danke!
                          Folgendes steht jetzt sofort im Logfile:
                          Code:
                          2012-09-07 14:26:39.631,Zeitschaltuhr,,0s,syntax error at (eval 54770) line 102, near "':' $element" syntax error at (eval 54770) line 123, near "}else" Global symbol "$element" requires explicit package name at (eval 54770) line 124. Global symbol "$element" requires explicit package name at (eval 54770) line 124. Can't use global @_ in "my" at (eval 54770) line 130, near "= @_" syntax error at (eval 54770) line 169, near ";  }" Can't use global @_ in "my" at (eval 54770) line 172, near "= @_" syntax error at (eval 54770) line 191, near ";  }"

                          Kommentar


                            #58
                            Oo. War ein dummer Tippfehler. Ist oben korrigiert Bitte nochmal testen. Das Plugin sollte aber so nicht all zu lange laufen gelassen werden da es sehr viele Debugzeilen generiert!

                            Ausführungsintervall = 20sek = 3mal pro Minute
                            Anzahl aktiver Schaltpunkte = 8
                            Anzahl Einträge pro Schaltpunkt = 4

                            3 x 60min x 24h x 8 x 4 = 138'240 Einträge pro Tag!!

                            Also wirklich nicht mehr als 1-2 Tage so bereiben da erstens nicht gut für den Speicher (Anzahl Schreibzyklen) und zweitens füllt es dir so die HD.

                            Aber mir fällt sonst auch keine bessere Lösung ein wie man sonst den fehlenden Schaltzeiten auf den Grund gehen könnte
                            Gruss Patrik alias swiss

                            Kommentar


                              #59
                              Ich habs jetzt mal reinkopiert.
                              Folgendes steht im logfile.
                              Code:
                              2012-09-08 08:50:27.502,Zeitschaltuhr,------
                              2012-09-08 08:50:27.505,Zeitschaltuhr,Schaltzeit: Licht_Haustuer_WE_OFF überspringen da bereits auf 0 
                              2012-09-08 08:50:27.505,Zeitschaltuhr,------ 
                              2012-09-08 08:50:27.508,Zeitschaltuhr,Schaltzeit: Licht_Traufe_ON verarbeiten... 
                              2012-09-08 08:50:27.508,Zeitschaltuhr,Schaltzeit: Licht_Traufe_ON reagiert auf Astrozeit 
                              2012-09-08 08:50:27.509,Zeitschaltuhr,Schaltzeit: Licht_Traufe_ON neue Schaltzeit: 19:50 
                              2012-09-08 08:50:27.509,Zeitschaltuhr,------ 
                              2012-09-08 08:50:27.512,Zeitschaltuhr,Schaltzeit: Licht_Traufe_OFF überspringen da bereits auf 0
                              2012-09-08 08:50:27.512,Zeitschaltuhr,------ 2012-09-08 08:50:27.515,Zeitschaltuhr,Schaltzeit: Licht_Traufe_OFF überspringen da bereits auf 0 
                              2012-09-08 08:50:48.475,Zeitschaltuhr,------ 
                              2012-09-08 08:50:48.478,Zeitschaltuhr,Schaltzeit: Rolladen_runter verarbeiten... 
                              2012-09-08 08:50:48.478,Zeitschaltuhr,Schaltzeit: Rolladen_runter reagiert auf Astrozeit 
                              2012-09-08 08:50:48.478,Zeitschaltuhr,Schaltzeit: Rolladen_runter neue Schaltzeit: 19:50 
                              2012-09-08 08:50:48.479,Zeitschaltuhr,------ 
                              2012-09-08 08:50:48.482,Zeitschaltuhr,Schaltzeit: Licht_Einfahrt_WE_ON verarbeiten... 
                              2012-09-08 08:50:48.482,Zeitschaltuhr,------ 
                              2012-09-08 08:50:48.485,Zeitschaltuhr,Schaltzeit: Licht_Einfahrt_WE_OFF überspringen da bereits auf 0 
                              2012-09-08 08:50:48.485,Zeitschaltuhr,------ 
                              2012-09-08 08:50:48.488,Zeitschaltuhr,Schaltzeit: Licht_Haustuer_WE_ON verarbeiten... 
                              2012-09-08 08:50:48.488,Zeitschaltuhr,------ 
                              2012-09-08 08:50:48.491,Zeitschaltuhr,Schaltzeit: Licht_Haustuer_WE_OFF überspringen da bereits auf 0 
                              2012-09-08 08:50:48.491,Zeitschaltuhr,------
                              Ich versuche mal, heute Abend zu Sonnenuntergang die Einträge zu lokalisieren.

                              Kommentar


                                #60
                                Sehr gut. Dann scheint es zu mindest mal zu funktionieren. Mal sehen was das Plugin heute um 19:50 macht
                                Gruss Patrik alias swiss

                                Kommentar

                                Lädt...
                                X