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:
Tallagrand Thierry
2026-10-06 13:31:25 +02:00
parent 2272204a62
commit f189df588d
5 changed files with 97 additions and 17 deletions

View File

@@ -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*

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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