Conception de la charge HC manuelle, arretee et non ecrite

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
Tallagrand Thierry
2026-09-18 03:01:35 +02:00
parent 463f1b1b06
commit 50e3fcc2df

View File

@@ -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*