Este artículo es continuación del artículo anterior:
Quería reemplazar un D1 Mini con un D1 MINI V4 nueva versión.

El anterior fue flasheado con Esp Easy, el nuevo, lo flasheé con ESP Home.
Aquí están los dos tutoriales:
Una vez que el D1 MINI V4 flasheado con Esp Home, continúo la configuración.
Aprovecho el cambio de D1Mini para reemplazar la resistencia del puente divisor entre A0 y GND, puse un 51K. El valor de esta resistencia se establece en el valor de la termorresistencia a 25 ° C (por lo tanto, se medirá manualmente antes de la instalación).
Para que conste, aquí está el diagrama de cableado

El cableado del D1 Mini no ha cambiado, así que reproduzco el diagrama con el D1 Mini V4.
Por favor refiérase a esta página para más explicaciones:
Me doy cuenta de la configuración del archivo yaml del dispositivo ESP Home
Una vez que el D1 mini flasheado V4, voy a ESPHome Builder y encuentro mi equipo:

Hago clic en EDITAR y edito el archivo yaml, aquí está la configuración:
sustituciones: nombre: esphome-web-e586c5 friendly_nombre: ESPHome Agua Caliente esphome: nombre: ${nombre} friendly_nombre: ${friendly_name} min_versión: 2024.6.0 nombre_add_mac_suffix: proyecto falso: nombre: Versión esphome.web: dev esp8266: tablero: esp01_1m # Habilitar el registro del registrador: # Habilitar el API Home Assistant api: # Permitir actualizaciones de Over-The-Air ota: - plataforma: esphome # Permitir la configuración de Wi-Fi a través del puerto serie improvisado_serial: wifi: # Configurar un AP Wi-Fi: {} # En combinación con la opción "ap", esto permite al usuario # Configurar las credenciales Wi-Fi a través de Wi-Fi AP. cautive_portal: dashboard_import: «Paquete _import _url»: 1//esphome/example-configs/esphome-web/esp8266.yaml@main import_full _config: cierto # Para tener una "próxima URL" para improvisar_serial web_server: sensor: - plataforma: Sensor ntc: temp_Nombre de resistencia: "Temperatura" unidad _of _measurement: "°C" de precisión _decimals: 2 calibración: b_constante: 3950 referencia_temperatura: 25 °C de referencia_resistencia: 50kOhm - plataforma: id de resistencia: temp_sensor de resistencia: Temp_Configuración de voltaje: Resistencia DOWNSTREAM: 50kOhm referencia_voltage: 3.3V - plataforma: pin de adc: Identificador A0: temp_voltaje # Sensor de turbina para agua fría - plataforma: Pulse_meter pin: número: Modo GPIO13: entrada: verdadero pullup: nombre verdadero: «Drinking Water Flow» unidad _of _measurement: 'L/min' precision_decimals: 0 filtro interno _: Tiempo de espera de 100 ms: Filtros 5s: - multiplicar: 0,013 en total: nombre: «Total de agua potable» unidad _of _measurement: Identificación «L»: _eau _precisión potable_decimals: 2 filtros: - multiplicar: 0.013 # Sensor de turbina para agua caliente - plataforma: Pulse_meter pin: número: Modo GPIO14: entrada: verdadero pullup: nombre verdadero: «Flujo de agua caliente» unidad _of _measurement: 'L/min' precision_decimals: 0 filtro interno _: Tiempo de espera de 100 ms: Filtros 5s: - multiplicar: 0.013 # 1/77 en total: nombre: «Total Conso Hot Water» unidad _of _measurement: Identificación «L»: _eau _chaude exactitud_decimals: 2 filtros: - multiplicar: 0.013 # 1/77 # Sensor calculado para el consumo neto de agua fría - plataforma: Nombre de la plantilla: «Total Conso Cold Water» unidad _of _measurement: "L" precisión _decimals: 2 lambda: |- return id(total _eau _potable).state - id(total _eau _chaude).state;
En pocas líneas, aquí está la explicación:
Sensor de temperatura (NTC):
- Utilice un termistor NTC
- Medición en °C con dos decimales
- Configuración en cascada: ADC (A0) → resistencia → ntc
- Calibrado con una constante B de 3950 y una referencia a 25°C/50kΩ
Dos sensores de flujo de agua (pulso _meter):
- Agua potable en GPIO13, Agua caliente en GPIO14
- Configuración en modo de entrada con pullup habilitado
- Conversión: multiplicado por 0,013 (calibrado en 77 pulsos/L)
- Tiempo de espera de 5 s (volver a 0 si no hay pulsos)
- Filtro interno de 100 ms para estabilizar la reproducción
- Cada uno tiene un medidor total en litros
- Aclaración: 0 decimales para el flujo, 2 decimales para el total
Un sensor calculado:
- Calcula el consumo de agua fría
- Fórmula: Agua potable total – Agua caliente total
- Aclaración: 2 decimales
Selecciono los sensores que guardo

Mantendré los últimos 4 sensores, desactivaré los otros y los renombraré por:
- sensor.temperatura _eau _chaude
- sensor.esphome _total_eau _potable
- sensor.esphome_total_eau_chaude
- sensor.esphome_total_eau_froide


Añado 3 sensores offset
Cuando el D1 Mini V4 se reinicia (por ejemplo, corte de jugo), el conteo comienza desde cero.
Así que organicé el cálculo del recuento total a través de un sensor que me da la suma de un desplazamiento y el valor del recuento actual.
Así que agregué 3 entidades de compensación. Para los puristas, solo dos son obligatorios, el tercero se puede calcular.
Entonces, en Configuración / Dispositivos y Servicios / Entradas, agregué una entrada

A continuación, el número


Asi que esto me crea entrada _number.eau _froide _offset.
Estoy haciendo esto para las otras dos compensaciones.

Elegí utilizar «agua potable» para todo lo que pasa por el contador de agua potable, es decir, el consumo total: agua fría + agua caliente.
Agrego 3 automatizaciones para administrar el restablecimiento del contador D1 Mini
El D1 Mini tiene un defecto de tamaño, pierde el valor de sus medidores en caso de reinicio, por lo que todo comienza desde cero, por lo que no me conviene.
Observé que, en el momento del restablecimiento, los sensores cambian al estado «no disponible» antes de volver a cero.
Por lo tanto, asignaré el estado anterior no disponible a una entrada _number que servirá como compensación, es decir, como un valor de corrección para el recuento general.
Para hacerlo más simple, hago 3 automatizaciones que hacen esto:
alias: Desplazamiento de agua caliente en desencadenantes no disponibles: - entidad _id: sensor.esphome _total_eau _chaude a: desencadenante no disponible: acciones estatales: - objetivo: _id (entidad): input_number.eau _chaude _offset datos: valor: >- {{ states('input_number.eau _chaude _offset') | float + trigger.from _state.state | float }} acción: input_number.setModo _value: alias único: Compensación de agua fría en desencadenantes no disponibles: - entidad _id: sensor.esphome _total_eau _froide a: desencadenante no disponible: acciones estatales: - objetivo: _id (entidad): input_number.eau_froide_datos de compensación: valor: >- {{ states('input _number.eau _froide _offset') | float + trigger.from _state.state | float }} acción: input_number.setModo _value: alias único: Compensar el agua potable en desencadenantes no disponibles: - entidad _id: sensor.esphome _total_eau _potable a: desencadenante no disponible: acciones estatales: - objetivo: _id (entidad): introdúzcase _number.eau _potable _offset data: valor: >- {{ states('input_number.eau _potable _offset') | float + trigger.from _state.state | float }} acción: input_number.setModo _value: soltero
Para cada tipo de agua (caliente, fría, potable), cuando el sensor deja de estar disponible:
- La automatización captura el último valor conocido antes de la desconexión
- Este valor se añade a un contador de offset almacenado en una entrada_number
- Esto mantiene la acumulación total incluso después de un reinicio del sensor

