Ankündigung

Einklappen

Sammelbestellung ETS5-UPGRADE gestartet...

Die Sammelbestellung für ETS5 UPGRADE ist gestartet. Infos unter: Link
Mehr anzeigen
Weniger anzeigen

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

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

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

    Hallo,

    ich hänge aktuell an einem kleinen Problem.
    Bei der realisierung einer automatischen Beschattung möchte ich die Sonnen-Position verwenden.

    Dazu habe ich ein logic script eingerichtet, welches mir per sh.sun.pos() die Werte berechnet. Als Ausgabe erhalte ich nun "azimut und altitude", wie in dem Beispiel.

    Leider bekomme ich in meinem Beispiel nun die Werte:
    azimut = 1.7550565004348755
    altitude = 0.6967217326164246

    Wie kann ich diese nun verwerten und bestenfalls in ° umwandeln?

    Vielen Dank für eure Hilfe!

    Liebe Grüße
    Micha

    #2
    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

    Kommentar


      #3
      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?

      Kommentar


        #4
        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.
        Mit freundlichen Grüßen
        Niko Will

        Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
        - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

        Kommentar


          #5
          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

          Kommentar


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

            Gruß,

            Dietmar

            Kommentar


              #7
              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..?

              Kommentar


                #8
                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

                Kommentar


                  #9
                  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?

                  Kommentar


                    #10
                    du könntest es mal so versuchen:

                    Code:
                    [item]
                        type = num
                        ...
                        eval = sh.sun.pos(degree=True)
                        eval_trigger = sun.pos
                    Mit freundlichen Grüßen
                    Niko Will

                    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                    Kommentar


                      #11
                      Hallo,

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

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        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.

                        Kommentar


                          #13
                          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

                          Kommentar


                            #14
                            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

                            Kommentar


                              #15
                              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

                              Kommentar

                              Lädt...
                              X