Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampen

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
funkleuchtturm
Beiträge: 1507
Registriert: 13.06.2011, 16:42
Kontaktdaten:

Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampen

Beitrag von funkleuchtturm » 10.03.2014, 17:53

Auf meiner Homepage gibt´s hierzu ein Update mit weniger Variablennamen: http://www.stall.biz/?project=sonnensta ... sen-lampen

Tags: Skript, Script, Sonnenposition, Elevation, Azimut, Rolladensteuerung, Jalousiensteuerung, Markisensteuerung, Lampensteuerung, Dämmerung, Dämmerungsskript,
Die Sonnenposition wird beschrieben mit der Sonnen_Elevation (Winkel zur Horizontalen) und dem Sonnen_Azimut (Winkel in der Horizontalen, von Norden aus gemessen wie bei der Kompassrose). Beide Grössen sind unentbehrlich für eine jahreszeitabhängige Betätigung von Rolladen für die Nacht, Rolladen für die Beschattung , Jalousien mit variablem Lamellenwinkel, Markisen und letztlich auch für die dämmerungsabhängige Beleuchtung. Professionelle Systeme zur Hausautomation stellen diese Funktion oft nur optional mit Aufpreis zur Verfügung !
Zur Sonnenstandsberechnung hatte ich bereits ein Skript erstellt, das mit mehreren linearen Interpolationsverfahren die Sonnenposition mehr oder weniger genau berechnet. http://homematic-forum.de/forum/viewtop ... 00#p140282 Theorie dazu gibt´s hier: http://de.wikipedia.org/wiki/Sonnenstand
Im Hinblick auf die weitere Verbesserung der Berechnung wird hier nun ein umfangreicheres HM-Skript beschrieben, das die Sonnenposition relativ genau für die gesamten 24h eines Tages berechnet. Durch die Verfügbarkeit brauchbarer Daten der Sonnenposition auch in der Nacht (wenn die Sonne bereits unter dem Horizont ist, Elevation negativ), können auch nachtabhängige Steuerungsaufgaben stufenlos und dämmerungsabhängig einfach gelöst werden. Zeitsprünge durch Umstellung von Sommer- auf Winterzeit entfallen durch diese Steuerungsart vollständig.
Hier also erst mal das Kochrezept:
1.) Sicherstellen, dass in der HM-Zeit- und Positionseinstellung auch der richtige Breitengrad des eigenen Standortes (hier hilft Google Earth !) und die richtige Zeitzoneneinstellung für Deutschland "CET/CEST (UTC +1/+2)" eingetragen sind.
2.) Zwei Systemvariablen anlegen_
- sonne_elevation Zahl -180 bis +180 grad
- sonne_azimut Zahl -360 bis +360 grad
3.) Ein WebUI-Programm anlegen, in dem man beispielsweise all 3 Minuten das folgende Skript aufruft:

