Corrige l'inversion plancher de demarrage / plancher de maintien (EVCS)

Incident du 24/08 12:24-12:28 : bascule de profil vers midday_hc_or_solar
avec SOC 58 %. Plancher de demarrage = min(midday_soc_min 75, abondance P6
40) = 40 ; plancher de maintien = max(soc_stop_min 29, 75-15) = 60. Le
systeme avait donc le droit de DEMARRER ce qu'il n'avait pas le droit de
MAINTENIR : cycle limite a la periode de min_run (3 min) sur toute la bande
[40 %, 60 %], et ~2,6 kW de PV ecretes a chaque creux (PV 10,24 kW -> 7,64 kW
quand la borne s'arrete, ESS sans injection).

Deux volets indissociables dans BATTERY_CLOUD_LOCKS.js :
- effectiveSocHoldFloor = min(regle du profil, plancher de demarrage
  effectif). Sans abondance, comportement inchange.
- l'abondance P6 se prouve au demarrage (batterie >= +20 A) mais se maintient
  en charge (batterie >= 0) : sinon la charge du vehicule, qui detourne
  precisement le surplus, detruit sa propre condition d'autorisation.

Golden 39 -> 40. Preuve par mutation sur midday-inversion-start-hold : code
d'avant -> stop / "Conditions de maintien perdues", apres -> step_up 19 A.

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-08-24 12:46:18 +02:00
parent 522f47e821
commit 057e0f7d8f
5 changed files with 148 additions and 39 deletions

View File

@@ -538,29 +538,51 @@ restant un filet de sécurité borné.
#### B. Oscillation de la charge EVCS en plein soleil
Observée le 24/08 vers 11:58-12:00 avec PV 7,7-7,9 kW : la borne alterne
`Waiting for start` / 0 A et `Charging` / 7 A. **Ce n'est pas une limite
5 kVA** — aucun `binary_sensor.victron_ve_bus_overload` depuis le 20/08,
`ac_loads_max_safe_w` = 9000 W, AC-out L1 mesuré à 5335 W sans overload (le
parallèle maître/esclave tient bien au-delà de 5 kVA), et le plafond calculé
par `WINDOWS_SOURCEV2` ressort à ~20 A. Deux causes réelles :
Observée le 24/08 entre 12:25 et 12:28 : la borne charge à 18 A / 3502 W avec
PV 10,24 kW et batterie à **+127 A**, puis s'arrête (0 A, `Waiting for start`)
— et la PV retombe à 7638 W, soit **~2,6 kW écrêtés** faute de preneur (ESS
sans injection, batterie déjà à son courant de charge maximal).
1. **Bande morte nulle.** `battery_discharge_soft_a` = 0 A et
`battery_neutral_band_a` = 0 A (réglés à 0 le 17/07/2026). Comme
`profileBatteryDischargeFloorA = max(seuil du profil, réglage global)`, la
tolérance de −12 A prévue pour la bande SOC 40-60 % est **annulée** : la
moindre pointe de conso (ballon, lave-vaisselle) fait passer le courant
batterie sous 0 A et casse `solarHoldOk`. Avec `min_run_minutes` = 3, la
période du cycle est de 3 à 6 minutes.
2. **Condition de démarrage auto-destructrice (P6).** En `outside_window`
(11:00-12:24) le plancher de démarrage est `soc_start_min` = 80 % alors que
le SOC est à 49 %. Le seul chemin autorisant le départ est l'override
d'abondance P6, qui exige `pvPowerAvg10m ≥ 4000 W` **et**
`batteryCurrentA ≥ +20 A`. Or brancher la voiture détourne le surplus et
fait tomber le courant batterie sous +20 A : l'action détruit sa propre
condition d'autorisation. Système bistable → oscillateur.
**Ce n'est pas une limite 5 kVA** : aucun `binary_sensor.victron_ve_bus_overload`
depuis le 20/08, `ac_loads_max_safe_w` = 9000 W, AC-out L1 mesuré à 5335 W sans
overload (le parallèle maître/esclave tient bien au-delà de 5 kVA), plafond
calculé par `WINDOWS_SOURCEV2` ~20 A. **Ce n'est pas non plus une bande morte
batterie trop étroite** : le courant était à +127 A au moment de l'arrêt, très
loin de tout seuil de décharge.
Direction retenue (même logique qu'en A) : lire la conso au lieu de la
**Cause réelle : inversion du plancher de démarrage et du plancher de maintien.**
À 12:24:00 le profil bascule `outside_window` → `midday_hc_or_solar`. Dans ce
profil, avec SOC 58 % :
| | Calcul | Valeur |
|---|---|---|
| Plancher de **démarrage** | `min(midday_soc_min 75, abondance P6 40)` | **40 %** |
| Plancher de **maintien** | `max(soc_stop_min 29, midday_soc_min 75 − 15)` | **60 %** |
`40 ≤ 58 < 60` : le système a le droit de **démarrer** ce qu'il n'a pas le
droit de **maintenir**. Cycle limite garanti à la période de `min_run_minutes`
(3 min) sur toute la bande [40 %, 60 %], traversée chaque jour vers midi.
L'origine est P6, qui abaissait le plancher de démarrage en cas d'abondance
sans toucher au plancher de maintien.
**Correctif déployé le 24/08 12:45** (`BATTERY_CLOUD_LOCKS.js`), deux volets :
1. **Invariant maintien ≤ démarrage** :
`effectiveSocHoldFloor = min(règle du profil, plancher de démarrage effectif)`.
Sans abondance, rien ne change (60 reste 60).
2. **L'abondance se prouve au démarrage, se maintient en charge.**
`solarAbundanceStart` exige toujours `pvAvg ≥ 4000 W` **et**
`batteryCurrentA ≥ +20 A` (preuve avant d'agir) ; `solarAbundanceHold`
n'exige que `pvAvg ≥ 4000 W` **et** `batteryCurrentA ≥ 0` (la batterie n'est
pas devenue fournisseuse). Sans cette distinction, la charge du véhicule —
qui détourne précisément le surplus — fait tomber le courant batterie sous
+20 A et **détruit sa propre condition d'autorisation** : système bistable.
Scénario golden `midday-inversion-start-hold` (relevé VRM du 24/08 12:25).
Preuve par mutation : sur le code d'avant → `stop` / « Conditions de maintien
perdues » ; après → `charging_step_up_battery` à 19 A. Golden 39 → 40.
Direction de fond (même logique qu'en A) : lire la conso au lieu de la
deviner, la filtrer numériquement (les pointes nocturnes sont improbables hors
charge EVCS), lisser le SOC pour les décisions de confort en gardant
l'instantané pour la sécurité, et exploiter les messages d'état réels du