HA-Mesure de température de l’eau (V2026) : stratification + estimation du volume d’eau chaude

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 :

  1. 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é).
  2. 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 mis offset: 2 sur la sonde milieu ; conserve-le si tu as étalonné “sur robinet”, comme expliqué dans la V1.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *