Hallo Bastian,
anbei einmal der vollständige Code:
--[[
%% autostart
%% properties
%% globals
--]]
local minSonAuf = '00' -- Vohrzeichen - + min. wo die Sonne Frueher auf geht... SonnenAufgang.
local minSonUnt = '00' -- Vohrzeichen - + min. wo die Sonne Spaeter unter geht... SonnenUntergang.
local zeitFruehstensAuf = '06:00' --Fruehstens wenn die Sonne auf geht.
local zeitSpaetestensAuf = '08:00' --Spaetestens wenn die Sonne auf geht.
local zeitMaxUntergang = '22:00' --Spaetestens wenn die Sonne unter geht.
local startSunLux = 300000; -- über 20.000 Lux für zu
local startSunTemp = 30;
local startSunDelay = 5; -- 5 Min bis zu
local endSunLux = 6000; -- unter 6.000 Lux für auf
local endSunDelay = 20; -- 20 Min bis auf
local sunProtectPosition = 77; -- Sonnen schutz position für Rollos.
local sunProtectPosition1 = 45; -- Sonnen schutz position für Rollos (Terrassentür).
local luxSensor = 67 -- Helichkeits sensor.
local tempSensor = 205 -- Temperatursensor
local rebootSceneID = 170 -- ID der eigenen Scene die rebotet wird.
local meldungenDebug = 0 -- hilfs vareable um die meldungen nicht an dauernd zu wiederholen.
local rs_living_1 = 152;
local rs_living_2 = 150;
local rs_living_3 = 154;
local rs_living_4 = 175;
local rs_kueche_1 = 181;
local rs_hwr_1 = 183;
local rs_bad_1 = 185;
local doorID1 = 22;
local doorID2 = 26;
local doorID3 = 30;
local phoneID = {fibaro:getGlobal("var_mareen_handy"), fibaro:getGlobal("var_daniel_handy")} -- Handy-IDs
local maxID = 2000
-----------------------------------------------------------------------------------------
debug = function ( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
--#######################################################################################
local sourceTrigger = fibaro:getSourceTrigger();
function sceneReboot()
local currentDate = os.date("*t");
if ((currentDate.hour == 2) and (currentDate.min >= 0)and (currentDate.min < 1))
or sourceTrigger["type"] == "other" then
debug('salmon',"Neustart der Scene!")
fibaro:sleep(1*60*1000)
fibaro:startScene(rebootSceneID);
end
setTimeout(sceneReboot, 1*60*1000)
end
--#######################################################################################
debug('gold', ""..fibaro:getValue(1,'sunriseHour').." ... echte SonnenAufgang")
debug('steelblue', ""..minSonAuf.." min... Aufgesetzte zeit in minuten bis Sonnen Aufgang.")
local a, b = fibaro:getValue(1,'sunriseHour'):match("([^,]+):([^,]+)")
local VersetzteSonnenAufgang = os.date("%H:%M", -3600+ a*60*60 + (b*60+minSonAuf*60));
debug('yellow',""..VersetzteSonnenAufgang.." Versetzte.... SonnenAufgang")
----------------------------------------------------------------------------------------
debug('orangered',""..fibaro:getValue(1,'sunsetHour').. " ... echte SonnenUntergang")
debug('steelblue', ""..minSonUnt.." min... Aufgesetzte zeit in minuten bis Sonnen Untergang.")
local a, b = fibaro:getValue(1,'sunsetHour'):match("([^,]+):([^,]+)")
local VersetzteSonnenUntergang = os.date("%H:%M", -3600+ a*60*60 + (b*60+minSonUnt*60));
debug('orangered',""..VersetzteSonnenUntergang.." Versetzte... SonnenUntergang")
--########################################################################################
if VersetzteSonnenAufgang > zeitFruehstensAuf and VersetzteSonnenAufgang < zeitSpaetestensAuf then
debug('yellow',"Die Rollos werden um "..VersetzteSonnenAufgang.. " auf gehen.")
elseif VersetzteSonnenAufgang < zeitFruehstensAuf then
debug('yellow',"Die Rollos werden um "..zeitFruehstensAuf.. " auf gehen.")
elseif VersetzteSonnenAufgang > zeitSpaetestensAuf then
debug('yellow',"Die Rollos werden um "..zeitSpaetestensAuf.. " auf gehen.")
end
--------------------------------------------------------------------------------------------
if VersetzteSonnenUntergang > zeitMaxUntergang then
debug('steelblue',"Die Rollos werden um "..zeitMaxUntergang.. " unter gehen.")
else
debug('steelblue',"Die Rollos werden um "..VersetzteSonnenUntergang.. " runter gehen.")
end
--#########################################################################################
debug('darkgreen',"Rollershutter-Controller startet das erste mal!");
function rollerShutter()
----------------------------------------------------------------------------------------
local a, b = fibaro:getValue(1,'sunriseHour'):match("([^,]+):([^,]+)")
local VersetzteSonnenAufgang = os.date("%H:%M", -3600+ a*60*60 + (b*60+minSonAuf*60));
----------------------------------------------------------------------------------------
local a, b = fibaro:getValue(1,'sunsetHour'):match("([^,]+):([^,]+)")
local VersetzteSonnenUntergang = os.date("%H:%M", -3600+ a*60*60 + (b*60+minSonUnt*60));
----------------------------------------------------------------------------------------
local currentDate = os.date('*t');
local rollershutter_runs = tonumber(fibaro:getGlobalValue('rollershutter_runs'));
local SonnenSchutz = tonumber(fibaro:getGlobalValue('SonnenSchutz'));
----------------------------------------------------------------------------------------
local version = '2.0';
local currentDate = os.date('*t');
local rollershutter_runs = tonumber(fibaro:getGlobalValue('rollershutter_runs'));
local random = math.random(27); --Zufallswert von 0-45min
local min = math.floor((random*100)/60);
----------------------------------------------------------------------------------------
-----------------------------Random Sonnenuntergang-------------------------------------
local randomzu = math.random(18,36); --Zufallswert zwischen 30min (18) und 60min (36)
local minzu = math.floor((random*100)/60);
------------------------------------------------------------------------------------------
---################# SonnenSchutz... rollos runter fahren !! #########################---
------------------------------------------------------------------------------------------
if ( tonumber(fibaro:getValue(luxSensor, "value")) > startSunLux )
and ( tonumber(fibaro:getValue(tempSensor, "value")) > startSunTemp )
and (os.date("%H:%M", os.time()) > VersetzteSonnenAufgang)
and (os.date("%H:%M", os.time()) < VersetzteSonnenUntergang)
and (tonumber(SonnenSchutz) == 0)
then
fibaro:setGlobal('SunFirstMaxTimeLux', '1');
local gSunFirstMaxTimeLux = fibaro:getGlobalModificationTime('SunFirstMaxTimeLux')
if ( tonumber(fibaro:getValue(luxSensor, "value")) > startSunLux )
and ((os.time() - gSunFirstMaxTimeLux) >= startSunDelay*60)
then
---------------- Rollos eintragen ----------------------------------------
fibaro:call(rs_living_1, "setValue", sunProtectPosition1+5); --Tuere
fibaro:call(rs_living_2, "setValue", sunProtectPosition+5); --Tuere
fibaro:call(rs_living_3, "setValue", sunProtectPosition1+5); --Tuere
fibaro:call(rs_living_4, "setValue", sunProtectPosition1+5); --Tuere
--fibaro:call(100, "setValue", sunProtectPosition);--FensterFlur obergeschoss zur
---------------------------------------------------------------------------
debug('greenyellow', fibaro:getValue(luxSensor, "value")..' Lux ... Die Rollos fahren auf ' ..sunProtectPosition..'%!!!')
debug('greenyellow', fibaro:getValue(tempSensor, "value")..' Temp ... Die Rollos fahren auf')
fibaro:setGlobal('SunFirstMaxTimeLux', '0');
fibaro:setGlobal('SunFirstMinTimeLux', '0');
fibaro:setGlobal('SonnenSchutz', '1'); --SonnenSchutz wurde gesetzt.
fibaro:setGlobal('RolloUnten0Oben1', '0');
meldungenDebug = 0
elseif meldungenDebug == 0 then
debug('lightsteelblue','Die Rollos bleiben oben... es sind ' ..fibaro:getValue(luxSensor, "value")..' Lux und '..startSunDelay..' min bis die Rollos auf ' ..sunProtectPosition..'% fahren.')
meldungenDebug = 1 --damit er nicht immer die gleiche meldung schreibt wie odas ueber ihm.
end
------------------------------------------------------------------------------------------
---################# SonnenSchutz... rollos rauf fahren !! ###########################---
------------------------------------------------------------------------------------------
elseif ( tonumber(fibaro:getValue(luxSensor, "value")) < endSunLux )
and (os.date("%H:%M", os.time()) > VersetzteSonnenAufgang)
and (os.date("%H:%M", os.time()) < VersetzteSonnenUntergang)
and (tonumber(SonnenSchutz) == 1)
then
fibaro:setGlobal('SunFirstMinTimeLux', '1');
local gSunFirstMinTimeLux = fibaro:getGlobalModificationTime('SunFirstMinTimeLux')
if ( tonumber(fibaro:getValue(luxSensor, "value")) < endSunLux )
and ((os.time() - gSunFirstMinTimeLux) >= endSunDelay*60)
then
---------------- Rollos eintragen --------------------------------------------------
fibaro:call(rs_living_1, 'open');
fibaro:call(rs_living_2, 'open');
fibaro:call(rs_living_3, 'open');
fibaro:call(rs_living_4, 'open');
--------------------------------------------------------------------------------------
debug('greenyellow', fibaro:getValue(luxSensor, "value")..' Die Rollos fahren rauf!!!')
fibaro:setGlobal('SunFirstMaxTimeLux', '0');
fibaro:setGlobal('SunFirstMinTimeLux', '0');
fibaro:setGlobal('SonnenSchutz', '0'); --SonnenSchutz wurde entfernt.
fibaro:setGlobal('RolloUnten0Oben1', '1');
meldungenDebug = 0
elseif meldungenDebug == 0 then
debug('lightsteelblue','Rollos bleiben auf ' ..sunProtectPosition..' % ... es sind ' ..fibaro:getValue(luxSensor, "value")..' Lux und '..endSunDelay..' min bis die Rollos rauf fahren.')
meldungenDebug = 1 --damit er nicht immer die gleiche meldung schreibt wie odas ueber ihm.
end
------------------------------------------------------------------------------------------
---################# SonnenAufgang !! ###############################################--
------------------------------------------------------------------------------------------
elseif ((VersetzteSonnenAufgang > zeitFruehstensAuf
and os.date("%H:%M", os.time()) == VersetzteSonnenAufgang)
or (VersetzteSonnenAufgang < zeitFruehstensAuf
and os.date("%H:%M", os.time()) == zeitFruehstensAuf)
or (VersetzteSonnenAufgang > zeitSpaetestensAuf
and os.date("%H:%M", os.time()) == zeitSpaetestensAuf)
and (0 < tonumber(fibaro:getValue(tempSensor, "value")))
and (tonumber(rollershutter_runs) == 0))
then
debug('darkkhaki',"--------------------------------------------------------------");
debug('darkkhaki',"Rollershutter-Controller gestartet (Ver." .. version .. ")");
debug('darkkhaki', fibaro:getValue(tempSensor, "value")..' Grad Außentemperatur ');
fibaro:setGlobal('rollershutter_runs', '1');
fibaro:debug('Sonnenaufgang... öffne Rollos');
fibaro:debug('Waiting ' .. min .. ' min');
fibaro:sleep(random*100000);
fibaro:call(rs_living_1, 'open');
fibaro:call(rs_living_2, 'open');
fibaro:call(rs_living_3, 'open');
fibaro:call(rs_living_4, 'open');
fibaro:call(rs_kueche_1, 'open');
fibaro:call(rs_hwr_1, 'open');
fibaro:call(rs_bad_1, 'open');
debug('yellow',"Rollos wurden geoefnet.");
fibaro:setGlobal('SunFirstMaxTimeLux', '0');
fibaro:setGlobal('SunFirstMinTimeLux', '0');
fibaro:setGlobal('SonnenSchutz', '0'); --SonnenSchutz wurde entfernt.
fibaro:setGlobal('rollershutter_runs', '0');
fibaro:setGlobal('RolloUnten0Oben1', '1');
if (os.date("%H:%M", os.time()) >= VersetzteSonnenAufgang) then
debug('coral',"Es ist Tag");
end
-----------------------------------------------------------------------------------------
---################ SonnenUntergang !! ###########################################---
-----------------------------------------------------------------------------------------
elseif ((VersetzteSonnenUntergang < zeitMaxUntergang
and os.date("%H:%M", os.time()) == VersetzteSonnenUntergang)
or (VersetzteSonnenUntergang > zeitMaxUntergang
and os.date("%H:%M", os.time()) == zeitMaxUntergang)
and (0 < tonumber(fibaro:getValue(tempSensor, "value")))
and (tonumber(rollershutter_runs) == 0))
then
debug('darkkhaki',"--------------------------------------------------------------");
debug('darkkhaki',"Rollershutter-Controller hat gestartet (Ver." .. version .. ")");
debug('darkkhaki', fibaro:getValue(tempSensor, "value")..' Grad Außentemperatur ');
fibaro:setGlobal('rollershutter_runs', '1');
fibaro:debug('Sonnenunter... schließe Rollos');
fibaro:debug('Waiting ' .. minzu .. ' min');
fibaro:sleep(randomzu*100000);
------ID für close ohne prüfung eines offenen Fensters------------
--fibaro:call(rs_living_4, 'close')
fibaro:call(rs_living_4, "setValue", "40");
--fibaro:call(rs_kueche_1, 'close');
fibaro:call(rs_kueche_1, "setValue", "40");
fibaro:call(rs_hwr_1, 'close');
fibaro:call(rs_bad_1, 'close');
while
(tonumber(fibaro:getValue(doorID1, 'value')) > 0) do --prüft ob Fester offen, wenn ja wird fenster nicht geschlossen
fibaro:sleep(10*1000)
end
fibaro:call(rs_living_1, 'close');
while
(tonumber(fibaro:getValue(doorID3, 'value')) > 0) do --prüft ob Fester offen, wenn ja wird fenster nicht geschlossen
fibaro:sleep(10*1000)
end
fibaro:call(rs_living_3, 'close');
while
(tonumber(fibaro:getValue(doorID2, 'value')) > 0) do --prüft ob Fester offen, wenn ja wird fenster nicht geschlossen
fibaro:sleep(10*1000)
end
--fibaro:call(rs_living_2, 'close');
fibaro:call(rs_living_2, "setValue", "70");
debug('royalblue',"Rollos wurden geschlossen.");
fibaro:setGlobal('SunFirstMaxTimeLux', '0');
fibaro:setGlobal('SunFirstMinTimeLux', '0');
fibaro:setGlobal('SonnenSchutz', '0'); --SonnenSchutz wurde entfernt.
fibaro:setGlobal('rollershutter_runs', '0');
fibaro:setGlobal('RolloUnten0Oben1', '0');
if (os.date("%H:%M", os.time()) >= VersetzteSonnenUntergang) then
debug('royalblue',"Es ist Nacht");
end
--######################-Temperaturprüfung-######################
elseif (10 < tonumber(fibaro:getValue(tempSensor, "value"))
and (tonumber(RolloUnten0Oben1) == 1))
then
debug('darkkhaki', fibaro:getValue(tempSensor, "value")..' Grad Außentemperatur ');
fibaro:debug('Frostgrenze erreicht, Rollläden konnten nicht geöffnet werden!');
for k=1, maxID do
if phoneID[k] ~= nil then
--fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: Außentemperaur <= 0 Grad. Rollläden manuell schließen!')
fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: Außentemperaur ' ..fibaro:getValue(tempSensor, "value").. ' Grad. Rollläden manuell schließen!')
debug('darkkhaki', fibaro:getValue(tempSensor, "value")..' Grad Außentemperatur!!!');
end
end
end
---#######################################################################################
setTimeout(rollerShutter, 60*1000);
end
--########################################################################################
if (sourceTrigger['type'] == 'autostart') then
rollerShutter();
sceneReboot();
elseif (sourceTrigger['type'] == 'property') then
fibaro:debug('Source device = ' .. sourceTrigger['deviceID'])
elseif (sourceTrigger['type'] == 'global') then
fibaro:debug('Global variable source = ' .. sourceTrigger['name'])
elseif (sourceTrigger['type'] == 'other') then
---------------- Rollos eintragen ----------------------------------------
if(os.date("%H:%M", os.time()) > VersetzteSonnenAufgang)
and(os.date("%H:%M", os.time()) < VersetzteSonnenUntergang) then
fibaro:call(rs_living_1, 'open');
fibaro:call(rs_living_2, 'open');
fibaro:call(rs_living_3, 'open');
fibaro:call(rs_living_4, 'open');
fibaro:call(rs_kueche_1, 'open');
fibaro:call(rs_hwr_1, 'open');
fibaro:call(rs_bad_1, 'open');
debug('coral',' Die Rollos fahren in grundstellung!!!')
fibaro:setGlobal('SunFirstMaxTimeLux', '0');
fibaro:setGlobal('SunFirstMinTimeLux', '0');
fibaro:setGlobal('SonnenSchutz', '0'); --SonnenSchutz wurde entfernt.
fibaro:setGlobal('RolloUnten0Oben1', '1');
else
debug('royalblue',' Es ist Nacht!!!')
fibaro:setGlobal('SunFirstMaxTimeLux', '0');
fibaro:setGlobal('SunFirstMinTimeLux', '0');
fibaro:setGlobal('SonnenSchutz', '0'); --SonnenSchutz wurde entfernt.
end
---------------------------------------------------------------------------
fibaro:debug('Other source.')
end
--###########################################################################################