Sonnenverlauf zur Rollosteuerung

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

Das VD zum Abruf des Sonnenstandes findet ihr hier:
http://www.siio.de/board/thema/vd-fuer-den-sonnenverlauf/

Hi,

ich habe in das Ganze noch meinen Regensensor (Netatmo) eingebaut und der Küchentür einen Strip verpasst.

--[[
%% properties
144 value
%% events
%% globals
Sonnenstand
rain_hour
--]]

-- 144 ist die ID der Netatmo-Außetemperatur, siehe local TempID
-- "Sonnenstand" ist die Globale Variable aus dem separaten Sonnenstands-VD
-- Es müssen manuell folgene Globale Variablen (GV) angeelgt werden:
-- Sonnenstand, SonneOstRunter, SonneSuedHoch, SonneSuedRunter, SonneWestRunter, SonneWestHoch...
-- Die GV "Anwesend" steuert bei mir Anwesenheit bzw. die ABwesenheit

local sourceTrigger = fibaro:getSourceTrigger();
local version = '2.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ösiche 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 = 210
local SonneWestWeg = 289

--Gibt Wert an VD Rollosteuerung
fibaro:call(316, "setProperty", "ui.Label2.value", "S: "..SonneSuedDa.."°  W: "..SonneWestDa.."° ")
fibaro:call(316, "setProperty", "ui.Label3.value", Sonnenstand.."°")

--Temperaur die mindestnes 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

--Definitin der Rollo-IDs je Himmelsrichtung
local RollosOst = {153, 155, 173, 171}; 
local RollosSued = {110, 147, 169, 167};  --ohne Küchen-Terassentür; 167 Feli Garten
local RollosWest = {149, 163}; -- nur EG drin, da OG: 175, 165 ganz zu 
local KuechenTuer = 151

local morning  = {08, 12}; 	 -- HH:MM für Lichter an morgens in der früh
local night  = {23, 00}; -- HH:MM für Lichter aus in der Nacht
local Bettzeit  = {18, 30}; --Vor der Bettzeit vom Zwerg
local vorher = 20 		 -- 20 Minuten vor Sonnenuntergang angehen
local nachher = 5		 -- 5 Minuten Verzögerung nach Sonnenaufgang zum ausgehen
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 Bettzeit = os.date("%H:%M", -3600+ Bettzeit[1]*60*60 + Bettzeit[2]*60);
local ostime = os.date("%H:%M", os.time());
local currentTime = os.date("%H:%M");
local currentDate = os.date("*t");
local Regen = tonumber(fibaro:getGlobalValue("rain_hour"))

--if Regen == 0 
  --then fibaro:debug("Regen Nein")
  --else fibaro:debug("Regen Ja")
--end

--fibaro:debug("Morning-Zeit: "..morning)

--#########################################################################

--Damit je Seite das Script 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("SonneOstHoch", "0")
	fibaro:setGlobal("SonneWestRunter", "0")
	fibaro:setGlobal("SonneWestHoch", "0")  
   	fibaro:debug("Check für einmaligen Durchlauf zurückgesetzt. ")
  	--fibaro:call(223, "sendPush", "RunSonne wurde zurückgesetzt", "RunSunReset");
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 sowie wenn es gerade nicht regnet
if  ((currentTime >= morning) and
  	(Sonnenstand < SonneOstWeg) and
  	(tonumber(fibaro:getValue(TempID, "value")) >= GradNord) and
  	(tonumber(fibaro:getGlobalValue("SonneOstRunter")) == tonumber("0")) and
  	Regen == 0 )
  	then
	fibaro:debug("Sonne im Osten und Rollo geht runter")
		for i = 1,#RollosOst do
			fibaro:call(RollosOst[i],"setValue", RolloWert)
			--fibaro:debug("Aktuelle Dev ID: "..RollosOst[i])
		end
  		fibaro:setGlobal("SonneOstRunter", "1")
 		fibaro:call(223, "sendPush", "Rollos wegen Sonne im OSTEN runtergefahren")
end  

---- wieder Hoch weil Ost-Sonne weg ODER Regen, wenn Sonne im Osten steht
  	if ( (Sonnenstand >= SonneOstWeg and Sonnenstand <= SonneOstWeg+3 and
    	  tonumber(fibaro:getGlobalValue("SonneOstHoch")) == tonumber("0")	) 
  		  or 
    	  ( (currentTime >= morning) and
		  	(Sonnenstand < SonneOstWeg) and 
      		 tonumber(fibaro:getGlobalValue("SonneOstRunter")) == tonumber("1") and
  		  	 Regen > 0 ) ) then
  				if Regen > 0 then fibaro:debug("Rollo-Ost wegen Regen: "..Regen.." l) hochgefahren. ")
  			 	else fibaro:debug("Sonne im Osten weg und Rollos gehen hoch") end
  			 for i = 1,#RollosOst do
				fibaro:call(RollosOst[i], "open")
				--fibaro:debug("Aktuelle Dev ID: "..RollosOst[i])
			 end
  			 fibaro:setGlobal("SonneOstHoch", "1")
  	  		 fibaro:setGlobal("SonneOstRunter", "0")
	end

