Session reseau unique de la nuit : engagement sur le bilan, sortie sur la fenetre

§26 avait pose l objectif et designe le critere. Avant d ecrire quoi que ce
soit, j ai mesure les kWh reellement sortis de la batterie par point de SOC sur
cinq fenetres et trois nuits : 0,164 a 0,171 kWh/point au-dessus de 42 %, soit
environ 17 kWh, mais 0,121 entre 45 et 22 % et 0,082 entre 33 et 20 %. En bas
d echelle un point de SOC vaut moitie moins, alors que BALANCE.js convertit avec
une constante unique de 15 kWh. required_soc y est donc systematiquement trop
bas — c est le facteur 1,75 mesure la nuit du 02-03/09, ou le SOC descendait
bien plus vite que la ligne.

Cette mesure a dicte la conception : le relachement de la session ne peut pas
etre un seuil de SOC, puisqu il porterait sur une grandeur fausse et que tout
seuil que le SOC repasse ensuite rouvre l oscillateur du 27/08. Les deux
variantes evidentes — relacher sur required_soc, ou sur required_soc_prudent
avec la bande p50/p80 — ont ete ecartees pour cette raison.

Retenu : engagement sur le bilan (batterie sous la cible), relachement a la fin
de la fenetre. L oscillation devient structurellement impossible, la condition
de sortie etant monotone : une fenetre ne se ferme qu une fois. Un nouveau
helper input_boolean.victron_evcs_night_grid_session_committed porte
l engagement, cree par input_boolean.reload sans redemarrage HA et ecrit
seulement sur changement reel ; sans cette persistance la garde redeviendrait
une bande, donc un oscillateur.

Effet : l ACM recharge jusqu a la cible puis tient la batterie a 2 A, la maison
finit la nuit sur le reseau en heures creuses au lieu de vider la reserve, et la
batterie arrive a l aube pres de sa cible avec de la place pour le solaire. La
coupure immediate E2 de l hysteresis exige l absence d override et le helper
takeover reste ON : aucune modification du workflow d hysteresis.

Golden 75 -> 78. Le scenario epingle quelques heures plus tot comme limite
connue devient celui du correctif, attendu mis a jour dans le meme commit.
Quatre mutations ; la plus parlante retire la garde bilan et fait tomber les
trois scenarios anti-oscillateur du 27/08 — les tests de l ancien correctif
protegent le nouveau code.

Prerequis identifie et non traite : la conversion kWh vers points de SOC est une
constante la ou la realite est une courbe. Consequence, un sous-declenchement
possible en bas d echelle, jamais une oscillation. Prochain chantier du bilan.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-03 23:14:49 +02:00
parent 05bdf019c2
commit 914ef021b2
11 changed files with 334 additions and 23 deletions

View File

@@ -867,6 +867,51 @@ Le bon critere de re-engagement — « un budget d'energie restant a couvrir »
etait deja designe par §26 ; le bilan est maintenant cable, mais la suite touche
la machine a etats de la nuit et fera l'objet d'un chantier propre.
#### G. Session reseau unique de la nuit (03/09/2026)
Le chantier annonce ci-dessus, fait le soir meme — mais pas comme prevu.
**Mesure prealable, qui a change la conception.** Les kWh reellement sortis de
la batterie par point de SOC, sur cinq fenetres et trois nuits : 0,164 a
0,171 kWh/point au-dessus de 42 % (soit ~17 kWh), mais **0,121 entre 45 et 22 %
et 0,082 entre 33 et 20 %**. En bas d'echelle, un point de SOC vaut moitie
moins. Or le bilan convertit avec une constante unique de 15 kWh :
`required_soc` y est donc systematiquement trop bas — d'ou la batterie qui,
la nuit du 02-03/09, descendait 1,75 fois plus vite que la ligne.
**Consequence : le relachement ne peut pas etre un seuil de SOC.** Il porterait
sur une grandeur fausse, et tout seuil que le SOC repasse ensuite rouvre
l'oscillateur du 27/08. Les deux variantes evidentes — relacher sur
`required_soc`, ou sur `required_soc_prudent` avec la bande p50/p80 — ont ete
ecartees pour cette raison.
**Conception retenue : engagement sur le bilan, relachement a la FIN DE LA
FENETRE.** L'oscillation devient structurellement impossible, la condition de
sortie etant monotone : une fenetre ne se ferme qu'une fois. Un helper
`input_boolean.victron_evcs_night_grid_session_committed` porte l'engagement —
sans cette persistance, la garde serait reevaluee a chaque cycle et redeviendrait
une bande.
Effet : l'ACM recharge jusqu'a la cible puis tient la batterie a 2 A, la maison
finit la nuit sur le reseau **en heures creuses** au lieu de vider la reserve, et
la batterie arrive a l'aube pres de sa cible, avec de la place pour le solaire.
La coupure immediate E2 de l'hysteresis exige `!evcsGridOverride` et le helper
takeover reste ON : aucune modification du workflow d'hysteresis n'a ete
necessaire.
Golden 75 → 78. La mutation la plus parlante : retirer la garde bilan fait
tomber les trois scenarios anti-oscillateur du 27/08 — les tests de l'ancien
correctif protegent le nouveau code. Detail : HANDOFF §40.
⚠️ **Prerequis identifie, non traite** : `evcs_balance_usable_capacity_kwh` = 15
est une constante la ou la realite est une courbe, et `INPUT_PARSE` code 17,5 en
dur de son cote. Consequence : `required_soc` sous-estime le besoin en bas
d'echelle, donc la session peut manquer des nuits ou elle aurait du s'engager
(sous-declenchement — jamais d'oscillation, la conception y est immune), et la
reserve d'orage est optimiste dans la meme bande. §28 avait deja signale
l'effondrement de la jauge ; les mesures du 03/09 lui donnent sa courbe. C'est
le prochain chantier du bilan energetique.
⚠️ Point structurel mis au jour par cet incident : le bilan energetique publie
l'heure de croisement, l'energie a couvrir, le SOC requis, `grid_needed` et
`pv_censored` — et **aucun des deux workflows de decision n'en lit une seule