Intro
Dans un article précédent HA-Gestion Eau Chaude Sanitaire – Domo Rem81 je mesurais la température du ballon ECS avec une seule sonde au contact de la cuve. Elle donne une tendance exploitable (et c’est déjà très bien).
Mais dans un ballon électrique, la réalité est souvent une stratification : très chaud en haut, tiède au milieu, froid en bas. Avec une seule mesure, on peut croire que “le ballon est bon” alors que le volume réellement utilisable (ex : douche) ne l’est pas autant.
Objectif de cette V2026 :
- mesurer 5 points de température du haut vers le bas,
- mesurer la température de l’eau froide d’arrivée,
- en déduire un volume d’eau chaude équivalent à 40 °C, exprimé en litres,
- garder une valeur cohérente même si une sonde décroche (WiFi, bus 1-Wire, etc.).
- Gérer la chauffe de l’ECS non pas en fonction d’une température mais en fonction d’un volume d’eau chaude disponible.
Upgrade:
- 03/11/2026 : article mis à jour (V2026-11) pour correspondre au code actuel : volume exprimé en litres équivalents 40 °C avec pondération par la température de l’eau froide, 7e sonde « eau froide » avec garde-fou, capteur « Debug ECS », exemples et seuils (230 / 320 L), carte du tableau de bord à jour. Article rendu autonome (explications du montage des sondes et de l’étalonnage intégrées, plus de renvoi vers la V1).
Réalisation:
Implantation des sondes (recommandation pratique)
- Très haut / Haut : proche de la sortie ECS et du dôme supérieur (zone la plus chaude).
- Milieu : mi-hauteur du ballon.
- Bas / Très bas : zone proche de la résistance (souvent la plus “froide” en début de chauffe PV partielle).
- Eau froide : sur la canalisation d’arrivée d’eau froide, près de la vanne d’arrêt, juste avant l’entrée du ballon. Elle sert de référence pour calculer ce que vaut un litre chaud une fois mélangé à l’eau froide.
- Sortie régulateur : sur la canalisation de sortie ECS, après le régulateur thermostatique. Elle ne sert pas au calcul du volume : c’est un contrôle et une alarme en cas de défaillance du régulateur.
- Les DS18B20 peuvent être :
- soit glissées dans l’isolant au contact de la cuve (bien à plat, recouvertes d’isolant : un mauvais contact fait « tiédir » la mesure),
- soit positionnées dans des fourreaux si le ballon en dispose.
Bus 1-Wire : câblage classique (3 fils), sondes en parallèle avec résistance de rappel de 4.7 k ohm entre le « signal » et le « +VCC ». Chaque DS18B20 a une adresse unique (64 bits) à relever dans les journaux d’ESPHome au premier démarrage, puis à reporter dans le YAML.
Principe de calcul du “volume d’eau chaude équivalent 40 °C”
On découpe virtuellement le ballon (200 L chez moi) en 4 segments verticaux de 50 L, délimités par les 5 sondes.
Le résultat est exprimé en litres équivalents à 40 °C : c’est le volume d’eau à 40 °C que l’on obtiendrait en mélangeant l’eau chaude du ballon avec de l’eau froide. Un litre à 65 °C vaut donc plus qu’un litre à 45 °C. C’est pour cela que le résultat peut dépasser le volume du ballon : sur ma carte, 377 L pour un ballon de 200 L.
Pour chaque segment, avec Th la température de la sonde du haut du segment, Tb celle du bas et Tf la température de l’eau froide :
- si Th et Tb sont au-dessus de 40 °C : tout le segment est utile. Litres équivalents = 50 L × (T moyenne − Tf) / (40 − Tf), avec T moyenne = (Th + Tb) / 2,
- si Th et Tb sont sous 40 °C : le segment compte pour 0,
- si le segment traverse 40 °C : on estime la fraction chaude = (Th − 40) / (Th − Tb), puis on pondère de la même façon avec T moyenne = (Th + 40) / 2.
Le volume total est la somme des 4 segments.
Exemple chiffré avec Tf = 19 °C et un segment entre 66 °C et 63 °C : T moyenne = 64,5 °C, facteur = (64,5 − 19) / (40 − 19) = 2,17, soit 50 × 2,17 ≈ 108 L équivalents pour 50 L réels.
Dans le code, j’ai ajouté trois sécurités importantes :
- Correction monotone : on force
T[0] >= T[1] >= T[2] >= T[3] >= T[4](on évite les inversions aberrantes dues à une sonde qui “dérive” ou un point de mesure mal plaqué). - Garde-fou eau froide : si la sonde d’eau froide est absente ou donne une valeur hors de 5–25 °C, on utilise une valeur de secours (15 °C chez moi).
- Valeur de repli : si une sonde du ballon est indisponible (
NaN), ou si l’eau froide est trop proche de 40 °C (calcul impossible), on conserve le dernier volume valide (global restauré au reboot).
Un capteur texte « Debug ECS » publie le détail à chaque calcul, par exemple :
ECS 372L | EF 19.0->19.0 mesuree | T 65.9/65.9/63.2/55.4/36.6 | S 112/109/96/56 | C1
soit : le volume ; l’eau froide brute puis utilisée et son mode (mesurée ou secours) ; les 5 températures après correction ; les litres équivalents de chaque segment ; C1 = nombre de corrections monotones appliquées. Les messages ERREUR ECS … détaillent le repli quand il se déclenche.
Code ESPHome (ESP32 + 7 DS18B20 + volume calculé)
Remarque : j’ai déclaré 7 sondes de température : 5 pour le ballon, 1 pour l’eau froide d’arrivée et 1 “sortie régulateur”. Le volume calculé utilise les 5 sondes du ballon et la sonde d’eau froide ; la “température sortie régulateur” me sert uniquement de contrôle et d’alarme en cas de défaillance du régulateur thermostatique situé en sortie de l’ECS.
Vous trouverez la dernière version du code ici: home-assistant/esphome/esp139-ecs.yaml at master · remycrochon/home-assistant
Constantes à adapter au début du calcul : V_TOTAL (volume du ballon), T_CIBLE (température utile) et T_FROIDE_SECOURS.
Exploitation dans les automatismes
Idée simple:
Dans la version précédente, les automatismes se basaient sur un seuil de température (ex : < 40°C → chauffe nuit en HC, > 45°C → stop).
Avec le volume équivalent, on pilote plus finement. Chez moi : chauffe réseau en HC sous 230 L, arrêt au-dessus de 320 L :
- Nuit (HC) : si
Ballon litres équivalents 40°C< 230 L → chauffe réseau - Arrêt : si
Ballon litres équivalents 40°C> 320 L → stop
Exemple (même logique qu’avec la température, mais le critère est en litres équivalents au lieu de °C) :
trigger:
- platform: numeric_state
entity_id: sensor.sous_sol_esp139_ecs_ballon_litres_equivalents_40degc
below: 230
id: v_bas
- platform: numeric_state
entity_id: sensor.sous_sol_esp139_ecs_ballon_litres_equivalents_40degc
above: 320
id: v_haut
# + vos triggers HC/HP, soleil, mode Auto, etc.
# Puis un choose: qui remplace les anciennes conditions de température
# par ces deux seuils en litres.
Les seuils sont en litres équivalents : ils ne sont pas à comparer au volume physique du ballon. Adaptez le nom de l’entité au vôtre.
Idée un peu plus complexe:
J’exploite ce volume dans mon routeur solaire ESPHome : en heures creuses, c’est lui qui décide d’amorcer ou d’arrêter la chauffe (hystérésis entre un seuil bas et un seuil haut), voir HA-Routeur Solaire Photovoltaïque avec ESPHome — V2026_10
Tableau de bord:
Exemple de carte:

