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:
109
HANDOFF.md
109
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*
|
||||
|
||||
Reference in New Issue
Block a user