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:
@@ -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,
|
||||
},
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user