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 donnant ainsi 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,
- en déduire un volume d’eau 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.
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).
- Les DS18B20 peuvent être :
- soit glissées dans l’isolant au contact de la cuve (comme expliqué dans la V1),
- 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 ».
Principe de calcul du “volume d’eau chaude utile”
On découpe virtuellement le ballon (200 L) en 4 segments verticaux définis par 5 sondes.
Pour chaque segment :
- si les 2 températures (haut/bas du segment) sont au-dessus du seuil → segment “100% chaud”
- si les 2 sont sous le seuil → segment “0% chaud”
- si on est en transition → on estime la fraction chaude du segment
Dans le code, j’ai ajouté deux 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é). - Valeur de repli : si une sonde est indisponible (
NaN) → on conserve le dernier volume valide (global restauré au reboot).
Code ESPHome (ESP32 + 6 DS18B20 + volume calculé)
Remarque : j’ai déclaré 6 sondes de T° (5 pour le ballon + 1 “sortie régulateur”). Le volume calculé utilise les 5 sondes ballon, 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
Exploitation dans les automatismes
Idée simple:
Dans mon article, les automatismes V1 se basaient sur un seuil de température (ex : < 40°C → chauffe nuit en HC, > 45°C → stop).
Avec le volume, tu peux piloter plus finement, par exemple :
- Nuit (HC) : si
Ballon volume eau chaude< 80 L → chauffe réseau - Arrêt : si
Ballon volume eau chaude> 140 L → stop
Exemple (logique identique à ton “cahier des charges”, mais critère “L” au lieu de “°C”) :
trigger:
- platform: numeric_state
entity_id: sensor.ballon_volume_eau_chaude
below: 80
id: v_bas
- platform: numeric_state
entity_id: sensor.ballon_volume_eau_chaude
above: 140
id: v_haut
# + tes triggers HC/HP + soleil + mode Auto, etc.
# Puis choose: comme dans ton automatisme, en remplaçant les conditions de température.
Idée un peu plus complexe:
J’exploite le volume d’ECS dans ma nouvelle version de routeur ESPHOME 2026, voir cet article: HA-Routeur Solaire Photovoltaïque avec ESPHome — V2026 (HP/HC + calibration) – Domo Rem81
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.esp139_ecs_ballon_volume_eau_chaude
prefix: ""
style:
background: null
color: black
font-size: 190%
left: 30%
top: 50%
transform: none
type: state-label
- entity: sensor.esp176_esp32_routeur_1r_p_ecs_jsymk
prefix: ""
style:
background: null
color: black
font-size: 150%
left: 76%
top: 75%
transform: none
type: state-label
image: /local/images/ecs.png
grid_options:
columns: 12
rows: 10
Le fichier image est téléchargeable ici: domo.rem81/ecs.png at main · remycrochon/domo.rem81
Notes de réglage:
V_TOTAL: adapte à ton ballon (200 L ici).T_SEUIL: 40°C est un bon standard “eau utile”, mais tu peux mettre 42–45°C si tu veux être plus conservateur.K(tanh) : plus K est grand, plus la transition est “brutale”. 3–5 est généralement raisonnable.- Offset sur
temp_ecs: tu as misoffset: 2sur la sonde milieu ; conserve-le si tu as étalonné “sur robinet”, comme expliqué dans la V1.
