Fix E: latch 'charge terminée' en session active + coupure recovery_done (incident rebond 08-09/08)
- DECISION: branche completed prioritaire dans la session active (avant VDF/source-lost) → état collant écrit au 1er cycle status=3, relais encore fermé - WINDOWS: garde puissance <=300W sur Fix D (anti-glitch) - Hystérésis: turn_off_recovery_done (bypass min_on, dry-run 5 cas) - golden 23→25 (session armée status 3, flap statut post-latch) - HANDOFF §18
This commit is contained in:
@@ -629,6 +629,35 @@ else if (cloud.sessionObservedActive) {
|
||||
const effectiveHoldConditionsOk =
|
||||
holdConditionsOk || manualLocalHoldOverride;
|
||||
|
||||
// =================================================
|
||||
// Fix E (09/08/2026) : CHARGE TERMINÉE PENDANT LA SESSION ACTIVE.
|
||||
// Nuit 08-09/08 : status EVCS 3 "charged" → WINDOWS passe la source à
|
||||
// 'blocked' (Fix D), mais ICI les branches source-lost prenaient la main
|
||||
// (hold_min_run_source_lost 25 min puis stop_source_lost), l'état collant
|
||||
// n'était JAMAIS écrit ; à l'ouverture du relais le statut retombe (3→1),
|
||||
// completed redevenait faux → re-P7 → EDF rallumé → rebond ~30 min.
|
||||
// On latche l'état collant AU PREMIER cycle où la fin de charge est vue,
|
||||
// relais encore fermé, et on termine la session proprement (pas de min ON).
|
||||
// =================================================
|
||||
if (
|
||||
context.profile === 'night_hc' &&
|
||||
nightEvcs?.vehicleChargeCompleted &&
|
||||
!manualLocalChargeAllowed &&
|
||||
!strategy.forceGridRequested
|
||||
) {
|
||||
setOff({
|
||||
stateName: nightEvcs?.nightRecoveryDone
|
||||
? 'night_recovery_done_idle'
|
||||
: 'night_session_done_idle',
|
||||
decisionName: 'stop_vehicle_full_or_paused',
|
||||
reasonText: 'Charge véhicule terminée en session active : arrêt propre, veille nuit collante',
|
||||
dynamic: false,
|
||||
mustStopFlag: false,
|
||||
blockReason: 'none',
|
||||
blockedUntilStamp: now.stamp,
|
||||
});
|
||||
}
|
||||
|
||||
// =================================================
|
||||
// VEHICLE FULL / PAUSED - NUMERIC FILTER DECISION
|
||||
// IMPORTANT:
|
||||
@@ -636,7 +665,7 @@ else if (cloud.sessionObservedActive) {
|
||||
// - uniquement si la source est réellement livrable
|
||||
// - sans utiliser le PV comme critère
|
||||
// =================================================
|
||||
if (
|
||||
else if (
|
||||
vehicleDemandFilter.evcsVehicleNoDemandSemantic &&
|
||||
vehicleDemandFilter.sourceDeliverableForNoDemand
|
||||
) {
|
||||
|
||||
@@ -322,7 +322,13 @@ const prevSurplusState = (input.prev_surplus_state ?? '').toString().trim().toLo
|
||||
// charge, sans attendre le VehicleDemandFilter (désarmé si la session a été
|
||||
// stoppée par une garde, ex battery_current_hard_stop → détection tardive
|
||||
// observée la nuit du 07-08/08).
|
||||
const evcsStatusCharged = Number.parseFloat(parsed.evcsStatusRaw) === 3;
|
||||
// Fix E (09/08/2026) : garde puissance ≤ 300 W pour ne jamais latcher "fini"
|
||||
// sur un glitch de statut pendant une vraie charge. NB : le statut retombe
|
||||
// (3→1/6) dès l'ouverture du relais → la persistance est assurée par l'état
|
||||
// collant écrit par DECISION pendant la session (voir Fix E DECISION).
|
||||
const evcsStatusCharged =
|
||||
Number.parseFloat(parsed.evcsStatusRaw) === 3 &&
|
||||
Math.max(0, parsed.evcsAcPowerW || 0) <= 300;
|
||||
|
||||
const vehicleChargeCompleted =
|
||||
nightSessionActive &&
|
||||
|
||||
Reference in New Issue
Block a user