Domotiza el agua

Es muy fácil conectar una electroválvula y un caudalímetro a la toma de agua y poder controlarlas desde Home Assistant.

Con el montaje que te propongo en el vídeo desde ese momento tendrás el control y podrás medir los litros consumidos, y lo podrás usar en casa para la ducha, en el jardín para la piscina, para llenar un depósito, para el riego, etc.

Y lo mejor es que podrás hacerlo tanto desde Home Assistant como de forma autónoma.

Te dejo a continuación los enlaces de compra de los productos que se han usado en el vídeo:

Aquí el vídeo:

A continuación te dejo el código que he usado en ESPHome:

esphome:
  name: grifo-termo-electrico

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "W56/vbjbtOSrMGxxxxxxxxxpYW6b8SvQKxjTG4o="

ota:
  password: "91e57a0858xxxxxxxxxxx43b032001ff210"

wifi:
  # definimos varios Wifi para que el dispositivo se conecte automáticamente al 
  # que llegue con mejor cobertura
  networks:
  - ssid: !secret wifi_ssid
    password: !secret wifi_password
  - ssid: !secret wifi_ssid2
    password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Grifo-Termo-Electrico"
    password: "8WFPYUGouwjM"

captive_portal:

sensor:
  # Caudalímetro YF-B5
  - platform: pulse_counter
    device_class: water
    pin: GPIO5 #D1
    name: "Consumo agua termo electrico instantáneo"
    id: yfb5
    update_interval: 5s
    unit_of_measurement: 'l/min'
    filters:
      # Q = F /6.6 siendo F litros por segundo. 
      # Para pasarlo a minutos sería Q = F * 1 / (6.6 * 60) = F * 0.002525
      - multiply: 0.002525 

  - platform: integration
    device_class: water
    state_class: total_increasing
    name: "Consumo agua termo electrico acumulado"
    unit_of_measurement: 'L'
    accuracy_decimals: 2
    sensor: yfb5
    time_unit: min


switch:
  # Relés para manejar la electroválvula
  - platform: gpio
    id: grifo_termo_electrico_cerrar
    pin: GPIO14 #D5

  - platform: gpio
    id: grifo_termo_electrico_abrir
    pin: GPIO12 #D6


light:
  # Leds
  - platform: binary
    output: led1
    id: led_verde
    
  - platform: binary
    output: led2
    id: led_rojo 

output:
  - platform: gpio
    id: led1
    pin: GPIO13 #D7

  - platform: gpio
    id: led2
    pin: GPIO15 #D8

binary_sensor:
  # Pulsador en Home Assistant
  - platform: homeassistant
    entity_id: input_boolean.termo_electrico
    id: puls_termo_hass
    on_state:
      # según esté encendido o apagado en Home Assistant
      # coloco el led rojo en apagado o encendido (al revés)
      - if:
          condition:
            lambda: return(id(puls_termo_hass).state);
          then:
            light.turn_on: led_rojo
          else:
            light.turn_off: led_rojo
      # y luego movemos la electroválvula para abrir o cerrar según corresponda
      - script.execute: mueve_grifo

  # Pulsador en la caja    
  - platform: gpio    
    id: pulsador_caja
    pin:
      number: GPIO4 #D2
      mode:
        input: true
        pullup: true
    on_press:
      then:
        if:
          # si está conectado a Home Assistant
          condition:
            api.connected:
          then:
            # entonces cambia de estado el pulsador de Home Assistant
            # esto provocará que se ejecute el bloque anterior como
            # si fuera el usuario quien lo ha pulsado. Por tanto
            # la electroválvula se colocará en su posición automáticamente
            - homeassistant.service: 
                service: input_boolean.toggle
                data:
                  entity_id: input_boolean.termo_electrico
          else:
            # Si no hay conexión a Home Assistant movemos
            # la electroválvula desde aquí
            - script.execute: mueve_grifo
            
script:
  # En este script movemos la electroválvula a la posición de abierta o cerrada
  # dependiendo del estado del led rojo. Si estaba encendido, la válvula estaba
  # cerrada y por lo tanto hay que abrirla.
  # Por el contrario, si estaba apagado, la válvula estaba abierta y por lo tanto
  # hay que abrirla
  - id: mueve_grifo
    then:
      if:
        condition:
          # La condición es el estado del led rojo
          light.is_on: led_rojo
        then:
          # ABRIMOS LA VÁLVULA
          ####################
          # Cambiamos el estado de los dos leds
          - light.turn_on: led_verde
          - light.turn_off: led_rojo
          # Activamos los relés en la combinación adecuada para abrir la válvula
          - switch.turn_on: grifo_termo_electrico_abrir
          - switch.turn_off: grifo_termo_electrico_cerrar
          # Hacemos un parpadeo del led verde durante 15 segundos
          - repeat:
              count: 30
              then:
                - light.turn_off: led_verde
                - delay: 250ms
                - light.turn_on: led_verde
                - delay: 250ms
          # Y apagamos el relé que estaba abierto
          - switch.turn_off: grifo_termo_electrico_abrir

        else:
          # CERRAMOS LA VÁLVULA
          ####################
          # Cambiamos el estado de los dos leds
          - light.turn_off: led_verde
          - light.turn_on: led_rojo
          # Activamos los relés en la combinación adecuada para cerrar la válvula
          - switch.turn_off: grifo_termo_electrico_abrir
          - switch.turn_on: grifo_termo_electrico_cerrar
          # Hacemos un parpadeo del led rojo durante 15 segundos
          - repeat:
              count: 30
              then:
                - light.turn_off: led_rojo
                - delay: 250ms
                - light.turn_on: led_rojo
                - delay: 250ms
          # Y apagamos el relé que estaba abierto
          - switch.turn_off: grifo_termo_electrico_cerrar

Y aquí te dejo el esquema del circuito de control:

Scroll al inicio