Ankündigung

Einklappen
Keine Ankündigung bisher.

Sonnenaufgang und -untergang, Userlog

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Sonnenaufgang und -untergang, Userlog

    Hallo,

    anbei mein Versuch, eine Steuerung mit den Sonnenaufgangs- und Sonnenuntergangszeiten als Wiregate-Plugin umzusetzen.

    Code:
     
       use Math::Trig;
      $plugin_info{$plugname.'_cycle'} = 300;
       
      # Diese Daten müssen eingepflegt werden; Längengrad und Breitengrad, sowie die Zeitzone
      # (localtime)[8] gibt an, ob gerade Sommerzeit ist und addiert entsprechend +1 dazu
      # *************************************************************************************
      my $lat = 49.9;
      my $lon = 10.9;
      my $timezone = (localtime)[8];
      # *************************************************************************************
      my $h = -0.0145; 
      my $RAD = pi/180.0;
      my $B = $lat * $RAD;
      my $DOY = ((localtime)[7]+1);  # DOY = Day Of Year
      my $timecalc = -0.171 * sin(0.0337 * $DOY + 0.465) - 0.1299 * sin(0.01787 * $DOY - 0.168);
      my $declination = 0.4095 * sin(0.016906 * ($DOY - 80.086));
      my $tmp = (sin($h) - (sin($B) * sin($declination))) / (cos($B) * cos($declination));
      my $timediff = 12* acos($tmp)/pi;
      my $timenow = ((localtime)[2] + (localtime)[1]/60);
       
      # Prüft, ob aktuelle Zeit > Sonnenaufgangszeit ist und < Sonnenuntergangszeit
      if ($plugin_info{$plugname."_status"}!=1 and $timenow > sunrise() and $timenow < sunset() ) {
         userlog ("Jetzt ist es Sonnenaufgang");
         $plugin_info{$plugname."_status"} = 1;
      }
      # Prüft, ob aktuelle Zeit > Sonnenuntergangszeit ist 
      if ($plugin_info{$plugname."_status"}!=0 and $timenow > sunset() ) {
         userlog ("Jetzt ist es Sonnenuntergang");
         $plugin_info{$plugname."_status"} = 0;
      }
       
      userlog ($plugname."-Plugin erfolgreich ausgeführt");
       
      sub sunrise{
            my $sunrise = 12 - $timediff - $timecalc + (15-$lon)*4/60 + $timezone;
            return $sunrise;
      }     
       
      sub sunset{
            my $sunset = 12 + $timediff - $timecalc + (15-$lon)*4/60 + $timezone;
            return $sunset;
      }
       
      sub userlog {
       open(LOG, ">>/var/log/wg_userlog_".$plugname.".log") || die "Kann Logdatei nicht öffnen!";
       printf LOG "%04d-%02d-%02d %02d:%02d:%02d  ",((localtime)[5] +1900),((localtime)[4] +1),(localtime)[3],(localtime)[2],(localtime)[1],(localtime)[0];
       print LOG @_[0]."\n";
       close LOG;
      }
      [FONT=&quot]return;[/FONT]
    Die Formeln zur Berechnung der Zeiten habe ich von hier übernommen:
    Formel für Sonnenaufgang, Sonnenuntergang und die Zeitgleichung

    Ich hoffe, der Code ist halbwegs verständlich (ist mein erster "Perl"-Versuch), bin aber gerne für Verbesserungen (und Erweiterungen) offen.

    Die letzte Funktion "Userlog" war für mich sehr hilfreich, da ich hier alle Variablen etc. ausgeben lassen konnte, ohne den Überblick im normalen Log-File zu verlieren. Die Log-Datei kann genau wie die plugin-Logdatei über den Browser aufgerufen werden (Dateiname ist hier
    /var/log/wg_userlog_".$plugname.".log )

    Viele Grüße
    Christian
    Angehängte Dateien
    Viele Grüße
    Christian

    #2
    Danke! (Auch wenn ich's noch nicht ausprobiert habe...)

    So etwas wollte ich mir auch schon schreiben, hatte dann aber verzichtet, da ich erst mal hätte klären wollen, wie ich am besten neue Perl-Pakete (CPAN) mit einbinde, wie z.B. das hier sehr passende Astro::Sunrise
    TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

    Kommentar


      #3
      Gleichfalls Danke,

      dann wage ich mich doch mal an die testweise Rollladensteuerung
      my $lat = 49.9; (Ist übrigens Bamberg Hbf)
      my $lon = 10.9;

      kann man übrigens sehr einfach per google maps rausbekommen. Oben rechts auf Link klicken. Is da &ll=...

      Kann man das ( my $timezone = (localtime)[8];\) nicht umgehen? der NTP setzt ja die Zeit auf der wiregate immer korrekt.

      Lbau

      PS:
      2010-04-21 19:22:26 Jetzt ist es Sonnenaufgang
      2010-04-21 19:22:26 Sonnenstand-Plugin erfolgreich ausgeführt
      2010-04-21 19:22:54 Sonnenstand-Plugin erfolgreich ausgeführt
      ???? soll das so sein? Ist eher gleich Sonnenuntergang :-)
      funktioniert ansonsten aber:
      2010-04-21 20:33:04 Sonnenstand-Plugin erfolgreich ausgeführt
      2010-04-21 20:38:05 Jetzt ist es Sonnenuntergang
      2010-04-21 20:38:05 Sonnenstand-Plugin erfolgreich ausgeführt

      Kommentar


        #4
        Zitat von lbau Beitrag anzeigen
        Kann man das ( my $timezone = (localtime)[8];\) nicht umgehen? der NTP setzt ja die Zeit auf der wiregate immer korrekt.
        Wiregate hat die korrekte Uhrzeit, aber in der Berechnung muss soweit ich das richtig verstanden habe mit angegeben werden, ob Sommerzeit oder Winterzeit ist. Deshalb bei Sommerzeit +1h.

        Zitat von lbau Beitrag anzeigen

        2010-04-21 19:22:26 Jetzt ist es Sonnenaufgang
        2010-04-21 19:22:26 Sonnenstand-Plugin erfolgreich ausgeführt
        2010-04-21 19:22:54 Sonnenstand-Plugin erfolgreich ausgeführt
        ???? soll das so sein? Ist eher gleich Sonnenuntergang :-)
        funktioniert ansonsten aber:
        2010-04-21 20:33:04 Sonnenstand-Plugin erfolgreich ausgeführt
        2010-04-21 20:38:05 Jetzt ist es Sonnenuntergang
        2010-04-21 20:38:05 Sonnenstand-Plugin erfolgreich ausgeführt
        Sonnenaufgan um 19:22 Uhr dürfte nur beim allerersten Ausführen passieren, da er hier in die Sonnenaufgangsfunktion reingeht, da der Wert $plugin_info{$plugname."_status"} noch leer und somit !=1 ist.


        Viele Grüße
        Christian
        Viele Grüße
        Christian

        Kommentar


          #5
          Sonnenaufgan um 19:22 Uhr dürfte nur beim allerersten Ausführen passieren, da er hier in die Sonnenaufgangsfunktion reingeht, da der Wert $plugin_info{$plugname."_status"} noch leer und somit !=1 ist.
          Dann vielleicht besser initialisieren. Sonst gehen beim Neustart vom Wiregate erst mal all Rollläden hoch :-)

          Ich versuche das mal zu ändern?

          Mein Perl ist aber auch nicht viel besser.

          Code:
            Rudimentäre Rolladensteuerung
          ...
           # Prüft, ob aktuelle Zeit > Sonnenaufgangszeit ist und < Sonnenuntergangszeit
            if ($plugin_info{$plugname."_status"}!=1 and $timenow > sunrise() and $timenow < sunset() ) {
               userlog ("Jetzt ist es Sonnenaufgang");
               $plugin_info{$plugname."_status"} = 1;
               knx_write( "4/1/0", 0 );
               
            }
            # Prüft, ob aktuelle Zeit > Sonnenuntergangszeit ist 
            if ($plugin_info{$plugname."_status"}!=0 and $timenow > sunset() ) {
               userlog ("Jetzt ist es Sonnenuntergang");
               $plugin_info{$plugname."_status"} = 0;
               knx_write( "4/1/0", 1 );
            }
          ...
          Lbau

          Kommentar


            #6
            Klasse!
            Das mit localtime sollte auf den ersten Blick schon so passen..

            @lbau das wird nur beim ersten Aufruf des Plugins passieren, $plugin_info bleibt ja über Neustarts etc. erhalten..

            Solche Sachen wie Userlog kann man dann bei Bedarf auch direkt in den Daemon packen, aber man kann übrigens auch mit INFO("XXX"); (oder WARNING oder..) ins deamon(syslog) schreiben.
            Das mit dem Userlog hat einen kleinen Nachteil: die Logfiles werden nicht automatisch rotiert, liegen also bis zum St.Nimmerleinstag oder bis der Flash voll ist da..
            Aber was spricht gegens Plugin-Log, dort kann man ja filtern; das wird nach Aufruf des Plugins auch nur kurz auf&zugemacht (ich mach dafür glaub ich mal ne sep. function..)

            BTW: "use XXX" kann man bei sinnvollem Bedarf auch "oben" reinnehmen, weil im Plugin (eval) kostet sowas mal richtig.. Mit Autoload sollte das auch erst im Speicher landen wenn ein Plugin es verwendet.
            Und wenns sinnvolle CPAN-Module gibt, für die es nicht eh ein Debian-Paket gibt, sowas ist normalerweise in wenigen Minuten gepackaged..

            Makki

            P.S.: Sowas dann mittelfristig am besten ins Code-Schnipsel-Forum, denn dort kann der Autor den ersten Post selbst pflegen..
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              OK.

              Wäre es mit den Codeschnipseln nicht übersichtlicher, wenn es da eigene Foren gäbe?

              Z.B. unter Support/WireGate eins?

              :-) Dann habe ich gerade diesen Feriencode gesehen für ?? EIBPc oder so. Könnte wir sowas nicht auch aufs Wiregate packen?

              Wenn ich es richtig gedeutet habe, kann man den Plugin Status ja auch von anderen Plugins auswerten? Dann könnte man diese Variable ja global setzen und dann in anderen Plugins benutzen um z.B. die Rollläden unten zu lassen?

              Lbau

              Kommentar


                #8
                @Makki:
                ich muss gestehen, das mit dem Userlog war eine Notlösung, da ich es nicht hinbekommen habe, in das normale Log zu schreiben (außer über den "Return" Wert).

                Das Userlog ist vielleicht dann in erster Linie als "Entwicklungshilfe" einsetzbar, und im Produktivbetrieb kann man ja dann ins normale Log schreiben lassen.


                Viele Grüße
                Christian
                Viele Grüße
                Christian

                Kommentar


                  #9
                  Zitat von christian523 Beitrag anzeigen
                  ich muss gestehen, das mit dem Userlog war eine Notlösung, da ich es nicht hinbekommen habe, in das normale Log zu schreiben (außer über den "Return" Wert).
                  Evtl. gibt's dafür einen offiziellen Weg, gelöst habe ich das bei mir aber ganz einfach:

                  Oben im Plugin habe ich ein
                  Code:
                  my $ret_val = '';
                  Dort wo's mir gefällt hänge ich einfach weitere Strings an und am Schluss gibt's halt ein
                  Code:
                  return $ret_val;
                  TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                  Kommentar


                    #10
                    Plugin-Log

                    Soeben ins SVN, ab dem nächsten (Patchlevel 20) kann man mit:

                    Code:
                    plugin_log($plugname,"Logeintrag");
                    auch so sep. Einträge ins Plugin-Log schreiben..
                    Dann kann man sich aussuchen ob man dies zu einem Eintrag beim "return" zusammenfassen will oder separate Zeilen (z.B. zum Filtern)

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

                    Kommentar


                      #11
                      Zitat von lbau Beitrag anzeigen
                      Wäre es mit den Codeschnipseln nicht übersichtlicher, wenn es da eigene Foren gäbe?
                      Ich denke solange es so übersichtlich ist reicht das so völlig; man kann sich ja auch anderes abgucken..

                      Dann habe ich gerade diesen Feriencode gesehen
                      Machen kann man vieles (das meiste wenigstens)

                      Wenn ich es richtig gedeutet habe, kann man den Plugin Status ja auch von anderen Plugins auswerten?
                      Ja, solange man "weiss" wie das Plugin heisst kann man auf alle Werte beliebig zugreifen. Ein grosses Masterkonzept steckt da nicht dahinter, $plugin_info ist ein simpler Hash der in einem DBD-file gespeichert und geladen wird..
                      Einzige Prämisse: Variablen müssen mit plugname_ beginnen und plugname muss existieren, damit ein "Aufräumdienst" altes Zeug daraus entfernen kann.

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

                      Kommentar


                        #12
                        OK, hier mal ein Update:
                        Code:
                         use Math::Trig;
                          $plugin_info{$plugname.'_cycle'} = 300;
                           
                          # Diese Daten müssen eingepflegt werden; Längengrad und Breitengrad, sowie die Zeitzone
                          # (localtime)[8] gibt an, ob gerade Sommerzeit ist und addiert entsprechend +1 dazu
                          # *************************************************************************************
                          my $lat = 50;
                          my $lon = 7;
                          my $timezone = (localtime)[8];
                          # *************************************************************************************
                          my $h = -0.0145; 
                          my $RAD = pi/180.0;
                          my $B = $lat * $RAD;
                          my $DOY = ((localtime)[7]+1);  # DOY = Day Of Year
                          my $timecalc = -0.171 * sin(0.0337 * $DOY + 0.465) - 0.1299 * sin(0.01787 * $DOY - 0.168);
                          my $declination = 0.4095 * sin(0.016906 * ($DOY - 80.086));
                          my $tmp = (sin($h) - (sin($B) * sin($declination))) / (cos($B) * cos($declination));
                          my $timediff = 12* acos($tmp)/pi;
                          my $timenow = ((localtime)[2] + (localtime)[1]/60);
                           
                          # Prüft, ob aktuelle Zeit > Sonnenaufgangszeit ist und < Sonnenuntergangszeit
                          if ($plugin_info{$plugname."_status"}!=1 and $timenow > sunrise() and $timenow < sunset() ) {
                             $plugin_info{$plugname."_status"} = 1;
                             knx_write( "4/1/2", 0 );      # Küche Fenster hoch
                        
                          }
                          # Prüft, ob aktuelle Zeit > Sonnenuntergangszeit ist 
                          if ($plugin_info{$plugname."_status"}!=0 and $timenow > sunset() ) {
                             $plugin_info{$plugname."_status"} = 0;
                             knx_write( "0/1/2", 1 );       # Zentral runter
                        
                          }
                        
                          return  $plugin_info{$plugname."_status"}; 
                           
                          sub sunrise{
                                my $sunrise = 12 - $timediff - $timecalc + (15-$lon)*4/60 + $timezone;
                                return $sunrise;
                          }     
                           
                          sub sunset{
                                my $sunset = 12 + $timediff - $timecalc + (15-$lon)*4/60 + $timezone;
                                return $sunset;
                          }
                           
                          return;
                        Läuft nicht mehr??? Irgendwie sind da zu viele Returns drin?


                        Hier noch eine Frage: Rollladen erst mal leicht öffnen zum Wecken der Kinder

                        Es scheint, als ob ich wohl Positionen anfahren kann. Siehe Bild.

                        Jetzt muss ich nur noch rausbekommen, wie man das nachprogrammiert.
                        Angehängte Dateien

                        Kommentar


                          #13
                          @lbau: Neue GA mit Obj. 66 des Aktors verbinden und
                          Code:
                          knx_write("x/y/z",90,5); # Rolladenpos 90% als DPT5 auf den Bus schreiben
                          (wie immer: falls die GA's richtig importiert wurden, kann man sich das 5 für den DPT auch sparen)

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

                          Kommentar


                            #14
                            wie würde das denn aussehen, wenn ich zum Testen groupwrite nehme?

                            Code:
                            groupwrite local:/tmp/eib 4/3/7 90
                            habe ich schon versucht, aber es scheint nur manchmal zu klappen

                            Typ ist im Moment auf 1 Byte 5.001 percentage.

                            Kommentar


                              #15
                              Irgendwie verstehe ich die Frage nicht ganz, aber groupwrite mit Wert "90" bedeutet 0x90 in Hex, Dezimal=144/255, also 56%
                              Mit knx_write in Plugins gibt man dagegen natürlich die dezimalen (in dem Fall Prozentwerte) an.. DPT5 dürfte schon stimmen..

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

                              Kommentar

                              Lädt...
                              X