Slimme watermeter

Last Updated on 8 februari 2022 by Syds

Use cases:

  • Waterverbruik per dag/maand/jaar tonen in Google Data Studio rapportage

Links:

https://www.letscontrolit.com/wiki/index.php/LJ12A3

Onderdelen:

ArtikelAantalPrijsWebshop
Wemos D1 mini incl. pinheaders11,67Aliexpress
Wemos D1 DC Powershield11,18Aliexpress
BC547B transistor10,03Aliexpress
Weerstand 10K Ohm10,01Aliexpress
Weerstand 1K Ohm10,01Aliexpress
Diode 1N414810,01Aliexpress
Transformator 12V DC11,33Aliexpress
PCB printplaat 3×4 cm10,13Aliexpress
Schroefterminal 3-voudig10,36Aliexpress
(Dupont) kabeltjes male-female30,06Aliexpress
Optioneel: Behuizing11,13Aliexpress
LJ12A3-4-Z/Bx Inductieve Proximity Sensor12,26Aliexpress
Tie-wraps 368mm30,40MijnIJzerwaren.nl
Hoekanker zonder ril 125X125mm 46X2,5mm10,85MijnIJzerwaren.nl

Benodigdheden

  • Soldeerbout + tin
  • Kniptangetje
  • Boormachine + 4mm boortje
  • Stanleymes
  • Flex of IJzerzaag
  • Optioneel: 3D printer

Reeds up-and-running

  • MQTT-broker
  • Node-Red
  • ESP Easy Flasher incl. recente Esp-binaries
  • evt. Domoticz

Schema:

Werkwijze:

Op de Wemos D1 mini 2 male 8-voudige pinheaders gesoldeerd. Tevens op de VCC en GND van de Wemos DC Powershield 2 enkelvoudige male pinheaders gesoldeerd. Vervolgens van 2 male 8-voudige pinheaders de pins met een tangetje eruit getrokken, en de plastic pinhouders op de pinheaders van de Wemos D1 mini geschoven zodat er wat extra ruimte komt tussen de Wemos D1 mini en het powershield. Vervolgens het powershield op de pinheaders van de Wemos D1 mini gesoldeerd. Dus Wemos D1 beneden, en powershield daar boven op.

Op een stukje PCB van ongeveer 3 bij 4 cm een 3 voudige female pinheader gesoldeerd, zodat de verbindingen tussen de Wemos D1 pack en het printplaatje met behulp van 3 dupont kabels gemaakt kan worden. Vervolgens de 1k en 10k ohm weerstanden, de 1N4148 diode en de BC547B transistor conform bovenstaand schema op de printplaat gesoldeerd, dit alles uitkomende op een 3-voudige schroefterminal. Daarna de female connector van een zwart dupont kabeltje afgeknipt, gestript en op D5 (GPIO-14) van de Wemos D1 mini gesoldeerd. Tevens een blauwe dupont kabel op de pinheader van 12v GND van het powershield geschoven, en een bruine dupont kabel op de pinheader van de 12v VCC van het powershield. Tot slot de male zijdes van de 3 dupont kabels aangesloten op de female pinheader van het printplaatje.

Vervolgens de Wemos pack en het printplaatje in de behuizing geplaatst. De behuizing heb ik geprint met mijn 3D printer. De 3D printfiles kun je hier downloaden.

FileDownload URL
Bodyhttps://drive.google.com/file/d/1aCPEnqlAvVYCOhtTO0PQDwlNUTcWQAq2/view?usp=sharing
Coverhttps://drive.google.com/file/d/1gFAkQLfIEfSzWzpK8gUlfwLoJnCHTgSy/view?usp=sharing
CAD-filehttps://drive.google.com/file/d/1fs2r4mTijNxRXvyiJh_B_a56ZDn56Wm9/view?usp=sharing

De Wemos Pack klikt vast in de uitsparingen, vervolgens kun je de 3,5mm powerjack van het shield door de uitsparing schuiven. In het printplaatje twee 2,5mm gaatjes geboord, en de printplaat met kleine zelftappende schroefjes vastgezet. De kabel van de sensor doorgevoerd, met een tie-wrap geborgd, en vastgeschroefd in de schroefterminal volgens onderstaand schema:

  • Blauw: Gnd (1 in schema)
  • Zwart: Data (2 in schema)
  • Bruin: VCC (3 in schema)

Tot slot de cover met twee schroefjes op de behuizing vastgezet.

Met een flex het hoekanker afgekort naar ongeveer 70 bij 40 mm, en in het deel van 40mm een inkeping gemaakt van 13 mm breed bij ongeveer 25mm. Het hoekanker licht bij gebogen tot een hoek van ongeveer 95-100 graden. De sensor met de meegeleverde moeren en sluitringen in de inkeping vastgezet, en het lange deel van 70mm met twee tie-wraps vastgezet op de watermeter.

Wemos D1 flashen:

De Wemos D1 geflashed met ESPMega m.b.v. ESP Easy Flasher:

EspEasy geconfigureerd:

  • Config tab

