Waterflowmeter in Domoticz (dzVents)
In een eerder artikel hebben hebben we uitgelegd hoe je een watermeter kunt uitlezen en het verbruik in Domoticz weer kunt geven. Het verbruik kun je per uur, dag, week, maand of jaar inzien. Maar wat nu als je het verbruik real-time wilt zien? Bijvoorbeeld als je de tuin aan het beregenen bent? Uiteraard heeft Ehoco hier een oplossing voor: de waterflowmeter!
-
Benodigdheden
Allereerst moet je jouw watermeter kunnen uitlezen in Domoticz met het LUA-script of Python-script.
De volgende stap is om een virtuele sensor aan te maken. Ga naar Setup -> Hardware en kies bij Type voor Dummy. Je mag zeg een herkenbare naam kiezen:
Zodra de Dummy Hardware toegevoegd is kunnen de virtuele sensoren gaan aanmaken. Klik hiervoor op Create Virtual Sensors (in het donkerblauw).
Maak nu de virtuele sensor aan van het type “Waterflow” en geef “Waterflow” als naam van de sensor:
Waterflowmeter script
De laatste stap is het script. Ga naar Setup > More Options > Events en kies voor een dzVents event. Kopieer onderstaand script naar Domoticz. Op regel vijf zet je de naam van je watermeter neer. Op regel 18 zet je de naam van jouw waterflow-meter neer. Activeer het event en sla het op.
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 |
return { on = { devices = { 'Watermeter' -- change to name of your watermeter }, }, data = { water = { initial = {}, }, }, execute = function(dz, item) local factor = 1 -- this might need to be changed depending on if your meter is in liters or m3 or different. local waterFlow = dz.devices('Waterflow') local waterTotal = tonumber(item.sValue) * factor -- watermeter can be of type counter or custom sensor sValue works for both if dz.data.water.total ~= nil then -- first reading does not update the flowmeter waterFlow.cancelQueuedCommands() local pastTime = dz.time.dDate - dz.data.water.lastTime -- seconds since last time local waterFlowValue = dz.utils.round((( waterTotal - dz.data.water.total ) * 60) / pastTime, 2) -- liter / min waterFlow.updateWaterflow(waterFlowValue) waterFlow.updateWaterflow(0).afterSec(60) -- if no new data within 60 seconds the reset flow to 0 end dz.data.water.total = waterTotal dz.data.water.lastTime = dz.time.dDate end } |
Vanaf nu zal de waterflowmeter in Domoticz weergegeven worden, in onderstaand voorbeeld is het verbruik 12 liter per minuut.
Hallo Joost,
Ik heb het script gebruikt in Domoticz. Wat voor soort dzVents script moet ik gebruiken? Ik kan uit verschillende soorten kiezen.
De naam van mijn watermeter is: Water. De naam van de Waterflow meter is: Waterflow. Ik krijg echter een error in de log:
2020-01-19 20:46:11.345 Status: dzVents: Info: Handling events for: “Water”, value: “804”
2020-01-19 20:46:11.345 Status: dzVents: Info: —— Start internal script: Script #1: Device: “Water (Dummy )”, Index: 1066
2020-01-19 20:46:11.346 Status: dzVents: Error (2.4.19): An error occured when calling event handler Script #1
2020-01-19 20:46:11.346 Status: dzVents: Error (2.4.19): …domoticz/scripts/dzVents/generated_scripts/Script #1.lua:18: attempt to perform arithmetic on a nil value
2020-01-19 20:46:11.347 Status: dzVents: Info: —— Finished Script #1
Kun jij me hiermee helpen? Alvast bedankt
Bij dzVents-scripts maakt het niet uit wat je kiest (in tegenstelling tot LUA-scripts).
Heb je het script één-op-één overgenomen? Het is nl. vreemd dat je op regel 18 een foutmelding krijgt. Wellicht is het beter om de namen van je devices aan te passen, zodat ze overeenkomen met het script.
Iets klop er toch niet aan dit script. Allereerst dit:
2020-04-06 10:25:15.552 Status: dzVents: Info: domoticz.round deprecated. Please use domoticz.utils.round.
Dat is nog eenvoudig te verhelpen. Maar dan het volgende: op het dashboard staat de Waterflow continu op de waarde 4.98283e+09 l/min, ook als de kraan uit staat. Misschien heeft het ermee te maken dat ik de watermeter met andere hardware anders uitlees, maar dat zou eigenlijk niet moeten uitmaken…
Ik heb al een jaar of zo een watermeter draadloos aan Domoticz hangen (via een Wemos D1 met ESP Easy). De stand wordt bijgehouden in een virtueel apparaat ‘Waterverbruik’ (een incremental counter met deelfactor 1.000 om de stand om te rekenen naar m3) geeft in mijn systeem het verbruik in kuubs redelijk nauwkeurig weer.
Het script heb ik dus als volgt aangepast:
Regel 3: ‘Waterverbruik’ — het device met mijn watermeter
Regel 15: local factor = 1000 — reken de kuubs weer terug naar liters.
Regel 22: local waterFlowValue = dz.utils.round((( waterTotal – dz.data.water.total ) * 60) / pastTime, 2) — aangepaste afronding met dz.utils.round
In de log ziet het resultaat van het Waterflow script er als volgt uit:
2020-04-06 10:41:05.586 Status: dzVents: Info: Handling events for: “Waterverbruik”, value: “18446744073709413642”
2020-04-06 10:41:05.586 Status: dzVents: Info: —— Start internal script: Waterflow: Device: “Waterverbruik (VIRTUAL)”, Index: 195
2020-04-06 10:41:05.589 Status: dzVents: Info: —— Finished Waterflow
De waarde van Waterflow op het dashboard blijft constant op dezelfde waarde4.98283e+09 l/min dus ergens in de berekening gaat het mis. Deze waarde op het dashboard verandert niet als ik de kraan aan of uit zet.
Ik heb geprobeerd de waarde van een aantal variabelen uit te lezen in de log met print() commando’s en zie dan:
2020-04-06 21:11:10.234 Status: dzVents: waterFlow=
2020-04-06 21:11:10.234 Status: dzVents: waterTotal=
2020-04-06 21:11:10.234 Status: dzVents: 1.8446744073709e+22
2020-04-06 21:11:10.234 Status: dzVents: waterFlowValue=
2020-04-06 21:11:10.234 Status: dzVents: 4982833152.0
Met andere woorden: de waarde van waterFlow is leeg en verandert niet… Enig idee?
Ik heb de waterflowmeter uiteindelijk werkend gekregen. Maar er is iets raars aan de hand: de meter lijkt alleen waarden te geven in stapjes van 12.
– Als ik de kraan helemaal open zet, staat de flow op 12l/min.
– Zet ik de kraan half open, dan staat de flow niet op 6l/min zoals je zou verwachten, maar afwisselend 5 seconden op 0 en 5 seconden op 12l/min.
– Zet ik de kraan op een heel klein straaltje open, dan staat de flow afwisselen 15 keer 5 seconden op 0 en dan een keer 5 seconden op 12l/min
– Zet ik twee kranen open, dan staat de flow op 24l/min.
Waar die 5 seconden vandaan komt, is duidelijk: dat is de interval waarmee de Watermeter data naar Domoticz stuurt. Het betekent dat het Waterflow-script ook om de 5 seconden wordt getriggerd. Maar het is vreemd dat het script dat de flow moet meten dit op een aan/uit manier doet in stapjes van 12, in plaats van het gemiddelde te berekenen over meerdere metingen.
Kijk eens op je watermeter. Bij mij heeft die plm 5 seconden nodig om het meetwieltje 1x rond te laten draaien. 5×12 is 60, dus dan zit je idd netjes op 12 lpm…
Ter info, dat is bij het doorspoelen van het toilet, dus 1 waterpunt “volledig open”…
Never mind, even een denkfout. Er moet dus een mechanisme zijn dat de waarde terugzet naar 0. Het lijkt erop dat het script (ook) wordt getriggered door een ander event dan een puls van de watermeter, waardoor er een verbruik van 0 wordt gemeten tussen 2 uitvoeringen van het script.
Laat bij mij nog de vraag open hoe de waarde van de waterflow wordt teruggebracht naar 0 als er geen nieuwe pulsen van de watermeter komen en het script dus niet getriggered wordt…
Hoi Pierre, kun je ook toelichten wat je nog hebt moeten doen om het werkend te krijgen?
Als de kraan opengaat staat de waarde te flippen tussen 60 en inf, wat vermoedelijk infinity is. Ik heb een flowmeter tussen de leiding zitten en moet water meter deling op 120000 zetten voor een correcte uitlezing. Iemand een hint waar ik een setting kan doen om de l/m een beetje fatsoenlijk te krijgen?