Architecture, logique de régulation, code Home Assistant et mapping brightness → puissance. Implémentation sur SSR 230V piloté par dimmer Zigbee.
Le routeur est entièrement passif vis-à-vis du réseau : il ne fait que modifier la puissance absorbée par le chauffe-eau pour coller au surplus instantané mesuré par le smartmeter bidirectionnel.
p_linky dans l'automation vaut donc 0 à l'équilibre, négatif en surplus, positif en déficit.Le dimmer Zigbee expose une valeur brightness de 0 à 255. La relation avec la puissance réelle dissipée par la résistance n'est pas linéaire - elle suit une courbe mesurée empiriquement.
| Brightness | Plage | Puissance (W) | Formule interpolée |
|---|---|---|---|
| 0 - 63 | mort | 0 W | - |
| 64 - 95 | démarrage | 9 → 135 W | linéaire (9, 135) |
| 96 - 111 | basse | 135 → 269 W | linéaire (135, 269) |
| 112 - 127 | montée | 269 → 490 W | linéaire (269, 490) |
| 128 - 143 | milieu | 490 → 783 W | linéaire (490, 783) |
| 144 - 159 | mi-haute | 783 → 1 103 W | linéaire (783, 1103) |
| 160 - 175 | haute | 1 103 → 1 407 W | linéaire (1103, 1407) |
| 176 - 189 | très haute | 1 407 → 1 624 W | linéaire (1407, 1624) |
| 190 - 207 | max pratique | 1 624 → 1 960 W | linéaire (1624, 1960) |
| 208 - 255 | plateau | 1 960 → 2 100 W | quasi-plateau |
L'automation calcule un brightness_cible à chaque déclenchement (nouveau relevé Linky) selon les règles suivantes.
| Condition | Direction | Gain | Effet |
|---|---|---|---|
| surplus > 1 200 W | ↑ montée | 0.6 | Rattrapage rapide |
| 600 W < surplus ≤ 1 200 W | ↑ montée | 0.4 | Montée modérée |
| 0 < surplus ≤ 600 W | ↑ montée | 0.25 | Montée douce |
| soutirage quelconque | ↓ descente | 0.8 | Descente prioritaire |
| Condition | Action |
|---|---|
| |Linky| < 5 W (zone morte) | maintien - pas de variation |
| brightness_calc < seuil_off (60) en descente | extinction → brightness = 1 |
| brightness_calc < seuil_on (80) en montée | saut → brightness = 80 minimum |
| delta > variation_max par cycle | écrêtage - progression limitée |
variation_max est dynamique : max(2, |écart| / 10). Plus le déséquilibre est grand, plus la variation autorisée par cycle est large.L'asservissement puissance/compteur forme une boucle fermée : le routeur augmente la charge, ce qui réduit le surplus mesuré, ce qui fait redescendre la charge, et ainsi de suite. Sans précaution, cette boucle peut osciller - la puissance monte et descend en permanence sans jamais se stabiliser.
Les conséquences sont sérieuses à plusieurs niveaux :
| Risque | Explication |
|---|---|
| Usure du SSR | Un relais statique qui commute en permanence se réchauffe anormalement. Les SSR sont conçus pour des commutations lentes, pas pour un haché haute fréquence. Une surchauffe peut conduire à la destruction du composant. |
| Perturbations réseau | Des variations rapides de charge créent des harmoniques et des fluctuations de tension qui peuvent perturber d'autres équipements sur la même ligne. |
| Imprécision de la régulation | Si le système oscille, il consomme en moyenne plus que le surplus disponible et soutire du réseau par intermittence - l'objectif zéro-soutirage n'est plus atteint. |
| Logs HA saturés | Chaque déclenchement du script écrit dans l'historique. Des milliers d'événements par heure dégradent les performances de Home Assistant et de sa base de données. |
restart du script (annuler toute exécution en cours si un nouveau relevé arrive - évite la superposition de plusieurs instances).Script Home Assistant - automation de type script appelable avec les paramètres dimmer et nomCE.
routage_solaire_dimmer: alias: "Routage solaire générique dimmer" mode: restart fields: dimmer: description: "Entité du dimmer" nomCE: description: "Nom logique du chauffe-eau" sequence: # 1. Variables de configuration - variables: p_max: 1950 # Puissance nominale résistance idle_min: 1 # Brightness minimal (≠ off) seuil_on: 80 # Saut minimum à la montée seuil_off: 60 # Extinction si dessous en descente p_linky: > {% if is_state('input_boolean.simulation_solaire','on') %} {{ states('input_number.simulation_puissance_linky') | float(0) }} {% else %} {{ states('sensor.compteur_general_power') | float(0) }} {% endif %} # 2. Calcul puissance actuelle du CE via courbe empirique - variables: p_actuelle: > {% set b = brightness_actuel %} {% if b < 64 %} 0 {% elif b < 96 %} {{ (9 + (b-64)*(135-9)/(96-64)) | int }} {# … segments intermédiaires … #} {% else %} {{ (2085 + (b-240)*(2100-2085)/(255-240)) | int }} {% endif %} # 3. Calcul brightness cible avec gains adaptatifs - variables: cible_finale: > {% set surplus = -p_linky %} {% set gain_monte = 0.6 if surplus>1200 else 0.4 if surplus>600 else 0.25 %} {% set gain = gain_monte if ecart>0 else 0.8 %} {% set variation_max = [2, (ecart|abs/10)|int] | max %} {# Application zone morte, écrêtage, seuils on/off … #} # 4. Application si delta > 1 brightness - action: light.turn_on target: entity_id: "{{ dimmer_entity }}" data: brightness: "{{ cible_finale | int }}"
Reproduit exactement le calcul de l'automation pour n'importe quel état d'entrée.
Le routeur solaire couvre les besoins en eau chaude les jours bien ensoleillés. Mais en hiver, par temps couvert ou lors de plusieurs jours consécutifs sans production suffisante, le chauffe-eau peut ne pas atteindre sa température de consigne avec le seul surplus solaire.
Il est indispensable de prévoir un appoint automatique sur les heures creuses EDF. Le principe : Home Assistant surveille la température du ballon et, si elle n'a pas atteint le seuil requis en fin de journée, déclenche une chauffe complémentaire pendant la plage tarifaire la moins chère - typiquement entre 22 h et 6 h.
| Condition | Action Home Assistant |
|---|---|
| Fin de journée solaire, température ballon < seuil | Activer l'appoint au début de la plage heures creuses |
| Température ballon atteinte | Couper l'appoint immédiatement |
| Début de journée, production solaire détectée | Désactiver l'appoint - laisser le routeur prendre la main |
| Mode | Description | Cas d'usage |
|---|---|---|
| Mode vacances | Suspension complète du routage et de l'appoint. Le chauffe-eau est mis en veille ou maintenu à une température minimale anti-légionelle (55 °C une fois par semaine). | Absence prolongée - évite de chauffer inutilement, tout en assurant l'hygiène sanitaire du ballon. |
| Mode solaire uniquement | Désactivation de l'appoint heures creuses. Le ballon n'est chauffé que par le surplus photovoltaïque, sans jamais tirer sur le réseau. | Objectif autonomie complète en été, ou pour les utilisateurs souhaitant mesurer la part solaire pure. |
| Cascade multi-chauffe-eau | Plusieurs instances du script tournent en parallèle, chacune pilotant un dimmer et un SSR distinct. Un mécanisme de priorité distribue le surplus : le chauffe-eau principal est servi en premier, les suivants reçoivent l'excédent résiduel. | Grande maison, gîte, installation avec deux ballons (un par zone). Nécessite autant de dimmers et de SSR que de chauffe-eau. |
| Composant | Rôle | Remarque |
|---|---|---|
| Compteur bidirectionnel 2 canaux - Zigbee | Mesure le flux réseau en temps réel (soutirage / injection) ainsi que la consommation du chauffe-eau | A placer sur le tableau principal, sur le fil de phase et sur le fil de phase du chauffe-eau |
| Dimmer Zigbee | Traduit la consigne Home Assistant en signal 0-10 V pour le SSR | Doit exposer un attribut brightness 0-255 |
| SSR 230V AC à entrée 0-10 V | Module la puissance 230V envoyée à la résistance du chauffe-eau | Prévoir dissipateur thermique - peut chauffer en charge |
| Chauffe-eau électrique | Charge thermique réceptrice du surplus solaire | Thermostat mécanique obligatoire - exclure les modèles à régulation électronique |
| Home Assistant (Raspberry Pi ou mini-PC sous Linux Ubuntu) | Centrale domotique qui exécute l'automatisation de routage | Doit rester actif en permanence ; intégration Zigbee2MQTT recommandée |
| Passerelle Zigbee (Clé USB ou Radio) | Passerelle radio entre Home Assistant et les modules Zigbee | Ex. Sonoff Zigbee 3.0 Dongle Plus (USB) ou bien SMLIGHT SLZB-06 en ethernet (filaire ou wifi) |
Le système a besoin de deux mesures distinctes : le flux réseau global (Ch1, sur la phase principale au tableau) et la consommation du chauffe-eau (Ch2, sur la phase qui alimente la résistance). Si le tableau principal et le chauffe-eau sont proches, un seul smartmeter 2 canaux suffit et simplifie le câblage.
Si les deux points de mesure sont trop éloignés - chauffe-eau dans un local technique séparé, tableau à l'autre bout du logement - il est plus pratique d'installer deux compteurs mono-canal indépendants. Chaque compteur est placé là où se trouve le fil à mesurer ; ils remontent leurs données séparément à Home Assistant via Zigbee, sans contrainte de distance entre eux. L'automation lit alors les deux entités distinctes.
Tous les modules de ce montage communiquent en Zigbee natif, intégré via Zigbee2MQTT dans Home Assistant. Les modules Wi-Fi ou Tuya cloud sont exclus : ils introduisent une latence imprévisible (round-trip cloud) incompatible avec une boucle de régulation à la seconde, et dépendent d'un serveur tiers hors de votre contrôle.
Le réseau Zigbee mesh est local, déterministe et fonctionne hors-ligne. Chaque module routeur (compteur, dimmer) renforce la portée.
Le relais statique (Solid State Relay) doit impérativement être choisi avec :
Un SSR en charge dissipe de la chaleur par convection naturelle sur son refroidisseur. L'enfermer dans un coffret fermé sans ventilation forcée provoque une accumulation thermique qui réduit la durée de vie et peut conduire à la destruction du composant.
Montez le SSR sur une surface métallique aérée (rail DIN ouvert, plaque de fond de tableau non cloisonné), refroidisseur orienté vers le haut ou en façade pour faciliter la convection. Laissez au minimum 5 cm d'espace libre autour du dissipateur.
Le dimmer doit exposer une sortie analogique 0-10 V (et non une sortie TRIAC ou un coupure de phase) pour piloter le SSR en modulation linéaire. Il doit également exposer un attribut brightness sur 0-255 utilisable par Home Assistant via Zigbee2MQTT.
Les dimmers Wi-Fi ou Tuya sont exclus pour les mêmes raisons que les autres modules : latence cloud et dépendance à un service tiers. Vérifiez la compatibilité Zigbee2MQTT du modèle avant achat sur le site officiel zigbee2mqtt.io/supported-devices.