type: picture-elements
elements:
- entity: sensor.esp139_ecs_temp_sortie_regulateur
prefix: ""
style:
background: null
color: black
font-size: 150%
left: 60%
top: 3%
transform: none
type: state-label
- entity: sensor.esp139_ecs_temp_tres_haut
prefix: <--
style:
background: null
color: black
font-size: 150%
left: 65%
top: 25%
transform: none
type: state-label
- entity: sensor.esp139_ecs_temp_haut
prefix: <--
style:
background: null
color: black
font-size: 150%
left: 65%
top: 35%
transform: none
type: state-label
- entity: sensor.esp139_ecs_temp_ecs
prefix: <--
style:
background: null
color: black
font-size: 150%
left: 65%
top: 45%
transform: none
type: state-label
- entity: sensor.esp139_ecs_temp_bas
prefix: <--
style:
background: null
color: black
font-size: 150%
left: 65%
top: 55%
transform: none
type: state-label
- entity: sensor.esp139_ecs_temp_tres_bas
prefix: <--
style:
background: null
color: black
font-size: 150%
left: 65%
top: 65%
transform: none
type: state-label
- entity: sensor.sous_sol_esp139_ecs_ballon_litres_equivalents_40degc
prefix: ""
style:
background: null
color: black
font-size: 190%
left: 30%
top: 50%
transform: none
type: state-label
- entity: sensor.ecocompteur_ecs
prefix: ""
style:
background: null
color: black
font-size: 150%
left: 76%
top: 75%
transform: none
type: state-label
- entity: sensor.sous_sol_esp139_ecs_temp_eau_froide_ecs
prefix: ""
style:
background: null
color: black
font-size: 150%
left: 74%
top: 88%
transform: none
type: state-label
image: /local/images/ecs.png
grid_options:
columns: 12
rows: 10
EC = sortie ECS (sonde après le régulateur), EF = eau froide ; la puissance affichée est celle de la résistance (écocompteur ECS). Adaptez les noms d’entités aux vôtres.
Le fichier image est téléchargeable ici: domo.rem81/ecs.png at main · remycrochon/domo.rem81
Notes de réglage:
V_TOTAL: adaptez-le à votre ballon (200 L ici).T_CIBLE: 40°C est un bon standard “eau utile”. Vous pouvez mettre 42–45°C pour être plus conservateur, mais pensez alors à relever aussi vos seuils en litres.T_FROIDE_SECOURS: valeur utilisée si la sonde d’eau froide est absente ou hors de 5–25°C (15°C chez moi).- Offset sur la sonde du milieu (
offset: 2chez moi) : à ajuster en comparant la sonde à un thermomètre de référence au robinet, en eau chaude stabilisée. - Seuils d’automatisme (230 L / 320 L chez moi) : à régler selon votre consommation. Montez le seuil bas si vous manquez d’eau chaude le matin.
Article rédigé avec l’assistance de Claude AI (Anthropic) à partir de mes données et retours d’expérience.

One Comment on “HA-Mesure de température de l’eau : stratification + estimation du volume d’eau chaude – V2026-11”