Fixes A/B/C/D incident rebond EDF nuit 07-08/08 + GRAFCET doc

- A: état collant night_recovery_done_idle + bande cible−2 (anti-rebond takeover)
- B: snapshot relit night_session_start_soc/at (fin des réécritures 30s)
- C: hystérésis grid — turn_off_vehicle_unplugged (coupure immédiate, bypass min_on)
- D: evcs_status_raw==3 (charged) = fin de charge immédiate
- golden 19→23 scénarios (2 attendus mis à jour, 4 nouveaux)
- MANUEL_COMPLET §11.6 GRAFCET cycle nuit, HANDOFF §17, vision-notes incident
This commit is contained in:
Tallagrand Thierry
2026-08-08 14:20:21 +02:00
parent b20b3b19fc
commit 9bc4af0ea1
11 changed files with 874 additions and 15 deletions

View File

@@ -344,6 +344,64 @@ S'assurer que le véhicule est chargé avant l'heure de départ prévue.
- **gridTakeoverTriggerPct** : Seuil de basculement réseau
- **batteryRecoveryUrgent** : Si temps restant < temps de charge nécessaire
### 11.6 Cycle nuit HC complet — GRAFCET (P7 + P8 + fixes 08/08/2026)
Deux automates coordonnés via les helpers HA (`night_grid_takeover_needed`,
`victron_evcs_surplus_state`) :
- **G1** = contrôleur EVCS V2.6 (boucle 30 s)
- **G2** = hystérésis EDF (« Victron - Battery / Grid Hysteresis Fix V1 », 1 min)
```
G1 — SESSION NUIT EVCS
──────────────────────
X0 JOUR / attente (profils solaires)
│ t1: fenêtre HC (01:24) ET véhicule branché
X1 SESSION NUIT ACTIVE — capture startSOC/startAt (une seule fois, Fix B)
│ t2: toggle "Réseau HC nuit" ON → nightGridHcPreferred (P7)
X2 TAKEOVER: helper ON → G2 force EDF ON ; ACM tient la batterie (~2 A)
│ t3: EDF ON confirmé (gridAvailable)
X3 CHARGE VE: start 6 A → step-up (plafond 20 A / boost 28 A)
│ t4: fin de charge = VDF no-demand OU statut EVCS brut 3 "charged" (Fix D)
X4 CHARGE TERMINÉE (collant): vehicleChargeCompleted, sourceMode='blocked'
│
├─ t5a: SOC < cible matin
│ X5a RECOVERY BATTERIE: takeover ON (EDF ON), ACM recharge → cible
│ │ t6: SOC ≥ cible
│ ▼
└─ t5b: SOC ≥ cible matin
X5b RECOVERY DONE (collant, Fix A): état 'night_recovery_done_idle'
│ takeover OFF définitif → G2 coupe EDF (turn_off_recovered)
│ ré-engagement UNIQUEMENT si SOC ≤ cible − 2 (bande anti-rebond)
│ t7: débranchement OU fin de fenêtre (07:24)
X6 CLÔTURE: clear session → retour X0 (profil jour)
G2 — HYSTÉRÉSIS EDF (seuils ON ≤ 20 % | OFF ≥ 30 % | min_on 25 | cooldown 15)
──────────────────────────────────────────────────────────────────────────────
Y0 EDF OFF (observe_only)
│ u1: override EVCS (takeover/force_grid/grid_forced) sans no-demand
│ u2: SOC ≤ seuil ON (bypass cooldown)
Y1 EDF ON + latch
│ v1: override disparu ET min_on écoulé ET SOC ≥ seuil OFF → turn_off_recovered
│ v2: force_grid + voiture pleine → coupure immédiate
│ v3: véhicule débranché + SOC ≥ seuil OFF → coupure immédiate
│ (turn_off_vehicle_unplugged, bypass min_on — Fix C 08/08/2026)
└─▶ retour Y0 (cooldown 15 min)
```
États surplus « fin de nuit » (aucun ne doit matcher les patterns no-demand
de G2 — full_or_paused / not_requesting_power / charge_complete / no_demand) :
- `night_session_done_idle` : charge finie, recovery batterie possible (EDF
maintenu si SOC < cible)
- `night_recovery_done_idle` : charge finie ET batterie à la cible → EDF
relâché définitivement (anti-rebond)
#### Incident de référence (nuit 07-08/08/2026)
SOC bloqué pile à la cible (35 %) = point dégénéré (engage `soc ≤ 35`,
release `soc > 35`) → rebond EDF ON/OFF période ~10 min + flapping ACM 2-4 s,
et EDF maintenu 25 min après débranchement. Corrigé par Fix A (flag collant +
bande 2 pts), Fix B (snapshot relit startSOC/startAt), Fix C (coupure au
débranchement), Fix D (statut charged = fin de charge immédiate).
---
## 12. Configuration opencode.json

View File

