Categorieën
Arduino en ESP Domotica Home Assistant Smarthome

Watermeter in Home Assistant met esphome

Het is weer zomer en dus gaat Nederland massaal zwembadjes vullen, de planten sproeien en vaker douchen. Ik vroeg mij af, hoeveel verbruik je dan eigenlijk? Maar ook in de andere seizoenen is het interessant om te weten wat je waterverbruik is. Hoeveel verbruikt je wasmachine en je vaatwasser, hoeveel water gebruik je tijdens het douchen? Meten is weten en daarom gaan we de watermeter toevoegen aan onze smarthome domoticasoftware Home Assistant.

Een watermeter bevind zich vaak in de meterkast of kruipruimte. Waterbeheerbedrijven zoals Vitens of Oasen monteren vaak watermeters van het merk Itron. Zo ook die van mij, helaas zijn de watermeters nog niet smart en missen ze dus een ‘slimme’ aansluiting zoals P1 of S0 aansluiting (pulsuitgang) zoals bij slimme meters, zonnepanelen of tussenmeters. We zullen het dus anders aan moeten pakken om de watermeter uit te lezen.

Itron KIWA TU1M15
Mijn watermeter: Itron KIWA TU1M15

Home Assistant of Domoticz

Dit artikel is er ook voor Domoticz gebruikers! Lees rustig verder in Watermeter uitlezen met Domoticz als je Domoticz als smarthome software gebruikt en je waterverbruik inzichtelijk wilt krijgen.

Met onderstaand stappenplan voeg je eenvoudig je watermeter toe aan Home Assistant.

  1. Weet waar je watermeter zit

    Zorg dat je weet waar je watermeter zich bevind. Meestal is het de meterkast, je hebt er ook WiFi bereik en netstroom of USB 5v nodig.

  2. Knutsel de pulsteller in elkaar met de nabijheidssensor

    Maak een WiFi pulsteller op basis van een Wemos D1 mini/ESP8266 met nabijheidssensor en esphome

  3. Configureer Home Assistant

    Esphome maakt de sensoren aan in Home Assistant

  4. Analyseer je waterverbruik

    De gegevens komen binnen terwijl je water verbruikt. Nu heb je inzicht in je waterverbruik en start met besparen!

Zelf een pulsgever voor de watermeter maken met een Wemos D1 mini

In mijn huis is de Aquadis Itron TU1M15, geïnstalleerd. De watermeter bevat een rood ronddraaiend metertje met een stalen plaatje erop. Bij iedere liter water die je verbruikt, draait het metertje 1x rond. Wanneer je dus het aantal rondjes telt wat het plaatje draait, kun je je waterverbruik meten. Nu je dit weet, is het eigenlijk niet zo moeilijk meer, want we gaan gewoon pulsen tellen. Daar zijn legio voorbeelden en oplossingen voor binnen de Arduino wereld. Ik heb er twee geprobeerd, een optische sensor en de nabijheidssensor. Lees in mijn artikel Watermeter uitlezen met Domoticz meer over mijn bevindingen van beide oplossingen. Voor de watermeter integratie met Home Assistant ga ik in dit artikel verder met de beste oplossing; de nabijheidssensor.

Waterverbruik meten met een nabijheidssensor/proximity sensor

De beste oplossing heb ik gevonden in een “nabijheidssensor” ofwel een “proximity sensor”. Deze sensor geeft een puls af wanneer er metaal dichtbij het meetoppervlak komt. Het metalen plaatje op de rode wijzer van de watermeter is groot en dichtbij genoeg om waar te nemen door de sensor. Wanneer er detectie is, gaat de rode led op de sensor aan. Het betreft een LJ12A3-4-Z-BX. In de reacties onder het artikel Watermeter uitlezen met Domoticz hebben lezers gemeld dat ook andere type proximitysensors werken.

LJ12A3-4-Z-BX nabijheidssensor
LJ12A3-4-Z-BX nabijheidssensor

De werking van een nabijheidssensor/proximity sensor

