Files
EVCS/docs/CHANTIER_BILAN_ENERGETIQUE.md
Tallagrand Thierry 16b492df68 Chantier : ajoute l'objectif de dimensionnement du stockage
Le proprietaire vise l'autonomie et doit decider combien de batteries ajouter.
La ressource gaspillee par la censure est exactement l'energie qu'un stockage
supplementaire capterait : le bilan doit donc aussi estimer l'energie perdue
faute de puits et le gain par kWh ajoute.

Constat mesure sur 27 jours : import reseau 7,83 kWh/jour en moyenne, un seul
jour sur 27 a zero ; decharge batterie 11,5 kWh/jour en moyenne, p90 14,3, max
16,1 sur 17,5 utiles. La batterie se vide presque integralement chaque jour :
c'est elle le facteur limitant, pas la puissance des onduleurs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
2026-08-24 14:53:15 +02:00

7.1 KiB
Raw Blame History

Chantier — Bilan énergétique partagé

Journal de bord du chantier ouvert le 24/08/2026. Documentation définitive à écrire à la fin ; ce fichier ne sert qu'à ne rien perdre en route.

Pourquoi ce chantier

Constat du propriétaire, 24/08/2026 : « nous avons essayé de résoudre un défaut de stratégie par une suite de solutions tactiques ». Trois oscillateurs identifiés le même jour (règle de coupure EDF « Fix G », override d'abondance P6 qui détruisait sa propre condition d'autorisation, inversion des planchers de démarrage et de maintien) — tous de la même nature : des seuils empilés par couches successives, chacun défendable isolément, dont personne ne vérifiait la cohérence d'ensemble. Chaque correctif créait l'oscillateur suivant.

Toute valeur fixe est traitée comme une erreur de conception, pas comme un réglage à affiner.

Décisions actées

Sujet Décision
Profil horaire Recalculé une fois par jour, publié dans des helpers. Pas de recalcul dans la boucle 30 s.
Prudence Percentile 20, appliqué une seule fois sur le bilan net (PV − conso par heure et par jour), jamais séparément sur chaque terme — sinon on cumule deux pessimismes et le déficit passe à 109 % de la batterie, système inutilisable.
SOC Lissé pour les décisions de pilotage, valeur instantanée conservée pour les planchers de sécurité.
Consommation Mesurée, jamais supposée. Filtrage contextuel. Mesure non biaisée.
Production PV Jamais la mesure brute. Sans injection, PV_mesurée = min(ressource, conso + absorption batterie) : observation censurée dès que la batterie est pleine. Estimateur = prévision, recalée uniquement sur les heures non censurées.
Rétention historique recorder.purge_keep_days = 90 (appliqué le 24/08, redémarrage HA fait). Les statistiques long terme étaient déjà sans limite.
Conseiller IA Les faits restent arithmétiques et déterministes ; l'advisor traite les hypothèses (facteur de confiance sur la prévision, lecture des états et alarmes, explication). Montée en pouvoir en trois paliers, sur un score de prédiction vérifié contre la mesure.

Sorties attendues du bilan

Heure de croisement PV/conso · énergie à couvrir d'ici là · niveau de batterie requis (remplace grid_soc_off fixe) · marge disponible pour le véhicule · drapeau « production actuellement bridée » · drapeau de santé des mesures.

Objectif ajouté le 24/08 : dimensionner le stockage. Le propriétaire vise l'autonomie et veut savoir combien de batteries ajouter. La ressource gaspillée par la censure est précisément l'énergie qu'un stockage supplémentaire capterait : le bilan doit donc produire, en plus, une estimation de l'énergie perdue par manque de puits et le gain attendu par kWh de batterie ajouté. Cela impose une simulation multi-jours sur la ressource décensurée — c'est l'étape 3 qui la rend possible.

Constat mesuré sur 27 jours (28/07 → 24/08)

Grandeur Moyenne / jour
Production PV (censurée, donc minorée) 38,7 kWh
Consommation totale 43,1 kWh (dont véhicule 10,0)
Décharge batterie 11,5 kWh (p90 14,3 · max 16,1 sur 17,5 utiles)
Import réseau 7,83 kWh — un seul jour sur 27 à zéro

