HomeMatic Tutorial

HomeMatic – Sonnenstandberechnung

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.

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 Script:

Forum03

Für andere Regionen und Bedürfnisse sollten die Daten überprüft und ggf. angepasst bzw. präzisiert werden.

Das daraus abgeleitete Sonnenstand-Script…

    ! 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-Scriptes 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 by sTeRn AV ist ein rein privates Projekt. Support kann ich daher nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“. Die Verwendung erfolgt auf eigenes Risiko, ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung.
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN by sTeRn AV | smart-wohnen.org

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich stimme zu.