De sensor werkt op 6 tot 36V DC. Omdat die spanning niet uit de Wemos D1 mini of een USB poort komt, moeten we die ook zien te maken. Dat kan door bijvoorbeeld een 12VDC adapter te gebruiken, of door een spanningsconverter toe te passen.

De nabijheidssensor zelf trekt 300mA, dus de adapter of spanningsconverter moet dat minimaal kunnen leveren. Omdat ik geen plek meer had voor een extra stekker in het stopcontact voor een adapter en een ‘sterke’ USB poort beschikbaar had, heb ik gebruik gemaakt van een MT3608 spanningsconverter. Deze spanningsconverter kan maximaal 2A leveren.

Ik ga het als volgt aansluiten:

230VAC   ->    Telefoonlader 5V 2A      ->     Spanningsconverter 5v/12vDC  & Wemos D1 mini      ->        Sensor

Bij een adapter kun je het volgende doen:

230VAC    ->  Adapter  …VDC ..A   ->    Sensor & Spanningsconverter …V/5V DC  ->    Wemos D1 mini

TIP

In de reacties onder het artikel Watermeter uitlezen met Domoticz hebben lezers gemeld dat er ook een 5V nabijheidssensor is. Dat betekend dat je het spanningsconverterprintje niet meer nodig hebt.

MT3608 spanningsconverter voor Arduino
MT3608 spanningsconverter voor Arduino

Aansluitschema van de nabijheidssensor op Wemos D1 mini

De nabijheidssensor, Wemos D1 mini en de spanningsconverter sluit ik aan op een USB poort van een apparaat wat in de meterkast hangt. Vervolgens voeg je alle GND draden van alle componenten samen. Tussen de 5V van de Wemos en zwarte kabel van de sensor plaatsen we een 10K ohm weerstand. De datadraad van de sensor kun je op een willekeurige GPIO pin aansluiten van de Wemos. Onthoud dit pinnummer wel, want die heb je straks nodig in de esphome software. Sluit als laatste de blauwe en bruine draad van de nabijheidssensor aan op de 12v aansluiting van de spanningsconverter.

Aansluitschema watermeter
Aansluitschema watermeter

Wanneer je alles goed aangesloten hebt en je houd de sensor tegen een stuk metaal, zie je de led op de sensor aan gaan. Dat betekend dat het werkt!

Sensor en Wemos D1 mini bevestigen op de watermeter

De nabijheidssensor op de watermeter bevestigen is nog wel een uitdaging. Een voorwaarde voor mij was dat ik altijd de waterstand moet kunnen lezen en dat ik de meter niet mag beschadigen. Met wat knutselen met plastic, hout en stalen beugels kom je een eind.

Zelf maken moeilijk?

Ben je niet zo handig, dan bestaat er ook een Impulsgever die je op de Itron Aquadis watermeter plaatst en kunt integreren in je domoticasysteem. Het apparaat is wel vrij prijzig, namelijk ongeveer 80 euro en de leverbaarheid is lastig.

Pulssensor Cyble voor watermeters Itron
Pulssensor Cyble voor watermeters Itron

S0 tool

Collega blogger Wobbe van huizebruin.nl wees mij erop dat hij een kant en klare software en hardware oplossing heeft ontwikkeld op basis van esphome. Het is vergelijkbaar met wat we in dit artikel gaan maken. Wil je het checken? Zie :

ESPhome en Home Assistant

De hardware werkt. We gaan over naar de software. We gaan code via esphome op de Wemos D1 mini flashen. Heb je nog nooit met esphome gewerkt? Installeer dan eerst de esphome addon.

Klik op New Device en geef je device een naam. Geef het bijvoorbeeld de naam Watermeter. Plak nu onderstaande code in het venster:

# voorbeeld: https://github.com/hugokernel/esphome-water-meter
substitutions:
  name: watermeter
  friendly_name: "Watermeter"
  
esphome:
  name: watermeter
  platform: ESP8266
  board: d1_mini
  on_boot:
    priority: -10
    then:
    - script.execute: publish_states
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
  password: "59bfd5695775faaa05ef193e378d4cc2"