Code: Alles auswählen

    !berechg sonne_elevation, sonne_azimut; stand 14.03.2014 
    !Verfasser: funkleuchtturm
    real phi = system.Latitude(); !Breitengrad holen
    phi = 0.017453292 * phi; !umwandeln in bogenmass
    !####### sin_phi und cos_phi mit taylorreihe berechnen
    real temp = phi * phi;
    real sin_phi =phi * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); !sinus-naeherung
    real cos_phi = (temp *temp *0.0416667)  + 1.0 - (temp * 0.5); !cosinus-naeherung
    !### berechnung sonnenzeit, alle zeiten in minuten ########
    integer zeit_min = system.Date("%M").ToInteger() + 60*system.Date("%H").ToInteger();
    integer tagesbeginn_min = system.SunriseTime("%M").ToInteger() + 60*system.SunriseTime("%H").ToInteger();
    integer tagesende_min = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
    integer sonnenzeit =zeit_min + 720 - 0.5 *(tagesbeginn_min +tagesende_min);
    if (sonnenzeit > 1440) {sonnenzeit = sonnenzeit -1440;}
    if (sonnenzeit < 1) {sonnenzeit = 1440 + sonnenzeit;}
    boolean nachmittag =false;
    if (sonnenzeit > 720) {sonnenzeit =sonnenzeit - 720; nachmittag = true; }
                       else {sonnenzeit =720 -sonnenzeit;}
    !##### berechnung sin_tau und cos_tau ############           
    real tau = 0.00436332313 * sonnenzeit;   ! 15/60  * pi /180 * sonnenzeit  [0 < tau < pi ]
    if (tau < 1.570796327)
                   {temp = tau * tau;
                     real sin_tau =tau * ((temp * temp *  0.0083334) +1.0 - (temp *0.1666667));
                     tau= 1.570796327 - tau;
                     temp = tau * tau;
                     real cos_tau =tau * ((temp * temp *  0.0083334) +1.0 - (temp * 0.1666667));}                   
                 else
                     {real tau1  =3.141592654 - tau;
                       temp = tau1 * tau1;
                       real sin_tau =tau1 * ((temp * temp *  0.0083334) +1.0 - (temp * 0.1666667));
                       tau = tau  -  1.570796327;
                       temp = tau * tau;
                       real cos_tau = (tau) *(-1.0)* ((temp * temp *  0.0083334) +1.0 - (temp * 0.1666667));}
    !##### berechnung delta #######################   
    integer tageszahl = system.Date("%j").ToInteger();
    tageszahl = tageszahl +10;
    if (tageszahl > 365) {tageszahl = tageszahl - 365;}
    if (tageszahl < 92) {real tag = 0.0172142 *tageszahl;temp = tag * tag;
                real delta = (-0.410152) *((temp *temp *0.041666)  + 1.0 - (temp * 0.5));}
    if ((tageszahl >91) && (tageszahl < 184)) {tageszahl = 183 - tageszahl; real tag = 0.0172142 *tageszahl;
                  temp = tag * tag;  real delta = (0.410152) *((temp *temp *0.041666)  + 1.0 - (temp * 0.5));}
    if ((tageszahl >183) && (tageszahl < 275)) {tageszahl = tageszahl - 183; real tag = 0.0172142 *tageszahl;
                  temp = tag * tag;  real delta = (0.410152) *((temp *temp *0.041666)  + 1.0 - (temp * 0.5));}
    if ((tageszahl >274) && (tageszahl < 366)) {tageszahl = 365 - tageszahl; real tag = 0.0172142 *tageszahl;
                  temp = tag * tag;  real delta = (-0.410152) *((temp *temp *0.041666)  + 1.0 - (temp * 0.5));}
   !##### berechnung sin_delta, cos_delta  #######################   
    temp = delta * delta;
    real sin_delta =delta * ((temp * temp *  0.0083334) +1.0 - (temp * 0.1666667)); !sinus-naeherung
    real cos_delta = (temp *temp *0.0416667)  + 1.0 - (temp * 0.5); !cosinus-naeherung
    !##### berechnung tan_delta  mit stueckweiser linearisierung des tan  #######################   
    boolean vvorzeichen = true;
    if (delta< 0.0) {vvorzeichen = false; delta = (-1.0) *delta;}
    real tan_delta = 1.0233 * delta;
    if (delta >=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
    if (vvorzeichen == false) {tan_delta = (-1.0) * tan_delta;}
    !##### berechnung sin_elevation und tan_azimut #######################   
    real sin_elevation = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
    temp = sin_elevation * sin_elevation;
    real sonne_elevation = sin_elevation * (1.0 + (0.1666667 * temp) + (0.075 * temp * temp));     
    sonne_elevation = 57.29577951 * sonne_elevation;
    real nenner = (sin_phi*cos_tau) - (cos_phi * tan_delta);
    if (nenner < 0.0) {boolean plus180 = true;}
    real tan_azimut = sin_tau / nenner;
    !##### berechnung sonne_azimut mit stueckweiser linearisierung des arctan ############
    boolean vorzeichen = true;
    if (tan_azimut < 0.0) {vorzeichen = false; tan_azimut = (-1.0)*tan_azimut;}
    real sonne_azimut = 0.97723 * tan_azimut;
    if ((tan_azimut >=0.2679)&&(tan_azimut < 0.5774)) {sonne_azimut = (0.84588* tan_azimut) + 0.035189;}
    if ((tan_azimut >= 0.5774)&&(tan_azimut < 1.0)) {sonne_azimut = (0.6195* tan_azimut) + 0.1659;}
    if ((tan_azimut >= 1.0)&&(tan_azimut < 1.3032)) {sonne_azimut = (0.43173* tan_azimut) + 0.3537;}
    if ((tan_azimut >= 1.3032)&&(tan_azimut < 1.7321))  {sonne_azimut = (0.3052* tan_azimut) + 0.51856;}
    if ((tan_azimut >= 1.7321)&&(tan_azimut < 2.4142)) {sonne_azimut = (0.1919* tan_azimut) + 0.7148;}
    if ((tan_azimut >= 2.4142)&&(tan_azimut < 2.9459)) {sonne_azimut = (0.123* tan_azimut) + 0.88115;}
    if ((tan_azimut >= 2.9459)&&(tan_azimut < 3.7321)) {sonne_azimut = (0.083312* tan_azimut) + 0.9981;}
    if ((tan_azimut >= 3.7321)&&(tan_azimut < 5.0))  {sonne_azimut = (0.050792* tan_azimut) + 1.1194;}
    if ((tan_azimut >= 5.0)&&(tan_azimut <7.0)) {sonne_azimut = (0.02775* tan_azimut) + 1.23465;}
    if ((tan_azimut >= 7.0)&&(tan_azimut <12.0)) {sonne_azimut = (0.01175117* tan_azimut) + 1.346641;}
    if ((tan_azimut >= 12.0)&&(tan_azimut <20.0)) {sonne_azimut = (0.004147854* tan_azimut) + 1.437881;}
    if ((tan_azimut >= 20.0)&&(tan_azimut <50.0)) {sonne_azimut = (0.0009987* tan_azimut) + 1.5008639;}
    if (tan_azimut >= 50.0) {sonne_azimut = (0.000099983* tan_azimut) + 1.54579974;}
    if (sonne_azimut> 1.5707963278) {sonne_azimut = 1.5707963278;}
    if (vorzeichen == false) {sonne_azimut = (-1.0) * sonne_azimut;}
    sonne_azimut = 57.29577951 * sonne_azimut;
    if (plus180 == true) {sonne_azimut = sonne_azimut + 180.0;}
    !##### tageszeitliche korrektur und werte auf systemvariablen speichern ######
    if (nachmittag == false)
                    {sonne_azimut = 180.0 - sonne_azimut; sonnenzeit = 720 - sonnenzeit;}
                else
                    {sonne_azimut = sonne_azimut + 180.0;sonnenzeit = 720 + sonnenzeit;}
    sonne_azimut = 0.1 *((sonne_azimut*10.0) .ToInteger());
    sonne_elevation = 0.1 *((sonne_elevation*10.0) .ToInteger());     
    dom.GetObject("sonne_elevation").State(sonne_elevation);
    dom.GetObject("sonne_azimut").State(sonne_azimut);
Changelog:
11.03.2014: Offset-Fehler bei Azimutwinkel behoben. verschiedene Optimierungen bei der Rechenzeit
12.03.2014: Genauigkeit der Approximaton von sin, cos und arctan weiter verbessert
14.03.2014: Genauigkeit im Nulldurchgang der Elevation verbessert
18.04.2016 Auf meiner Homepage gibt´s ein Update des Sonnenstandsskripts mit Verwendung von weniger Variablen. Das kann der CCU Stabilität vielleicht nützen !
http://www.stall.biz/project/sonnenstan ... sen-lampen

... und nun mit den berechneten Systemvariablen sonne_elevation und sonne_azimut sehr einfach die Rolladen, Markisen und Lampen im Haus steuern.
Wie man das genau machen kann, werde ich bei Gelegenheit an Beispielen vielleicht nochmal darstellen, aber ich denke für den Homematiker ist das kein Problem!

Ach ja, zum Vergleich kann man die Daten mit einem "genauen" Sonnenstandsrechner vergleichen: http://www.volker-quaschning.de/datserv ... /index.php
Breiten und Längengrad eingeben und Berechnungsart "SUNAE" wählen. Die Abweichungen sind bei mir meist unter einem Grad, was bei den verwendeten Näherungsverfahren für die trigonometrischen Funktionen ganz ordentlich ist. Für die Heimautomation ist das jedenfalls mehr als genau!

Ergänzung 14.03.2014:
Wie man an den verwendeten Zahlenkolonnen im Skript erkennt, wurde bewusst weniger auf programmiertechnische "Schönheit" ausgelegt, sondern vielmehr wurde auf möglichst wenig Rechenoperationen und damit Laufzeit optimiert. Dies ist deshalb wichtig, weil das Skript zyklisch häufig aufgerufen wird!
Geringe Unstetigkeiten im Verlauf des Elevations- und Azimutwinkels bedingt durch die verwendeten Näherungsverfahren wurden weiter optimiert, so dass jetzt für die Heimautomation mehr als ausreichende Genauigkeit der Sonnenkoordinaten erreicht wird. Insbesondere im Bereich des Nulldurchgangs der Elevation ist ein möglichst stetiger Winkelverlauf deshalb wichtig, weil die meisten Steuerungsaufgaben im Bereich der Dämmerung erfolgen und hier ein möglichst gleichmässiger stufenloser Verlauf von grossem Vorteil ist.
Das folgende Bild zeigt sehr schön den Azimut und die Elevation, aufgezeichnet mit Historian über 24h. Diese Kurve verschieben sich täglich um einen geringen Betrag, wie man an dem geringen Sprung in der Elevationskurve um ca 00:00h erkennt:
sonnenstand1.jpg
Genauigkeit:
Der Vergleich mit Winkelergebnissen der Internet-Sonnenpositionsrechner ist abhängig von dem dort verwendeten Berechnungsverfahren:
Bei dem Berechnungsverfahren SUNAE war der Unterschied bei der Elevation meist weniger als ein halbes Grad. Der Azimutwinkel hatte Abweichungen bis zu etwa 2 Grad. Letztlich ist aber nicht die Genauigkeit entscheidend, sondern dass man im Bereich des Sonnenauf- und -untergangs mit dem Elevationswinkel eine gur aufgelöste stufenlose Zahl hat, von der man Schaltvorgänge reproduzierbar abhängig machen kann. Mit dem Azimut steuert man in der Regel sowieso nur Beschattungseinrichtungen, bei denen eine Winkelgenauigkeit von 2Grad mehr als genau sind.
Zuletzt geändert von funkleuchtturm am 18.04.2016, 18:19, insgesamt 9-mal geändert.
Viele Gruesse
Eugen
________________________________________________
Homematic-CCU2-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN, den RAINYMAN und den PULSECOUNTER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
SHC
Beiträge: 193
Registriert: 24.10.2007, 13:57

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von SHC » 10.03.2014, 19:13

Hallo Eugen,

ich habe auch "aktualisiert" und der Elevation-Wert ist vergleichbar mit dem Wert auf der verlinkten Webseite. Aber der Azimut-Wert liegt konstant bei 458,13.

Ich habe den Code ausgetauscht und die Systemvariable sonne_elevation von -90/90 auf -180/180 geändert. Habe ich etwas vergessen? :(

SHC

Benutzeravatar
funkleuchtturm
Beiträge: 1507
Registriert: 13.06.2011, 16:42
Kontaktdaten:

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von funkleuchtturm » 10.03.2014, 19:23

Du hast recht, hab ich auch gerade gesehen, das sind 180 grad zuviel. Ich hätte doch das Skript nochmal die gesamten 24h durchchecken sollen. Das ist ein kleines behebbares Problem bei der Qudrantenbestimmung des Tangens bzw. des Arcutangens. Werde ich korrigieren, .... aber erst morgen!
Viele Gruesse
Eugen
________________________________________________
Homematic-CCU2-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN, den RAINYMAN und den PULSECOUNTER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
funkleuchtturm
Beiträge: 1507
Registriert: 13.06.2011, 16:42
Kontaktdaten:

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von funkleuchtturm » 10.03.2014, 19:36

hab gerade das Skript "auf die Schnelle" korrigiert, werde aber morgen die Änderung prüfen.

@SHC funktioniert es jetzt mit der Änderung ?
Viele Gruesse
Eugen
________________________________________________
Homematic-CCU2-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN, den RAINYMAN und den PULSECOUNTER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
SHC
Beiträge: 193
Registriert: 24.10.2007, 13:57

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von SHC » 10.03.2014, 19:45

Hallo Eugen,

ja, es funktioniert jetzt wieder, vielen Dank!

Abweichung Azimut: 1,445 Grad
Abweichung Elevation: 0,395 Grad

Das ist doch großartig!! Toll. :D

SHC

DieterPN
Beiträge: 20
Registriert: 27.10.2012, 22:31

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von DieterPN » 10.03.2014, 21:38

Hallo,

hat schon jemand versucht dies für Homeputer CL Studio zu "konvertieren", zu realisieren?

Das Thema "Sonnenstandsberechnung" steht schon länger auf meiner Ideen-Liste (zu wenig Zeit :cry:) - bisher hatte ich überlegt Tabellen über Excel zu berechnen, als Datei abzulegen und auszuwerten. Berechnungen über ein Script wären natürlich eleganter :P und bevorzugt :!:

Grüße

Dieter

obarni
Beiträge: 32
Registriert: 21.09.2013, 22:08

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von obarni » 10.03.2014, 22:15

Das sieht jetzt mit dem korrigierten Azimut viel besser aus. Klasse und Danke! Great Job!!! :D

drhwpot
Beiträge: 141
Registriert: 04.11.2012, 11:05

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von drhwpot » 10.03.2014, 22:34

Super Sache!!! Tausend Dank, es funktioniert wunderbar!
1 x RaspberryMatic; 2 x Funk LAN Gateway (HM-LGW-O-TW-W-EU); 14 x Rollladenaktor (HM-LC-Bl1PBU-FM); 5 x Schalter ( HM-LC-Sw1PBU-FM); 4 x Schaltaktor (HmIP-BSM); 2 x Dimmer (HM-LC-Dim1TPBU-FM); 6 x Jalousienaktor-IP (HmIP-BBL); 8 x Fensterdrehgriff ( HM-Sec-RHS); 1 x Bewegungsmelder (HM-Sen-MDIR-O); 1 x Außensenor (HM-WDS10-TH-O); 1 x Temperaturfüller ( HM-WDS30-TO) FW: 3.45.5.20190330, CUxD - Timer, CUxD SyS EX, Sonnenstand 2.0, Prowl Push, Serviemeldungen via Push

-=FuF=-
Beiträge: 87
Registriert: 30.12.2013, 21:08

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von -=FuF=- » 11.03.2014, 00:08

Ich würde vielleicht noch auf eine Nachkommastelle runden, sonst läuft es super

joe.oster
Beiträge: 288
Registriert: 17.06.2013, 12:15
Wohnort: NRW

Re: Sonnenstandsberechnung 2.0 für Rolladen, Markisen, Lampe

Beitrag von joe.oster » 11.03.2014, 07:41

nach meinen ersten Test ist die Abweichung beim Azimut 0,15° also vernachläßigbar, bei Elevation ist sie allerdings 1,5°.

und das erscheint mir etwas viel.

Joe

Ansonsten funktioniert es.

Komischerweise weichen aber auch die SA und SU Zeiten zwischen CCU2 und Webseite http://www.volker-quaschning.de/datserv ... /index.php stark ab.

SA CCU2 6:56 Webseite 7:10
SU CCU2 18:30 Webseite 18:20

Bei beiden CCU2 und Webseite gebe ich aber die gleichen Koordinaten an :shock:

Also würde ich fast vermuten das das Skript richtig rechnet, oder ???
Zuletzt geändert von joe.oster am 11.03.2014, 08:02, insgesamt 2-mal geändert.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“