Page 1 of 1
Get average watermeter data
Posted: Monday 17 December 2018 16:37
by Evertjob89
Hi,
Currently i'm running an setup with a NPN watermeter sensors and this works fine.
Yesterday the water run for a couple of hours (4 hours) and nobody was at home, so i've lost almost 2000 liter water. I've calculated is should be around 5 liters a minut.
So avoid this (or be notified earlier) i'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be simple:
Code: Select all
--- Watermeter IDx 30
return {
on = {
devices = {
'Watermeter'
}
},
execute = function(domoticz, device)
watermeter.Usage = myVar.subsetSince('00:17:00') --- Get data from last 17 minutes
if(watermeter.Usage > 94) then
domoticz.notify('Water usage high!!',
'The waterusage is more than 5,5 liter a minute!',
domoticz.PRIORITY_HIGH)
end
end
}
The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Re: Get average watermeter data
Posted: Monday 17 December 2018 19:31
by waaren
Evertjob89 wrote: ↑Monday 17 December 2018 16:37
So avoid this (or be notified earlier) i'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be simple:
The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Can you tell us what device type and subtype your watermeter in domoticz is ?
Goto the devices tab in the domoticz gui and type water in the search field. I am interested in the idx, name, type and subType values. My screen shows something like:
Code: Select all
84 Virtual 00082084 1 Watermeter General Custom Sensor 194046 - -
982 Virtual2 14426 1 Watermeter2 RFXMeter RFXMeter counter 194.040 m3
1241 Virtual2 00083241 1 waterm General Waterflow 0 l/min
Re: Get average watermeter data
Posted: Monday 17 December 2018 19:36
by Evertjob89
waaren wrote: ↑Monday 17 December 2018 19:31
Evertjob89 wrote: ↑Monday 17 December 2018 16:37
So avoid this (or be notified earlier) i'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be simple:
The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Can you tell us what device type and subtype your watermeter in domoticz is ?
Goto the devices tab in the domoticz gui and type water in the search field. I am interested in the idx, name, type and subType values. My screen shows something like:
Code: Select all
84 Virtual 00082084 1 Watermeter General Custom Sensor 194046 - -
982 Virtual2 14426 1 Watermeter2 RFXMeter RFXMeter counter 194.040 m3
1241 Virtual2 00083241 1 waterm General Waterflow 0 l/min
Code: Select all
30 Virtuale sensoren 82030 1 Watermeter General Counter Incremental 329.286 m3 10 -
Re: Get average watermeter data
Posted: Monday 17 December 2018 21:05
by waaren
Evertjob89 wrote: ↑Monday 17 December 2018 16:37
Currently i'm running an setup with a NPN watermeter sensors and this works fine.
I'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Could be something like this. Please check the log for a couple of hours to see if factor is set right for your meter.
Code: Select all
return {
on = { devices = { "Watermeter" }},
data = { watermeter = { history = true, maxHours = 2 }},
logging = {
level = domoticz.LOG_DEBUG,
marker = "watermeter"
},
execute = function(dz,item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
-- JSON call to emulate waterflow
-- http://192.168.192.51:8084/json.htm?type=command¶m=udevice&idx=1242&svalue=1
dz.data.watermeter.add(item.counter)
local minutes = 17
local maxLitersPerMinute = 5.5
local meterFactor = 100
local max = dz.data.watermeter.maxSince('00:'.. minutes .. ':00')
local min = dz.data.watermeter.minSince('00:'.. minutes .. ':00')
local litersPerMinuteNotify = (max - min) / minutes * meterFactor
local litersPerMinuteNow = dz.data.watermeter.avgSince('00:01:00') * meterFactor
if litersPerMinuteNotify > maxLitersPerMinute then
dz.notify (
'Water usage high!!',
'The waterusage is ' .. dz.utils.round(litersPerMinuteNotify,1) .. ' liter a minute!',
dz.PRIORITY_HIGH
)
end
logWrite("Current water usage: " .. dz.utils.round(litersPerMinuteNow,1) .. " liter a minute")
end
}
Re: Get average watermeter data
Posted: Monday 17 December 2018 21:14
by Evertjob89
waaren wrote: ↑Monday 17 December 2018 21:05
Evertjob89 wrote: ↑Monday 17 December 2018 16:37
Currently i'm running an setup with a NPN watermeter sensors and this works fine.
I'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Could be something like this. Please check the log for a couple of hours to see if factor is set right for your meter.
Code: Select all
return {
on = { devices = { "Watermeter" }},
data = { watermeter = { history = true, maxHours = 2 }},
logging = {
level = domoticz.LOG_DEBUG,
marker = "watermeter"
},
execute = function(dz,item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
-- JSON call to emulate waterflow
-- http://192.168.192.51:8084/json.htm?type=command¶m=udevice&idx=1242&svalue=1
dz.data.watermeter.add(item.counter)
local minutes = 17
local maxLitersPerMinute = 5.5
local meterFactor = 100
local max = dz.data.watermeter.maxSince('00:'.. minutes .. ':00')
local min = dz.data.watermeter.minSince('00:'.. minutes .. ':00')
local litersPerMinuteNotify = (max - min) / minutes * meterFactor
local litersPerMinuteNow = dz.data.watermeter.avgSince('00:01:00') * meterFactor
if litersPerMinuteNotify > maxLitersPerMinute then
dz.notify (
'Water usage high!!',
'The waterusage is ' .. dz.utils.round(litersPerMinuteNotify,1) .. ' liter a minute!',
dz.PRIORITY_HIGH
)
end
logWrite("Current water usage: " .. dz.utils.round(litersPerMinuteNow,1) .. " liter a minute")
end
}
Code: Select all
2018-12-17 21:12:29.649 Status: dzVents: Write file: /home/pi/domoticz/scripts/dzVents/generated_scripts/Test.lua
2018-12-17 21:12:59.690 Status: dzVents: Info: Handling events for: "Watermeter", value: "0.00"
2018-12-17 21:12:59.690 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-17 21:12:59.692 Status: dzVents: Debug: watermeter: Current water usage: 32938.2 liter a minute
2018-12-17 21:12:59.693 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-17 21:13:50.929 Status: dzVents: Info: Handling events for: "Watermeter", value: "0.00"
2018-12-17 21:13:50.929 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-17 21:13:50.930 Status: dzVents: Debug: watermeter: Current water usage: 32938.2 liter a minute
2018-12-17 21:13:51.044 Status: dzVents: Info: watermeter: ------ Finished Test
It should be zero because there is no waterflow at the moment? The current count is 329.382
Re: Get average watermeter data
Posted: Monday 17 December 2018 22:15
by waaren
Evertjob89 wrote: ↑Monday 17 December 2018 16:37
Currently i'm running an setup with a NPN watermeter sensors and this works fine.
I'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Modified the calculation of current flow. Can you try this ? and please check the log for a couple of hours to see if factor is set right for your meter.
Code: Select all
return {
on = { devices = { "Watermeter" }},
data = { watermeter = { history = true, maxHours = 2 }},
logging = {
level = domoticz.LOG_DEBUG,
marker = "watermeter"
},
execute = function(dz,item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
-- JSON call to emulate waterflow
-- http://192.168.192.51:8084/json.htm?type=command¶m=udevice&idx=1242&svalue=0
dz.data.watermeter.add(item.counter)
local minutes = 17
local maxLitersPerMinute = 5.5
local factor = 100
local max = dz.data.watermeter.maxSince('00:'.. minutes .. ':00')
local min = dz.data.watermeter.minSince('00:'.. minutes .. ':00')
local litersPerMinuteNotify = (max - min) / minutes * factor
local current = dz.data.watermeter.get(1).data
local previous, previousTime, litersPerMinuteNow
if dz.data.watermeter.get(2) ~= nil then
previous = dz.data.watermeter.get(2).data
previousTime = dz.data.watermeter.get(2).time.msAgo
litersPerMinuteNow = (( current - previous ) / (previousTime / 60000 )) * factor -- 60000 = msecs in a minute
logWrite("Current water usage: " .. dz.utils.round(litersPerMinuteNow,1) .. " liter a minute")
else
logWrite("Current water usage cannot be determined (not enough data in history)")
end
if litersPerMinuteNotify > maxLitersPerMinute then
dz.notify (
'Water usage high!!',
'The waterusage is ' .. dz.utils.round(litersPerMinuteNotify,1) .. ' liter a minute!',
dz.PRIORITY_HIGH
)
end
end
}
Re: Get average watermeter data
Posted: Tuesday 18 December 2018 16:08
by Evertjob89
waaren wrote: ↑Monday 17 December 2018 22:15
Evertjob89 wrote: ↑Monday 17 December 2018 16:37
Currently i'm running an setup with a NPN watermeter sensors and this works fine.
I'm looking for a script that could help me but because i don't get DzVents as everyone else (maybe i'm thinking to difficult?) but the idea should be The idea is very simple, but i'm not getting it working (And i would like to not test it for 17 minutes)
Modified the calculation of current flow. Can you try this ? and please check the log for a couple of hours to see if factor is set right for your meter.
Code: Select all
return {
on = { devices = { "Watermeter" }},
data = { watermeter = { history = true, maxHours = 2 }},
logging = {
level = domoticz.LOG_DEBUG,
marker = "watermeter"
},
execute = function(dz,item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
-- JSON call to emulate waterflow
-- http://192.168.192.51:8084/json.htm?type=command¶m=udevice&idx=1242&svalue=0
dz.data.watermeter.add(item.counter)
local minutes = 17
local maxLitersPerMinute = 5.5
local factor = 100
local max = dz.data.watermeter.maxSince('00:'.. minutes .. ':00')
local min = dz.data.watermeter.minSince('00:'.. minutes .. ':00')
local litersPerMinuteNotify = (max - min) / minutes * factor
local current = dz.data.watermeter.get(1).data
local previous, previousTime, litersPerMinuteNow
if dz.data.watermeter.get(2) ~= nil then
previous = dz.data.watermeter.get(2).data
previousTime = dz.data.watermeter.get(2).time.msAgo
litersPerMinuteNow = (( current - previous ) / (previousTime / 60000 )) * factor -- 60000 = msecs in a minute
logWrite("Current water usage: " .. dz.utils.round(litersPerMinuteNow,1) .. " liter a minute")
else
logWrite("Current water usage cannot be determined (not enough data in history)")
end
if litersPerMinuteNotify > maxLitersPerMinute then
dz.notify (
'Water usage high!!',
'The waterusage is ' .. dz.utils.round(litersPerMinuteNotify,1) .. ' liter a minute!',
dz.PRIORITY_HIGH
)
end
end
}
I've tried it and it works, only not as i thought: I've want an average (Usage / Time = Result) for the last 17 minutes, right know it's giving me the result for every minute:
Code: Select all
2018-12-18 15:53:40.529 Status: dzVents: Info: Handling events for: "Watermeter", value: "0.00"
2018-12-18 15:53:40.529 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:53:40.560 Status: dzVents: Debug: watermeter: Current water usage: 0 liter a minute
2018-12-18 15:53:40.568 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:54:40.490 Status: dzVents: Info: Handling events for: "Watermeter", value: "6.00"
2018-12-18 15:54:40.490 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:54:40.520 Status: dzVents: Debug: watermeter: Current water usage: 0.6 liter a minute
2018-12-18 15:54:40.527 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:55:01.324 Status: dzVents: Info: Handling events for: "Watermeter", value: "4.00"
2018-12-18 15:55:01.326 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:55:01.355 Status: dzVents: Debug: watermeter: Current water usage: 1.2 liter a minute
2018-12-18 15:55:01.362 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:55:52.990 Status: dzVents: Info: Handling events for: "Watermeter", value: "14.00"
2018-12-18 15:55:52.990 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:55:53.019 Status: dzVents: Debug: watermeter: Current water usage: 1.6 liter a minute
2018-12-18 15:55:53.026 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:56:44.405 Status: dzVents: Info: Handling events for: "Watermeter", value: "11.00"
2018-12-18 15:56:44.405 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:56:44.434 Status: dzVents: Debug: watermeter: Current water usage: 1.3 liter a minute
2018-12-18 15:56:44.442 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:57:35.673 Status: dzVents: Info: Handling events for: "Watermeter", value: "8.00"
2018-12-18 15:57:35.673 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:57:35.702 Status: dzVents: Debug: watermeter: Current water usage: 0.9 liter a minute
2018-12-18 15:57:35.709 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:58:27.354 Status: dzVents: Info: Handling events for: "Watermeter", value: "8.00"
2018-12-18 15:58:27.354 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:58:27.383 Status: dzVents: Debug: watermeter: Current water usage: 0.9 liter a minute
2018-12-18 15:58:27.390 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 15:59:08.583 Status: dzVents: Info: Handling events for: "Watermeter", value: "5.00"
2018-12-18 15:59:08.583 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 15:59:08.612 Status: dzVents: Debug: watermeter: Current water usage: 0.7 liter a minute
2018-12-18 15:59:08.619 Status: dzVents: Info: watermeter: ------ Finished Test
2018-12-18 16:00:01.630 Status: dzVents: Info: Handling events for: "Watermeter", value: "0.00"
2018-12-18 16:00:01.630 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 16:00:01.662 Status: dzVents: Debug: watermeter: Current water usage: 0 liter a minute
2018-12-18 16:00:01.669 Status: dzVents: Info: watermeter: ------ Finished Test
Ive used 56 liters in 8 minutes so the result should be 56 / 8 = 7.25
Code: Select all
2018-12-18 16:00:01.630 Status: dzVents: Info: Handling events for: "Watermeter", value: "0.00"
2018-12-18 16:00:01.630 Status: dzVents: Info: watermeter: ------ Start internal script: Test: Device: "Watermeter (Virtuale sensoren)", Index: 30
2018-12-18 16:00:01.662 Status: dzVents: Debug: watermeter: Current water usage: 7.25 liter a minute
2018-12-18 16:00:01.669 Status: dzVents: Info: watermeter: ------ Finished Test
Re: Get average watermeter data
Posted: Tuesday 18 December 2018 17:19
by waaren
Evertjob89 wrote: ↑Tuesday 18 December 2018 16:08
I've tried it and it works, only not as i thought: I've want an average (Usage / Time = Result) for the last 17 minutes, right know it's giving me the result for every minute:
What you see is debug information. These are the values calculated every time the script executes.
If the water usage is above the set average (5.5) for the set period (17 minutes ) the script should send a notification.
If you want to test you can lower these settings by modifying the lines
Code: Select all
local minutes = 17
local maxLitersPerMinute = 5.5
and set them to a lower value.
Re: Get average watermeter data
Posted: Monday 17 February 2020 13:05
by rodaman
Script is working excellent also for me but i would like add switch in section when alerts is on.
Code: Select all
if litersPerMinuteNotify > maxLitersPerMinute then
--I added here
execute = function(domoticz, alert_woda)
local alarmwoda = domoticz.devices('Woda Alarm')
alarmwoda.switchOn()
end
But switch state Off and no errors. What i am doing wrong
Re: Get average watermeter data
Posted: Monday 17 February 2020 13:44
by waaren
rodaman wrote: ↑Monday 17 February 2020 13:05
Script is working excellent also for me but i would like add switch in section when alerts is on.
Code: Select all
if litersPerMinuteNotify > maxLitersPerMinute then
--I added here
execute = function(domoticz, alert_woda)
local alarmwoda = domoticz.devices('Woda Alarm')
alarmwoda.switchOn()
end
But switch state Off and no errors. What i am doing wrong
You don't need the repetition of the execute section. Just use
Code: Select all
if litersPerMinuteNotify > maxLitersPerMinute then
--add this line
dz.devices('Woda Alarm').switchOn()
Re: Get average watermeter data [Solved]
Posted: Monday 17 February 2020 17:51
by rodaman
It works!!! Thank you. I have to study DzVents better.
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 15:00
by rodaman
My friend got bill 200E for water. 2 times. After that he discovered that he had very little leakage from woodburner where is water valve for emergence. If there is power cut and woodburner is full of burning wood and pump stop pumping hot water, woodburner could explode so thermovalve open cold water for cooling stove. That valve opened just a little and he had very little leakage for very long time directly to sewage pipe so he could not spoted it. I have the same valve in my stove. How to check database water usage if there is no 0 usage during 24h for example?
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 15:28
by waaren
rodaman wrote: ↑Tuesday 18 February 2020 15:00
How to check database water usage if there is no 0 usage during 24h for example?
How many liters per day or per week should be considered as too much ?
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 15:40
by rodaman
I was thinking like, it should be 0 (zero) liter at some point in 24 hours. If there is a constant liittle leakage it will never be 0. Am I wrong?
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 15:44
by waaren
rodaman wrote: ↑Tuesday 18 February 2020 15:40
I was thinking like, it should be 0 (zero) liter at some point in 24 hours. If there is liittle leakage it will never be 0. Am I wrong?
I guess you are right but how long do you want to monitor the meter before you conclude the usage you measure is from a leak and not from common usage ?
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 15:53
by rodaman
During 24 hours I would like check if there is 0 liters usage. It should be especially in the night in my case . If 0 never occur for given time- alarm.
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 15:57
by waaren
rodaman wrote: ↑Tuesday 18 February 2020 15:53
During 24 hours I would like check if there is 0 liters usage. It should be especially in the night in my case . If 0 never occur for given time- alarm.
Probably a language thing but I try to understand what your definition is for 'given time'. Is it 3 days, a week, a month or something else ?
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 16:27
by rodaman
Ok, sorry. Let say 24 hours because I can see in a daily Domoticz report every night I have zero usage at some point so I do not have a little leakage. No need immediate action, just check if 0 occured during last 24 hours. Maybe I am wrong but I thought Domoticz keep detailed values for 24 hrs.
Re: Get average watermeter data
Posted: Tuesday 18 February 2020 20:22
by waaren
rodaman wrote: ↑Tuesday 18 February 2020 16:27
Ok, sorry. Let say 24 hours because I can see in a daily Domoticz report every night I have zero usage at some point so I do not have a little leakage. No need immediate action, just check if 0 occured during last 24 hours. Maybe I am wrong but I thought Domoticz keep detailed values for 24 hrs.
You could try this. It should notify you when there was no water usage in the last 24 hours.
Don't expect a notification the first time. The value is initialized then.
Code: Select all
local watermeterName = 'Watermeter' -- device name of watermeter
return
{
on =
{
timer =
{
'at 22:00',
},
devices =
{
watermeterName
},
},
data =
{
waterTotal = { initial = 0 },
watermeter = { history = true, maxHours = 2 },
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = 'watermeter',
},
execute = function(dz, item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
-- JSON call to emulate waterflow
-- http://192.168.192.51:8084/json.htm?type=command¶m=udevice&idx=1242&svalue=0
if item.isTimer then
local watermeter = dz.devices(watermeterName)
if watermeter.counter == dz.data.waterTotal then
logWrite("No water usage today")
dz.notify ('Water usage', 'There was no waterusage today', dz.PRIORITY_NORMAL )
else
dz.data.waterTotal = watermeter.counter
end
return
end
dz.data.watermeter.add(item.counter)
local minutes = 17
local maxLitersPerMinute = 5.5
local factor = 100
local max = dz.data.watermeter.maxSince('00:'.. minutes .. ':00')
local min = dz.data.watermeter.minSince('00:'.. minutes .. ':00')
local litersPerMinuteNotify = (max - min) / minutes * factor
local current = dz.data.watermeter.get(1).data
local previous, previousTime, litersPerMinuteNow
if dz.data.watermeter.get(2) ~= nil then
previous = dz.data.watermeter.get(2).data
previousTime = dz.data.watermeter.get(2).time.msAgo
litersPerMinuteNow = (( current - previous ) / (previousTime / 60000 )) * factor -- 60000 = msecs in a minute
logWrite("Current water usage: ' .. dz.utils.round(litersPerMinuteNow,1) .. ' liter a minute")
else
logWrite("Current water usage cannot be determined (not enough data in history)")
end
if litersPerMinuteNotify > maxLitersPerMinute then
dz.notify (
'Water usage high!!',
'The waterusage is ' .. dz.utils.round(litersPerMinuteNotify,1) .. ' liter a minute!',
dz.PRIORITY_HIGH
)
dz.devices('Woda Alarm').switchOn()
end
end
}
Re: Get average watermeter data
Posted: Wednesday 19 February 2020 21:37
by rodaman
Thank you for the script. I was thinking more that notification should be when non "0" occur during 24hrs. It could be sign that I have constant usage, very small but constant. What is "waterTotal" as a value. Maybe I can figure out how to write the script by me. I am very appreciated for your help.