Universele Tijd Sturing

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

 

Een reactie achterlaten

Je e-mailadres zal niet getoond worden. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

Translate »