From 50e3fcc2dfadf33c5f9816fe0dfab6a129ee8ba6 Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Fri, 18 Sep 2026 03:01:35 +0200 Subject: [PATCH] Conception de la charge HC manuelle, arretee et non ecrite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le proprietaire ferme la question de force_grid_now — « pour moi c est pour recharger la voiture » — et en tire le chantier : dissocier la recharge de la batterie solaire de la fonction EVCS. Trois pistes mesurees sur banc. La piste d un chemin separe est morte et de la maniere la plus nette : elle ne se fait pas ecraser par accident, elle s auto-detruit, puisqu il faudrait que le controleur la connaisse pour qu elle tienne. La piste du forcage de la cible du bilan est retenue, mais l ENDROIT du forcage decide de tout : force en aval, le contacteur se ferme, la session s engage et la consigne reste a 700 W — le defaut du 01/09 a l identique, et le seul des trois resultats indiagnosticable depuis le tableau de bord parce qu il A L AIR de marcher. Point d insertion identifie a une ligne pres dans coverage() : tout en derive, donc la cible et le manque bougent ensemble par construction au lieu de dependre d une discipline. Trois effets consignes, dont deux qui demandent une decision : le plancher monte aussi la cible prudente, donc la voiture cesse de descendre la batterie pendant une charge manuelle — structurel, aucune echeance n y change rien ; et le bilan ignore totalement les fenetres creuses, donc une cible manuelle fuit dans la journee et bloque la charge du soir. Echeance retenue plutot que bornes : le bilan repond a « de combien la batterie a besoin », pas a « quand est-ce bon marche ». Fait au passage : le courant du module entre dans le releve par cellule, ce qui rend enfin lisible « le detail de chaque cellule PENDANT la charge ». Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj --- HANDOFF.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/HANDOFF.md b/HANDOFF.md index 3cb9778..ec8d974 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -7147,3 +7147,112 @@ appartient au proprietaire. --- *Document mis a jour le : 17/09/2026 (~16:00) — expiration du reseau force deployee et verifiee en reel ; analyse de la surconsigne corrigee sur trois points* + +## 73. Nuit du 17 au 18/09/2026 — Dissocier la recharge batterie de la fonction EVCS + +### Ce qui a declenche le chantier, et une correction de sens +Deux sessions ont passe l'apres-midi a signaler au proprietaire qu'un changement +de la consigne reseau reduisait la recharge de la batterie sous +`force_grid_now`. Sa reponse ferme la question : **« force_grid_now pour moi +c'est pour recharger la voiture, ça me va comme cela »**. Nous raisonnions tous +les deux comme si cette strategie etait une commande de recharge batterie — +parce que l'episode du 17/09 en avait eu l'effet. C'etait un effet de bord, pas +l'intention. + +⚠️ A retenir : `force_grid_now` = « charge la voiture sur le reseau +maintenant ». Toute consequence sur la batterie solaire est incidente et ne doit +pas servir d'argument pour ou contre une evolution de cette strategie. + +Et c'est lui qui en tire le chantier : **la recharge de la batterie solaire doit +devenir une fonction propre**, avec son tableau de bord et sa commande — un +bouton de charge manuelle en heures creuses pour les cas ou le bilan ne +l'autorise pas alors que la meteo ou la brievete du jour d'hiver la justifient. + +### FAIT — le detail par cellule pendant la charge (Grafana) +Le detail cellule par cellule existait deja. Ce qui manquait etait le « pendant +la charge » : rien ne disait QUAND le module chargeait, et **un ecart entre +cellules ne veut rien dire hors de son courant** — le 05/09, meme module et meme +tension de parc, la cellule meneuse etait a 3555 mV sous 50 A et a 3496 mV sous +30 A. + +Le releve console porte le courant depuis le 17/09 mais l'ingestion ecrivait +`null`. Elle lit desormais la colonne `courant_mA`, **reperee par son NOM** : les +US5000 et les US2000C n'emettent pas les memes colonnes, et une position ferait +lire la mauvaise grandeur des qu'on deplace le cable d'un pack a l'autre. + +Deux panneaux : « Sante des modules — tous, d'un coup d'oeil » (le resume qu'on +lit en premier, la ou les autres panneaux demandent de choisir un module +d'avance) et « Le module chargeait-il ? ». Releve au deploiement, cinq modules +vivants, ecarts de **1 a 3 mV** — le parc restant est sain. + +### CONCEPTION ARRETEE, NON ECRITE — la charge HC manuelle +Trois pistes, mesurees sur banc golden par la session voisine. + +**Piste 2 — un chemin separe qui ne toucherait que la consigne et le contacteur : +MORTE.** Le controleur reecrit la consigne de repos a chaque cycle des que +`gridSessionActive` est faux : sonde a 5000 W poses de l'exterieur, ramenes a +700 W en trente secondes. Elle ne se fait pas ecraser par accident, elle +**s'auto-detruit** : pour qu'elle tienne il faudrait que le controleur la +connaisse, donc qu'elle ne soit plus separee. + +**Piste 3 — forcer la cible du bilan : RETENUE, mais l'ENDROIT du forcage decide +de tout.** + +| forcage | takeover | consigne | resultat | +|---|---|---:|---| +| **en aval** (un bouton ecrit `balance_required_soc`) | engage | **700 W** | batterie a ~100 W | +| **en amont** (dans `BALANCE.js`) | engage | **2333 W** | le manque reel finance | + +⚠️ **Le cas en aval est le pire des trois parce qu'il A L'AIR DE MARCHER** : +contacteur ferme, session engagee, et une consigne qui ne finance rien. C'est le +defaut du 01/09 et du 04/09 a l'identique, et le seul des trois resultats +indiagnosticable depuis le tableau de bord. `required_soc` ENGAGE la session, +`grid_energy_needed_kwh` la FINANCE : les desolidariser donne une session muette. + +**Point d'insertion, une ligne.** `BALANCE.js`, fonction `coverage()`, ligne 226 : + + const requiredSocRawPct = socForEnergy(energyToCoverKwh, socFloorPct); + +`requiredSocPct`, `socMarginPct`, `gridNeeded` et `gridEnergyNeededKwh` en +derivent tous dans les huit lignes suivantes. Un `Math.max(..., plancherManuel)` +a cet endroit fait donc bouger la cible ET le manque **ensemble par +construction** : le couplage implicite qui fait la fragilite de la piste 3 +devient une consequence de la forme du code, et non une discipline a tenir. + +### Trois effets a connaitre avant d'ecrire +1. **Les deux profils montent ensemble.** `coverage()` est appelee pour p50 ET + p80, donc le plancher monte aussi `required_soc_prudent`, qui est le plancher + de P12. Pendant une charge manuelle, la voiture cesserait donc de descendre + la batterie. Coherent — on ne remplit pas au reseau pendant que la voiture + vide — mais **une nuit ou il veut les deux, il n'aura que l'un**. C'est + structurel, aucune echeance n'y change rien. +2. ⚠️ **Le bilan ne connait pas les heures creuses.** `grep` sur les douze + fichiers de `src/energy-balance/` : zero occurrence de `hc_night` / + `hc_midday`. Sans garde de temps, une cible manuelle a 85 % fuit dans la + journee et mord sur `BATTERY_CLOUD_LOCKS.js:451`, + `eveningSocStartFloorPct = max(eveningSocStartMin, balanceRequiredSocPct)` — + la voiture ne demarrerait plus le soir. Ce n'est pas theorique, c'est une + ligne qui s'applique tous les soirs. + **Solution retenue : l'echeance, pas les bornes.** Meme mecanique que + l'expiration de `force_grid_now` (§72), deja eprouvee en production. Et + l'argument architectural : le bilan repond a « de combien la batterie a-t-elle + besoin », pas a « quand est-ce bon marche » ; lui apprendre les fenetres + tarifaires couplerait deux preoccupations aujourd'hui propres, et ajouterait + un endroit de plus a penser le jour ou une borne bouge. +3. **Rien d'autre n'est touche.** Le bloc « prochaine fenetre de deficit » + n'appelle pas `coverage()` (il utilise `socForEnergy` directement, l.287), et + un plancher a 85 reste loin sous l'ecretage a 100, donc aucune interaction + avec le signal de sous-dimensionnement de §26. + +### La decision qui reste au proprietaire +Contraindre le bilan (piste 3) ou l'ignorer (piste 1, un `sourceMode` de plus +dans le controleur). **Ce n'est pas un choix de technique mais de sens** : +contraindre garde un seul arbitre, ignorer en cree un second — et ce projet a +deja paye cher les automates concurrents (charges programmees de l'ESS §26, +consigne a 4200 W §27, plancher SOC de l'ESS §27). + +Reste aussi a construire, apres sa reconfiguration du LVHUB : le resume de +l'etat des cellules cote Home Assistant, et le bouton lui-meme. + +--- +*Document mis a jour le : 18/09/2026 (~03:15) — releve par cellule avec le courant, conception de la charge HC manuelle arretee et non ecrite*