Stworzona w 1 wersji przez Meryliona (który mam nadzieję do nas wkrótce dołaczy) i potem udoskonalana przeze mnie.
--[[
%% properties
4 dead
5 dead
6 dead
8 dead
9 dead
13 dead
16 dead
18 dead
22 dead
29 dead
33 dead
34 dead
35 dead
36 dead
37 dead
38 dead
39 dead
40 dead
43 dead
46 dead
52 dead
62 dead
65 dead
76 dead
77 dead
78 dead
89 dead
92 dead
95 dead
100 dead
101 dead
107 dead
110 dead
114 dead
117 dead
120 dead
127 dead
128 dead
135 dead
140 dead
146 dead
158 dead
164 dead
169 dead
172 dead
176 dead
180 dead
184 dead
187 dead
191 dead
192 dead
200 dead
205 dead
224 dead
227 dead
231 dead
234 dead
237 dead
238 dead
239 dead
240 dead
241 dead
247 dead
262 dead
269 dead
278 dead
281 dead
294 dead
298 dead
308 dead
313 dead
319 dead
324 dead
330 dead
331 dead
334 dead
335 dead
336 dead
337 dead
338 dead
339 dead
340 dead
341 dead
342 dead
343 dead
%% globals
--]]
-- powyzej wylistowane wszystkie ID urzadzen
-- ponizej powtorzone numery ID urzadzen do sprawdzania czy sa martwe
local ID = {4,5,6,8,9,13,16,18,22,29,33,34,35,36,37,38,39,40,43,46,52,62,65,76,77,78,89,92,95,100,101,107,110,114,117,120,127,128,135,140,146,158,164,169,172,176,180,184,187,191,192,200,205,224,227,231,234,237,238,239,240,241,247,262,269,278,281,294,298,308,313,319,324,330,331,334,335,336,337,338,339,340,341,342,343}
local Dead = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
local StartDead = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
local DeadTime = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
local trigger = fibaro:getSourceTrigger()
local TriggerID = tonumber(trigger['deviceID'])
--local Value, ModificationTime, Petla, PetlaCzasStart, nrdead = 0,0,0,0,0
local Value = 0
local ModificationTime = 0
local Petla = 0
local PetlaCzasStart = 0
local SprawdzanieStatusuNotOK = true
local Awaria = false
local Raport = ""
local DeadList = ""
local nrdead = 0
fibaro:setGlobal("nrdead", "0")
fibaro:call(223, "pressButton", "1") --HC2 send nr dead thinkspeak
--fibaro:debug(StartDead[1]..DeadTime[1])
--fibaro:debug(Value..ModificationTime..Petla..PetlaCzasStart..nrdead)
--fibaro:debug('start'..#ID..#Dead..#StartDead..#DeadTime)
--if TriggerID ~= nil then fibaro:debug('trigger ID='..TriggerID) else fibaro:debug('trigger type='..trigger.type) end
-- jesli scena jezeli juz dziala skoncz scene
if tonumber(fibaro:countScenes()) > 1
then fibaro:abort() end
PetlaCzasStart = os.time()
-- program glowny zapetlony w petli while
while SprawdzanieStatusuNotOK and (os.time() - PetlaCzasStart) < 3000 do
-- ustaw zeby zakonczyc petle while w nastepnym kroku
SprawdzanieStatusuNotOK = false
-- sprawdzanie stanu wszystkich ID
fibaro:sleep(5000)
for Petla = 1 , #ID do
-- jezeli czujnik martwy a w tabeli oznaczony jako zywy obudz 1 raz
Value , ModificationTime = fibaro:get(ID[Petla],'dead')
if fibaro:get(ID[Petla],'dead') == '1' and Dead[Petla] == 0
then
local name = fibaro:getName(ID[Petla]).. ' ' .. fibaro:getRoomNameByDeviceID(ID[Petla])
--fibaro:debug('Dead: '..ID[Petla].." "..name);
fibaro:setGlobal("deadlist", ID[Petla])
fibaro:setGlobal("deadname", name)
--fibaro:call(302, "pressButton", "6") --update log mysql
nrdead = nrdead + 1
DeadList = DeadList..ID[Petla].."\n"
Dead[Petla] = 1
DeadTime[Petla] = os.time()
StartDead[Petla] = ModificationTime
fibaro:wakeUpDeadDevice(ID[Petla])
end
-- jezeli po minucie po pierwszej probie ciagle jest martwy sprobuj 2 raz
if fibaro:get(ID[Petla],'dead') == '1' and Dead[Petla] == 1 and
(os.time() - DeadTime[Petla]) > 60
then
Dead[Petla] = 2
DeadTime[Petla] = os.time()
fibaro:wakeUpDeadDevice(ID[Petla])
end
-- jezeli po minucie po drugiej probie ciagle jest martwy sprobuj 3 raz
if fibaro:get(ID[Petla],'dead') == '1' and Dead[Petla] == 2 and
(os.time() - DeadTime[Petla]) > 60
then
Dead[Petla] = 3
DeadTime[Petla] = os.time()
fibaro:wakeUpDeadDevice(ID[Petla])
end
-- jezelipo minucie po trzeciej probie ciagle martwy raportuj status 4
if fibaro:get(ID[Petla],'dead') == '1' and Dead[Petla] == 3 and
(os.time() - DeadTime[Petla]) > 60
then
Dead[Petla] = 4
end
-- jezeli byl martwy a wrocil do zywych czekaj dwie minuty i raportuj jako ozywiony
if fibaro:get(ID[Petla],'dead') == '0' and Dead[Petla] > 0 and
(os.time() - ModificationTime) > 120 and Dead[Petla] < 10
then
Dead[Petla] = Dead[Petla] + 10
DeadTime[Petla] = ModificationTime - StartDead[Petla]
end
if fibaro:get(ID[Petla],'dead') == '1' and Dead[Petla] > 10
then
Dead[Petla] = 0
end
-- jezeli jakikolwiek czujnik jest w trakcie ozywiania ustaw flage do petli while
if Dead[Petla] > 0 and Dead[Petla] < 4
then
SprawdzanieStatusuNotOK = true
end
end
end
-- Raport z czynnosci
if (os.time() - PetlaCzasStart) > 2990
then
Raport = Raport .. ' TRAGEDIA JAKAS!!!! 15 minut budzenia umarlakow!!! \n\n'
end
for Petla = 1 , #ID do
Value , ModificationTime = fibaro:get(ID[Petla],'dead')
local name = fibaro:getName(ID[Petla]).. ' ' .. fibaro:getRoomNameByDeviceID(ID[Petla])
if Dead[Petla] == 4
then
Awaria = true
Raport = Raport..' AWARIA!!! Prawdziwa padlina ID : '..ID[Petla]..name..'\n'
end
if Dead[Petla] > 10
then
Raport = Raport ..' Obudzony : '..ID[Petla]..' '..name
.. ' po ' .. tostring(Dead[Petla] - 10) ..' probie, czas smierci: '..tostring(DeadTime[Petla])..' s\n'
Dead[Petla] = 0
end
if (os.time() - ModificationTime) < 6000 and Dead[Petla] < 10
then
--Raport = Raport..' Obudzenie : '..tostring(ID[Petla])..' '..name ..' nastapilo '..tostring(os.time() - ModificationTime)..' s temu \n'
end
end
if Awaria
then
--fibaro:call(idr,'sendPush','UMARLAKI - PRZECZYTAJ MEJLA')
end
if string.len(Raport) > 0 and nrdead > 2 then
fibaro:call(2,"sendEmail","Raport budzenia umarlakow", Raport)
end
fibaro:setGlobal("nrdead", tostring(nrdead))
--fibaro:setGlobal("deadlist", DeadList)
fibaro:call(223, "pressButton", "1") --HC2 send nr dead thinkspeak
fibaro:debug('END '..TriggerID..':'..Raport)