Voiture en solaire : arret avant le temps mini si la batterie paie, tolerance nuage bornee par le SOC requis prudent

This commit is contained in:
Tallagrand Thierry
2026-10-12 23:44:59 +02:00
parent ce18162977
commit 6a42cce5e5
6 changed files with 305 additions and 6 deletions

View File

@@ -313,8 +313,28 @@ const effectiveCloudToleranceMinutes =
(solarPotentialContext ? batteryTune.global.solarPotentialGraceMinutes : 0) +
(houseSpikeDetected ? batteryTune.global.houseSpikeGraceMinutes : 0);
// TOLERANCE NUAGE BORNEE PAR LE BILAN (12/10/2026, accord du proprietaire).
// La dette nuage est l'energie que la batterie maison avance a la voiture en
// pariant sur le retour du soleil. Plafond fixe (1,2 kWh) = defaut de
// conception : le 12/10 a 16:16, SOC 76 % pour 99 % requis (profil prudent)
// pour passer la nuit, la VW a pris ~1,9 kWh a la batterie. La voiture est un
// delestage : elle n'avance que ce que la batterie a AU-DESSUS du SOC requis
// prudent du bilan (meme borne que le budget voiture de nuit, 04/10).
// Bilan perime ou illisible -> plafond historique inchange.
const cloudBalanceAgeMin =
params.balanceLastRunMs !== null && params.balanceLastRunMs !== undefined
? (nowMs - params.balanceLastRunMs) / 60000
: null;
const cloudBalanceUsable =
cloudBalanceAgeMin !== null && cloudBalanceAgeMin >= -5 && cloudBalanceAgeMin <= 30 &&
params.balanceStatusOk && Number.isFinite(params.balanceRequiredSocPrudentPct);
const cloudDebtBalanceCapKwh = cloudBalanceUsable
? Math.max(0, parsed.soc - params.balanceRequiredSocPrudentPct) / 100 * cfg.batteryUsableCapacityKwh
: Infinity;
const effectiveCloudDebtMaxKwh = Math.min(params.cloudDebtMaxKwh, cloudDebtBalanceCapKwh);
const cloudToleranceOk =
cloudDebtNextKwh <= params.cloudDebtMaxKwh &&
cloudDebtNextKwh <= effectiveCloudDebtMaxKwh &&
(
!cloudDebtActive ||
cloudDebtDurationMinutes <= effectiveCloudToleranceMinutes
@@ -1125,6 +1145,7 @@ return [{
cloudDebtStartedMs,
cloudDebtDurationMinutes,
effectiveCloudToleranceMinutes,
effectiveCloudDebtMaxKwh,
cloudToleranceOk,
},

View File

@@ -837,11 +837,23 @@ else if (cloud.sessionObservedActive) {
}
else if (!effectiveHoldConditionsOk) {
if (lifecycle.minRunElapsed) {
// 12/10/2026 : le temps mini de marche (29 min en production) protege
// contre le cliquetis, PAS contre la batterie. Le 12/10 de 16:16 a 16:44,
// la VW a ete tenue a 14 A sur une batterie a -40/-74 A, en depassement
// souple depuis 20 min (tolerance de la bande : 6 min). En solaire, un
// depassement souple qui a epuise sa tolerance arrete la charge meme
// avant le temps mini : la voiture est un delestage.
const batteryPaysVehicle =
prev.batteryPolicy?.batterySoftDischargeHoldOk === false &&
!manualLocalHoldOverride &&
(activeSourceMode === 'solar_only' || activeSourceMode === 'solar_potential');
if (lifecycle.minRunElapsed || batteryPaysVehicle) {
setOff({
stateName: 'stop_conditions_lost',
stateName: batteryPaysVehicle && !lifecycle.minRunElapsed ? 'stop_battery_pays_vehicle' : 'stop_conditions_lost',
decisionName: 'stop',
reasonText: 'Conditions de maintien perdues',
reasonText: batteryPaysVehicle && !lifecycle.minRunElapsed
? 'Arret avant le temps mini : la batterie maison paie la voiture'
: 'Conditions de maintien perdues',
dynamic: false,
mustStopFlag: true,
blockReason: 'hold_conditions_lost',