73 lines
2.5 KiB
Lua
73 lines
2.5 KiB
Lua
-- Water leak detection
|
|
--
|
|
-- assumptions:
|
|
-- need 2 devices :
|
|
-- a Water Flow devices name "Water_Flow"
|
|
-- a Dummy Device type percentage "Leakage_Percent"
|
|
--
|
|
-- 1 / leakage "open valve"
|
|
-- Every minute if a non-zero water flow is present, it increments a counter (Leakage_Percent)
|
|
-- If the water flow is zero is that it leaks more continuously.
|
|
-- A notification can be put on "Leakage_Percent" if >80% (80% = 80 minutes of continuous flow)
|
|
--
|
|
-- 2 / "micro continuous flow" (drip)
|
|
-- in 24 hours one must have at least 2 hours without flow (detection 0.5 liters / hour is 4.5m3 / year)
|
|
-- if not, "Leakage_Percent" is forced at 100%.
|
|
|
|
local FLOW_DEVICE = 'Water_Flow' -- Flow device
|
|
local LEAK_DEVICE = 'Leakage_Percent' -- percent dummy device
|
|
|
|
|
|
return {
|
|
active = true,
|
|
on = {
|
|
['timer'] = {
|
|
'every minute'
|
|
}
|
|
},
|
|
data = {
|
|
time_0_flow = { initial = 0 },
|
|
total_time = { initial = 0 },
|
|
},
|
|
execute = function(domoticz)
|
|
-- Flow in liter/minute
|
|
local flow = tonumber(domoticz.devices(FLOW_DEVICE).rawData[1])
|
|
-- Dummy device in %
|
|
local leakage = domoticz.devices(LEAK_DEVICE)
|
|
local time_with_flow = tonumber(leakage.rawData[1])
|
|
local new_time_with_flow = time_with_flow
|
|
|
|
-- 1 / leakage "open valve"
|
|
if (flow > 0) then
|
|
domoticz.data.time_0_flow = 0 -- there is a flow
|
|
new_time_with_flow = new_time_with_flow + 1 -- time with flow
|
|
if (new_time_with_flow > 100) then
|
|
new_time_with_flow = 100
|
|
end
|
|
else
|
|
new_time_with_flow = 0
|
|
domoticz.data.time_0_flow = domoticz.data.time_0_flow + 1 -- time without flow
|
|
end
|
|
|
|
-- 2 / flight type "micro continuous flow" (drip)
|
|
domoticz.data.total_time = domoticz.data.total_time + 1 -- time without since last 2 hours with no flow
|
|
|
|
if (domoticz.data.time_0_flow > 120) then
|
|
-- 2 hours with no flow
|
|
domoticz.data.total_time = 0
|
|
elseif (domoticz.data.total_time > (60*24)) then
|
|
-- 24 heures since last 2 hours with no flow
|
|
new_time_with_flow = 100
|
|
end
|
|
-- log
|
|
domoticz.log(new_time_with_flow .. ' minutes with flow ')
|
|
domoticz.log(domoticz.data.time_0_flow .. ' minutes without flow ')
|
|
domoticz.log(domoticz.data.total_time .. ' minutes without 2hrs without flow ')
|
|
|
|
-- update dummy device %
|
|
if (time_with_flow ~= new_time_with_flow) then
|
|
leakage.update(0,new_time_with_flow)
|
|
end
|
|
end
|
|
}
|