Forum użytkowników automatyki budynkowej
Z-wave => Fibaro - sceny => Wątek zaczęty przez: krystian_man w Czerwiec 07, 2018, 09:42:22 pm
-
Witam
Skonfigurowałem scenę, która po zmroku zapala światło gdy czujnik ruchu systemu alarmowego jest naruszony, a gasi gdy czujnik ruchu jest nienaruszony przez 120s. Wszystko działa jednak w notyfikacjach wyświetla się komunikat dotyczący sceny gaszenia światła o przekroczonym limicie instancji. Proszę o pomoc w znalezieniu problemu.
-
na początek zwiększ liczbę instancji i sprawdź czy w Twoim przypadku będzie dobrze
Liczba instancji to informacja ile razy scena została aktywowana, a w przypadku wyłączenia scena jest aktywowana za każdym razem gdy czujka przejdzie w stan spoczynku (nie wykrywa ruchu) a kończy się dopiero po 120s i w tym czasie scena jest aktywowana kilkukrotnie i stąd ten komunikat
-
Cześć,
niżej gotowa scena zapalania i gaszenia światła. Wprowadź drobne modyfikacje pod siebie i będzie OK. Używam jej w wiatrołapie. Automatycznie zapala i gasi światło po naruszeniu czujki satel lub DorWindowSensor Fibaro (dwa czujniki 'lub'). Usuń jeden i będzie OK.
Jeżeli któryś z czujników jest naruszony, odliczanie zaczyna się od nowa i zgasi światło dopiero, gdy każdy z nich będzie nienaruszony przez określony czas.
--[[
%% autostart
%% properties
2281 value
2841 value
2814 value
%% events
%% globals
--]]
-- 2018.01.09
-- Scena z 2 sensorami ruchu i 1 światłem
-----------------------------------------------------------------------------
fibaro:debug("SCENE START --------------------------")
fibaro:debug("sceneInstance: "..fibaro:countScenes())
if fibaro:countScenes() > 1 then
fibaro:debug("SCENE ABORT --------------------------")
fibaro:abort()
end
-----------------------------------------------------------------------------
local sensorID1 = 2281 -- Wiatrołap czujnik ruchu
local sensorID2 = 2841 -- Wiatrołap DWS
local lightID = 2814 -- Wiatrołap L1
local delay = 60 -- s (1 min)
-- Functions ---------------------------------------------------------------
local sensorMoved1 = (tonumber(fibaro:getValue(sensorID1, "value")) > 0);
local sensorMoved2 = (tonumber(fibaro:getValue(sensorID2, "value")) > 0);
local isLightOn = (tonumber(fibaro:getValue(lightID, "value")) > 0);
--local lclIsNight = (fibaro:getGlobalValue("isNight"));
fibaro:debug("isLightOn: "..tostring(isLightOn));
fibaro:debug("sensorMoved1: "..tostring(sensorMoved1));
fibaro:debug("sensorMoved2: "..tostring(sensorMoved2));
--fibaro:debug("isNight: "..lclIsNight);
-- zapalanie światła --------------------------------------------------------
if sensorMoved1 or sensorMoved2 --and (lclIsNight == '1')
then
fibaro:call(lightID, "turnOn") -- Relay
-- fibaro:call(lightID, "setValue", "10") -- Dimmer
fibaro:debug("Action: turnOn")
end
-- gaszenie światła ---------------------------------------------------------
if isLightOn then
local turnOffTime = os.time() + delay
while turnOffTime > os.time() do
if ((tonumber(fibaro:getValue(sensorID1, "value"))) > 0) or ((tonumber(fibaro:getValue(sensorID2, "value"))) > 0)
then turnOffTime = os.time() + delay
end
fibaro:debug("zwłoka: "..tostring(turnOffTime - os.time()))
fibaro:sleep(5000)
end
fibaro:call(lightID, "turnOff") -- Relay
-- fibaro:call(lightID, "setValue", "0") -- Dimmer
fibaro:debug("Action: turnOff")
end
-- koniec --------------------------------------------------------------------
fibaro:debug("SCENE STOP")
-
Boogie chcę Ci bardzo podziękować za podzielenie się tą sceną.
Dzięki Tobie rozwiązałem problem ze światłem w wiatrołapie oraz zmodyfikowałem scenę żeby tylko wyłączała światło po braku ruchu w pokoju. Moje córki zawsze zostawiają włączone światło. Jeszcze raz Dzięki.
-
Boogie również dziękuję z isNight działa OK ale jeżeli po zapaleniu światła wyłączymy je łącznikiem to scena nadal odlicza czas do wyłączenia światła i nie pozwala do jego upłynięcia ponownie załączyć przez czujnik ruchu.
-
Scena super śmiga :) Ale mam jeszcze prośbę. Czy można dodać do sceny opcję czasową? Tak aby scena włączała i wyłączała się o określonych godzinach. Lub żeby włączała się o zachodzie słońca i wyłączała się o wschodzie słońca. Za pomoc z góry bardzo dziękuję.
-
#Boogie - Dzięki!
-
Proponuje troszkę zmodyfikować.
--[[
%% properties
26 value
%% globals
--]]
-- tylko jedna scena równocześnie
-----------------------------------------------------------------------------
fibaro:debug("SCENE START --------------------------")
fibaro:debug("sceneInstance: "..fibaro:countScenes())
if fibaro:countScenes() > 1
then
fibaro:debug("SCENE ABORT --------------------------")
fibaro:abort()
end
-- czy globalna zmienna mówi, że światło włączone ręcznie
if (tostring(fibaro:getGlobal("manualOn")) == "true")
then
fibaro:debug("SCENE ABORT --------------------------")
fibaro:abort()
end
-----------------------------------------------------------------------------
-- sensor ruchu
local sensorID = 26
-- światło
local lightID = 131
-- opóźnienie gaszenia
local delay = 30
-- czujnik światła
local lumenID = 28
-- próg natężenia światła
local lumen = 10
-- czas działania
local timeStart = '07:00'
local timeStop = '18:59'
local sensorMoved = (tonumber(fibaro:getValue(sensorID, "value")) > 0)
local isLightOn = (tonumber(fibaro:getValue(lightID, "value")) > 0)
fibaro:debug("isLightOn: "..tostring(isLightOn))
fibaro:debug("sensorMoved: "..tostring(sensorMoved))
---funkcje
-- funkcja zamienia czas w formacie tekstowym "HH:MM" lub os.date("*t") na liczbę minut od północy
function toMinutes(czasHHMM)
local a
if type(czasHHMM) == "string" then
a = tonumber(string.sub(czasHHMM, 1, 2)) * 60 + tonumber(string.sub(czasHHMM, 4, 5))
else
a = tonumber(czasHHMM.hour) * 60 + tonumber(czasHHMM.min)
end
return a
end
------------------------------------------------------------------------------
local minStart = toMinutes(timeStart)
local minStop = toMinutes(timeStop)
local minNow = toMinutes(os.date("*t"))
local sensorMoved = (tonumber(fibaro:getValue(sensorID, "value")) > 0)
local isLightOn = (tonumber(fibaro:getValue(lightID, "value")) > 0)
fibaro:debug("isLightOn: "..tostring(isLightOn))
fibaro:debug("sensorMoved: "..tostring(sensorMoved))
------------------------------------------------------------------------------
local isTime
if (minStop >= minStart)
then
if (minNow >= minStart) and (minNow <= minStop)
then isTime = true else isTime = false
end
elseif (minStop <= minStart)
then
if (minNow <= minStart) and (minNow >= minStop)
then isTime = false else isTime = true
end
end
fibaro:debug("isTime: "..tostring(isTime))
------------------------------------------------------------------------------
local isDark
if tonumber(fibaro:getValue(lumenID, "value")) < lumen
then
isDark = true
else
isDark = false
end
fibaro:debug("isDark: "..tostring(isDark))
------------------------------------------------------------------------------
-- zapalanie światła --------------------------------------------------------
if (sensorMoved and isDark == true and isTime == true and isLightOn == false)
then
fibaro:call(lightID, "turnOn")
fibaro:debug("Action: turnOn")
else fibaro:debug("nie spełniono warunków")
end
-- gaszenie światła ---------------------------------------------------------
if isLightOn
then
local turnOffTime = os.time() + delay
while turnOffTime > os.time()
do
if (tonumber(fibaro:getValue(sensorID, "value")) > 0)
then
turnOffTime = os.time() + delay
end
fibaro:debug("DELAY: "..tostring(turnOffTime - os.time()))
fibaro:sleep(1000)
end
-- sprawdzenie czy światło wyłączone ręcznie podczas trwania zwłoki (zmienna globalna)
if (tostring(fibaro:getGlobal("manualOn")) == "true")
then
fibaro:debug("SCENE ABORT -----------MANUAL ON ACTIVATED---------------")
fibaro:abort()
end
fibaro:call(lightID, "turnOff")
fibaro:debug("Action: turnOff")
end