wifi:
  ssid: "<<WIFI SSID>>"
  password: "<<WIFI PASSWORD>>"
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Watermeter Fallback Hotspot"
    password: "4Ejkhjkhuixa4M"
captive_portal:
script:
  - id: reset_main_counter
    then:
      - lambda: |-
          id(main_counter_pulses) = 0;
          id(water_main_consumption).publish_state(id(main_counter_pulses));
  - id: reset_secondary_counter
    then:
      - lambda: |-
          id(secondary_counter_pulses) = 0;
          id(water_secondary_consumption).publish_state(id(secondary_counter_pulses));
  - id: publish_states
    then:
      - lambda: |-
          id(water_main_consumption).publish_state(id(main_counter_pulses));
          id(water_secondary_consumption).publish_state(id(secondary_counter_pulses));
          id(water_daily_consumption).publish_state(id(daily_counter_pulses));
          id(water_weekly_consumption).publish_state(id(weekly_counter_pulses));
          id(water_monthly_consumption).publish_state(id(monthly_counter_pulses));
          id(water_yearly_consumption).publish_state(id(yearly_counter_pulses));
          id(current_water_consumption).publish_state(id(event_quantity));
  
time:
  - platform: sntp
    on_time:
      - seconds: 0
        minutes: 0
        hours: 0
        then:
          - globals.set:
              id: daily_counter_pulses
              value: '0'
          - lambda: id(water_daily_consumption).publish_state(id(daily_counter_pulses));
      - seconds: 0
        minutes: 0
        hours: 0
        days_of_week: MON
        then:
          - globals.set:
              id: weekly_counter_pulses
              value: '0'
          - lambda: id(water_weekly_consumption).publish_state(id(weekly_counter_pulses));
      - seconds: 0
        minutes: 0
        hours: 0
        days_of_month: 1
        then:
          - globals.set:
              id: monthly_counter_pulses
              value: '0'
          - lambda: id(water_monthly_consumption).publish_state(id(monthly_counter_pulses));
      - seconds: 0
        minutes: 0
        hours: 0
        days_of_month: 1
        months: JAN
        then:
          - globals.set:
              id: yearly_counter_pulses
              value: '0'
          - lambda: id(water_yearly_consumption).publish_state(id(yearly_counter_pulses));
sensor:
  - platform: pulse_counter
    id: water_pulse_counter
    pin: 4
    name: "${friendly_name} water consumption" 
    update_interval: 2sec
    internal_filter: 10us
    unit_of_measurement: "L/min"
    accuracy_decimals: 0
    icon: "mdi:water"
    filters:
      # Divide by 60
      - multiply: 0.0167
      - lambda: return abs(x);
  - platform: template
    id: water_main_consumption
    name: "${friendly_name} main water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: water_secondary_consumption
    name: "${friendly_name} secondary water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: water_daily_consumption
    name: "${friendly_name} daily water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: water_weekly_consumption
    name: "${friendly_name} weekly water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: water_monthly_consumption
    name: "${friendly_name} monthly water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: water_yearly_consumption
    name: "${friendly_name} yearly water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: current_water_consumption
    name: "${friendly_name} current water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  - platform: template
    id: last_water_consumption
    name: "${friendly_name} last water consumption"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    icon: "mdi:water"
  
binary_sensor:
  # Nabijheidssensor
  - platform: gpio
    id: water_pulse
    pin: 4
    internal: true
    filters:
       - delayed_on_off: 50ms
       - lambda: |-
          id(main_counter_pulses) += x;
          id(secondary_counter_pulses) += x;
          id(daily_counter_pulses) += x;
          id(weekly_counter_pulses) += x;
          id(monthly_counter_pulses) += x;
          id(yearly_counter_pulses) += x;
          id(event_quantity) += x;
          return x;
    on_state:
       - script.execute: publish_states
       
switch:
  - platform: template
    name: "${friendly_name} reset main counter button"
    icon: "mdi:restart"
    turn_on_action:
      - script.execute: reset_main_counter
  - platform: template
    name: "${friendly_name} reset secondary counter button"
    icon: "mdi:restart"
    turn_on_action:
      - script.execute: reset_secondary_counter
  - platform: restart
    name: "${friendly_name} restart"
