P10: mémoire 'véhicule plein' en journée (collant jusqu'au débranchement)
- WINDOWS: dayVehicleFullIdle (statut 3 ou VDF, héritages jour<->nuit), sourceMode blocked même face au solaire - DECISION: branche collante day_vehicle_full_idle au-dessus des gardes - échappatoires force_charge_now/force_grid_now (golden) - golden 33->36, validé live 10:04:30 (latch en 16 s sur la VW pleine) - HANDOFF §22 + MANUEL états collants
This commit is contained in:
48
HANDOFF.md
48
HANDOFF.md
@@ -1018,3 +1018,51 @@ de départ pour la priorité/urgence nuit — voulu).
|
|||||||
|
|
||||||
---
|
---
|
||||||
*Document mis à jour le : 09/08/2026 (~08:35) — P9 + sélecteur véhicule déployés, golden 33/33*
|
*Document mis à jour le : 09/08/2026 (~08:35) — P9 + sélecteur véhicule déployés, golden 33/33*
|
||||||
|
|
||||||
|
## 22. Session du 09/08/2026 — P10 : mémoire "véhicule plein" en journée
|
||||||
|
|
||||||
|
### Incident (captures utilisateur 09:49-09:57)
|
||||||
|
VW pleine rebranchée ~07:00. À 09:49, PV fort (5,5 kW) → le surplus solaire
|
||||||
|
lance une tentative (morning_solar, solar_only) : 6 A commandés, 0 W pris,
|
||||||
|
VRM affiche "Charged". Sans mémoire jour, le cycle se répète toutes les
|
||||||
|
~15 min TOUTE la journée (VDF stop → block → re-start). Zéro coût énergie
|
||||||
|
(solaire, EDF OFF) mais usure relais borne/VW + bruit. Les états collants
|
||||||
|
P8/P9 étaient scopés nuit / fenêtre départ.
|
||||||
|
|
||||||
|
### Fix P10 (déployé 09/08 10:04, golden 36/36, validé live à 10:04:30)
|
||||||
|
- WINDOWS : `dayVehicleFullIdle` collant = véhicule branché + hors fenêtre HC
|
||||||
|
+ (prev ∈ {day_vehicle_full_idle, vehicle_full_or_paused,
|
||||||
|
night_recovery_done_idle, night_session_done_idle, departure_done_idle}
|
||||||
|
OU statut 3 ≤ 300 W). sourceMode → 'blocked' (y compris face à solar_only :
|
||||||
|
charger un véhicule plein ne sert à rien).
|
||||||
|
- HÉRITAGES bidirectionnels : le jour hérite des états done de la nuit
|
||||||
|
(07:24 → aucune re-tentative matinale) ; la nuit hérite du jour
|
||||||
|
(vehicleChargeCompleted inclut day_vehicle_full_idle → pas de tentative
|
||||||
|
01:24 si resté branché plein).
|
||||||
|
- DECISION : branche collante 'day_vehicle_full_idle' au-dessus des gardes
|
||||||
|
(principe Fix F), stop propre si session armée.
|
||||||
|
- Libération : DÉBRANCHEMENT (vehicle_not_connected) — ou échappatoires
|
||||||
|
force_charge_now / force_grid_now (testé golden).
|
||||||
|
- Hystérésis : nom sans pattern no-demand ✓, aucun changement nécessaire
|
||||||
|
(EDF pas impliqué dans ce chemin).
|
||||||
|
|
||||||
|
### Golden 33 → 36
|
||||||
|
day-vw-pleine-statut3 (session armée 0 W statut 3 → collant) ·
|
||||||
|
day-full-heritage-nuit (prev=night_recovery_done_idle → pas de solaire) ·
|
||||||
|
day-full-echappatoire-force-charge (force_charge_now relance).
|
||||||
|
|
||||||
|
### Validation live
|
||||||
|
10:04:14 PUT → 10:04:30 : `day_vehicle_full_idle` latché sur la VW pleine
|
||||||
|
en cours de tentative ; statut retombé à 6 (relais ouvert) sans relance.
|
||||||
|
|
||||||
|
### Cycle de vie complet d'un véhicule branché (résumé)
|
||||||
|
```
|
||||||
|
branché → tentatives légitimes (nuit P7 / jour solaire / P9 départ)
|
||||||
|
→ plein détecté (statut 3 ou VDF)
|
||||||
|
→ collant : night_*_done_idle / departure_done_idle / day_vehicle_full_idle
|
||||||
|
(héritages entre périodes, réécrit chaque cycle au-dessus des gardes)
|
||||||
|
→ DÉBRANCHEMENT = seule remise à zéro (+ force_* en échappatoire)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
*Document mis à jour le : 09/08/2026 (~10:10) — P10 déployé et validé live, golden 36/36*
|
||||||
|
|||||||
@@ -456,6 +456,9 @@ de G2 — full_or_paused / not_requesting_power / charge_complete / no_demand) :
|
|||||||
relâché définitivement (anti-rebond)
|
relâché définitivement (anti-rebond)
|
||||||
- `departure_done_idle` : charge finie pendant la fenêtre départ P9 (jour)
|
- `departure_done_idle` : charge finie pendant la fenêtre départ P9 (jour)
|
||||||
→ EDF relâché définitivement
|
→ EDF relâché définitivement
|
||||||
|
- `day_vehicle_full_idle` (P10) : véhicule plein en journée → plus AUCUNE
|
||||||
|
tentative (même solaire) jusqu'au débranchement ; héritages bidirectionnels
|
||||||
|
jour↔nuit ; échappatoires force_charge_now / force_grid_now
|
||||||
|
|
||||||
#### Incidents de référence
|
#### Incidents de référence
|
||||||
- **Nuit 07-08/08 (JEEP)** : SOC bloqué pile à la cible = point dégénéré →
|
- **Nuit 07-08/08 (JEEP)** : SOC bloqué pile à la cible = point dégénéré →
|
||||||
|
|||||||
@@ -387,6 +387,7 @@ const vehicleChargeCompleted = !!nightPrev.vehicleChargeCompleted;
|
|||||||
const nightRecoveryDone = !!nightPrev.nightRecoveryDone;
|
const nightRecoveryDone = !!nightPrev.nightRecoveryDone;
|
||||||
const departureUrgentActive = !!nightPrev.departureUrgentActive;
|
const departureUrgentActive = !!nightPrev.departureUrgentActive;
|
||||||
const departureChargeDone = !!nightPrev.departureChargeDone;
|
const departureChargeDone = !!nightPrev.departureChargeDone;
|
||||||
|
const dayVehicleFullIdle = !!nightPrev.dayVehicleFullIdle;
|
||||||
const nightPreferredSourceMode = nightPrev.nightPreferredSourceMode || 'blocked';
|
const nightPreferredSourceMode = nightPrev.nightPreferredSourceMode || 'blocked';
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
@@ -850,6 +851,7 @@ return [{
|
|||||||
nightRecoveryDone,
|
nightRecoveryDone,
|
||||||
departureUrgentActive,
|
departureUrgentActive,
|
||||||
departureChargeDone,
|
departureChargeDone,
|
||||||
|
dayVehicleFullIdle,
|
||||||
nightPreferredSourceMode,
|
nightPreferredSourceMode,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -541,6 +541,28 @@ else if (
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// P10 (09/08/2026) : véhicule plein en JOURNÉE → veille collante
|
||||||
|
// 'day_vehicle_full_idle' jusqu'au débranchement. Évite les re-tentatives
|
||||||
|
// solaires cycliques sur un véhicule plein (usure relais). Réécrite chaque
|
||||||
|
// cycle au-dessus des gardes (principe Fix F). Échappatoires : force_*.
|
||||||
|
// =====================================================
|
||||||
|
else if (
|
||||||
|
nightEvcs?.dayVehicleFullIdle &&
|
||||||
|
!manualLocalChargeAllowed &&
|
||||||
|
!strategy.forceGridRequested
|
||||||
|
) {
|
||||||
|
setOff({
|
||||||
|
stateName: 'day_vehicle_full_idle',
|
||||||
|
decisionName: cloud.sessionObservedActive ? 'stop_vehicle_full_or_paused' : 'hold',
|
||||||
|
reasonText: 'Véhicule plein : veille jour, aucune nouvelle tentative jusqu\'au débranchement',
|
||||||
|
dynamic: false,
|
||||||
|
mustStopFlag: !!cloud.sessionObservedActive,
|
||||||
|
blockReason: 'none',
|
||||||
|
blockedUntilStamp: now.stamp,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
else if (safeguards.mustStopHard) {
|
else if (safeguards.mustStopHard) {
|
||||||
setOff({
|
setOff({
|
||||||
stateName:
|
stateName:
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ const vehicleChargeCompleted =
|
|||||||
prevSurplusState === 'vehicle_full_or_paused' ||
|
prevSurplusState === 'vehicle_full_or_paused' ||
|
||||||
prevSurplusState === 'night_session_done_idle' ||
|
prevSurplusState === 'night_session_done_idle' ||
|
||||||
prevSurplusState === 'night_recovery_done_idle' ||
|
prevSurplusState === 'night_recovery_done_idle' ||
|
||||||
|
prevSurplusState === 'day_vehicle_full_idle' ||
|
||||||
evcsStatusCharged
|
evcsStatusCharged
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -420,6 +421,37 @@ const departureUrgentActive =
|
|||||||
departureWindowActive &&
|
departureWindowActive &&
|
||||||
!departureChargeDone;
|
!departureChargeDone;
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// P10 (09/08/2026) : MÉMOIRE "VÉHICULE PLEIN" EN JOURNÉE.
|
||||||
|
// Observé le 09/08 09:49 : VW pleine branchée depuis 07:00, le surplus
|
||||||
|
// solaire retentait une charge (statut "Charged", 0 W) toutes les ~15 min
|
||||||
|
// toute la journée (usure relais, bruit). Les états collants P8/P9 étaient
|
||||||
|
// scopés nuit/fenêtre départ. Ici : une fois le véhicule vu plein (statut 3
|
||||||
|
// ou VDF), état collant 'day_vehicle_full_idle' jusqu'au DÉBRANCHEMENT.
|
||||||
|
// - hérite des états "done" de la nuit (07:24 → pas de re-tentative) ;
|
||||||
|
// - la nuit hérite en retour (vehicleChargeCompleted inclut day_*) ;
|
||||||
|
// - échappatoires : force_charge_now / force_grid_now / débrancher-rebrancher.
|
||||||
|
// =====================================================
|
||||||
|
const dayVehicleFullPrev =
|
||||||
|
prevSurplusState === 'day_vehicle_full_idle' ||
|
||||||
|
(
|
||||||
|
!inNightHcWindow &&
|
||||||
|
(
|
||||||
|
prevSurplusState === 'vehicle_full_or_paused' ||
|
||||||
|
prevSurplusState === 'night_recovery_done_idle' ||
|
||||||
|
prevSurplusState === 'night_session_done_idle' ||
|
||||||
|
prevSurplusState === 'departure_done_idle'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const dayVehicleFullIdle =
|
||||||
|
parsed.evcsVehicleConnected &&
|
||||||
|
!inNightHcWindow &&
|
||||||
|
!isStopMode &&
|
||||||
|
!forceGridRequested &&
|
||||||
|
!forceChargeRequested &&
|
||||||
|
(dayVehicleFullPrev || evcsStatusCharged);
|
||||||
|
|
||||||
// P8 : correction du fix 04/08 (logique inversée : "|| vehicleChargeCompleted"
|
// P8 : correction du fix 04/08 (logique inversée : "|| vehicleChargeCompleted"
|
||||||
// GARDAIT le latch après la charge au lieu de le libérer).
|
// GARDAIT le latch après la charge au lieu de le libérer).
|
||||||
const nightTakeoverLatched =
|
const nightTakeoverLatched =
|
||||||
@@ -693,6 +725,12 @@ if (departureChargeDone && profile !== 'night_hc' && !isStopMode && !forceGridRe
|
|||||||
sourceMode = 'blocked';
|
sourceMode = 'blocked';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// P10 : véhicule plein en journée (mémoire collante) → aucune source,
|
||||||
|
// y compris solaire (charger un véhicule plein ne sert à rien).
|
||||||
|
if (dayVehicleFullIdle && profile !== 'night_hc') {
|
||||||
|
sourceMode = 'blocked';
|
||||||
|
}
|
||||||
|
|
||||||
const operatingMode = profile;
|
const operatingMode = profile;
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
@@ -810,6 +848,9 @@ return [{
|
|||||||
// P9
|
// P9
|
||||||
departureUrgentActive,
|
departureUrgentActive,
|
||||||
departureChargeDone,
|
departureChargeDone,
|
||||||
|
|
||||||
|
// P10
|
||||||
|
dayVehicleFullIdle,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
|||||||
@@ -308,6 +308,89 @@ export const scenarios = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ===== P10 09/08/2026 : mémoire "véhicule plein" en journée =====
|
||||||
|
// Incident 09/08 09:49 : VW pleine, le surplus solaire retentait une charge
|
||||||
|
// toutes les ~15 min (statut "Charged", 0 W) → usure relais. Désormais
|
||||||
|
// collant jusqu'au débranchement, avec héritage des états done de la nuit.
|
||||||
|
{
|
||||||
|
id: 'day-vw-pleine-statut3',
|
||||||
|
label: 'Matin PV fort, session armée 0 W, statut 3 → day_vehicle_full_idle collant (stop propre, plus de solaire)',
|
||||||
|
time: MORNING,
|
||||||
|
overrides: {
|
||||||
|
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||||
|
soc_percent: '60', pv_power_w: '4500', pv_power_10m_avg_w: '4200',
|
||||||
|
pv_trend_w: '100', battery_current_a: '10',
|
||||||
|
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900',
|
||||||
|
evcs_charging_switch: 'on',
|
||||||
|
charge_permission_now: 'on',
|
||||||
|
control_latch: 'on',
|
||||||
|
evcs_current_a: '0',
|
||||||
|
evcs_ac_power_w: '0',
|
||||||
|
evcs_status_raw: '3',
|
||||||
|
prev_surplus_state: 'charging_hold',
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
profile: 'morning_solar',
|
||||||
|
sourceMode: 'blocked',
|
||||||
|
state: 'day_vehicle_full_idle',
|
||||||
|
decision: 'stop_vehicle_full_or_paused',
|
||||||
|
desiredCharging: false,
|
||||||
|
currentA: 6,
|
||||||
|
takeoverNeeded: false,
|
||||||
|
edfOnAction: false,
|
||||||
|
takeoverHelperService: 'turn_off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'day-full-heritage-nuit',
|
||||||
|
label: 'Matin PV fort, prev=night_recovery_done_idle (nuit finie pleine) → AUCUNE re-tentative solaire',
|
||||||
|
time: MORNING,
|
||||||
|
overrides: {
|
||||||
|
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||||
|
soc_percent: '60', pv_power_w: '4500', pv_power_10m_avg_w: '4200',
|
||||||
|
pv_trend_w: '100', battery_current_a: '10',
|
||||||
|
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900',
|
||||||
|
evcs_status_raw: '1',
|
||||||
|
prev_surplus_state: 'night_recovery_done_idle',
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
profile: 'morning_solar',
|
||||||
|
sourceMode: 'blocked',
|
||||||
|
state: 'day_vehicle_full_idle',
|
||||||
|
decision: 'hold',
|
||||||
|
desiredCharging: false,
|
||||||
|
currentA: 6,
|
||||||
|
takeoverNeeded: false,
|
||||||
|
edfOnAction: false,
|
||||||
|
takeoverHelperService: 'turn_off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'day-full-echappatoire-force-charge',
|
||||||
|
label: 'Matin PV fort, mémoire plein active MAIS force_charge_now → la charge repart (échappatoire utilisateur)',
|
||||||
|
time: MORNING,
|
||||||
|
overrides: {
|
||||||
|
victron_evcs_strategy: 'force_charge_now',
|
||||||
|
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||||
|
soc_percent: '60', pv_power_w: '4500', pv_power_10m_avg_w: '4200',
|
||||||
|
pv_trend_w: '100', battery_current_a: '10',
|
||||||
|
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900',
|
||||||
|
evcs_status_raw: '1',
|
||||||
|
prev_surplus_state: 'day_vehicle_full_idle',
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
profile: 'morning_solar',
|
||||||
|
sourceMode: 'solar_only',
|
||||||
|
state: 'start_manual_local_min_current',
|
||||||
|
decision: 'start',
|
||||||
|
desiredCharging: true,
|
||||||
|
currentA: 6,
|
||||||
|
takeoverNeeded: false,
|
||||||
|
edfOnAction: false,
|
||||||
|
takeoverHelperService: 'turn_off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
// ================= FIN DE CHARGE NUIT (P8) =================
|
// ================= FIN DE CHARGE NUIT (P8) =================
|
||||||
{
|
{
|
||||||
id: 'night-vw-pleine-transition',
|
id: 'night-vw-pleine-transition',
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user