HC3 - "holiday lights"?

Post Reply
Dennis1
Ny medlem
Posts: 2
Joined: 19 May 2020, 13:00
4

Hej!
Någon som sitter på en scen för HC3 som tänder lite random belysning när man är bortrest?
Har begränsade kunskaper vad gäller LUA...
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

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
Dennis1
Ny medlem
Posts: 2
Joined: 19 May 2020, 13:00
4

Du är grym @Jang :)
Tack så mycket för detta!!
Post Reply