interval:
  # Save the last consumption
  #
  # An event is published when a water flow (>= 1L / 15 seconds) is
  # detected and followed by a stop of consumption for a defined time.
  - interval: 15sec
    then:
      - lambda: |-
          if (id(event_quantity) != id(last_event_quantity)) {
            // Water continues to flow
            // Reset event counter
            id(event_counter) = 0;
          } else {
            // Water no longer flows
            if (id(event_quantity)) {
              // 4 * 15 * 5 = 5min
              if (id(event_counter) < 4 * 5) {
                // Timeout is not reaches
                id(event_counter)++;
              } else {
                  // Timeout is reaches
                  id(last_water_consumption).publish_state(id(event_quantity));
                  // Send event to Home Assistant
                  api::HomeAssistantServiceCallAction<> *api;
                  api = new api::HomeAssistantServiceCallAction<>(api_apiserver, true);
                  // Event id length limit is 32 characters
                  api->set_service("esphome.last_consumption_changes");
                  api->play();
                  id(event_quantity) = 0;
              }
            }
          }
          id(last_event_quantity) = id(event_quantity);
  # Track the current consumption
  - interval: 2sec
    then:
      - lambda: |-
          if (id(event_quantity) != id(current_event_quantity)) {
            id(current_water_consumption).publish_state(id(event_quantity));
          }
          id(current_event_quantity) = id(event_quantity);
globals:
 - id: main_counter_pulses
   type: int
   restore_value: yes
   initial_value: '0'
 - id: secondary_counter_pulses
   type: int
   restore_value: yes
   initial_value: '0'
 - id: daily_counter_pulses
   type: int
   restore_value: yes
   initial_value: '0'
 - id: weekly_counter_pulses
   type: int
   restore_value: yes
   initial_value: '0'
 - id: monthly_counter_pulses
   type: int
   restore_value: yes
   initial_value: '0'
 - id: yearly_counter_pulses
   type: int
   restore_value: yes
   initial_value: '0'
 - id: event_quantity
   type: int
   restore_value: no
   initial_value: '0'
 - id: last_event_quantity
   type: int
   restore_value: no
   initial_value: '0'
 - id: event_counter
   type: int
   restore_value: no
   initial_value: '0'
 - id: current_event_quantity
   type: int
   restore_value: no
   initial_value: '0'
 - id: higher_resistance
   type: float
   restore_value: yes
   initial_value: '0'

Pas de volgende waarden aan naar je eigen situatie: Wifi SSID, Wifi Password en de pin van de sensor onder binairy_sensor.

Het waterverbruik van vandaag. Om 00:00 reset de dagteller.
Het waterverbruik van vandaag. Om 00:00 reset de dagteller.

Deze code maakt een aantal sensors aan die je inzicht geven in je waterverbruik. Er is een ‘huidig verbruik’ teller, welke het aantal liters van de huidige tapactie telt. Het dag, week, maand en jaar verbruik kun je inzichtelijk maken voor deze periodes met de specifieke sensors. Er is ook een tweede teller aanwezig die je kunt resetten voor je eigen bepaalde periode.

De sensoren die Home Assistant aanmaakt
De sensoren die Home Assistant aanmaakt

esphome watermeter code flashen naar Wemos D1 mini

Flash de code naar de Wemos D1 mini. Dit moet de eerste keer via een USB kabel tussen de Wemos en de PC waar je mee werkt, of de host machine van Home Assistant. Ikzelf maak de USB verbinding altijd op de PC waarmee ik werk dus klik ik op Plug into this computer.

esphome flash opties
esphome flash opties

De browser maakt verbinding met je COM poorten en vraagt welke COM poort je Wemos is. Klik op de juiste en het flashen begint.

Welke COM poort is je Wemos D1 mini?
Welke COM poort is je Wemos D1 mini?

Als je na het flashen nog aanpassingen wilt maken aan de code kan dat, en kun je de code draadloos op je Wemos D1 mini flashen. Kies dan voor Wirelessly in het keuze menu. Home Assistant maakt dan verbinding met de Wemos via WiFi en werkt de software OTA bij.

