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:
- G_ZonStatus
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