Man kan i princip använda alla typer av VDs som sätter en fibaro global med en tid. Jompa har en AlarmClock VD som borde fungera.
En finess i ER som inte har använts så mycket är att man kan skapa en VD inifrån ER. Fördelen är att man kan hantera knapptryck etc med funktioner definierade i ER.
Så här skulle man kunna göra (inkluderas i main())
Code: Select all
local myTimerVars = {
{name='bedtime', descr="Läggdags"},
{name='garbage', descr="Soptunna ut"},
{name='excercise', descr="Träna"},
}
function setUpTimerVD(vars,vers)
local controllerDef =
{
{'label',{"Variabel:","VAR",""}},
{'button',{"<<","BKW"},{">>","FW"}},
{'label',{"Tid","TIME","--:--"}},
{'button',{"+H","PH"},{"-H","MH"},{"+M","PM"},{"-M","MM"}},
{'slider',{"Tid","TS"}},
{'label',{"Dagar:","DAYS",""}},
{'button',{"Må","DAY2"},{"Ti","DAY3"},{"On","DAY4"},{"To","DAY5"},{"Fr","DAY6"}},
{'button',{"Lördag","DAY7"},{"Söndag","DAY1"}},
{'label',{"Aktiverad","ACTIVATED","Ja"}},
{'button',{"Aktivera / Deaktivera","ACT"}},
{'button',{"Updatera","UPDATE"}},
}
ctrl = VDev.define("Tidsvariabler","contrl",vers,controllerDef)
for i=1,#vars do -- update and create missing variables
local v = vars[i]
v.time = v.time or os.time()
v.days = v.days or "sun,mon,tue,wed,thu,fri,sat"
local vv,tt = fibaro:getGlobal(v.name)
if tt == nil then
api.post("/globalVariables/",{name=v.name,value=json.encode(v)})
else
vars[i]=json.decode(fibaro:getGlobalValue(v.name))
end
end
local DayMap={'sun','mon','tue','wed','thu','fri','sat'}
local function t2str(t) return string.format("%02d:%02d",t/3600,(t % 3600)/60) end
local function limit(t) local m = 24*60*60; if t < 0 then return t+m elseif t > m then return t-m else return t end end
local function current()
local v = ctrl.getValue("VAR")
for i=1,#vars do if v==vars[1].descr then return i end end
return 1
end
local curr = current()
local function update() -- update all fields in VD
vars[curr].time = vars[curr].time or 0
vars[curr].days = vars[curr].days or ""
ctrl.setValue("VAR",vars[curr].descr)
ctrl.setValue("TIME",t2str(vars[curr].time))
ctrl.setValue("DAYS",vars[curr].days)
ctrl.setValue("ACTIVATED",vars[curr].active and "Ja" or "Nej")
end
update()
Event.event({type='VD',label='BKW'},
function(env) curr=curr-1 if curr < 1 then curr=#vars end update() end)
Event.event({type='VD',label='FW'},
function(env) curr = curr+1; if curr > #vars then curr=1 end update() end)
Event.event({type='VD',label='PH'},
function(env) vars[curr].time = limit(vars[curr].time+60*60) update() end)
Event.event({type='VD',label='MH'},
function(env) vars[curr].time = limit(vars[curr].time-60*60) update() end)
Event.event({type='VD',label='PM'},
function(env) vars[curr].time = limit(vars[curr].time+60) update() end)
Event.event({type='VD',label='MM'},
function(env) vars[curr].time = limit(vars[curr].time-60) update() end)
Event.event({type='VD',label='TS'},
function(env) vars[curr].time = math.floor(24*60*60*env.event.value/100) update() end)
Event.event({type='VD',label='$d==DAY%d'},
function(env)
local d = DayMap[tonumber(env.p.d:sub(4))]
local s = split(vars[curr].days or "",",")
local r1,r2 = {},{}; for _,dd in ipairs(s) do r1[dd]=true end
r1[d]= not r1[d]
for _,dd in ipairs(DayMap) do if r1[dd] then r2[#r2+1]=dd end end
vars[curr].days=table.concat(r2,",")
update()
end)
Event.event({type='VD',label='ACT'}, function(env) vars[curr].active = not vars[curr].active update() end)
Event.event({type='VD',label='UPDATE'}, function(env) fibaro:setGlobal(vars[curr].name,json.encode(vars[curr])) end)
end
setUpTimerVD(myTimerVars,10)
rule("@$bedtime.time & $bedtime.active & wday($bedtime.days) => log('HUPP')")
funktionen setUpTimerVD skapar en VD när ER startar upp (och om den redan finns så återanvänds den befintliga)
Den tar en tabell myTimerVars där man definierar upp fibaro globaler (name) och en beskrivning (descr)
I VDn kan man flippa mellan variabler och sätta tid, dagar och om den ska vara aktiv.
Man måste också klicka på update för att värdet ska sparas i fibaro global variablen.
Om man har satt variablen bedtime i VD så kommer den globala variabeln att ha värde
Code: Select all
{time=3600, descr="Läggdags", active=true, days="sun,mon,tue,wed,thu,fri,sat"}
(tiden spars som sekunder efter midnatt, i det här falle 01:00, det interna tidsformatet i ER)
Man kan utnyttja det i ER regler genom att då skriva
Code: Select all
rule("@$bedtime.time & $bedtime.active & wday($bedtime.days) => log('HUPP')")
Den regeln schedulerar en timer till den tid som finns i $bedtime.time, den kollar dessutom att timern är aktiv ($bedtime.active) och den kollar att det är en giltig dag med wday($bedtime.days)
Det kan vara ngt jag förbisett i det här exemplet men prova gärna.
Obs, reglerna måste definieras efter att setUpTimerVD har anropats.