La batterie se vide presque intégralement chaque jour : c'est elle le facteur limitant, pas la puissance des onduleurs. Premier encadrement, à confirmer par la simulation : environ +8 kWh utiles pour annuler l'import d'une journée typique, +15 kWh pour couvrir les mauvaises journées (p90). Réserve : ce calcul suppose que le surplus existait pour remplir la capacité ajoutée, ce qui est vrai les jours ensoleillés mais faux les jours réellement pauvres.

Avancement

  • Étape 1 — détection de la censure (24/08). src/energy-balance/ : snapshot HA de 26 champs incluant les signaux jamais lus (états MPPT, état VE.Bus, alarme de surcharge, ESS BatteryLife, état du bus DC, statut natif de la borne, prévision horaire) et nœud CENSORSHIP.js qui qualifie chaque échantillon. Suite tests/energy-balance/ : 10 scénarios, dont un snapshot réel du 24/08 14:29 correctement classé censuré. Mesure sur l'historique : 48 % des heures de jour sont censurées, 77 à 96 % à partir de 13 h.
  • Étape 2 — profil de consommation mesuré (24/08). src/energy-balance/CONSUMPTION_PROFILE.js : compteurs d'énergie cumulés → deltas horaires → distribution par heure de la journée → percentiles. Validé sur 28 jours réels (639 heures, aucun compteur remis à zéro) : consommation typique 31,9 kWh/jour hors véhicule, 42,8 kWh au p80. Le profil tient dans un helper input_text (119 caractères sur 255). Vérification préalable de la méthode : seulement 7,8 % des heures de déficit sont censurées — censure et déficit sont physiquement presque exclusifs (une heure censurée est une heure où la batterie n'avait plus de place, donc une heure de surplus). La grandeur qui pilote la décision EDF est donc mesurée sur des données propres.
  • Étape 3 — estimateur de ressource PV = prévision recalée sur les heures exploitables de l'étape 1.
  • Étape 4 — bilan et ses sorties.

Backlog

  • Doublon unique_id: victron_vebus_dc_power — déclaré deux fois, avec deux topics différents : configuration.yaml:99 (system/0/Dc/Vebus/Power) et packages/victron_vebus_mqtt.yaml:63 (vebus/276/Dc/0/Power). Vérifié le 24/08 : les deux publient la même grandeur — un système VE.Bus en parallèle n'expose qu'une seule instance D-Bus couvrant les deux onduleurs. Ce n'est donc pas un défaut de données, seulement une ligne ERROR à chaque démarrage et un fichier qui ment sur ce qu'il fait. Supprimer les lignes 62-68 du package, garder celle de configuration.yaml (nom conforme à l'entity_id utilisé par INPUT_PARSE), puis mqtt.reload — pas besoin de redémarrer.
  • evcsDedicatedMaxW: 4900 codé en dur dans INPUT_PARSE.js, appliqué dès qu'EDF est absent (plafond ~20 A). Encore une valeur au jugé : à confronter à la réalité du câblage du circuit dédié avant de la garder ou de la remplacer par un helper.
  • Alarmes jamais lues : sensor.airtria_mpii_v1_overload_alarm, alarme « High charge current » du Battery Monitor (observée active le 24/08), sensor.gx_device_ess_batterylife_state (peut imposer sa propre limite de décharge à l'insu du contrôleur), sensor.evcs_hq2239dnt7p_status.
  • États MPPT jamais lus (sensor.airtria_mppt1_state, sensor.mppt_450_200_hq2449yr9pt_state) — indispensables : ils disent si un échantillon de production est exploitable ou censuré.
  • Contrôle de vraisemblance PV + VE.Bus = batterie — vérifié à 95 W près le 24/08 (~9 %). À intégrer comme drapeau de santé permanent : le jour où l'identité diverge, un capteur ment.
  • États zombies stop_source_lost / idle_wait_source — noms transitoires peu lisibles dans le journal et le tableau de bord (cf. HANDOFF §24, hors périmètre à l'époque).