Blog Obsolet

HomeMatic – Sonnenstandberechnung

Letzte Aktualisierung am 1. Juli 2023

Dieser Beitrag ist obsolet, da die CCU den Sonnenstand zwischenzeitlich selbst präzise berechnet. Er wird nicht mehr aktualisiert. Die Kommentare wurden geschlossen.

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…

[code]
dom.GetObject("sonne_elevation").State(system.SunAltitude().Round(2));
dom.GetObject("sonne_azimut").State(system.SunAzimuth().Round(2));
[/code]

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.

Analemma pattern in the sky
„Analemma pattern in the sky“ by jailbird [CC-BY-SA-2.0-de], via Wikimedia Commons

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/Ost110° – 150°
Süd150° – 210°
Süd/West210° – 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):

Forum02
SR=Sunrise, SS=Sunset, die Zahlen in der linken Spalte sind die jeweiligen Tage im Jahr.

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

Forum03

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:

Forum04

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

Forum05

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…

HomeMatic-Forum



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.

Bitte beachten...

SMART WOHNEN in Stern's Haus ist ein rein privates, nicht kommerzielles Projekt. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“, Support kann ich nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis.
Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung! Für die Einhaltung der einschlägigen technischen Vorschriften ist jeder Anwender selbst verantwortlich!
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN in Stern's Haus | sternshaus.de
WordPress Cookie Plugin von Real Cookie Banner