Här är en QA. Skapa en ny QuickApp, välj typ "com.fibaro.binarySwitch", klistra in koden nedan, och skapa en QuickApp variabel som heter "lights" med en lista av vilka lampor som ska ingå i simuleringen. Ex. lights= "55 88 23".
QA:n är en av/på switch och man slår av på simuleringen genom att trycka på knappen (grön/röd "måltavla") eller anropa "turnOn"/"turnOff" kommandon från t.ex en scen.
Algorimen är enkel och kan göras mer avancerad. Ex. tända färre ljus på nattetid. Nu kommer det att vara full fart hela naten
Var 8:e minut tänds en lampa (om inte alla redan är tända) och efter 10-30min släcks den. Det går att styra med variablerna i koden nedan.
Någon får gärna förbättra algoritmen/koden/finesserna.
Code: Select all
local lights = {}
local timer = nil
local interval = 8
local minLength,maxLength = 10,30
local function scheduleLights(self)
local freeLights = {}
for _,light in ipairs(lights) do if light.free then freeLights[#freeLights+1]=light end end
if #freeLights < 1 then return end -- No lights to schedule, just return
local index = math.random(1,#freeLights) -- pick a light, any light
local light = freeLights[index]
light.free = false
fibaro.call(light.deviceId,"turnOn")
local onTime = math.random(minLength,maxLength)
self:debug("Turning on light ",light.deviceId, " and off in ",onTime," minutes")
light.timer=setTimeout(function() -- schedule time in future we turn off the light
fibaro.call(light.deviceId,"turnOff")
self:debug("Turning off light ",light.deviceId)
light.free = true
light.timer = nil
end,onTime*60*1000)
end
function QuickApp:turnOn()
if timer == nil then
self:debug("Turning on")
self:updateProperty("value",true)
self:updateProperty("state",true)
states = {}
for _,light in ipairs(lights) do -- save current light states so we can restore when we stop
light.state=fibaro.getValue(light.deviceId,'value')
light.state = light.state==nil and false
end
timer = setInterval(function() scheduleLights(self) end,interval*60*1000) -- start turning on lights every Xmin
scheduleLights(self) -- schedule directly also...
end
end
function QuickApp:turnOff()
if timer then
self:debug("Turning off")
self:updateProperty("value",false)
self:updateProperty("state",false)
for _,light in ipairs(lights) do -- restore light states
--fibaro.call(light,'setValue',light.state)
if light.timer then clearTimeout(light.timer) end -- cancel off timer, if any
light.free = true
light.timer = nil
end
clearInterval(timer)
timer = nil
end
end
function QuickApp:onInit()
self:debug("HolidayLights, deviceId:",plugin.mainDeviceId)
lightsStr = self:getVariable("lights")
lights = {}
lightsStr:gsub("%d+", function(light)
lights[#lights+1]={deviceId=tonumber(light), free=true}
end)
if #lights == 0 then
self:debug("No lights configured. Please set quickApp variable 'lights' with list of devices")
end
self:updateProperty("value",false)
self:updateProperty("state",false)
end