Declaro los sensores de consumo final
En mi archivo templates.yaml, agrego estos tres sensores:
- sensor: - nombre: Consumo único de agua potable _id: sensor.consumo _eau _potable unit _of _measurement: "L" dispositivo _class: _clase del estado del agua: Total _Estado de aumento: > {% _current = states('sensor.esphome_total_eau _potable') | float %} {% set total _offset = states('input_number.eau _potable _offset') | float %} {{ total _offset + medida _current si states('sensor.esphome _total_eau _potable')!= 'unavailable' else total _offset }} - nombre: _id único "Consumo de agua fría": sensor.consumo _eau _froide unidad _of _measurement: "L" dispositivo _class: _clase del estado del agua: Total _Estado de aumento: > {% _current = states('sensor.esphome_total_eau_froide') | float %} {% _offset = states('input_number.eau _froide _offset') | float %} {{ total _offset + medida _current si states('sensor.esphome _total_eau _froide')!= 'unavailable' else total _offset }} - nombre: _id único "Consumo de agua caliente": sensor.consumo _eau _chaude unidad _of _measurement: "L" dispositivo _class: _clase del estado del agua: Total _Estado de aumento: > {% _current = states('sensor.esphome_total_eau _chaude') | float %} {% _offset = estados('input_number.eau _chaude _offset') | float %} {{ total _offset + medida _current si states('sensor.esphome _total _eau _chaude')!= 'no disponible' más total _offset }}
Estos sensores son sensores virtuales (plantillas) que permiten rastrear el consumo de agua de forma persistente. Analicemos cómo funcionan:
Fuentes de datos:
- Sensores físicos ESP Home (sensor.esphome_total_eau _*)
- Anuncios de compensación (entrada_number.eau _*_offset)
Tipos de medidas:
- Agua potable: Total de agua entrante
- Agua caliente: Consumo de agua caliente
- Agua fría: Consumo de agua fría
Características comunes:
- _clase estatal: total_incremento: Indica un medidor que aumenta continuamente
- _of _unidad de medición: «L»: Medición en litros
Lógica operativa:
{% _current = states(«sensor.esphome_total_eau _*») | float %}
{% _offset total = estados («input_number.eau _*_offset») | float %}
{{ total _offset + medida _current si states(…)!= «unavailable» else total _offset }}
- Si el sensor ESP está disponible: Total = Compensación + Medida actual
- Si el sensor ESP no está disponible: Total = Compensación solamente
Configurar grabador
Debemos recordar mantener lo que necesitamos, pero también no registrar lo que no es útil.
Así que en la configuración de la grabadora, puse:
incluir: _globs de la entidad: [...] - input_number.eau _* - sensor.consumo _eau _* excluir: _globs de la entidad: [...] - sensor.esphome*
Estoy probando el restablecimiento del D1 Mini V4
Así que, al final, tengo
- 3 input_number que sirven como offset,
- 3 sensores que me dan el valor de los medidores actuales de la D1 Mini
- 3 sensores calculados que me dan el valor de los medidores permanentes

En esta etapa, el D1 nunca se ha relanzado, por lo que los contadores D1 y los contadores permanentes son idénticos.
Desconecto y reconecto el D1 mini, los sensores dejarán de estar disponibles durante el tiempo de reinicio y luego volverán a 0.

En ese momento, el Offset toma los últimos valores de los contadores. A continuación, el D1 mini se vuelve a conectar con el asistente de inicio:

Los contadores permanentes incluyen el valor de offset + el valor del contador de D1 (0).
Corro un poco de agua caliente y un poco de agua fría, las compensaciones no se mueven pero los medidores muestran los valores correctos:

Así que guardo solo los últimos 3 metros para mi Dashboard y para las estadísticas de conso.
Resultado



Si tuviera que hacerse de nuevo (ideas o feedback)
- Usaría una turbina con un sensor de temperatura incluso para agua fría, tengo curiosidad por saber la temperatura especialmente en invierno.


