Fibaro Home Center 2 – LUA-scen för att tända/släcka belysning – enkla versionen
Vi har tidigare gått igenom ett avancerat luascript som använder flera olika rörelsesensorer och timervariabler för att på ett intelligent sätt styra belysningen i våra lokaler. Det skriptet är antagligen mer avancerat än vad de flesta behöver, så här kommer den enkla varianten.
Scriptet nedan triggas av en rörelsesnsor eller en dörrsensor och använder den globala variabeln timer, och den globala variabeln night. Här kan du läsa mer om variabler, och här kan du läsa mer om hur du skapar en scen som sätter variabeln night.
Scriptet bör vara mycket lättare att förstå och modifiera än den avancerade varianten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
--[[ %% properties 47 value 43 value %% globals --]] --43 is the id of the PIR that is located outside near the door. --47 is the door sensor that detects if the door is opened or not. --Scene purpose -- IF PIR detects movement or door is opened then turn on lamp keep it on for 3 minutes -- but only do so if global variable "night" is true.. -- If new movement detected during the 3 minute period reset the timer to 3 minutes local sceneId = 16 --ID of this scene, used to detect number of instances run local timerEndTime = 180 --Seconds to keep the lamp turned on after PIR detects movement local timer = "timer" --Name of global variabel to control the timer local timerValue = fibaro:getGlobalValue(timer) --Current value of global variabel for timer local triggerValue = fibaro:getValue(43, "value") --Get PIR value that activated this scene local triggerValue2 = fibaro:getValue(47, "value") --Get Door sensor value that activated this scene local lights = 42 --light to be controlled by this scene fibaro:debug("start, timer = " .. timerValue .. " lights = " .. fibaro:getValue(lights, "value") .. " ,triggerValue = " .. triggerValue .. ",".. triggerValue2..", night = " .. fibaro:getGlobalValue("night")) --debug if ( fibaro:getValue(lights, "value") == "0" and triggerValue + triggerValue2 > 0 and tonumber(fibaro:getGlobalValue("night")) > 0) then --if the lights is off, one (or both) of the trigger values is true and the night variable is true... fibaro:call(lights, "turnOn") --Turn lights on fibaro:setGlobal(timer, timerEndTime) --Set global variabel for timer while (fibaro:getGlobalValue(timer) ~= "0") do --loop until timer is 0 timerValue = tonumber(fibaro:getGlobalValue(timer)) --Get current value of global variabel timer fibaro:setGlobal(timer, timerValue-1) --Decrease global variabel for timer with 1 second fibaro:debug("Loop - timer = " .. fibaro:getGlobalValue(timer)) --debug fibaro:sleep(1000) --Wait 1 second end fibaro:call(lights, "turnOff") --Turn lights off elseif fibaro:countScenes(sceneId) > 1 then --if scene is already running , reset the timer to 3 minutes fibaro:setGlobal(timer, timerEndTime) --set global variabel for timer to 2 minutes fibaro:debug("New instance, totalt = " .. fibaro:countScenes(sceneId)) --debug end |
Som vanligt svarar vi gärna på frågor!
6 svar till Fibaro Home Center 2 – LUA-scen för att tända/släcka belysning – enkla versionen
Hej!
Tack för bra post. Jag får dock ett Debug-fel som lyder:
[DEBUG] 12:05:29: line 25: attempt to concatenate local ’timerValue’ (a nil value)
Oerhört tacksam om ni kunde bistå med lite hjälp här!
Med vänlig hälsning, /Rasmus
Hej!
Det ser ut som du kanske missat att skapa den globala variabeln ”timer”. Dessa skapar du under ”Panels” -> ”Variable Panels”. Sen lägger du till en variabel som heter ”timer”, så borde felmeddelandet försvinna.
Felet beror på att koden hämtar in värdet på den globala variabeln ”timer” med anrop:
local timerValue = fibaro:getGlobalValue(timer)
I och med att variabeln inte finns sätts ”timerValue” till nil, vilket motsvarar ”inget värde” och då kan inte utskriften ske korrekt längre ner i koden (fibaro:debug på rad 25).
Nu har denna tråd några månader på nacken.. Men testar att väcka den.
Jag är ny i LUA djungeln och försöker lära mig lite.
Kommandona i sig är väl (mer eller mindre) logiska. Men det som alltid är lite lurigt när man testar färdiga scener och ändra ID:n och variabler att matcha sina egna, är formatteringen. Att bara klistra in och byta ID nummer har hittils aldrig funkat direct. Det kommer alltid t.ex mellanslag som genererar fel i stil med ”unexpected character at line xx.
Vad finns det för tumregler där? De scener jag testat, inkl denna, slutar med att jag får sudda varje mellanslag i början av varje rad tills koden körs igenom till botten utan fel.
Fråga 2..
Nu ser koden ut så här:
–[[
%% properties
220 value
%% globals
–]]
–220 RD3 – motion sensor bathroom downstairs
–Scene purpose
— IF motion sensor detects movement lamp keep it on for 3 minutes — but only do so if global variable ”night” is true..
— If new movement detected during the 3 minute period reset the timer to 3 minutes
local sceneId = 41 –ID of this scene, used to detect number of instances run
local timerEndTime = 180 –Seconds to keep the lamp turned on after PIR detects movement
local timer = ”timer” –Name of global variabel to control the timer
local timerValue = fibaro:getGlobalValue(timer) –Current value of global variabel for timer
local triggerValue = fibaro:getValue(220, ”value”) –Get motion sensor value that activated this scene
local lights = 23 –light to be controlled by this scene
fibaro:debug(”start, timer = ” .. timerValue .. ” lights = ” .. fibaro:getValue(lights, ”value”) .. ” ,triggerValue = ” .. triggerValue .. ”,night = ” .. fibaro:getGlobalValue(”night”)) –debug
if ( fibaro:getValue(lights, ”value”) == ”0” and triggerValue > 0 and tonumber(fibaro:getGlobalValue(”night”)) > 0) then
fibaro:call(lights, ”turnOn”)
fibaro:setGlobal(timer, timerEndTime)
while (fibaro:getGlobalValue(timer) ~= ”0”) do
timerValue = tonumber(fibaro:getGlobalValue(timer))
fibaro:setGlobal(timer, timerValue-1)
fibaro:debug(”Loop – timer = ” .. fibaro:getGlobalValue(timer))
fibaro:sleep(1000) end
fibaro:call(lights, ”turnOff”)
else
if fibaro:countScenes(sceneId) > 1
then fibaro:setGlobal(timer, timerEndTime)
fibaro:debug(”New instance, totalt = ” .. fibaro:countScenes(sceneId))
end
.. och jag får följande fel:
[DEBUG] 00:15:28: line 38: ’end’ expected (to close ’if’ at line 23)near
Nu har jag visserligen editerat den lite.. Gissar något väsentligt försvunnit? 🙂
Lua bryr sig egentligen inte om whitespace, det är främst för läsbarhet, så det enda jag kan tänka mig är antingen att HC2 inte har stöd för en viss typ av whitespace, eller att de whitespace-tecken som kopieras inte tolkas som whitespace av någon anledning.
Angående felmeddelandet gissar jag att det är en ”end” för lite i koden, jag tror det behöver vara en för både ”if”- och ”while”-blocket.
Kan det vara detta som spökar?
fibaro:sleep(1000) end
Vet inte.. Testat nu olika varianter. Ta bort end. Flytta till raden under.. Får samma fel.
Det skumma är att jag inte ändrat något på logiken i koden. Bortsett från kommentarerna som jag tog bort (för att bli av med diverse felmeddelanden..) så ser det ju likadant ut i er kod ovan.