[BLOG] Fibaro Home Center 2 - LUA-scen för att tända/släcka

I denna kategori diskuteras inlägg på blog.m.nu
Användarvisningsbild
supportM
Moderator
Inlägg: 342
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping

[BLOG] Fibaro Home Center 2 - LUA-scen för att tända/släcka

Inlägg av supportM » 20 okt 2014, 21:48

Detta inlägg kommer från ett blogginlägg. För att läsa originalinlägget, klicka här »

Fibaro Home Center 2 har stöd för scener som skrivs med LUA-kod. Möjligheterna är mycket stora att göra användbara avancerade scener. Vi har tänkt att vi i några korta guider ska presentera ett par olika scener.

Syftet med denna scen är att tända och sedan automatiskt släcka belysningen i våra lokaler.
  • Om rörelse detekteras i lagret tänds all belysning förutom vid Micron och hålls tänd i 20 minuter om ingen ny rörelse detekteras.
  • Om rörelse detekteras vid micron tänds all belysning och hålls tänd i 5 minuter om ingen ny rörelse detekteras.
TAnken med att ha två olika timervärden är att det inte är säkert att belysningen behövs i lagret bara för att man varit vid micron, och är man vid micron är man inte där särskilt länge.

Rörelsesensorn i lagret sitter inte helt optimalt till så man får gå en bit i mörker för att den ska triggas, och då är det fiffigt att tända allt när man är vi micron så man slipper gå i mörker i lagret. (Hänger ni med?)

Rörelsesensorn i lagret tänder dock inte vid Micron, för kommer man från lagret sitter rörelsesensorn bra till och tänder lampan lagom tills man är framme

Scriptet är välkommenterat, självklart är det bara att fråga om något är otydligt.

För att scriptet ska fungera måste variablerna timerMicro och timerLager vara skapade i panelen variabler. Här kan du läsa mer om variabler.


--[[
%% properties
152 value
202 value
%% globals
--]]

--152 = PIR Lager
--202 = PIR Micro

--Scene purpose
-- IF PIR detects movement at "Lager" then turn on all lamps except at the Micro and keep them on for 20 minutes.
-- If PIR detects movement at "Micro" then turn on all lamps and keep them on for 5 minues.

-- If new movement is detected within the timerange the timers are reset to keep lamps on.

local sceneId = 25 --ID of this scene, used to detect number of instances run
local timerEndLager = 1200 --Seconds to keep the lamp turned on after PIR detects movement
local timerEndMicro = 300 --Seconds to keep the lamp turned on after PIR detects movement
local timerEndMain = timerEndLager -- Set default timer value (will be altered if it's movement at the Micro)
local timerLager = "timerLager" --Name of global variabel to control the timer in Lager
local timerMicro = "timerMicro"
local timerValueLager = fibaro:getGlobalValue(timerLager) --Current value of global variabel for timer
local timerValueMicro = fibaro:getGlobalValue(timerMicro) --Current value of global variabel for timer
local pirLager = fibaro:getValue(152, "value") --Get PIR value that activated this scene
local pirMicro = fibaro:getValue(202, "value") --Get PIR value that activated this scene
local lampaArbetsbank = 86 --lights to be controlled by this scene
local lampaGang = 128
local lampaSwitch = 145
local lampaNyaLagret = 196
local lampaMicro = 78
local lampaEntre = 40
local fan = 156 --forced ventilation

if ( tonumber(pirLager) 0 ) then --First run and Pir is triggered
fibaro:debug("Lets begin")
fibaro:call(lampaArbetsbank, "turnOn") --Turn lights on
fibaro:call(lampaGang, "turnOn")
fibaro:call(lampaSwitch, "turnOn")
fibaro:call(lampaNyaLagret, "turnOn")
fibaro:call(lampaEntre, "turnOn")
fibaro:call(fan, "turnOn")
if ( tonumber(pirMicro) > 0 ) then
fibaro:debug("Micro on")
fibaro:call(lampaMicro, "turnOn")
fibaro:setGlobal(timerMicro,timerEndMicro) --Set global variable to the correct timer
end
fibaro:setGlobal(timerLager, timerEndMain) --Set global variable to the correct timer
while (fibaro:getGlobalValue(timerLager) ~= "0") do -- loop until the timer reaches 0
timerValueLager = tonumber(fibaro:getGlobalValue(timerLager)) --Get current value of global variabel timer
timerValueMicro = tonumber(fibaro:getGlobalValue(timerMicro)) --Get current value of global variabel timer
if ( timerValueMicro > 0 ) then
fibaro:setGlobal(timerMicro, timerValueMicro-1) --Decrease global variabel for timer with 1 second
end
if ( timerValueMicro == 0 ) then
fibaro:call(lampaMicro, "turnOff")
end
fibaro:setGlobal(timerLager, timerValueLager-1) --Decrease global variabel for timer with 1 second
fibaro:debug("Loop - timerLager = " .. fibaro:getGlobalValue(timerLager) .. "timerMicro = " .. fibaro:getGlobalValue(timerMicro))
fibaro:sleep(1000) --Wait 1 second
end
--times up
fibaro:debug("Släcker")
fibaro:call(lampaArbetsbank, "turnOff") --Turn lights on
fibaro:call(lampaGang, "turnOff")
fibaro:call(lampaSwitch, "turnOff")
fibaro:call(lampaNyaLagret, "turnOff")
fibaro:call(lampaEntre, "turnOff")
fibaro:call(lampaMicro, "turnOff")
elseif fibaro:countScenes(sceneId) > 1 then --We've already got an instance of this scene running in the background main purpose now is to reset the timer since new movement is detected
fibaro:call(lampaArbetsbank, "turnOn") --Turn lights on, just to be sure they are on
fibaro:call(lampaGang, "turnOn")
fibaro:call(lampaSwitch, "turnOn")
fibaro:call(lampaNyaLagret, "turnOn")
fibaro:call(lampaEntre, "turnOn")
fibaro:call(fan, "turnOn")
if ( tonumber(pirMicro) > 0 ) then
fibaro:call(lampaMicro, "turnOn")
fibaro:setGlobal(timerMicro,timerEndMicro) --Set global variable to the correct timer
end
fibaro:setGlobal(timerLager, timerEndMain) --Reset the timer, full value if Lager is triggered, Micro value if timer is less than micro and current value if micro is triggered and timer is greater than the micro values.
end
fibaro:debug("End, instances = " .. fibaro:countScenes(sceneId))