Ankündigung

Einklappen
Keine Ankündigung bisher.

Sonnenauf- und untergang des heutigen Tages berechnen

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

    Sonnenauf- und untergang des heutigen Tages berechnen

    Hi!

    Ich verwende den (nautischen) Sonnenauf- und untergang um die zeitlichen Grenzen für die Freigabe der helligkeitsgesteuerten Aussenbeleuchtung fest zu legen:

    logic.conf
    Code:
    [aussenbeleuchtung]
        filename = 'aussenbeleuchtung.py'
        # Aufruf mit init automatisch aufgrund Abfrage von Schwellwert-Item
        crontab = sunrise-12 | sunset-12
        watch_item = Wetterstation.Daemmerung.Schwellwert_unterschritten
    aussenbeleuchtung.py (KISS!)
    Code:
    #!/usr/bin/env python
    
    now = sh.utcnow()
    sunrise = sh.sun.rise(-12)
    sunset = sh.sun.set(-12)
    
    if (now > sunrise) and (now < sunset) and sh.Wetterstation.Daemmerung.Schwellwert_unterschritten():
        sh.Aussenbeleuchtung(1, 'Aussenbeleuchtungsautomatik')
    else:
        sh.Aussenbeleuchtung(0, 'Aussenbeleuchtungsautomatik')
    Problem: "sh.sun.rise()" liefert immer den Aufgang des nächsten Tages zurück, womit die Bedingung nie wahr wird. Gleiches würde dann passieren, wenn das erledigt wäre: Dann würde sh.sun.set() immer den nächsten Untergang liefern, und die Bedingung wäre immer wahr.

    Irgendwie finde ich es undurchsichtig, den nächsten Wert zurückzuliefern. Spontan würde ich sagen: da muss man ein "date-object" beipacken können, damit man das steuern kann. Geht das?

    Grüße
    Robert

    #2
    Sorry,

    ich hab einfach mal im Code gestöbert:

    Es geht direkt wohl nicht. Evtl. könnte das lib/orb.py um ein optionales Datetime erweitert werden, damit man das steuern kann.

    Ansonsten (böser? Hack auf privates Item):
    Code:
    sh.sun._obs.date = datetime.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
    sh.sun._obs.horizon = '-12'
    sunrise = sh.sun._obs.next_rising(sh.sun._orb, use_center=True).datetime().replace(tzinfo=tzutc())
    sunset = sh.sun._obs.next_setting(sh.sun._orb, use_center=True).datetime().replace(tzinfo=tzutc())
    Scheint es zu tun.

    Grüße
    Robert

    Kommentar


      #3
      Hi Robert,

      rise und set liefern das nächste Event. Ob das jetzt heute oder morgen ist, hängt von der Uhrzeit und der Methode ab.
      In einer Logik die von sunrise getriggert wird, liefert sie natürlich immer den Sonnenaufgang vom nächsten Tag.


      Ich würde es so realisieren:
      Code:
      # item.conf
      [tag]
        type = bool
        crontab = sunrise-12 = True | sunset-12 = False
      Code:
      # logic.conf
      [aussenbeleuchtung]
        filename = 'aussenbeleuchtung.py'
        watch_item = tag, Wetterstation.Daemmerung.Schwellwert_unterschritten
      Code:
      # aussenbeleuchtung.py
      if sh.Wetterstation.Daemmerung.Schwellwert_unterschritten() and sh.tag():
          sh.Aussenbeleuchtung(1, 'Aussenbeleuchtungsautomatik')
      else:
          sh.Aussenbeleuchtung(0, 'Aussenbeleuchtungsautomatik')
      Davon abgesehen, kann man rise und set (im develop branch) auch einen Offset (von now) in Minuten angeben. Damit könnten man auch den Sonnenaufgang von heute berechnen.

      hth

      Marcus

      Kommentar


        #4
        Eigentlich braucht man hierfür keine richtigen Logiken

        Code:
        # item.conf
        [tag]
          type = bool
          crontab = sunrise-12 = True | sunset-12 = False
        
        [Aussenbeleuchtung]
          type = bool
          eval = sh.tag() and  sh.Wetterstation.Daemmerung.Schwellwert_unterschritten()
          eval_trigger = tag, Wetterstation.Daemmerung.Schwellwert_unterschritten

        Kommentar


          #5
          Oder noch einfacher...

          Code:
          # item.conf
          [tag]
            type = bool
            crontab = sunrise-12 = True | sunset-12 = False
          
          [Aussenbeleuchtung]
            type = bool
            eval = and
            eval_trigger = tag, Wetterstation.Daemmerung.Schwellwert_unterschritten
          so macht das doch Spaß!

          Kommentar


            #6
            ähm, kleiner Denkfehler


            Code:
            # item.conf
            [nacht]
              type = bool
              crontab = sunrise-12 = False | sunset-12 = True
            
            [Aussenbeleuchtung]
              type = bool
              eval = and
              eval_trigger = nacht, Wetterstation.Daemmerung.Schwellwert_unterschritten

            Kommentar


              #7
              Hi Marcus!

              Vielen Dank für die Antwort.

              Deine erste Lösung hatte ich auch überlegt (allerdings einfach mit Cachen des Zustands in der Logik), allerdings entsteht dann die Problematik bei einem Neustart von sh.py. Sicher lösbar, allerdings war mir dass dann zu "um die Ecke".

              Dein zweiter Hinweis ist richtig. Ich hatte irgendwie nur die Addition des Zeitdeltas vor dem "return" wahrgenommen, nicht die vorherige Subtraktion. Ergo moff = 24*60 und wir haben den vorherigen Tag... Irgendwie traue ich dem aber nicht, und würde dann eher die Minuten seit letzter Mitternacht abziehen. Da kriege ich aber kein korrektes Ergebnis...

              /edit: Sehe gerade du hast derweil geschrieben: Ja, wie gesagt, sicher schick - aber da kommt du bei einem Neustart nicht mit hin! Da kann das Licht aus (wenn ich nach Sonnenuntergang starte) bzw. dümmer noch, an bleiben...

              Grüße
              Robert

              Kommentar


                #8
                Hallo Robert,

                mit dem Neustart und der evtl. Änderung dazwischen hast Du natürlich Recht.

                Ein eval für Nacht wäre z.B.

                Code:
                eval = sh.sun.rise(-18).day == sh.sun.set(-18).day
                Oder in eine Logik auslagern die bei init und sunset/rise getriggert wird:

                Code:
                sh.nacht(sh.sun.rise(-18).day == sh.sun.set(-18).day)
                Bis bald

                Marcus

                Kommentar


                  #9
                  Hallo,

                  ich habe sun.rise/set gerade um die Angabe einer absoluten Zeit erweitert.

                  Im praktischen Einsatz:

                  Code:
                  # datum ist ein datetime.date Objekt
                  # area ist ein Item mit den subitems Sonnenaufgang und Sonnenuntergang
                  
                  dt = datetime.datetime.combine(datum, datetime.time()).replace(tzinfo=sh.tzinfo())
                  area.sonnenaufgang(sh.sun.rise(dt=dt).astimezone(sh.tzinfo()).strftime("%H:%M"))
                  area.sonnenuntergang(sh.sun.set(dt=dt).astimezone(sh.tzinfo()).strftime("%H:%M"))
                  hth

                  Marcus

                  Kommentar


                    #10
                    Hallo zusammen,

                    ich bin (noch) passiver Forumsteilnehmer da ich mich noch am "reinkämpfen" in smarthome.py und smartvisu bin.
                    Ich habe den gleichen Anwendungsfall wie Robert (Freigabe der helligkeitsgesteuerten Beleuchtung) und bin über das selbe Problem gestolpert.

                    Da mich im Endeffekt die genaue Sonnenauf- und Untergangszeit nicht interessiert, sondern lediglich die Tatsache, ob die Sonne heute schon auf- oder untegegangen ist, habe ich das so gelöst

                    Code:
                    time = sh.now()
                    timeSunRise = sh.sun.rise(4)
                    timeSunSet = sh.sun.set(4)
                    
                    [COLOR=Green]#Überprüfen ob Sonne schon auf- aber nicht untergegangen ist -> Tag[/COLOR]
                    if timeSunRise.date() > time.date() and timeSunSet.date() == time.date(): 
                    ...
                    else:[COLOR=Green] [COLOR=SeaGreen]#Nacht[/COLOR][/COLOR]
                    ...
                    Gruß,

                    Daniel

                    Kommentar


                      #11
                      Hallo Daniel,

                      willkommen im Club.

                      Ab 1.0 gibt es auch die beiden Items:

                      env.location.day
                      env.location.night

                      Die werden, wenn der Ort passt, korrekt gesetzt.

                      Allerdings mit -6 als Parameter:

                      Code:
                      # setting day and night
                          day = sh.sun.rise(-6).day != sh.sun.set(-6).day
                          sh.env.location.day(day)
                          sh.env.location.night(not day)
                      Bis bald

                      Marcus

                      Kommentar

                      Lädt...
                      X