Consumo de agua
En casa tenemos medido en bastante detalle el consumo eléctrico, pero algo que hasta hace poco no teníamos controlado era el consumo de agua. Es algo que hace años que quería montar, y empecé el proceso, pero sólo pude completarlo muy recientemente, cuando por fin tuve electricidad en la zona del contador.
Veamos los detalles de cómo lo monté. El contador es uno interno propio, separado del de la traída, modelo Baylan 1783-MID-010, aunque también viene como marca Ruedagua. Es un contador típico, sin nada especial, pero como otros muchos, trae unas roscas en el plástico y un imán en la aguja pequeña para poderlo digitalizar con un aparato de la marca.

Contador analógico
Lo habitual para domotizar este tipo de cosas es utilizar un sensor inductivo para detectar el metal cada vez que la aguja pequeña gira. Esto nos da una resolución de 1 litro, que es suficiente para nuestros usos. Opté por utilizar un LJ18A3-8-Z/BX 5V que encontré en AliExpress a muy buen precio (menos de 5€). Diseñé e imprimí un adaptador para colocar el sensor en el lugar exacto y atornillarlo en los espacios diseñados para ello, comprobando que funcionaba correctamente.

Sensor ya montado
Lo siguiente fue preparar el circuito para conectar el sensor. Utilicé un devboard ESP32 por comodidad, alimentado por un HiLink a 5V, puesto que es lo que necesita el sensor, y el devboard trae electrónica para alimentarlo desde ese voltaje sin problemas. Tuve también que añadir una forma de reducir los 5V que saca el sensor a los 3.3V que esperan los GPIO del ESP32: un divisor de voltaje con dos resistencias fue más que suficiente. Para que todo quedase más profesional, imprimí el PCB en JLCPCB, y diseñé una carcasa chula para protegerlo.

PCB ESP32 y caja
Ya sólo quedó colocarlo en su sitio, y configurar todo en ESPHome. Para esto último hay varias opciones, pero tras un tiempo llegué a la siguiente configuración:
globals:
- id: pulse_timestamps
type: std::vector<uint32_t>
restore_value: no
- id: last_total_count
type: float
initial_value: '0'
sensor:
- platform: pulse_meter
pin: GPIO27
internal_filter: 1s
internal_filter_mode: PULSE
id: water_rate_int
internal: true
total:
name: "Consumo Total Agua"
unit_of_measurement: "L"
id: water_total
icon: "mdi:water"
accuracy_decimals: 0
device_class: water
state_class: total_increasing
filters:
- multiply: 1
on_value:
then:
- lambda: |-
int delta = (int)(x - id(last_total_count));
if (delta > 0) {
for(int i = 0; i < delta; i++) {
id(pulse_timestamps).push_back(millis());
}
id(last_total_count) = x;
}
- platform: template
name: "Consumo Instantáneo Agua"
unit_of_measurement: "L/min"
id: water_rate
icon: "mdi:water"
accuracy_decimals: 0
device_class: volume_flow_rate
state_class: measurement
update_interval: 1s
lambda: |-
uint32_t now = millis();
id(pulse_timestamps).erase(
std::remove_if(id(pulse_timestamps).begin(), id(pulse_timestamps).end(),
[now](uint32_t t) {
return (now - t) > 60000;
}),
id(pulse_timestamps).end()
);
return (float)id(pulse_timestamps).size();
He utilizado un pulse_meter en el pin del sensor, que se encarga del filtrado y de manejar el consumo total. Además, configuro un template con una lambda para dar una aproximación del consumo instantáneo, llevando la cuenta de los pulsos recibidos el último minuto. Seguro que hay otras formas de hacerlo, pero esta fue la que me dio un resultado mejor para mi caso de uso. Importante no olvidar las unidades y clases correctos para que Home Assistant nos lo acepte.
Con esto ya estamos listos para añadirlo al panel de energía, aunque en mi caso opté por crear un ayudante de tipo sensor de suministro sobre el sensor, para evitar problemas en reinicios o si mañana cambio el sensor. ¡Y eso es todo! Ya tenemos gráficos detallados con el consumo.

Gráfico de consumo
Este tipo de proyectos no siempre tienen un objetivo claro de inicio, más allá de la diversión y de querer obtener más datos, pero esa información siempre acaba siendo útil, tanto en automatizaciones originales, como en aprender más de tu consumo, y con ello poder tomar decisiones informadas. Ya veremos qué sale de aquí, pero por lo de pronto, estoy encantado con el resultado.