Het werkt! Je watermeter is toegevoegd aan Home Assistant!

Nu je je waterverbruik inzichtelijk hebt in Home Assistant kun je onderzoeken welke apparaten en activiteiten veel water gebruiken. Misschien kun je hierop wel heel simpel besparen! Je wasmachine en vaatwasser verbruiken vaak het meeste water, naast de keukenkraan en douche. Wist je dat het heel makkelijk is om een melding te krijgen als de wasmachine of vaatwasser klaar is? Je meet dat niet via het waterverbuik maar op een andere manier. Lees meer over notificaties krijgen van je normale wasmachine, droger of ander apparaat in Is de wasmachine klaar? Notificatie van domoticz.

Kom je er niet uit? Laat een reactie achter!

Wat vond je van dit artikel?

Geef hieronder je stem via de sterren. Laat weten wat je vindt van het artikel en stel je vragen in de reacties!

Wat vond je van deze blogpost?

Klik op een ster om een beoordeling te geven!

Gemiddelde score 5 / 5. Aantal stemmen: 1

Er heeft nog niemand gestemd. Wees de eerste, het kost niets en geen registratie!

Jammer dat de post niet behulpzaam was.

Laten we deze post verbeteren!

Wat zou er beter kunnen?

9 reacties op “Watermeter in Home Assistant met esphome”

Hi Wouter, bedankt voor de uitgebreide uitleg! ik heb sinds gisteren succesvol een watermeter in homeassistant en gebruik daarbij de configuratie die je hierboven hebt gedeeld.
ik ben ook al tegen het eerste probleem aangelopen; als het meetwiel half onder de sensor stil komt te staan gaat de sensor knipperen en wordt er een absurd hoog aantal pulses geregistreerd; heb je wellicht een tip om dit in de software eruit te filteren?

Beste Laurens,

Leuk dat je aan de slag bent gegaan! Ik weet van het probleem wat je omschrijft. Ik heb er zelf eigenlijk geen last van. Ik kan mij niet voorstellen dat het bij mij niet voorkomt. Toch zie ik geen pieken in mijn verbruik.

Heeft het misschien te maken met de weerstand die je gebruikt? Anders wellicht de waarde van
internal_filter: 10us verhogen?

Succes en groet Wouter

Dag Wouter
Ik zou jouw programma willen gebruiken om mijn stookolieverbruik te monitoren
De teller die ik bezit geeft echter 20 pulsen per liter , hoe kan ik dit aanpassen ?

Hoi marnix,

Dat kan! Volgens mij is het het eenvoudigst om in de code onder de filters van de binary sensor een multiply toevoegen.

– multiply: 0.05

0.05 = 1/20

Alles blijft werken zoals nu alleen iedere puls wordt vermenigvuldigd met 0.05 waardoor na 20 pulsen de teller op 1 staat.

Omdat je nu ook met decimalen werkt kun je de accuracy nog aanpassen naar 0.00

Succes en groet Wouter

Dag wouter
binary_sensor blijkt geen filter multiply toe te staan
de accuracy is aangepast naar 0.05 maar heeft geen effect in HA

Hoi Marnix,

Oh ja ik zie het. De code voor esphome is voor mij ook nog een beetje nieuw…

Wat je ook kunt doen is in home assistant een template sensor maken die de waarde van de watermeter vermenigvuldigd met 0.05.

De accuracy_decimals moet je aanpassen naar 2 zodat esphome snapt dat je 2 decimalen wilt. Maar als je de omrekening doet in home assistant zelf hoeft dat niet.

Zoals gezegd esphome is voor mij ook wat nieuw.

Groet Wouter

Dag wouter,
Dat werkt inderdaad prima , zodoende heb ik mijn eerste template gemaakt
Is er een manier om de geschiedenis te verwijderen zodat ik met een propere meting kan herbeginnen ?
Groetjes
Marnix

Laat weten wat je van dit artikel vindt!

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

%d bloggers liken dit: