Letzte Aktualisierung am 15. Januar 2023
Der jeweils aktuelle Sonnenstand ist eine wichtige Größe für viele Hausautomatisierungsaufgaben, z.B. für die Steuerung von Jalousien. Zur Ermittlung des Sonnenstandes gibt es verschiedene Lösungsansätze. Nachfolgend ist eine Lösung für die HomeMatic-Zentrale (CCU) beschrieben, die ohne externe Aufrufe auskommt und deren „hinreichende Näherung“ für die Steuerung von Jalousien durchaus ausreicht.
Update Mai 2019
Mit der RaspberryMatic Firmware 3.45.7.20190504 wurden die Skriptfunktionen „system.SunAzimuth()“ und „system.SunAltitude()“ eingeführt, welche die momentane Sonnenposition in Abhängigkeit des Standortes ausgeben.
Das nachfolgende Tutorial sowie die am Ende empfohlene genauere Variante sind damit obsolet.
Nachdem vorher die Systemvariablen „sonne_elevation“ und „sonne_azimut“ vom Typ Zahl angelegt wurden, reduziert sich das Skript z.B. auf diese beiden Zeilen, die alle paar Minuten aufgerufen werden sollten…
dom.GetObject("sonne_elevation").State(system.SunAltitude().Round(2)); dom.GetObject("sonne_azimut").State(system.SunAzimuth().Round(2));
Die Sonne bewegt sich im Laufe eines Jahres auf einer Art „Doppelkeule“ oder „Acht“, dem sogenannten Analemma, dessen Ausrichtung sich über die Tageszeit verändert.

Details hierzu kann man im Netz nachlesen, z.B. bei Wikipedia. Die Extrema des Analemma liegen Ende Juni und Ende Dezember, der Schnittpunkt der „Acht“ Mitte April und Ende August. Die „Keulenbreite“ wurde in der nachfolgenden Auswertung vernachlässigt, man kann sie bei Bedarf aber natürlich auch einbeziehen.
Zunächst ist der Sonnenstand auf der Kompassrose wie folgt in handhabbare Abschnitte zu unterteilen:
Ost | < 110° |
Süd/Ost | 110° – 150° |
Süd | 150° – 210° |
Süd/West | 210° – 250° |
West | > 250° |
In einem zweiten Schritt ist zur Näherung das Analemma, bezogen auf den Standort des jeweiligen Gebäudes, über das Kalenderjahr zunächst in verschiedene Abschnitte zu teilen und für diese dann die Uhrzeit zu ermitteln, an der die Sonne die o.a. Winkel (110°, 150°, 210°, 250°) erreicht.
Ein hervorragendes Tool hierfür findet sich auf sunearthtools.com.
Die folgende, auf den ersten Blick vielleicht etwas verwirrende Tabelle, zeigt die Auswertung (für den Raum Köln):

Reduziert und gerundet ergeben sich bezogen auf die Tage im Jahr folgende Eckdaten für das Skript:

Für andere Regionen und Bedürfnisse sollten die Daten überprüft und ggf. angepasst bzw. präzisiert werden.
Das daraus abgeleitete Sonnenstand-Skript…
! Sonnenstand Analemma real sDate = system.Date("%j").ToInteger(); real c_zeit = (0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger(); real c_tagesbeginn = (0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger(); real c_tagesende = (0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger(); integer v_sonnenstand = 0; ! Sonne unter Horizont ! Analemma 23.12. bis 10.02. if ((sDate > 356) || ((sDate > 0) && (sDate < 41))) { if (c_zeit < c_tagesende) { v_sonnenstand = 4; ! Süd/West } if (c_zeit < c_tagesende - 2) { v_sonnenstand = 3; ! Süd } if (c_zeit < c_tagesbeginn + 2) { v_sonnenstand = 2; ! Süd/Ost } if (c_zeit < c_tagesbeginn -1) { v_sonnenstand = 0; ! Sonne unter Horizont } } ! Analemma 11.02. bis 07.03. und 01.11. bis 22.12. if (((sDate > 304) && (sDate < 357)) || ((sDate > 40) && (sDate < 67))) { if (c_zeit < c_tagesende) { v_sonnenstand = 4; ! Süd/West } if (c_zeit < c_tagesende - 3) { v_sonnenstand = 3; ! Süd } if (c_zeit < c_tagesbeginn + 3) { v_sonnenstand = 2; ! Süd/Ost } if (c_zeit < c_tagesbeginn -1) { v_sonnenstand = 0; ! Sonne unter Horizont } } ! Analemma 08.03. bis 12.04. und 05.10. bis 31.10. if (((sDate > 277) && (sDate < 305)) || ((sDate > 66) && (sDate < 103))) { if (c_zeit < c_tagesende) { v_sonnenstand = 5; ! West } if (c_zeit < c_tagesende - 1) { v_sonnenstand = 4; ! Süd/West } if (c_zeit < c_tagesende - 4) { v_sonnenstand = 3; ! Süd } if (c_zeit < c_tagesbeginn + 4) { v_sonnenstand = 2; ! Süd/Ost } if (c_zeit < c_tagesbeginn + 1) { v_sonnenstand = 1; ! Ost } if (c_zeit < c_tagesbeginn -1) { v_sonnenstand = 0; ! Sonne unter Horizont } } ! Analemma 13.04. bis 30.04. und 30.08. bis 04.10. if (((sDate > 241) && (sDate < 278)) || ((sDate > 102) && (sDate < 121))) { if (c_zeit < c_tagesende) { v_sonnenstand = 5; ! West } if (c_zeit < c_tagesende - 3) { v_sonnenstand = 4; ! Süd/West } if (c_zeit < c_tagesende - 5) { v_sonnenstand = 3; ! Süd } if (c_zeit < c_tagesbeginn + 5) { v_sonnenstand = 2; ! Süd/Ost } if (c_zeit < c_tagesbeginn + 3) { v_sonnenstand = 1; ! Ost } if (c_zeit < c_tagesbeginn -1) { v_sonnenstand = 0; ! Sonne unter Horizont } } ! Analemma 01.05. bis 09.06. und 12.08. bis 29.08. if (((sDate > 192) && (sDate < 242)) || ((sDate > 120) && (sDate < 161))) { if (c_zeit < c_tagesende) { v_sonnenstand = 5; ! West } if (c_zeit < c_tagesende - 4) { v_sonnenstand = 4; ! Süd/West } if (c_zeit < c_tagesende - 6) { v_sonnenstand = 3; ! Süd } if (c_zeit < c_tagesbeginn + 6) { v_sonnenstand = 2; ! Süd/Ost } if (c_zeit < c_tagesbeginn + 4) { v_sonnenstand = 1; ! Ost } if (c_zeit < c_tagesbeginn -1) { v_sonnenstand = 0; ! Sonne unter Horizont } } ! Analemma 10.06. bis 11.08. und 01.11. bis 22.12. if ((sDate > 160) && (sDate < 193)) { if (c_zeit < c_tagesende) { v_sonnenstand = 5; ! West } if (c_zeit < c_tagesende - 5) { v_sonnenstand = 4; ! Süd/West } if (c_zeit < c_tagesende - 7) { v_sonnenstand = 3; ! Süd } if (c_zeit < c_tagesbeginn + 7) { v_sonnenstand = 2; ! Süd/Ost } if (c_zeit < c_tagesbeginn + 5) { v_sonnenstand = 1; ! Ost } if (c_zeit < c_tagesbeginn -1) { v_sonnenstand = 0; ! Sonne unter Horizont } } dom.GetObject("Sonnenstand").State(v_sonnenstand);
…ist auf Basis des in der HomeMatic-Community gemeinhin bekannten Tageszeiten-Skriptes erstellt, wird per Zeitmodul alle 10 Minuten aufgerufen und liefert die SysVar „Sonnenstand“, die zuvor wie folgt definiert werden muss:

Das Ergebnis sieht, z.B. im CCU-Historian, dann so aus…

Bei einer Verwendung zur Jalousiesteuerung empfehle ich, die Rollläden nicht sofort nach Schalten der SysVar „Sonnenstand“ auf „unter Horizont“ herunter zu lassen sondern mit einer ca. 30 minütigen Verzögerung, dann gehen sie erst bei deutlich beginnender Dunkelheit nach unten, aber das ist Geschmackssache und sollte individuell ausprobiert werden.
Zum korrespondierenden Beitrag im…
Tipp: Wer es genauer braucht, sollte sich mal diese Variante einer Sonnenstandberechnung ansehen. Dort wird in einem etwas anderen Ansatz die Sonnenposition in zwei Systemvariablen „sonne_elevation“ und „sonne_azimut“ abgelegt.