Hi,
Scripte zur Beschattung gibt es diverse.
Entweder nach der Temperatur oder nach Lux und/oder in bestimmten Zeiträumen.
Hier hat boomx eine Vorlage für die Rollosteuerung nach den Sonnenuntergang bzw. -aufgang eingestellt:
http://www.siio.de/board/thema/rollladen-steuerung-sonnenaufgang-untergang/.
Mein Ansatz greift auf den Sonnenstand zurück und steuert die Rollos in der Ost-, Süd- und Westseite.
Für den Sonnenstand nehme ich derzeit ein VD aus dem französischen Forum.
http://www.domotique-info.fr/2015/09/ou-est-le-soleil-pour-votre-homecenter-2/
Das berechnet den Sonnenstand und fragt ihn nicht laufend aus dem Internet ab.
Eine alternatives VD habe ich vorbereitet, muss ich aber noch mal testen.
Ansonsten ist das Script mittlerweile für meine Bedürfnisse stark angepasst, hoffe aber, dass ich genügend Erklärungen hinterlassen habe, damit ihr es anpassen könnt.
Die eingebauten Globale Variablen (GV) sind notwendig, damit nach einem automatischen Runterfahren die Rollos manuell geöffnet werden können und auch offen bleiben.
Fensterkontakte habe ich nicht berücksichtigt, da ich dort keine habe.
Ich warte immer noch auf den Funk-Türgriff von Soda…
--[[
%% properties
144 value
%% events
%% globals
Sonnenstand
--]]
-- 144 ist die ID der Netatmo-Außentemperatur, siehe local TempID
-- "Sonnenstand" ist die Globale Variable aus dem separaten Sonnenstands-VD
-- Es müssen manuell folgende Globale Variablen (GV) angelegt werden:
-- Sonnenstand, SonneOstRunter, SonneSuedHoch, SonneSuedRunter, SonneWestRunter
-- Die GV "Anwesend" steuert bei mir Anwesenheit bzw. die Abwesenheit
local sourceTrigger = fibaro:getSourceTrigger();
local version = '1.0';
if fibaro:countScenes() > 1 then
fibaro:debug("stop scene");
fibaro:abort();
end
--der Stand der Sonne kommt aus einer Globalen Variablen,
--die durch das französische VD gespeist wird
local Sonnenstand = tonumber(fibaro:getGlobalValue("Sonnenstand"))
-- Angabe des Sonnenwinkels in Grad für Himmelsrichtung
local SonneOstWeg = 176
local SonneSuedDa = 118
local SonneSuedWeg = 277
local SonneWestDa = 212
local SonneWestWeg = 289
--Temperaur die mindestens erfüllt sein muss
local GradNord = 19
local GradSued = 20
local TempID = 144
local RolloWert = 20 --Wert auf den die Rollos geöffnet bleiben sollen
--Definition der Rollo-IDs je Himmelsrichtung
local RollosOst = {153, 155, 173, 171};
local RollosSued = {110, 147, 169, 167};
local RollosWest = {149, 163, 175, 165};
local KuechenTuer = 151
local morning = {08, 12}; -- HH:MM
local night = {23, 00}; -- HH:MM
local vorher = 20 -- 20 Minuten vorher
local nachher = 5 -- 5 Minuten Verzögerung nachher
local SunSet = fibaro:getValue(1, "sunsetHour")
local Sunrise = fibaro:getValue(1, "sunriseHour")
local morning = os.date("%H:%M", -3600+ morning[1]*60*60 + morning[2]*60);
local night = os.date("%H:%M", -3600+ night[1]*60*60 + night[2]*60);
local ostime = os.date("%H:%M", os.time());
local currentTime = os.date("%H:%M");
local currentDate = os.date("*t");
--fibaro:debug("Morning-Zeit: "..morning)
--#########################################################################
-- Damit je Seite das Scruipt nur ein einziges mal läuft, manuelles und dauerhaftes
--hochfahren der Rollos ist somit möglich.
if (currentTime >= "05:40" and currentTime < "06:00") then
fibaro:setGlobal("SonneSuedRunter", "0")
fibaro:setGlobal("SonneSuedHoch", "0")
fibaro:setGlobal("SonneOstRunter", "0")
fibaro:setGlobal("SonneWestRunter", "0")
fibaro:debug("Check für einmaligen Durchlauf zurückgesetzt. ")
end
fibaro:debug("Sonnenstand: "..Sonnenstand.."° und "..tonumber(fibaro:getValue(TempID, "value")).." Grad im Garten")
--#########################################################
--Ost
--geht runter ab bestimmter Zeit, bei bestimmter Wärme und bis bestimmten
--Sonnenstand
if ((currentTime >= morning) and
(Sonnenstand < SonneOstWeg) and
(tonumber(fibaro:getValue(TempID, "value")) >= GradNord) and
(tonumber(fibaro:getGlobalValue("SonneOstRunter")) == tonumber("0")))
then
fibaro:debug("Sonne im Osten und Rollo runter")
for i = 1,#RollosOst do
fibaro:call(RollosOst[i],"setValue", RolloWert)
--fibaro:debug("Aktuelle Dev ID: "..RollosOst[i])
end
fibaro:setGlobal("SonneOstRunter", "1")
end
-- wieder Hoch
if (Sonnenstand >= SonneOstWeg and Sonnenstand <= SonneOstWeg+2) then
fibaro:debug("Sonne im Osten weg und Rollos gehen hoch")
for i = 1,#RollosOst do
fibaro:call(RollosOst[i], "open")
--fibaro:debug("Aktuelle Dev ID: "..RollosOst[i])
end
end
--############################################################################
--Süd
--nur bei bestimmter Wärme und zwischen zwei Sonnenständen gehen Rollos runter
if (Sonnenstand >= SonneSuedDa and Sonnenstand < SonneSuedWeg) and
(tonumber(fibaro:getValue(TempID, "value")) >= GradSued) and
(tonumber(fibaro:getGlobalValue("SonneSuedRunter")) == tonumber("0"))
then
fibaro:debug("Sonne im Süden und Rollo geht runter")
for i = 1,#RollosSued do
fibaro:call(RollosSued[i],"setValue", RolloWert)
--fibaro:debug("Aktuelle Dev ID: "..switches[i])
end
-- Rollo Küchentür geht Runter bei Abwesenheit und am Mo, Di, Mi, Fr
if ((currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 6)
or fibaro:getGlobalValue("Anwesend") == "Nein" )
then
fibaro:call(KuechenTuer,"setValue", RolloWert)
end
fibaro:setGlobal("SonneSuedRunter", "1")
fibaro:debug("Sued-Run Status weil runtergefahren: "..fibaro:getGlobal("SonneSuedRunter"))
end
--wieder Hoch
-- das "+2" in "SonneSuedWeg+2" soll einen "Sprung" im Sonnenstand abfangen, damit die Bedingung erfüllt ist
if ((Sonnenstand >= SonneSuedWeg and Sonnenstand <= SonneSuedWeg+2) and
tonumber(fibaro:getGlobalValue("SonneSuedHoch")) == tonumber("0") ) then
fibaro:debug("Sonne im Süden weg und Rollos hoch")
for i = 1,#RollosSued do
fibaro:call(RollosSued[i], "open")
--fibaro:debug("Aktuelle Dev ID: "..RollosSued[i])
end
fibaro:call(KuechenTuer, "open")
fibaro:setGlobal("SonneSuedHoch", "1")
end
--############################################################################
--West
--nur bei bestimmter Wärme und zwischen zwei Sonnenstand West und bis Süd
if ((Sonnenstand >= SonneWestDa and Sonnenstand < SonneSuedWeg) and
(tonumber(fibaro:getValue(TempID, "value")) >= GradSued) and
(tonumber(fibaro:getGlobalValue("SonneWestRunter")) == tonumber("0")))
then
fibaro:debug("Sonne im Westen")
for i = 1,#RollosWest do
fibaro:call(RollosWest[i],"setValue", RolloWert)
--fibaro:debug("Aktuelle Dev ID: "..RollosWest[i])
end
fibaro:setGlobal("SonneWestRunter", "1")
end
----wieder Hoch
--Nur bestimmte Rollos sollen wieder geöffnet werden, nicht alle Rollos im Westen
if (Sonnenstand >= SonneWestWeg and Sonnenstand <= SonneWestWeg+2) then
fibaro:debug("Sonne im Westen weg und Rollos gehen hoch")
fibaro:call(149, "open")
fibaro:call(163, "open")
fibaro:call(175, "open")
end