Slimme watermeter

Use cases:

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

Links:

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

Onderdelen:

Artikel Aantal Prijs Webshop
Wemos D1 mini incl. pinheaders 1 1,67 Aliexpress
Wemos D1 DC Powershield 1 1,18 Aliexpress
BC547B transistor 1 0,03 Aliexpress
Weerstand 10K Ohm 1 0,01 Aliexpress
Weerstand 1K Ohm 1 0,01 Aliexpress
Diode 1N4148 1 0,01 Aliexpress
Transformator 12V DC 1 1,33 Aliexpress
PCB printplaat 3×4 cm 1 0,13 Aliexpress
Schroefterminal 3-voudig 1 0,36 Aliexpress
(Dupont) kabeltjes male-female 3 0,06 Aliexpress
Behuizing 1 1,13 Aliexpress
LJ12A3-4-Z/Bx Inductieve Proximity Sensor 1 2,26 Aliexpress
Tie-wraps 368mm 3 0,40 MijnIJzerwaren.nl
Hoekanker zonder ril 125X125mm 46X2,5mm 1 0,85 MijnIJzerwaren.nl

 

Benodigdheden

  • Soldeerbout + tin
  • Kniptangetje
  • Boormachine + 4mm boortje
  • Stanleymes
  • Flex of IJzerzaag

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 (moest met een stanleymesje de opening voor de draadinvoer iets groter maken om dit passend te maken voor de power jack van de powershield. Tevens met de boormachine een gaatje gemaakt in de behuizing t.b.v. de kabel van de inductie sensor. 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)

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

Attribuut Waarde Doel
Unit Name Watermeter Logische naam
Unit number 6 Uniek nummer !
Append unitnumer to Unit Name uitgevinkt
  • Controller tab, MQTT controller toegevoegd

Toelichting

Attribuut Waarde Doel
Protocol Domoticz MQTT
Controller IP <ip adress MQTT server>
Enabled aangevinkt
  • Devices tab, Pulse counter toegevoegd

Toelichting

Attribuut Waarde Doel
Device Generic Pulse Counter Aantal pulsen tellen van wieltje in watermeter
Name Watermeter Logische naam
Enabled Aangevinkt
GPIO GPIO-14 (D5) Zie ook werkwijze
Mode type Falling Zodra de sensor een puls meet wordt het voltage op D4 naar 0 gebracht, dit wordt geteld.
Send to controller Aangevinkt Zend waarden naar MQTT (en Domoticz)
IDX IDX van device in Domoticz Zie volgende stap
Interval 3600 Iedere 60 minuten wordt er waarneming gedaan

 

Domoticz:

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

Toelichting

Attribuut Waarde Doel
Naam Watermeter Logische naam
Sensor Type Waterflow

 

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:

Node Werking
Run Once Bij het initieel starten van de flow wordt de laatst geregistreerde meterstand opgehaald uit de database
Get last Meterstand Genereer select-statement om laatst geregistreerde meterstand uit database uit te lezen
Database Connectie naar MariaDB database, schema Energy
Set Previous Meterstand Zet opgehaalde meterstand in flow context
MQTT-in Luister naar topic domoticz/in
Watermeter Filter messages van IDX 224 (Watermeter) uit
Build SQL Genereert insert sql-statement op basis van svalue uit MQTT-message en vorige meterstand it flow context
Database Insert SQL-statement wordt verwerkt in de database
msg.payload T.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 element SQL-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.

Geef een antwoord

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