Voiture a midi : la batterie au-dessus du plancher n'est plus comptee comme du solaire (seul le surplus net, plus l'assistance >= 90 %)
This commit is contained in:
32
HANDOFF.md
32
HANDOFF.md
@@ -1818,5 +1818,35 @@ orange-cloture (verifie par SPARK : envoye le 05/10 a 17:42).
|
||||
Meteo-France) — sert aussi la comparaison VRM / Forecast.Solar en retard depuis le 05/10 ;
|
||||
nuit du 06 au 07/10.
|
||||
|
||||
### 06/10 midi — La JEEP ne chargeait pas : le bilan comptait la batterie comme du solaire
|
||||
- JEEP branchee 13:12:45 a 56 % (Uconnect, fin de trajet 12:53), depart 15:30 (mardi). Bilan :
|
||||
besoin 4,4 kWh, « solaire » 5,86 = **4,08 kWh de batterie au-dessus du plancher** (57 -> 43,4 %)
|
||||
+ 1,78 kWh de surplus net prevu -> « solaire suffisant », pas d'EDF. Mais le controleur ne donne
|
||||
JAMAIS la batterie a la voiture en journee (demarrage sur excedent, §36 ; assistance batterie
|
||||
seulement a SOC >= 90) : PV 0,7 kW, maison 4,5 kW (repas) -> `idle_wait_conditions`. Deux calculs
|
||||
jamais confrontes, encore (meme famille que le budget du 04/10).
|
||||
- **Secours manuel** (accord du proprietaire) : `force_grid_now` pose par moi a 13:16:58, EDF ferme
|
||||
13:17:04, JEEP a 1,1 kW a 13:18. Echeance automatique armee (`evcs_expiration_force_grid_enabled`
|
||||
on) : retour `auto_solar_plus` attendu a 14:24.
|
||||
- **Regle du proprietaire** : « jour de depart a midi, rien a attendre du solaire l'apres-midi :
|
||||
bascule automatique sur le reseau sauf si le solaire donne la charge ce midi ».
|
||||
**Correctif `BALANCE.js` (deploye 13:26)** : solaire disponible pour la voiture = surplus net prevu
|
||||
(p50) d'ici le depart, moins ce qu'il faut pour remonter une batterie sous son plancher au depart,
|
||||
plus la batterie au-dessus de `VEHICLE_BATTERY_ASSIST_SOC_PCT` (90 = `batteryAssistSolarStartSocMin`
|
||||
du controleur). La batterie au-dessus du plancher n'est plus comptee. Le mecanisme aval existait
|
||||
(verdict -> `middayGridSessionUncovered` -> session HC de midi, voiture `grid_hc_allowed`).
|
||||
Tests bilan **79/79** : `bilan-jeep-midi-soleil-solaire-suffit` devient
|
||||
`…-soleil-batterie-non-comptee` (SOC 47, 4,96 < 7,66 -> reseau, VOULU), + `…-batterie-haute-assistance-comptee`
|
||||
(SOC 95 : 4,96 + 1,5 = 6,46 >= 3,48, pas de reseau) et `…-0610-surplus-insuffisant` (SOC 57 : 2,26
|
||||
< 3,83 -> reseau), verifies a la main ; garde-fou `seuil-assistance-aligne` (lit les deux fichiers) ;
|
||||
deux mutations qui mordent (batterie recomptee : 3 scenarios ; seuil 85 : 2). Sauvegarde
|
||||
`BALANCE.js.bak-20261006` (scratchpad) ; retour arriere = `git revert` + push du bilan.
|
||||
- **Verifie en reel 13:30:51** : « Voiture (depart 15:30) : 4 kWh a donner, solaire 2,91 kWh ->
|
||||
reseau justifie », `evcs_balance_vehicle_grid_needed` = on.
|
||||
- Effet attendu : les jours de depart (JEEP mar/sam 15:30, VW/ZERO avec depart ponctuel) a moins
|
||||
de 90 % de SOC, EDF a midi des que le surplus prevu ne couvre pas le besoin ; plus de
|
||||
`force_grid_now` a la main. ⚠️ La session ne vaut que dans la fenetre HC de midi (12:24-14:24) :
|
||||
une voiture branchee apres 14:24 n'est pas couverte.
|
||||
|
||||
---
|
||||
*Document mis a jour le : 06/10/2026 (~10:45) — nuit 05->06 : JEEP chargee sur EDF en complete (6,32 kWh), budget 0 du a la prevision, Windy/ECMWF contre VRM, a comparer ce soir ; concierge aligne sur la preuve fin de trajet ; a verifier : nuit 05->06 et mardi faible, comparaison VRM/Forecast.Solar ; JEEP identifiee aussi par sa fin de trajet, prevision de la nuit 05->06 ; identification JEEP reussie en reel, correction humaine qui prime (refus supprime), session du 04/10 coupee ; EVCS Master en quatre onglets ; Jeep lue par Uconnect et identifiee seule, capacite JEEP 10 kWh, concierge variante (a) ; releve par photo (SPARK), hass-uconnect en attente ; ecart semaine/week-end mesure (pas de profil week-end la nuit) ; nuit du budget : budget borne au plancher prudent, sans EDF = voiture bloquee meme EDF ferme (batterie seule) ; Energie : sauts corriges ; tableau Energie complete (Sud/Ouest, batterie par integration, borne ; aucun redemarrage HA) ; kilometrage des vehicules (km/kWh, capacite, releves de reference, agent cable 15/15) ; a verifier le 04/10 au matin : nuit du budget JEEP ; concierge : vehicule non confirme demande, heure de saisie ; Grafana vehicules en tableau ; Grafana vehicules : ZERO et Invite ajoutes, session 16:46 reetiquetee ZERO ; prevision SOC 10 h ~35 % ; concierge fiable : niveau note par le script, une ligne, dedoublonnage, simulation par drapeau ; agent : message incompris = question, bourse sur demande explicite (banc final 6/6) ; a verifier : nuit du samedi 03 au dimanche 04/10 (budget < besoin JEEP), cron orange-cloture lundi 05/10 apres 17:40, comparaison VRM / Forecast.Solar lundi 05/10*
|
||||
*Document mis a jour le : 06/10/2026 (~13:35) — voiture a midi : la batterie n'est plus comptee comme du solaire (EDF automatique les jours de depart si le surplus ne couvre pas) ; nuit 05->06 : JEEP chargee sur EDF en complete (6,32 kWh), budget 0 du a la prevision, Windy/ECMWF contre VRM, a comparer ce soir ; concierge aligne sur la preuve fin de trajet ; a verifier : nuit 05->06 et mardi faible, comparaison VRM/Forecast.Solar ; JEEP identifiee aussi par sa fin de trajet, prevision de la nuit 05->06 ; identification JEEP reussie en reel, correction humaine qui prime (refus supprime), session du 04/10 coupee ; EVCS Master en quatre onglets ; Jeep lue par Uconnect et identifiee seule, capacite JEEP 10 kWh, concierge variante (a) ; releve par photo (SPARK), hass-uconnect en attente ; ecart semaine/week-end mesure (pas de profil week-end la nuit) ; nuit du budget : budget borne au plancher prudent, sans EDF = voiture bloquee meme EDF ferme (batterie seule) ; Energie : sauts corriges ; tableau Energie complete (Sud/Ouest, batterie par integration, borne ; aucun redemarrage HA) ; kilometrage des vehicules (km/kWh, capacite, releves de reference, agent cable 15/15) ; a verifier le 04/10 au matin : nuit du budget JEEP ; concierge : vehicule non confirme demande, heure de saisie ; Grafana vehicules en tableau ; Grafana vehicules : ZERO et Invite ajoutes, session 16:46 reetiquetee ZERO ; prevision SOC 10 h ~35 % ; concierge fiable : niveau note par le script, une ligne, dedoublonnage, simulation par drapeau ; agent : message incompris = question, bourse sur demande explicite (banc final 6/6) ; a verifier : nuit du samedi 03 au dimanche 04/10 (budget < besoin JEEP), cron orange-cloture lundi 05/10 apres 17:40, comparaison VRM / Forecast.Solar lundi 05/10*
|
||||
|
||||
@@ -483,10 +483,18 @@ if (nightHcActive && Number.isFinite(socPct)) {
|
||||
// meme tarif — fermer le contacteur a midi n'y gagnerait rien et etoufferait le
|
||||
// solaire (installation sans injection).
|
||||
//
|
||||
// Ce que le solaire peut donner a la voiture avant son depart SANS toucher a
|
||||
// la reserve de la nuit : l'energie de la batterie au-dessus du plancher
|
||||
// « tenir jusqu'a la prochaine HC » evalue AU DEPART, plus le bilan net prevu
|
||||
// (production - maison) d'ici le depart. Profil p50, comme required_soc.
|
||||
// Ce que le solaire peut donner a la voiture avant son depart : le bilan net
|
||||
// prevu (production - maison) d'ici le depart, profil p50 comme required_soc.
|
||||
// Une batterie SOUS son plancher « tenir jusqu'a la prochaine HC » (evalue AU
|
||||
// DEPART) est d'abord remontee par ce surplus.
|
||||
// ⚠️ 06/10/2026 (proprietaire : « bascule automatique sur force_grid_now sauf si
|
||||
// le solaire donne la charge ce midi ») : la batterie au-dessus de ce plancher
|
||||
// n'est PLUS comptee. Le controleur ne donne pas la batterie a la voiture en
|
||||
// journee (demarrage sur excedent, §36) sauf par l'assistance batterie, a partir
|
||||
// de VEHICLE_BATTERY_ASSIST_SOC_PCT : seule la part au-dessus est comptee. Le
|
||||
// 06/10 a 13:12, 4,08 kWh de batterie comptes donnaient « solaire suffisant »
|
||||
// (5,86 pour 4,4) alors que le controleur attendait un excedent qui n'est pas
|
||||
// venu : la JEEP serait partie a 15:30 sans charge.
|
||||
// Le reseau est justifie quand le besoin de la voiture, borne par ce que son
|
||||
// chargeur peut absorber avant le depart, depasse ce solaire.
|
||||
//
|
||||
@@ -504,6 +512,9 @@ if (nightHcActive && Number.isFinite(socPct)) {
|
||||
// du contacteur coute 50 a 150 Wh de transitoire (§57), on exige un gain d'au
|
||||
// moins trois fois ce cout.
|
||||
const VEHICLE_GRID_MIN_SHORTFALL_KWH = 0.5;
|
||||
// = batteryAssistSolarStartSocMin de BATTERY_CLOUD_LOCKS.js (verifie par un
|
||||
// test qui lit le controleur : les deux valeurs ne peuvent pas diverger).
|
||||
const VEHICLE_BATTERY_ASSIST_SOC_PCT = 90;
|
||||
const vehicleChargerKw = num(input.vehicle_charger_kw, NaN);
|
||||
const nowMsBalance = num(input.nowMs, Date.now());
|
||||
const vehicleConnected = input.vehicle_connected === true || input.vehicle_connected === 'true';
|
||||
@@ -538,10 +549,10 @@ if (vehicleRuleActive) {
|
||||
// Difference SIGNEE : une batterie SOUS son plancher doit d'abord etre
|
||||
// remontee par ce meme surplus avant que la voiture n'en voie un kWh.
|
||||
const plancherDepart = Math.max(socFloorPct, vehicleFloorAtDeparturePct);
|
||||
const batterieAuDessusKwh = socPct >= plancherDepart
|
||||
? energyBetweenSoc(plancherDepart, socPct)
|
||||
: -energyBetweenSoc(socPct, plancherDepart);
|
||||
vehicleSolarKwh = Math.max(0, batterieAuDessusKwh + netKwh);
|
||||
const manqueBatterieKwh = socPct >= plancherDepart ? 0 : energyBetweenSoc(socPct, plancherDepart);
|
||||
const seuilAssist = Math.max(plancherDepart, VEHICLE_BATTERY_ASSIST_SOC_PCT);
|
||||
const batterieAssistKwh = socPct > seuilAssist ? energyBetweenSoc(seuilAssist, socPct) : 0;
|
||||
vehicleSolarKwh = Math.max(0, netKwh - manqueBatterieKwh) + batterieAssistKwh;
|
||||
vehicleReachableKwh = Number.isFinite(vehicleChargerKw) && vehicleChargerKw > 0
|
||||
? Math.min(vehicleNeedKwh, vehicleChargerKw * (vehicleDepartureMs - nowMsBalance) / 3600000)
|
||||
: vehicleNeedKwh;
|
||||
|
||||
@@ -212,6 +212,23 @@ if (!PRINT && (!ONLY || 'prepare-balance-transmet-tout'.includes(ONLY))) {
|
||||
}
|
||||
}
|
||||
|
||||
// Garde-fou (06/10) : le seuil d'assistance batterie que le bilan compte pour
|
||||
// la voiture a midi doit etre CELUI du controleur. S'ils divergent, le bilan
|
||||
// promet a la voiture une batterie que le controleur ne lui donnera pas.
|
||||
if (!PRINT && (!ONLY || 'seuil-assistance-aligne'.includes(ONLY))) {
|
||||
run++;
|
||||
const bal = fs.readFileSync(path.join(ROOT, 'src/energy-balance/BALANCE.js'), 'utf8');
|
||||
const ctl = fs.readFileSync(path.join(ROOT, 'src/nodes/BATTERY_CLOUD_LOCKS.js'), 'utf8');
|
||||
const a = (bal.match(/const VEHICLE_BATTERY_ASSIST_SOC_PCT = (\d+(?:\.\d+)?);/) || [])[1];
|
||||
const b = (ctl.match(/const batteryAssistSolarStartSocMin = (\d+(?:\.\d+)?);/) || [])[1];
|
||||
if (!a || !b || Number(a) !== Number(b)) {
|
||||
failed++;
|
||||
console.log(`❌ seuil-assistance-aligne | bilan ${a} contre controleur ${b}`);
|
||||
} else {
|
||||
console.log(`✅ seuil-assistance-aligne (${a} %)`);
|
||||
}
|
||||
}
|
||||
|
||||
if (PRINT) process.exit(0);
|
||||
console.log('');
|
||||
if (failed) {
|
||||
|
||||
@@ -453,14 +453,36 @@ export const balanceScenarios = [
|
||||
}, // ======== JEEP BRANCHEE A MIDI, DEPART 15:30 (28/09/2026) ========
|
||||
{
|
||||
node: 'BALANCE',
|
||||
id: 'bilan-jeep-midi-soleil-solaire-suffit',
|
||||
label: 'JEEP a 12 %, midi ensoleille (prevision 25,1 kWh), SOC 47 : le solaire couvre, pas de reseau',
|
||||
// Verifie a la main : 88 % x 8,7 = 7,66 kWh. Plancher au depart 33,5 % ->
|
||||
// 13,5 points x 0,30 = 4,05 kWh de batterie + 4,96 kWh de surplus net
|
||||
// 12:30-15:30 = 9,01 kWh >= 7,66.
|
||||
id: 'bilan-jeep-midi-soleil-batterie-non-comptee',
|
||||
label: 'JEEP a 12 %, midi ensoleille (prevision 25,1 kWh), SOC 47 : seul le surplus net compte (4,96 < 7,66) -> reseau',
|
||||
// Regle du 06/10/2026 : la batterie au-dessus du plancher n'est plus
|
||||
// comptee (le controleur ne la donne pas a la voiture sous 90 %).
|
||||
// Verifie a la main : 88 % x 8,7 = 7,66 kWh ; plancher au depart 33,5 %
|
||||
// < SOC 47 -> aucun manque batterie ; surplus net 12:30-15:30 = 4,96 kWh
|
||||
// (avant le 06/10 : + 4,05 kWh de batterie = 9,01, pas de reseau).
|
||||
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 47, MIDI_2709), 12),
|
||||
expect: { usable: true, vehicleActive: true, vehicleNeedKwh: 7.66, vehicleSolarKwh: 9,
|
||||
vehicleFloorAtDeparturePct: 33.5, vehicleGridNeeded: false },
|
||||
expect: { usable: true, vehicleActive: true, vehicleNeedKwh: 7.66, vehicleSolarKwh: 4.96,
|
||||
vehicleFloorAtDeparturePct: 33.5, vehicleGridNeeded: true },
|
||||
},
|
||||
{
|
||||
node: 'BALANCE',
|
||||
id: 'bilan-jeep-midi-batterie-haute-assistance-comptee',
|
||||
label: 'JEEP a 60 %, midi ensoleille, SOC 95 : surplus net + batterie au-dessus de 90 % (assistance) couvrent -> pas de reseau',
|
||||
// Besoin 40 % x 8,7 = 3,48 kWh ; surplus net 4,96 + (95 - 90) x 0,30 = 1,5
|
||||
// de batterie d'assistance = 6,46 kWh >= 3,48.
|
||||
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 95, MIDI_2709), 60),
|
||||
expect: { usable: true, vehicleActive: true, vehicleNeedKwh: 3.48, vehicleSolarKwh: 6.46,
|
||||
vehicleGridNeeded: false },
|
||||
},
|
||||
{
|
||||
node: 'BALANCE',
|
||||
id: 'bilan-jeep-midi-0610-surplus-insuffisant',
|
||||
label: 'Cas du 06/10 13:12 rejoue : SOC 57 bien au-dessus du plancher, mais surplus net insuffisant -> reseau',
|
||||
// Meme construction : JEEP a 56 %, besoin 44 % x 8,7 = 3,83 kWh ; la
|
||||
// batterie au-dessus du plancher ne compte pas, seul le surplus net.
|
||||
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 57, MIDI_2709, SOMBRE), 56),
|
||||
expect: { usable: true, vehicleActive: true, vehicleNeedKwh: 3.83, vehicleSolarKwh: 2.26,
|
||||
vehicleGridNeeded: true },
|
||||
},
|
||||
{
|
||||
node: 'BALANCE',
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user