(Het automatisch configureren van de WiFi-instellingen werkt bij mij niet altijd met ESP Easy flasher, in dat geval start de Wemos na het flashen op in AP mode en kun je op deze wijze ESPEasy alsnog connecteren aan de WiFi)

Toelichting

AttribuutWaardeDoel
Unit NameWatermeterLogische naam
Unit number6Uniek nummer !
Append unitnumer to Unit Nameuitgevinkt 
  • Controller tab, MQTT controller toegevoegd

Toelichting

AttribuutWaardeDoel
ProtocolDomoticz MQTT 
Controller IP<ip adress MQTT server> 
Enabledaangevinkt 
  • Devices tab, Pulse counter toegevoegd

Toelichting

AttribuutWaardeDoel
DeviceGeneric Pulse CounterAantal pulsen tellen van wieltje in watermeter
NameWatermeterLogische naam
EnabledAangevinkt 
GPIOGPIO-14 (D5)Zie ook werkwijze
Mode typeFallingZodra de sensor een puls meet wordt het voltage op D4 naar 0 gebracht, dit wordt geteld.
Send to controllerAangevinktZend waarden naar MQTT (en Domoticz)
IDXIDX van device in DomoticzZie volgende stap
Interval3600Iedere 60 minuten wordt er waarneming gedaan

Domoticz:

Een virtueel device aangemaakt vanuit de dummy hardware ‘Virtuele devices’ op het hardware tab.

Toelichting

AttribuutWaardeDoel
NaamWatermeterLogische naam
Sensor TypeWaterflow 

Ga vervolgens naar het tabblad apparaten en zoek het net aangemaakte device op en noteer het IDX nummer. Neem dit IDX nummer over in de ESP configuratie van de vorige stap.

MariaDB:

  • M.b.v. MySQL workbench tabel ‘Watermeter’ aangemaakt:

CREATE TABLE `watermeter` (
`sample datetime` datetime NOT NULL,
`pulses` int(11) DEFAULT NULL,
`liters` float(10,3) DEFAULT NULL,
`meterstand` float(10,3) DEFAULT NULL,
`type` char(1) DEFAULT 'S' COMMENT 'S = Sensor\nM = Manual',
PRIMARY KEY (`sample datetime`)

Log in op je Raspberry pi als root, start daar mysql:

mysql -p

en voer onderstaand commando uit

grant select on energy.watermeter to 'googledata'@'%';

Node Red Flow gemaakt:

NodeWerking
Run OnceBij het initieel starten van de flow wordt de laatst geregistreerde meterstand opgehaald uit de database
Get last MeterstandGenereer select-statement om laatst geregistreerde meterstand uit database uit te lezen
DatabaseConnectie naar MariaDB database, schema Energy
Set Previous MeterstandZet opgehaalde meterstand in flow context
MQTT-inLuister naar topic domoticz/in
WatermeterFilter messages van IDX 224 (Watermeter) uit
Build SQLGenereert insert sql-statement op basis van svalue uit MQTT-message en vorige meterstand it flow context
DatabaseInsert SQL-statement wordt verwerkt in de database
msg.payloadT.b.v. debugging (SQL-statement wordt getoond)
  • Export

[{"id":"9d187f62.57094","type":"tab","label":"Watermeter","disabled":false,"info":""},{"id":"35e2cbd4.822624","type":"mqtt in","z":"9d187f62.57094","name":"MQTT in","topic":"domoticz/in","qos":"2","datatype":"auto","broker":"ede154bd.f75f38","x":120,"y":160,"wires":[["89343dab.9b7b3"]]},{"id":"705eddb1.d81c04","type":"function","z":"9d187f62.57094","name":"Build SQL","func":"// {\"idx\":224,\"RSSI\":5,\"nvalue\":0,\"svalue\":\"3.00\"}\"\n\nvar pulses = parseInt(msg.payload.split(',')[3].split(':')[1].replace(\"}\",\"\").replace(/\"/g,\"\"));\nvar liters = pulses * 1; // verander 1 in kalibratieeenheid\nvar meterstand = flow.get(\"meterstand\") + liters/1000; // meterstand is in kuubs\nvar sql = \"\";\n\nif ( pulses > 0) {\n sql = \"insert into watermeter (`sample datetime`, `pulses`, `liters`, `meterstand`) values (now(),\";\n sql = sql + pulses + \", \" + liters + \", \" + meterstand + \");\";\n\n flow.set(\"meterstand\", meterstand);\n}\nelse {\n sql = \"SELECT 1 FROM DUAL;\";\n}\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":600,"y":160,"wires":[["99e0cb7b.5a1498"]]},{"id":"54c7fe23.a2cd","type":"debug","z":"9d187f62.57094","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1010,"y":160,"wires":[]},{"id":"99e0cb7b.5a1498","type":"mysql","z":"9d187f62.57094","mydb":"8056d2ce.5f8c8","name":"Database","x":800,"y":160,"wires":[["54c7fe23.a2cd"]]},{"id":"89343dab.9b7b3","type":"switch","z":"9d187f62.57094","name":"Watermeter","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"\"idx\":224","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":350,"y":160,"wires":[["705eddb1.d81c04"]]},{"id":"10f928ce.a3f8c7","type":"function","z":"9d187f62.57094","name":"Get last Meterstand","func":"var sql = \"SELECT * FROM watermeter where `sample datetime` = (select max(`sample datetime`) from watermeter);\"\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":60,"wires":[["f3a335bf.9e0d88"]]},{"id":"f3a335bf.9e0d88","type":"mysql","z":"9d187f62.57094","mydb":"8056d2ce.5f8c8","name":"Database","x":600,"y":60,"wires":[["68e743e4.06691c"]]},{"id":"522e970c.72a198","type":"inject","z":"9d187f62.57094","name":"Run once","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":60,"wires":[["10f928ce.a3f8c7"]]},{"id":"68e743e4.06691c","type":"function","z":"9d187f62.57094","name":"Set previous Meterstand","func":"flow.set(\"meterstand\", msg.payload[0][\"meterstand\"]);\n\n// node.warn(msg.payload[0][\"meterstand\"]);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":850,"y":60,"wires":[[]]},{"id":"ede154bd.f75f38","type":"mqtt-broker","z":"","name":"pi","broker":"192.168.2.29","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"8056d2ce.5f8c8","type":"MySQLdatabase","z":"","name":"mysql","host":"localhost","port":"3306","db":"energy","tz":"","charset":"UTF8"}]

Sensor afstellen

Op het rode wieltje (links onderin) zit een stukje metaal, dit gebruik ik om te meten. Een inductieve-sensor werkt op basis van magnetisme. Iedere keer dat het stukje metaal op het rode wieltje voorbij de sensor komt, telt hij een puls. Plaats het bewerkte hoekanker, en de hierop bevestigde sensor, zo dat hij bij iedere draaiing van het rode wieltje een meting verricht. Dit zie je aan het rode ledje bovenop de sensor. Zorg ervoor dat de sensor op het glas van de watermeter rust, anders meet hij niet goed.

Google data studio rapportage gemaakt:

  • Op het dashboard een staafdiagram toegevoegd die het waterverbruik over de afgelopen week weergeeft
  • Tevens een pagina aangemaakt met het waterverbruik per uur, per dag de afgelopen 30 dagen en per maand dit jaar
  • Hiervoor heb ik de volgende SQL-statements gebruikt
Rapport elementSQL-statement
Dashboard: Waterverbruik afgelopen week per dag;

 

Water: verbruik per dag afgelopen 30 dagen;

Water: verbruik per maand dit jaar;

SELECT `sample datetime` as ‘sample_datetime’,

 

       liters

FROM energy.watermeter;

Water: verbruik per uur;SELECT hour(`sample datetime`) as ‘uur’,

 

       sum(liters) as ‘liters’

FROM energy.watermeter

group by hour(`sample datetime`)

  • En de volgende instellingen

Eindresultaat:

Het eindresultaat ziet er als volgt uit:

Kalibreren:

De komende tijd ga ik de watermeter kalibreren. Als uitgangspunt heb ik een 10 liter emmer gevuld met water, en het aan pulsen geteld. Dit leverde 8 pulsen op. Een snelle rekensom leert dat er 1,25 liter per puls gemeten wordt. Of dit nauwkeurig genoeg is ga ik de komende tijd meten. Daarom heb ik in de sql-tabel het veld ’type’ toegevoegd. Dit stelt me in staat om meterstanden vanaf de meter handmatig toe te voegen, en op deze wijze het aantal verbruikte liters en de berekende meterstand te corrigeren.

Correctie: Aan het eind nogmaals de werkelijke meterstand vergeleken met de berekende meterstand. Bleek dat het aantal pulsen exact overeenkomt met het verbruikt aantal liters. Conlusie, 1 puls is 1 liter, wat op zich ook wel logisch lijkt. De node-red flow hierop aangepast.

Door het verschil tussen de berekende meterstand en de werkelijk van de watermeter afgelezen meterstand met elkaar te vergelijken, en te delen door het aantal pulsen tussen de twee ‘handmatige’ metingen, levert dit een correctie (positief of negatief) t.o.v. de ingestelde 1 liter per puls in de Node Red functie-node ‘Build SQL’.

T.z.t. zal ik mijn ervaringen met het kalibreren hier aan toe voegen.

2 gedachten over “Slimme watermeter

    1. Syds zegt:

      De constructie is wat fragiel. Onlangs moest de monteur een glasvezelkabel naar binnen brengen en heeft waarschijnlijk de sensor verschoven. Verder is het kalibreren van de sensor, dat wil zeggen hoeveel water is een volledig draai van de meter lastig. Zou fijn zijn dat Liander de specificaties gewoon op hun website zou zetten. Kwam al kalibreren de uit op een halve “gallon”. Verder werkt een en ander zeer stabiel.

      Syds

      Beantwoorden

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *