Budget voiture de la nuit : ce que la batterie peut donner sans EDF, arret au compteur, choix sans EDF / complete
This commit is contained in:
@@ -625,9 +625,44 @@ const nightBatterySurplusFloorPct = Math.max(
|
||||
// Sans verrou, la charge repartirait des qu'elle s'arrete : cinquieme
|
||||
// oscillateur du projet, par construction. UNE SEULE PASSE de surplus par
|
||||
// session de nuit, comme la recovery batterie depuis le 27/08.
|
||||
// BUDGET VOITURE DE LA NUIT (30/09/2026, decisions du proprietaire).
|
||||
// « Definir combien la voiture peut prendre sans utiliser EDF, et brider la
|
||||
// charge a cette valeur ou autoriser une charge complete avec EDF. »
|
||||
// Le bilan publie le budget ; il est FIGE au premier cycle de la session
|
||||
// (avec l'index du compteur de la borne) dans input_text
|
||||
// victron_evcs_night_budget = « budget|index », efface en fin de session.
|
||||
// L'arret se juge sur le COMPTEUR, qui ne fait que monter : condition
|
||||
// monotone, aucun oscillateur possible (meme logique que §40). Le plancher de
|
||||
// SOC prudent reste un second arret, jamais retire.
|
||||
const nightBudgetPrev = (() => {
|
||||
const m = String(params.nightBudgetPrevRaw || '').match(/^\s*([\d.]+)\|([\d.]+)\s*$/);
|
||||
return m ? { budgetKwh: Number(m[1]), refKwh: Number(m[2]) } : null;
|
||||
})();
|
||||
const nightBudgetCaptureOk =
|
||||
nightSessionActive && !nightBudgetPrev &&
|
||||
balanceMorningTargetApplied &&
|
||||
Number.isFinite(params.balanceNightVehicleBudgetKwh) &&
|
||||
Number.isFinite(params.evcsTotalEnergyKwh);
|
||||
const nightBudget = !nightSessionActive
|
||||
? null
|
||||
: nightBudgetPrev || (nightBudgetCaptureOk
|
||||
? { budgetKwh: Math.max(0, params.balanceNightVehicleBudgetKwh), refKwh: params.evcsTotalEnergyKwh }
|
||||
: null);
|
||||
const nightBudgetToWrite = nightSessionActive
|
||||
? (nightBudgetCaptureOk ? `${Math.round(nightBudget.budgetKwh * 100) / 100}|${nightBudget.refKwh}` : null)
|
||||
: (nightBudgetPrev ? '' : null);
|
||||
const nightBudgetDeliveredKwh = nightBudget && Number.isFinite(params.evcsTotalEnergyKwh)
|
||||
? Math.max(0, params.evcsTotalEnergyKwh - nightBudget.refKwh)
|
||||
: null;
|
||||
const nightBudgetReached =
|
||||
!!nightBudget && nightBudgetDeliveredKwh !== null &&
|
||||
nightBudgetDeliveredKwh >= nightBudget.budgetKwh - 0.05;
|
||||
const nightChargeComplete = params.nightChargeMode === 'complete';
|
||||
|
||||
const nightBatterySurplusExhausted =
|
||||
params.nightBatteryDonePrev ||
|
||||
(nightSessionActive && parsed.soc <= nightBatterySurplusFloorPct);
|
||||
(nightSessionActive && parsed.soc <= nightBatterySurplusFloorPct) ||
|
||||
(nightSessionActive && nightBudgetReached);
|
||||
|
||||
const nightBatterySurplusAvailable =
|
||||
nightSessionActive &&
|
||||
@@ -644,15 +679,26 @@ const nightBatterySurplusAvailable =
|
||||
// decrite par le proprietaire — « quitte a fermer EDF entre 6h et 7h24 pour
|
||||
// completer » — et elle devient automatique : l'epuisement du surplus rend
|
||||
// `nightGridHcPreferred` vrai, donc P7 prend le relais.
|
||||
// « Sans EDF » (defaut) : la voiture ne prend JAMAIS le reseau la nuit ; une
|
||||
// fois le budget batterie atteint (ou sans budget exploitable), elle attend le
|
||||
// soleil. « Charge complete » : EDF en HC finit la charge, comme avant.
|
||||
const nightGridHcPreferred =
|
||||
nightSessionActive &&
|
||||
params.allowGridHcNight &&
|
||||
nightChargeComplete &&
|
||||
!vehicleChargeCompleted &&
|
||||
!nightBatterySurplusAvailable;
|
||||
|
||||
const nightCarWaitsNoGrid =
|
||||
nightSessionActive &&
|
||||
!nightChargeComplete &&
|
||||
!vehicleChargeCompleted &&
|
||||
!nightBatterySurplusAvailable;
|
||||
|
||||
const batteryAssistAllowed =
|
||||
nightSessionActive &&
|
||||
!nightGridHcPreferred &&
|
||||
!nightCarWaitsNoGrid &&
|
||||
parsed.soc > batteryHardFloorPct &&
|
||||
parsed.soc > gridTakeoverTriggerPct &&
|
||||
!nightTakeoverLatched &&
|
||||
@@ -794,6 +840,12 @@ const nightPreferredSourceMode =
|
||||
!nightSessionActive
|
||||
? 'blocked'
|
||||
: vehicleChargeCompleted
|
||||
? 'blocked'
|
||||
// « Sans EDF » ne bloque la voiture que si EDF n'est PAS deja engage pour
|
||||
// la batterie (plancher dur, cible du matin, session du bilan, verrou) :
|
||||
// proteger le materiel prime (regle du proprietaire, 05/09), et EDF deja
|
||||
// ferme en HC, la voiture en profite au meme tarif.
|
||||
: nightCarWaitsNoGrid && !nightGridTakeoverNeeded
|
||||
? 'blocked'
|
||||
: batteryAssistAllowed
|
||||
? 'battery_assist_night'
|
||||
@@ -1189,6 +1241,12 @@ return [{
|
||||
nightBatterySurplusFloorPct,
|
||||
nightBatterySurplusAvailable,
|
||||
nightBatterySurplusExhausted,
|
||||
nightBudgetKwh: nightBudget ? nightBudget.budgetKwh : null,
|
||||
nightBudgetDeliveredKwh,
|
||||
nightBudgetReached,
|
||||
nightBudgetToWrite,
|
||||
nightChargeMode: params.nightChargeMode,
|
||||
nightCarWaitsNoGrid,
|
||||
nightGridSessionCommitted,
|
||||
middayVehicleGridNeeded,
|
||||
nightGridSessionUncovered,
|
||||
|
||||
Reference in New Issue
Block a user