@@ -169,4 +169,59 @@ Suite à la session de débogage du 17/07/2026:
- Configuration actuelle: soc_start_min=80%, night_target_soc=70%, battery_discharge_soft_a=0A
- Mode sonde activé (probe_enabled: ON)
- Système fonctionnel avec delivery 99.9%
- EDF OFF la journée, uniquement la nuit
- EDF OFF la journée, uniquement la nuit
---
# Vision notes — Incident nuit 07→08/08/2026 (rebond EDF post-P8)
Source
9 captures : dashboard EVCS Master (08/08 11:31) + timeline Activité HA 01:00→07:00.
# OCR brut (faits clés)
- 01:25:03 Interrupteur hold_on_evcs_override | Grid=on | Latch=on | SOC=27% | AC=1021W |
Cause: night_grid_takeover_needed | PV 0W | EVCS inactif 0W | status_raw=6 |
signature es=battery_current_hard_stop
- 01:24:30→04:16 : "Victron EVCS Night Session Start At" RÉÉCRIT toutes les 30 s
(01:24:30, 01:25:00, 03:05:30, 03:59:30, 04:01:30...) + "Bloqué jusqu'à" glissant.
- 03:05 / 03:59 : hold_on_evcs_override maintenu, SOC 35%, seuils 20%/30%, PV 0W.
- 03:58:33→04:01:29 : "Victron mode (derived)" alterne Charging (AC-in) ↔ On grid
(passthru/import) toutes les 2-4 s (flapping ACM autour de SOC=cible).
- 04:16:03 turn_on_evcs_override : EDF re-forcé ON (Grid/Latch étaient OFF), SOC 35%,
cause night_grid_takeover_needed, es=night_session_done_idle. Latch hystérésis Activé.
- 04:18:03 hold_on_min_runtime (EDF maintenu ON, mini 25 min, 2 min écoulées),
status_raw=0, es=vehicle_not_connected ; Night Session Active + Takeover → Désactivés ;
VDF delivery=0 noise=0.003 score=0.002 noDemand=off ; victron_evcs_cloud_debt_kwh=1,1.
- 04:25:03 hysteresis_disabled | Grid=off | Latch=off | es=stopped_user (arrêt manuel).
- 04:26:03 "Dernier ON il y a 10 min | Dernier OFF il y a 11 min" → période de rebond ~10 min.
- Dashboard 11:31 : véhicule non détecté/débranché, consigne 20 A, durée charge 1h32m,
énergie session Inconnu ; Conseiller IA ombre : auto_solar_plus, cible 35%, accord,
modèle qwen3-vl, 35 accords / 4 divergences, kill-switch ON.
# État actuel déduit
- P7 (charge HC auto 01:24) a fonctionné ; VW pleine ~02:56 (1h32m).
- P8 a fini par émettre night_session_done_idle mais TARDIVEMENT, puis rebond EDF
ON/OFF (~10 min de période) : SOC bloqué pile à la cible matin (35%) =
gridTakeoverTrigger (soc<=35 → EDF ON) vs release (soc>35 → EDF OFF) sans bande.
- Débranchement VW (04:17) → takeover bien désactivé mais EDF resté ON (min_runtime 25)
→ arrêt manuel utilisateur 04:25.
# Causes code identifiées (src/nodes/)
1. WINDOWS_SOURCEV2.js:272-283+348-356 : gridTakeoverTriggerPct == batteryMorningTargetPct,
engage `soc <= 35`, release implicite `soc > 35`, recovery ACM `soc < 35` (strict)
→ point de fonctionnement dégénéré à SOC=cible → oscillation EDF + flapping ACM.
2. HA_SNAPSHOT_TEMPLATE.json.tpl : champs `evcs_night_session_start_soc` /
`evcs_night_session_start_at` ABSENTS → INPUT_PARSE ne relit jamais la capture →
nightSessionNeedsCapture=true à chaque cycle → réécriture toutes les 30 s (logs).
3. DECISION_ENGINEV2.js:322-337 : VDF armé uniquement session pleinement active ;
tout stop pour autre raison (ex battery_current_hard_stop) désarme le filtre →
détection "voiture pleine" retardée (~1h20 cette nuit).
4. Hystérésis grid (workflow 7iIlu7LLTW7TZA8o) : pas de coupure anticipée après
débranchement (min_on 25 min s'applique même si véhicule parti et SOC >= seuil OFF).
# Actions recommandées
- Fix A (prioritaire) : flag collant `night_recovery_done` (recovery terminée une fois
SOC >= cible) + bande d'hystérésis (engage cible-2, release cible) dans WINDOWS_SOURCEV2.
- Fix B : ajouter les 2 champs night_session_start_* au snapshot template.
- Fix C : coupure EDF anticipée si vehicle_not_connected + SOC >= gridSocOff (bypass min_on).
- Fix D (optionnel) : fiabiliser fin de charge (statut EVCS "charged", ou VDF armable en hold).
- +2 scénarios golden : SOC==cible avec vehicleChargeCompleted (pas d'oscillation), débranché
pendant hold EDF.