--############################################################################  
--Süd
--nur bei bestimmer Wärme, kein Regen 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") and
  		 Regen == 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: "..RollosSued[i])
			end
  			--Rollo Küchentür geht Runter bei Abwesenheit   
			if (tonumber(fibaro:getValue(306, "value")) == 0 
    		  or fibaro:getGlobalValue("Anwesend") == "Nein" ) then
      			fibaro:debug("Küchentür ist zu und Rollo geht gleich runter")
      			fibaro:sleep(2*60*1000)
      			--wenn nach zwei Minuten Küchentür immer noch zu ist, geht Rollo runter
    			--wenn Küchentür nach zwei Min geöffnet wird, bleibt Rollo oben
    			if tonumber(fibaro:getValue(306, "value")) == 0 then
    				fibaro:call(KuechenTuer, "setValue", RolloWert)
    				fibaro:debug("Küchentür-Rollo ist runter gefahren")
        		else fibaro:debug("Küchentür-Rollo ist geöffnet worden und NICHT runter gefahren")
      			end
    		else fibaro:debug("Küchentür ist OFFEN und Rollo bleibt oben")  
    		end    		
 	    	fibaro:setGlobal("SonneSuedRunter", "1")
   	 		fibaro:call(223, "sendPush", "Rollos wegen Sonne im SÜDEN runtergefahren")
  end
	
-------wieder Hoch  weil Sonne weg ODER Regen, wenn Sonne im Süden
	-- das "+2" in "SonneSuedWeg+2" soll einen "Sprung" im Sonnenstand abfangen, damit die Bedingung erfüllt ist
		if  (( (Sonnenstand >= SonneSuedWeg and Sonnenstand <= SonneSuedWeg+3) and
  			   tonumber(fibaro:getGlobalValue("SonneSuedHoch")) == tonumber("0") ) 
  			or 
      		 ((Sonnenstand >= SonneSuedDa and Sonnenstand < SonneSuedWeg) and
    		  (tonumber(fibaro:getGlobalValue("SonneSuedRunter")) == tonumber("1")) and
  		  	   Regen > 0 ) )
  			then	  
				if Regen > 0 then fibaro:debug("Rollo-Süd wegen Regen: "..Regen.." l) hochgefahren. ")
  			 	else fibaro:debug("Sonne im Süden weg und Rollos gehen hoch") end
  			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")
  			fibaro:setGlobal("SonneSuedRunter", "0")
		end
  
--############################################################################
--West
--nur bei bestimmer 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")) and
  		 Regen == 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:call(175, "close")
  		fibaro:call(165, "close")
  		fibaro:setGlobal("SonneWestRunter", "1")
 		fibaro:call(223, "sendPush", "Rollos wegen Sonne im WESTEN runtergefahren")
end

  -------wieder Hoch weil Sonne weg
		--Nur bestimmte Rollos sollen wieder geöffnet werden, nicht alle Rollos im Westen	
		if (Sonnenstand >= SonneWestWeg and Sonnenstand <= SonneWestWeg+2) and
  			(tonumber(fibaro:getGlobalValue("SonneWestHoch")) == tonumber("0"))
  			then	  
			fibaro:debug("Sonne im Westen weg und Rollos gehen hoch")
  			fibaro:call(149, "open")  --WoZi Fenster
  			fibaro:call(163, "open")  --Gast Fenster
  			fibaro:call(175, "open")  --SchlaZi Fenster
  			fibaro:setGlobal("SonneWestHoch", "1")
	  		fibaro:setGlobal("SonneWestRunter", "0")
 		end

------alle West-Rollos wieder Hoch weil Regen und Sonne im Westen steht
	if ((Sonnenstand >= SonneWestDa and Sonnenstand < SonneSuedWeg) and
  		 Regen > 0 and
    	 currentTime <= Bettzeit and
  		 tonumber(fibaro:getGlobalValue("SonneWestRunter")) == tonumber("1"))
  		then
  		fibaro:debug("Rollo-West wegen "..Regen.." l Regen hochgefahren. ")
  		for i = 1,#RollosWest do
			fibaro:call(RollosWest[i], Open)
			--fibaro:debug("Aktuelle Dev ID: "..RollosWest[i])
  		end
  		fibaro:call(175, "open")
  		fibaro:call(165, "open")
 		fibaro:setGlobal("SonneWestRunter", "0")
  	end	

--############################################################################

--für Rollosterungs-VD:
fibaro:call(316, "setProperty", "ui.Label4.value", "O: "..fibaro:getGlobalValue("SonneOstRunter").."  S: "..fibaro:getGlobalValue("SonneSuedRunter").."  W: "..fibaro:getGlobalValue("SonneWestRunter"))


Das Rollo an der Küchentür hatte ich - bilde ich mir zumindest ein - bereist über ein while-Abfrgae intelligenter gemacht, als nur über die if-Abfrage…

VG Hoggle

Hallo,

besteht die möglichkeit das jemand das VD von den Franzosen hier erklärt?
Ich blicke da leider nicht durch.
Das von Hoggle über die API des Herrn Hoffmann habe ich schon probiert, mir fehlt aber noch der API Key.

Gruß
Flo

Hallo, ich frag einfach nochmal nach Hilfe.

Das VD der Franzosen habe ich nach Anleitung “installiert”. In das IP Adressfeld des VD habe ich die nähest Station eingegeben.
Leider werden mir keinerlei Werte im VD angezeigt.
Kann mir da jemand Helfen?

Das alternative VD über die API von Sonnenverlauf.de geht bei mir auch nicht, da ich keine Antwort vom Betreiber zwecks API-Key bekomme.

Gruß
Tucher

Den Key versuche ich schon seit Jahren zu bekommen. Leider immer ohne Erfolg. Selbst diverse Email Adressen haben nichts gebracht ?

Mein Key ist mittlerweile auch nicht mehr gültig…
Schade, die Abenddämmerung war hilfreich…

Sehr schade zu hören.

Läuft denn das Französische VD bei euch?

Ja, das geht.