Onderstaande LUA scene kan je gebruiken als tijdssturing. Vermits ik voor zonsopgang en zonsondergang met globale variabelen wil werken, moeten deze op voorhand wel gedefinieerd zijn:
Hierbij de code. Je kan in de “timeEventMatrix” gewoon je tijdsgetriggerde scenes toevoegen als array (de eerste moet je laten staan):
“op welke dagen”,”startuur”,”startminuut”,”op te roepen sceneID”,”tekst voor debug”,”0″
--[[
%% autostart
%% properties
%% events
%% globals
--]]
-- "day", "hour", "minute"
-- day "zondag"=0 ; "maandag"=1 ; ... ; "zaterdag"=6 ; "all"=7
local timeEventMatrix={
{"7","0","1","special","Sun Change","0"}, --default event to update sunrise and sunset time
{"1","10","44","24","TimeScene","0"}
}
local timeEvents=#timeEventMatrix
local sr_Hour=0
local sr_Minute=0
local ss_Hour=0
local ss_Minute=0
function FN_Event(day,hour,minute)
fibaro:debug("Running Event at day "..day.." hour "..hour..":"..minute)
if ((tonumber(hour)==0) and (tonumber(minute)==1)) then
local ss=fibaro:getValue(1, "sunsetHour")
ss_Hour=tonumber(string.sub(ss, 1 , 2))
ss_Minute=tonumber(string.sub(ss,4) )
-- fibaro:debug("sunset hour: "..ss_Hour.." minute: "..ss_Minute)
local sr=fibaro:getValue(1, "sunriseHour")
sr_Hour=tonumber(string.sub(sr, 1 , 2))
sr_Minute=tonumber(string.sub(sr,4) )
-- fibaro:debug("sunset hour: "..sr_Hour.." minute: "..sr_Minute)
for i = 2,timeEvents do
-- fibaro:debug("reset event runstats")
timeEventMatrix[i][6]="0"
end
end
if ((tonumber(hour)==sr_Hour) and (tonumber(minute)==sr_Minute)) then
fibaro:debug("Sunrise Event - setting G_Zonstatus")
FN_SunriseEvent()
elseif ((tonumber(hour)==ss_Hour) and (tonumber(minute)==ss_Minute)) then
fibaro:debug("Sunset Event - setting G_Zonstatus")
FN_SunsetEvent()
end
for i = 2,timeEvents do
if ((day==timeEventMatrix[i][1]) and (hour==timeEventMatrix[i][2]) and (minute==timeEventMatrix[i][3]) and (timeEventMatrix[i][6]~="1")) then
fibaro:debug("Event "..i.." executing scene: "..timeEventMatrix[i][5])
fibaro:startScene(timeEventMatrix[i][4])
timeEventMatrix[i][6]="1"
end
end
end
function FN_SunriseEvent()
fibaro:setGlobal("G_ZonStatus","1")
end
function FN_minToSunrise(time_hour,time_minute)
if (time_hour*60+time_minute)<=(sr_Hour*60+sr_Minute) then
return ((sr_Hour*60+sr_Minute)-(time_hour*60+time_minute))
else
return ((sr_Hour*60+sr_Minute)+(24*60)-(time_hour*60+time_minute))
end
end
function FN_SunsetEvent()
fibaro:setGlobal("G_ZonStatus","0")
end
function FN_minToSunset(time_hour,time_minute)
if (time_hour*60+time_minute)<=(ss_Hour*60+ss_Minute) then
return ((ss_Hour*60+ss_Minute)-(time_hour*60+time_minute))
else
return ((24*60)-(time_hour*60+time_minute)+(ss_Hour*60+ss_Minute))
end
end
function FN_timeDiff(fromDay,fromHour,fromMinute,toDay,toHour,toMinute)
-- fibaro:debug("timediff between "..fromDay.." - "..fromHour..":"..fromMinute.." to "..toDay.." - "..toHour..":"..toMinute)
if (toDay==7) then
if (fromHour*60+fromMinute)<=(toHour*60+toMinute) then
return ((toHour*60+toMinute)-(fromHour*60+fromMinute))
else
return ((24*60)-(fromHour*60+fromMinute)+(toHour*60+toMinute))
end
end
if (fromDay==toDay) then
if (fromHour*60+fromMinute)<=(toHour*60+toMinute) then
return ((toHour*60+toMinute)-(fromHour*60+fromMinute))
else
return ((24*60*7)+(24*60)-(fromHour*60+fromMinute)+(toHour*60+toMinute))
end
elseif ((fromDay<toDay) and (toDay~=7)) then return ((24*60)-(fromHour*60+fromMinute)+(toDay-fromDay-1)*(24*60)+(toHour*60+toMinute)) elseif (fromDay>toDay) then
return ((24*60)-(fromHour*60+fromMinute)+(24*60*(6-fromDay+toDay))+(toHour*60+toMinute))
end
end
function calcSleep(time_day,time_hour,time_minute)
local sleepToSunset=FN_minToSunset(tonumber(time_hour),tonumber(time_minute))
-- fibaro:debug("Time to Sunset: "..sleepToSunset.." min")
local idevent="SunSet"
local sleepToSunrise=FN_minToSunrise(tonumber(time_hour),tonumber(time_minute))
-- fibaro:debug("Time to Sunrise: "..sleepToSunrise.." min")
local minsleep=sleepToSunset
if (sleepToSunrise<minsleep) then
minsleep=sleepToSunrise
idevent="SunRise"
end
for i = 1,timeEvents do
local es=FN_timeDiff(tonumber(time_day),tonumber(time_hour),tonumber(time_minute),tonumber(timeEventMatrix[i][1]),tonumber(timeEventMatrix[i][2]),tonumber(timeEventMatrix[i][3]))
-- fibaro:debug("Sleep to event "..i.." : "..es.." min")
if (es<minsleep) then minsleep=es idevent=timeEventMatrix[i][2]..":"..timeEventMatrix[i][3] end end fibaro:debug("Selected Event at "..idevent.." sleeptime: "..minsleep.." min") return minsleep end FN_Event("7","0","1") while true do local sleepNow=calcSleep(os.date("%w"),os.date("%H"),os.date("%M"))*60*1000 -- fibaro:debug("Sleeptime to nearest Event: "..sleepNow) if (sleepNow>=60000) then
sleepNow=sleepNow-30000
fibaro:debug("Sleeping for: "..sleepNow.." milliseconds")
fibaro:sleep(sleepNow)
else
FN_Event(os.date("%w"),os.date("%H"),os.date("%M"))
fibaro:debug("Sleeping for: 60000 milliseconds")
fibaro:sleep(60000)
end
end