Zur sonnenstands- und sonnenscheinabhängigen Steuerung von Rollläden habe ich hier um Forum viel gelesen und mich inspirieren lassen (es gibt ja wirklich schon viele gute Ideen und Lösungen). Meine Lösung ist nun eine Kombination aus verschiedenen Ansätzen.
1. Sonnensensor
Zum Erkennen von Sonnenschein gibt es im Forum im Wesentlichen zwei verschiedene Vorgehensweisen. Eine Idee ist die Ermittlung der Differenztemperatur zwischen zwei unterschiedlich positionierten Temperaturmesser, wie sie z.B. hier http://homematic-forum.de/forum/viewtop ... 793#p45725 oder auch hier http://homematic-forum.de/forum/viewtop ... =31&t=6919 beschrieben ist.
Die zweite Variante wertet die Spannung einer Solarzelle aus. Ich habe mich für diese Art eines Sonnensensors entschieden und ihn nach folgender Idee gebaut: http://homematic-forum.de/forum/viewtop ... =27&t=5059, die hier detailliert beschrieben ist: http://maximilian-roth.de/?p=399
Allerdings verwende ich abweichend als Optokoppler den Typ SFH615A-2 und 25k-Potis, womit ich zwei unterschiedlich Schaltkanäle des HM-SCI-3-FM ansteuere (Sonnenschein und Dämmerung bzw. "trübes Wetter").
Fertig aufgebaut sieht der Sonsor so aus...
und liefert folgende Zustände:
2. Sonnenstand
Zur Ermittlung des Sonnenstandes gibt es z.B. hier http://homematic-forum.de/forum/viewtop ... onnenstand oder auch hier
http://homematic-forum.de/forum/viewtop ... =31&t=6035 schon interessante Lösungen.
Meine CCU hat aber inzwischen recht viele Komponen zu bedienen und da ich mit ähnlichen Lösungen im Bereich der Taupunktberechnung vermehrt Abstürze hatte, wollte ich ohne SystemExec-Aufrufe auskommen. Für die Steuerung der Rollladen war dabei für mich eine "hinreichende Näherung" durchaus akzeptabel.
Den Sonnenstand habe ich zunächst auf der Kompassrose wie folgt unterteilt:
Ost: < 110°
Süd/Ost: 110° - 150°
Süd: 150° - 210°
Süd/West: 210° - 250°
West: > 250 °
Die Sonne bewegt sich im Laufe eines Jahres auf einer Art "Doppelkeule" oder "Acht", der sogenannten Analemma, deren Ausrichtung sich über die Tageszeit verändert (Details hierzu kann man im Netz nachlesen, z.B. hier http://de.wikipedia.org/wiki/Analemma). Die Extrema der Analemma liegen Ende Juni und Ende Dezember, der Schnittpunkt der "Acht" Mitte April und Ende August. Die "Keulenbreite" habe ich in der nachfolgenden Auswertung vernachlässigt, man kann sie bei Bedarf aber natürlich auch einbeziehen.
Bei der Erstellung des Scriptes zur Ermittlung des Sonnenstandes habe ich daher zur Näherung die Analemma bezogen auf den Standort des Hauses über das Kalenderjahr zunächst in verschiedene Abschnitte geteilt und für diese dann die Uhrzeit ermittelt, an der die Sonne die o.a. Winkel (110°, 150°, 210°, 250°) erreicht.
Ein hervorragendes Tool hierfür findet sich auf http://www.sunearthtools.com/dp/tools/p ... hp?lang=de.
Die folgende, auf den ersten Blick vielleicht etwas verwirrende Tabelle, zeigt meine Auswertung (für den Raum Köln):
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:
Für andere Regionen und Bedürfnisse sollten die Daten überprüft und ggf. angepasst bzw. präzisiert werden.
Das daraus abgeleitete Sonnenstand-Script
Code: Alles auswählen
! 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);
Das Ergebnis sieht dann z.B. wie folgt aus...
3. Steuerung
Hier habe ich eine Lösung in Anlehnung an diese http://maximilian-roth.de/?p=1209 gewählt, z.B. ...
Automatisch lasse ich die Rollladen herunter, wenn die SysVar "Sonnenstand" auf "unter Horizont schaltet", z.B. so...