Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - sh.sun.pos() in °

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

  • Onkelandy
    antwortet
    Hehe Danke für den Hinweis, werde ich zukünftig versuchen "richtig" zu machen.. Auf Anfrage gibt es jetzt hier meinen Code für die Sonnenstandssteuerung. Ich muss dazu sagen, dass das Ganze eher laienhaft unterwegs ist... ab und an macht die Jalousie auch zu, obwohl ich das nicht will - kann aber an den zu geringen Thresholds für die Wetterwerte liegen. Here we go - sollte was Olles oder Kompliziertes auffallen, bitte melden. Optimierungspotenzial gibt es sicher massig:

    Item.conf:
    Code:
    [Sonne]
        [[aufgang]]
            type = foo
            visu_acl = r
            enforce_updates = true
        [[untergang]]
            type = foo
            visu_acl = r
            enforce_updates = true
        [[position]]
            type = foo
            visu = yes
            visu_acl = r
            knx_dpt = 16
            enforce_updates = true
    
    ['sicherheitjalousien']
       type = bool
       visu_acl = r
       enforce_updates = yes
       knx_dpt = 1
       knx_send = 0/1/22
    
    ['sicherheitscreens']
       type = bool
       visu_acl = r
       enforce_updates = yes   
       knx_dpt = 1
       knx_send = 0/1/23
    
    ['jalousien']
        [['automatik']]
        type = bool
        visu_acl = rw
        enforce_updates = yes
        knx_dpt = 1
        cache = True
    
    ['osten']
        [['j5_wohnen']]
            [[['hoehe']]]
                knx_send = 3/1/16
                knx_dpt = 5
                visu_acl = rw
                type = num
                knx_init =3/1/32
                cache = True
                sqlite = init
                enforce_updates  = yes
                beschattung = 75 | 110 | 20 | 254 | 24 | 4 | 500
                # Die Werte fuer Beschattung: azimut-start | azimut-stop | min altitude | jalousienhoehe | temperatur (Wunderground) | UV Wert (Wunderground) | Solarwert (Wunderground)
    
    usw.
    logic.conf:
    Code:
    [Wunderground]
    # Wunderground Setup siehe Beitrag zu entsprechender Logik im Forum
    filename = wunderground.py
    visu_acl = yes
    crontab = init
    cycle = 600
    
    [Sonne]
    filename = sonne.py
    crontab = init
    cycle = 600
    
    [Jalousien]
    filename = jalousien.py
    watch_item = jalousien.automatik
    Die sonne.py:
    Code:
    #!/usr/bin/python3.2
    # Sicherheit abhaengig von Windgeschwindigkeit von naechstgelegener Wunderground Station. Eigene Wetterstation waere besser ;)
    limitjalousien = 35
    limitscreens = 50
    
    if sh.Wetter.Windgeschwindigkeit.kmh() >= limitjalousien:
       sh.sicherheitjalousien(1)
       logger.error("Windgeschwindigkeit liegt bei {0} und somit ueber {1}, daher Jalousien gesperrt".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitjalousien))
    else:
       if sh.sicherheitjalousien() == 1:
          sh.sicherheitjalousien(0)
          logger.warning("Windgeschwindigkeit liegt bei {0} und somit unter {1}, daher Jalousiesperre aufgehoben".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitjalousien))
    
       
    if sh.Wetter.Windgeschwindigkeit.kmh() >= limitscreens:
       sh.sicherheitscreens(1)
       logger.error("Windgeschwindigkeit liegt bei {0} und somit ueber {1}, daher Screens gesperrt".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitscreens))
    else:
       if sh.sicherheitscreens() == 1:
          sh.sicherheitscreens(0)
          logger.warning("Windgeschwindigkeit liegt bei {0} und somit unter {1}, daher Screensperre aufgehoben".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitscreens))
    
    
    # aktuelle Sonnenposition
    sh.Sonne.position(sh.sun.pos(degree=True))
    azimut, altitude = sh.Sonne.position()
    
    # Zeiten fuer Reset
    sonnenaufgang = sh.sun.rise(-6).astimezone(sh.tzinfo()).time()
    sonnenaufgang2 = sh.sun.rise().astimezone(sh.tzinfo()).time()
    jetzt = sh.now().astimezone(sh.tzinfo()).time()
    
    
    # RESET am Morgen
    if jetzt >=sonnenaufgang and jetzt <=sonnenaufgang2:
      sh.jalousien.automatik(1)
      logger.warning("Jalousienautomatik aktiviert, da es Morgen ist")
    
    # Sofern Gesamtautomatik aktiviert ist...
    if sh.jalousien.automatik() == 1:  
       for jalousie in sh.find_items('beschattung'):
         # Auslesen der Jalousiewerte fuer die Beschattung
         start = int(jalousie.conf['beschattung'][0])
         stop = int(jalousie.conf['beschattung'][1])
         hoehe = int(jalousie.conf['beschattung'][2])
         # Das war mal dafuer gedacht, dass manche Objekte erst nach Sonnenuntergang triggern. Kann aber auch durch das "Nacht"-Objekt geloest werden, siehe unten.
         if hoehe <=0:
            hoehe2 = hoehe
         else:
            hoehe2 = -90
         zufahren = jalousie.conf['beschattung'][3]
         temperatur = int(jalousie.conf['beschattung'][4])
         uv = int(jalousie.conf['beschattung'][5])
         solar = int(jalousie.conf['beschattung'][6])
         
         try:
            # Wenn noch ein weiterer Wert in der item.conf angegeben ist, dann wird dieser Wert angefahren, sobald Nacht ist - unabhaengig also vom Wetter.
            nacht = int(jalousie.conf['beschattung'][7])
            logger.debug("Wert fuer Nacht gefunden: {0}".format(nacht))
    
         except:
            # Wenn kein Nachtwert angegeben ist, dann ist er auf Null gesetzt.
            nacht = 0
         
         try:
            # Eventuell koennte man das Ganze auch zweigleisig fahren. Also dass man nochmals verschiedene Werte fuer eine weitere Phase angibt. Wuerde Sinn machen, wenn auf eine Fensterfront zB bei Azimut 100-150 Sonne faellt und dann bei 200-250 wieder, dazwischen aber nicht (Baum oder so..) 
            start2 = int(jalousie.conf['beschattung'][8])
            stop2 = int(jalousie.conf['beschattung'][9])
            temperatur2 = int(jalousie.conf['beschattung'][10])
            uv2 = int(jalousie.conf['beschattung'][11])
            solar2 = int(jalousie.conf['beschattung'][12])
            hoehe3 = int(jalousie.conf['beschattung'][13])
         
         except:   
            # Und wenn es die oberen Werte nicht gibt, werden sie auf quasi auf unendlich gesetzt, damit sie in unterer Abfrage ignoriert werden.
            start2 = 1000
            stop2 = -1000
            temperatur2 = 1000
            uv2 = 1000
            solar2 = 10000000
            hoehe3 = 1000
            
         logger.debug("Nacht ist auf Wert: {0}. Laut Smarthome ist Nacht auf {1}".format(nacht,sh.env.location.night()))
    
         # Wenn die Jalousie nicht mittels KNX-Taster oder Visualisierung geaendert wurde, wird sie durch die Automatik geaendert...
         if not (jalousie.changed_by().startswith('KNX') or jalousie.changed_by().startswith('Visu')):
             # Abfrage ob Nacht ist und ein Nachtwert gesetzt wurde. Ausserdem Alternativabfrage, ob die in der item.conf angegeben Werte derzeit wahr sind. Wenn ja, dann fahren die Jalousien automatisch.
             if (sh.env.location.night() and not nacht == 0) or (azimut >= start and azimut <= stop and sh.Wetter.Temperatur() >=temperatur and (sh.Wetter.UV() >=uv or sh.Wetter.Solar() >=solar) and (altitude >= hoehe or altitude <= hoehe2)) or (azimut >= start2 and azimut <= stop2 and sh.Wetter.Temperatur() >=temperatur2 and (sh.Wetter.UV() >=uv2 or sh.Wetter.Solar() >=solar2) and altitude >= hoehe3):
               # Wenn Nacht und Jalousie einen Nachtwert hat, wird auf diesen Nachtwert gefahren
               if sh.env.location.night() and not nacht == 0:
                  jalousie(nacht)
                  logger.info("Fahre Jalousie {0} auf Wert {1} zu, weil Nachsituation aktiviert.".format(jalousie, nacht))
               # Ansonsten wird auf den in der item.conf angegeben Wert gefahren.
               else:
                    jalousie(zufahren)
                    logger.info("Fahre Jalousie {0} auf Wert {1} zu.".format(jalousie, zufahren))
             # Wenn die Mindestwerte fuer Temperatur, Azimut, etc. nicht erreicht sind, faehrt die Jalousie hoch. Wir moechten ja Sonne ins Zimmer lassen.
             else:
               jalousie(0)
               logger.info("Fahre Jalousie {0} auf Wert 0.".format(jalousie))
         # Und falls die Jalousie seit dem Morgen manuell betaetigt wurde, wird sie nicht mehr veraendert. So lange, bis die Gesamtautomatik wieder aktiviert wird.
         else:
              logger.info("Jalousie {0} zuletzt manuell durch {1} geaendert, daher kein Automatikbetrieb".format(jalousie,jalousie.changed_by()))
    jalousien.py - zum Aktivieren der Automatik auf Knopfdruck
    Code:
    #!/usr/bin/python3.2
    
    logger.info(trigger)
    
    
    if sh.jalousien.automatik() == 1:
       logger.warning("Jalousienautomatik aktiv")
       for jalousie in sh.find_items('beschattung'):
           fahren = jalousie()
           # Dies bewirkt, dass die letzte Aenderung fuer die Jalousie von der Logik kommt und nicht mehr vom KNX-Taster oder der Visualisierung. Alles wird wieder nach Sonnenstand gesteuert.
           jalousie(fahren+1)
           logger.debug("Fahre Jalousie {0} auf Wert {1} zu.".format(jalousie,fahren))

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo,

    schön das Du eine Lösung für Dein Problem gefunden hast.

    Ein kleine Anmerkung, in letzter Zeit grassiert hier eine Varianten wie man Strings ausgibt
    Code:
    print("Variable 1" + str(var1))
    .

    Das macht "man" nicht. Richtig/besser ist
    Code:
    print("Variable 1 {0}".format(var1))
    Der geneigte Leser kann die Argumente dafür im Internet nachlesen.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Suuuuper, 1000 Dank. Deutlich noblerer Ansatz, der auch hervorragend funktioniert. Habe jetzt gleich noch altitude, temperatur und anfahrtshöhe mit integriert. Das mit dem changed_by funktioniert auch hervorragend, nur wenn nicht startswith KNX und Visu, dann werden die Rolläden geändert.

    Ich habe jetzt mal einen Automatik-Schalter mit eingebaut. Gibt ein eigenes item jalousien.automatik. Wenn das eingeschaltet wird, passiert folgendes:
    Code:
    if sh.jalousien.automatik():
       for jalousie in sh.find_items('beschattung'):
           fahren = jalousie()
           logger.debug("Jalousieautomatik aktiviert: "+str(jalousie))
           jalousie(fahren+1)
           logger.debug("Fahre Jalousie "+str(jalousie)+" auf Wert "+str(fahren)+" zu.")
    Dadurch wird sicher gestellt, dass "changed_by" nicht KNX oder Visu ist. Diese Logik wird dann auch jeden Morgen automatisch getriggert.

    Und das changed_by habe ich wie folgt integriert:
    Code:
    if sh.jalousien.automatik() == 1:  
       for jalousie in sh.find_items('beschattung'):
         start = int(jalousie.conf['beschattung'][0])
         stop = int(jalousie.conf['beschattung'][1])
         hoehe = int(jalousie.conf['beschattung'][2])
         zufahren = jalousie.conf['beschattung'][3]
         temperatur = int(jalousie.conf['beschattung'][4])
         if not (jalousie.changed_by().startswith('KNX') or jalousie.changed_by().startswith('Visu')):
             logger.debug(str(jalousie)+" wurde geaendert durch: "+str(jalousie.changed_by()))
             if azimut >= start and azimut <= stop and sh.Wetter.Temperatur() >=temperatur and (sh.Wetter.UV() >=6 or sh.Wetter.Solar() >=900) and altitude >= hoehe:
               jalousie(zufahren)
               logger.debug("Fahre Jalousie "+str(jalousie)+" auf Wert "+str(zufahren)+" zu.")
             else:
               jalousie(0)
               logger.debug("Fahre Jalousie "+str(jalousie)+" auf Wert 0.")
         else:
              logger.debug("Jalousie "+str(jalousie)+" zuletzt manuell durch "+str(jalousie.changed_by())+" geaendert, daher kein Automatikbetrieb")
    Find ich so eigtl. ganz gut. Im Prinzip gibt es eine generelle Automatik und eine Jalousien-bezogene. Letztere wird nur dann zurück gesetzt, wenn man Automatik auf aus und ein schaltet. Nicht ganz nobel, aber okay. Könnte man natürlich auch in der Visu ein eigenes Feld für jede Jalousie machen, wo angezeigt wird, ob automatisch oder nicht.

    Mal sehen, ob das jetzt alles im Dauereinsatz auch stabil läuft. Was mir nicht gefällt ist die Tatsache, dass bei Jalousien wirklich was gefahren werden muss, um das triggered_by "zurück zu setzen". Das hört man leider

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo,

    zwei Anmerkungen. Man kann die Logik auch etwas generischer gestalten in dem man den Räumen bzw. Jalousien Wertbereich mitgibt.

    z.B.

    Code:
    [wz]
      [[fenster]]
          beschattung = 100 | 200
    und dann in einer Logik in etwas so etwas macht:

    Code:
    for fenster in sh.find_items('beschattung'):
      start = fenster.conf['beschattung'][0]
      stop = fenster.conf['beschattung'][1]
      if azimuth >= start and azimuth <= stop:
        fenster(100)
    Man könnte auch noch etwas mit Fenster.changed_by einbauen, dann kann man überprüfen wer das Item zuletzt gesetzt hat.
    Das zurücksetzen auf den Auto-Betrieb ist noch ein anderes Problem.

    Ich hoffe Du kannst was mit den Anregungen anfangen.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Oki, so auf die Schnelle habe ich nun einfach in meine Sonnenlogik, die via crontab alle 15 Minuten ausgelöst wird, folgenden Code eingepflanzt:
    Code:
    azimut, altitude = sh.Sonne.position()
    logger.debug("Azimut:"+str(azimut))
    logger.debug("Altitude:"+str(altitude))
    
    if azimut >=70 and azimut <120 and altitude >20 and sh.Wetter.Temperatur() >=20:
       logger.debug("Sonne im Osten")
       sh.osten.j6_stiegenhaus.hoehe(254)
    
    if azimut >=120 and azimut <190 and altitude >50 and sh.Wetter.Temperatur() >=22:
       logger.debug("Sonne im Suedosten")
       if sh.osten.j6_stiegenhaus.hoehe() == 254:
          sh.osten.j6_stiegenhaus.hoehe(1)
    Temperatur bekomm ich via Wunderground-Logik. Ersten Tests zufolge funktioniert das schon mal. Altitude könnt man sich wohl sparen bzw. für die Lamellenstellung nutzen. Hätte wer dafür einen netten Code? Ansonsten müsste man hier halt auch 3 Bereich in der Altitude definieren und dementsprechend die Lamellenneigung anpassen. Oder wie wär das nobel zu lösen?

    Die if-Abfrage über die Höhe der Jalousie sollte verhindern, dass eine manuell eingestellte Jalousie alle 15 Minuten verstellt wird. Wenn hier jemand eine bessere Lösung parat hätte, wäre ich froh.

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo,

    das Item muss über eine Logik aktualisiert werden. Das mit eval funktioniert nicht.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    du könntest es mal so versuchen:

    Code:
    [item]
        type = num
        ...
        eval = sh.sun.pos(degree=True)
        eval_trigger = sun.pos

    Einen Kommentar schreiben:


  • Bonze
    antwortet
    wie kann man das eigentlicch machen, das man einem Item direkt den Winkel zuweist ? mit


    Code:
    [item]
    type = num
        visu = yes
        visu_acl= rw
        sqlite = true 
        cache = true
        history = true
    
    sh.sun.pos(degree=True)
    oder funktioniert das nur ueber umwege uber ne logic?

    Einen Kommentar schreiben:


  • hansmaulwurf
    antwortet
    Hallo,

    da mich das auch interressiert hat, habe ich mal ein wenig gegoogelt.

    Ich denke jetzt auch, dass der Azimutwinkel bei Norden 0° hat. (Das ist aber immer eine Definitionsfrage)

    Azimut ? Wikipedia

    Weiter kann man hier für seine Position/ Koordinaten sehr schön den Sonnenverlauf sehen.

    Berechnung der Position der Sonne in den Himmel für jeden Ort auf der Erde zu jeder Zeit des Tages

    Jetzt müsste man erstmal den Azimutwinkel bzw. den Winkelbereich für die Beschattung festlegen. Dazu muss man natürlich die Koordinaten von seinem Haus kennen. Ich denke mit Google maps kein Problem.

    Hierzu spielt meiner Meinung nach der Elevationswinkel (Höhe) erstmal keine Rolle. Vielleicht wenn man im Winter keine Beschattuung möchte ? Das ist aber wahrschelinlich sinnvoller über den Abgleich der Innentemperatur zu lösen.

    Bist Du selber schon weitergekommen ?

    Gruß,
    Hans

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    He ihr zwei! Danke für die rasche Rückmeldung - perfekt!

    Gibt's irgendwo was zur Sonnenstandsberechnung in smarthome.py? Konnte hier im Forum noch nicht wirklich was finden außer halt der kontinuierlichen Abfrage über die aktuellen Werte. Wie ich das dann aber am besten ummünze auf eine Rolladensteuerung ist mir bis dato nur bedingt klar

    Seh ich das richtig, dass die Werte von Norden aus gerechnet sind, ja? Also 180 Grad wär genau Süden? 270 Grad dann eben Westen..?

    Einen Kommentar schreiben:


  • dschwert
    antwortet
    Ist jetzt zwar nicht mehr nötig, aber es gibt auch zwei Funktionen zum umrechnen:
    math.degrees(rad)
    math.radians(deg)

    Gruß,

    Dietmar

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo,

    es haben beide Recht. 'Normale' Leute denken eher in Grad. Programmierer in Rad.

    Deswegen habe ich der Funktion eine Option spendiert:
    Code:
    sh.sun.pos(degree=True)
    liefert den Wert in Grad zurück.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Die wenigsten Formeln rechnen mit Winkeln in Grad. Daher macht es schon mehr sinn, das als Radiant zurück zu geben damit man das z.B. in Sonnenstandsberechnungen direkt verwenden kann.

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Ich hab das jetzt direkt im orb.py im lib-Ordner abgeändert. Und auch gleich ein Round und die Sache passt. Frage wäre, ob das nicht generell gut wäre, wenn der Wert in Grad geliefert werden würde?

    Wär's sonst evtl. möglich, die Rechnung über eval im items.conf laufen zu lassen?

    Einen Kommentar schreiben:


  • c0rvus88
    antwortet
    Hallo,

    ich habe die Lösung selber gefunden ;-)

    Die Umrechnung in ° erfolgt duch folgendes Script:
    #!/usr/bin/env python

    import math

    azimut, altitude = sh.sun.pos()
    azimut = azimut*180/math.pi
    altitude = altitude*180/math.pi

    Somit kann ich nun die Werte verwenden.

    Liebe Grüße
    Micha

    Einen Kommentar schreiben:

Lädt...
X