Ankündigung

Einklappen
Keine Ankündigung bisher.

emx_uhr.pl: Sonnenauf/untergangs-abhängige Schltungen

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

    [wiregate] emx_uhr.pl: Sonnenauf/untergangs-abhängige Schltungen

    Wie im Parallelthread angekündigt, hab ich mal zusammengestellt, wie ich Schaltungen, die sich am Sonnenaufgang bzw. Sonnenuntergang orientieren, durchführe. Damit es im anderen Thread nicht durcheinander geht, habe ich ein eigenes Thema dazu aufgemacht.

    Es sind keine zusätzlichen Perl astro- oder ähnliche Pakete nötig.

    Für die Zusatzfunktionen muss nicht das Plugin geändert werden, es kann vollständig über die .conf Datei erledigt werden. Die Funktionen setzen dabei auf das emx_sonne.pl Plugin auf, welches einmal täglich die Sonnenauf- und untergangszeiten berechnet (und zwar auch beim Wechseln Sommer/Winter/Sommerzeit korrekt ;-) ).

    Hier das Beispiel. Adressen und Werte sind gegenüber meiner privaten Version natürlich geändert, da könnte es eventuell also auch noch den ein oder anderen Tippfehler geben. Funktional läuft das bei mir seit Winter letzten Jahres aber absolut reibungslos.

    Ich habe alles so gut ich kann im Code dokumentiert:

    Code:
    # Konfigurationsbeispiel für Sonenabhaengige Schaltungen
    #
    # License: GPL (v2)
    # $Id: emx_uhr.conf.sample2 $
    # Copyright: Edgar (emax) Hermanns, forum at hermanns punkt net
    #----------------------------------------------------------------------
    # extra Funktionen
    # 
    # Die Funktionen erlauben die Rueckgabe von Werten relativ zum Sonnenauf- 
    # bzw. -untergang. 
    #
    # ACHTUNG:   Das funktioniert nur, wenn dass 'emx_sonne.pl' Plugin aktiv 
    #            ist, welches ein mal taeglich den Sonnenaufgang und den 
    #            Sonnenuntergang berechnet und in %plugin_info abspeichert.
    #
    # Funktionen:
    #
    # sonnUntHH: gibt die Stunde des Sonnenuntergangs plus $1 zurueck.
    #            Moechte z.B. man die Stunde um 1:45 _vor_ Sonnenuntergang 
    #            erhalten, ruft man 'sonnUntHH(-1.75)' auf.
    #            Die Funktion gibt nur die Stunde zurueck. 
    #            ACHTUNG: Es muss trotzdem die komplette Zeitangabe
    #                     inklusive Stundenbruchteil als Parameter angegeben 
    #                     werden.
    #
    #            Beispiel: Sonnenuntergang um 18:15 Uhr
    #                      Geplante Schaltzeit 1,5 Stunden vorher
    #
    #                      Aufruf:       sonnUntHH(-1.5);
    #                      Rueckgabewert: 16   (= 18:15 minus 1:30 = 16:45)
    #           
    #            Positive Werte ergeben natuerlich eine spaetere Schaltzeit:
    #        
    #                      Aufruf:       sonnUntHH(1.75)
    #                      Rueckgabewert: 20   (= 18:15 plus 1.75 = 20:00)
    #
    #            Die Dezimalwerte fuer die Stundenbruchteile muss man nicht 
    #            ausrechnen, das macht perl von selber. Wer zum Beispiel
    #            Eine Stunde und 13 Minuten vorher Schalten moechte,
    #            kann das so schreiben:
    # 
    #                     Aufruf:        sonnUntHH(-1.216667)
    #
    #            oder einfacher auch so:
    #
    #                     Aufruf:        sonnUntHH(-(1.0 + 13/60))
    #
    # sonnUntHH: gibt die Minute des Sonnenuntergangs plus $1 zurueck.
    #            Es gelten die gleichen Regeln wie oben.
    # 
    # sonnAufHH: dto. fuer Sonnenaufgangs-Stunde
    # sonnAufMM: dto. fuer Minute.
    #
    #----------------------------------------------------------------------
    
    sub sonnUntHH()
    {
        # Rueckgabe Sonnenuntergangs-Stunde + $1 Std
        # Die Angabe $1 muss die vollstaendig abzuziehende/addierende Zeit 
        # in HH.MM (als float) beinhalten, auch die Minuten!
        # Beipiel: Eindreiviertel Stunden = 1:45 = 1.75
        # Es wird nur die Stunde zurueckgegeben.
    
        my $offset = shift || return int($plugin_info{'emx_sonne.pl.unt'});
        $offset = int($offset * 1000);
        ($offset < 0) and $offset = 24000 + ($offset % 24000);
        return  int ((($plugin_info{'emx_sonne.pl.unt'} * 1000 + $offset) % 24000) / 1000);
    } # sonnUntHH
    
    sub sonnUntMM()
    {
        # Rueckgabe Sonnenuntergangs-Minute + $1 Offset
    
        my $offset = shift || return $plugin_info{'emx_sonne.pl.untMM'};
        $offset = int($offset * 1000);
        ($offset < 0) and $offset = 24000 + ($offset % 24000);
        return  int ((($plugin_info{'emx_sonne.pl.unt'} * 1000 + $offset) % 1000) * 60 / 1000 );
    } # sonnUntMM
    
    sub sonnAufHH()
    {
        # Rueckgabe Sonnenaufgangs-Stunde + $1 Std
        # Die Angabe $1 muss die vollstaendig abzuziehende/addierende Zeit 
        # in HH.MM (als float) beinhalten
        # Es wird nur die Stunde zurueckgegeben.
    
        my $offset = shift || return int($plugin_info{'emx_sonne.pl.auf'});
        $offset = int($offset * 1000);
        ($offset < 0) and $offset = 24000 + ($offset % 24000);
        return  int ((($plugin_info{'emx_sonne.pl.auf'} * 1000 + $offset) % 24000) / 1000);
    } # sonnUntHH
    
    
    sub sonnAufMM()
    {
        # Rueckgabe Sonnenaufgangs-Minute + $1 Offset
    
        my $offset = shift || return $plugin_info{'emx_sonne.pl.aufMM'};
        $offset = int($offset * 1000);
        ($offset < 0) and $offset = 24000 + ($offset % 24000);
        return  int ((($plugin_info{'emx_sonne.pl.auf'} * 1000 + $offset) % 1000) * 60 / 1000 );
    } # sonnAufMM
    
    #-----------------------------------------------------------------------------
    # Einstellungen (Beipiele)
    #-----------------------------------------------------------------------------
    
    $LokaleZeitZone = "CET";          # lokale Zeitzone
    $LokaleSommerZeitZone="CEST";     # lokale Zeitzone im Sommer
    
    @Zeiten = 
        (
         # Werkstatt Ventilator an, taeglich, 1 std. vor sonnenaufgang
         { Name=>'WS_Ventilator', Aktiv=>'1', Std=>&sonnAufHH(-1.0), Min=>&sonnAufMM(-1.0), 
           MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'1', DPT=>'1', GA=>'1/2/34', Log=>'1' }, 
         
         # Werkstatt Ventilator aus, taeglich, 11 minuten spaeter als 1 std. vor sonnenaufgang
         { Name=>'WS_Ventilator', Aktiv=>'1', Std=>&sonnAufHH(-1.0 + 11/60), Min=>&sonnAufMM(-1.0 + 11/60), 
           MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'0', DPT=>'1', GA=>'1/2/34', Log=>'1' }, 
    
         # Rollaeden runter fahren, Kueche 13 Minuten nach Sonneuntergang, Terrasse 14 Minuten nach Sonnenuntergang
         { Name=>'EG_RollKuecheAb',       Aktiv=>'1', Std=>&sonnUntHH(13/60), Min=>&sonnUntMM(13/60), Wert=>'1', DPT=>'1', GA=>'4/5/67', Log=>'1' }, 
         { Name=>'EG_RollTerrasseAuf',    Aktiv=>'1', Std=>&sonnUntHH(14/60), Min=>&sonnUntMM(14/60), Wert=>'1', DPT=>'1', GA=>'4/5/67', Log=>'1' }, 
        );
    
    #-----------------------------------------------------------------------------
    # $slotEnd definiert die Sekunde, ab der neu synchronisiert wird   
    # ACHTUNG: Sollte nicht kleiner als 1 Sekunde sein.
    #-----------------------------------------------------------------------------
    $slotEnd = 3; 
    
    #-----------------------------------------------------------------------------
    # ENDE Einstellungen
    #-----------------------------------------------------------------------------
    
    1;
    
    # emacs setting
    # ;;; Local Variables: ***
    # ;;; mode:perl ***
    # ;;; End: ***
    Wenn sich über längere Zeit bei Euch keinen Fehlfunktionen zeigen, werde ich das als ...conf.sample2 ins svn stellen.
    Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

    #2
    Noch eine Anmerkung:

    Man könnte darüber nachdenken, diese Funktionen ins eigentliche Plugin zu übernehmen. Das würde aber bedeuten, dass man dann auch das emx_sonne.pl Plugin verwenden müsste, was jedoch meiner Auffassung von Modularität widerspricht.

    Ich muss da noch mal ein bischen drüber grübeln.
    Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

    Kommentar


      #3
      Hallo,

      erstmal Danke für das Veröffentlichen des Plugins!

      Aber ich bin etwas verwirrt: Das Schaltuhr-Plugin kann doch auch abhängig von Sonnenauf und -untergang schalten?!

      Gruß,
      Hendrik

      Kommentar


        #4
        Das ist der Grund für ein eigenes Thema. Es gibt zwei solche Plugins: emx_uhr.pl und das von swiss. Im anderen Thread werden beide behandelt. Damit das nicht durcheinander geht, hab ich nun ein neues Thema aufgemacht.

        Dieser Thread hier bezieht sich auf emx_uhr.pl.
        Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

        Kommentar


          #5
          Hallo,

          sind die Funktionalitäten der beiden Plugins denn sonst vergleichbar?

          Gruß,
          Hendrik

          Kommentar


            #6
            Ich kann zum anderen Plugin nichts sagen, weil ich es nicht verwende.

            Zu diesem hier kann ich aber folgendes sagen:
            • es kann nach Jahr, Monat, Tag des Monats, Wochentag, Stunde, und Minute schalten
            • es versteht Zeitzonen
            • es verarbeitet Sommer- und Winterzeit korrekt
            • es kann mit dem hier vorgestellten Zusatz auch Sonnenauf/untergangsabhägig reagieren
            • dabei kann relativ zum Sonnenauf/untergang eine positive oder negative Zeit angegeben werden (voher/nachher)
            • Einträge in der Schalttabelle können inaktiv gesetzt werden, mann muss sie dafür nicht löschen. So kann man sie später ggf. wieder reaktivieren
            • es kann angegeben werden, ob ein Schaltvorgang geloggt werden soll oder nicht
            • es können beliebige Zusatzfunktionen in die Konfigurationsdatei eingetragen werden, ohne das Plugin selber ändern zu müssen
            • es kommt mit den perl standard-Paketen des Wiregate aus
            • es synchronisiert sich permanent selber, um Zeitdrifts auszugleichen die eine Schaltung 'veschlampen' könnten
            • Plugin und Konfiguration (i.e.: Software und Benutzerdaten) sind vollkommen unabhängig voneinander
            • es hat keine mir bekannten Bugs


            Vielleicht kann das andere Plugin das auch oder auch mehr, das weiß ich nicht.
            Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

            Kommentar


              #7
              Hi,

              wieso werden denn hier separate Funktionen für die Stunden und Minuten verwendet? Und wieso muss man bei den Stunden den Minutenanteil mit angeben, wenn doch nur der Stundenanteil zurückgegeben wird?
              Irgendwie erschließt sich mir das noch nicht so ganz....
              CU,
              Mathias

              Kommentar


                #8
                Eine einfache Antwort wäre, es einmal ohne zu versuchen. :-)

                Aber die Antwort ist sogar noch einfacher:
                1. Getrennte Funktionen für Minuten und Stunden: Modularität. Da in der Tabelle die Einträge für Minuten und Stunden getrennt sind, ist auch eine getrennte Berechnung nötig. Denn was sollte man denn für eine Minutenberechnung für einen Wert zurückgeben, wenn nicht den Minutenwert?
                2. Wozu die komplette Offsetangabe obwohl nur die Stunde (im Beispiel unten 14 vs. 15) bzw. die Minute zurückgegeben wird: Wenn ich etwas eineinhalb Stunden vor 16:15 ausführen möchte, wie soll ich das denn ohne die Minuten ausrechnen?

                  16:15 Uhr minus 1 Stunde = 15:15 Uhr.
                  16:15 Uhr minus 1:30 = 14:45 Uhr.

                  Die halbe Stunde im Beipiel ist für die Berechnung der Stunde also unverzichtbar.



                Aber eigentlich ist das genau so im Code ausfürhrlich dokumentiert ....


                Trotzdem: An Vorschlägen für eine eingängigere Lösung wäre ich durchaus sehr interessiert. :-)
                Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                Kommentar


                  #9
                  Bei der Gelegenheit wüde mich mal interessieren, ob das überhaupt einer verwendet? Nur dann checke ich es nämlich auch ein. Wenn man so gar kein Feedback bekommt, kann das ja auch ein Zeichen dafür sein, dass es schlicht uninteressant ist.
                  Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                  Kommentar


                    #10
                    Hi,

                    ok, die cron-Geschichte leuchtet mir ein. Ich war gedanklich nicht bei wiederkehrenden Ereignissen, sondern einfach bei einem Ereignis abhängig von Sonnenauf/-untergang +/- Offset. Und dafür hätte meinem Verständnis nach ein einziger Offset gereicht.
                    Nächste Woche wird eingezogen, dann hab ich das WG dauerhaft im Zugriff
                    CU,
                    Mathias

                    Kommentar


                      #11
                      Hi emax,
                      ich habe "uhr" und "sonne" seit ca. zwei Woche laufen. Die Zeitschaltung verwende ich auch bereits erfolgreich. Die Ergebnisse der Auf- und Untergangszeiten scheinen auch zu passen, ich schalte danach aber aus Zeitmangel noch nichts...

                      Warum habe ich mich für die emax-Lösung entschieden und nicht die swiss-Lösung verwendet?
                      1. saubere Architektur: Modularisierung, separation on concerns
                      2. gute Dokumentation im Code
                      3. keine externen Abhängigkeiten
                      4. schaltuhr.pl im SVN hatte mehrere Tage syntaktische Fehler

                      Tolle Arbeit, emax!

                      Ciao, PP

                      Kommentar


                        #12
                        Vielen Dank,

                        so viel Lob macht verlegen. Freut mich, wenn es funktioniert und das tut was erwartet wird. :-)
                        Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                        Kommentar


                          #13
                          Hallo emax,

                          ich habe die emx_uhr vor und nach der Umstellung auf config Files problemlos am laufen!
                          Werde demnächst auch das Sonnenauf/untergangs-plugin integrieren.

                          Super plugin!!! Danke!

                          Kommentar


                            #14
                            Besten Dank :-)

                            Wenn es bei der Integration Sonnenauf/untergang Fragen gibt, einfach hier posten.
                            Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                            Kommentar


                              #15
                              Hallo emax,

                              hab das Sonnenauf/untergang Plugin nun am laufen. Die Sonnenauf/untergangs Zeiten werden auch korrekt berechnet.
                              Wenn ich diese aber in der emx_uhr verwenden will funktionier es nicht (Im Plugin log keinen Eintrag). Ich habe folgende beiden Zeilen zum Testen in der emx_uhr.conf eingetragen:

                              Code:
                              { Name=>'Licht_Flur', Aktiv=>'1', Std=>'sonnUntHH',   Min=> 'sonnUntMM',  MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'0', DPT=>'1', GA=>'5/0/2', Log=>'1' },
                              { Name=>'Licht_Flur', Aktiv=>'1', Std=>'sonnUntHH(0.5)',   Min=> 'sonnUntMM',  MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'0', DPT=>'1', GA=>'5/0/2', Log=>'1' },
                              Ist das so richtig?

                              PS: Kann ich auch den Namen 'Licht_Flur' mit ins log ausgeben?

                              Danke und Grüße,
                              Marc

                              Kommentar

                              Lädt...
                              X