Advisor: premier câblage réel — cible SOC matin (toggle, bornes, fraîcheur 120min)
- nouveau toggle input_boolean.evcs_advisor_apply_night_target (package + carte, OFF par défaut) - snapshot/INPUT_PARSE: advisor_apply/target/status/last_run (+parseAdvisorRunToMs DD/MM HH:mm) - WINDOWS: batteryMorningTargetPct = advisor si ON+ok+frais, clamp [max(22,hardFloor),90], sinon règles forecast; traçabilité '(ADVISOR)' dans la reason DECISION - golden 26→29 (appliqué / stale / toggle off) - HANDOFF §20 (surveillance + rollback 3 niveaux)
This commit is contained in:
@@ -257,13 +257,40 @@ const nightForecastKwh =
|
||||
? Math.max(parsed.todayRemainingKwh, parsed.tomorrowKwh || 0)
|
||||
: parsed.todayRemainingKwh;
|
||||
|
||||
const batteryMorningTargetPct =
|
||||
const batteryMorningTargetRulePct =
|
||||
nightForecastKwh >= params.evcsNightStrongForecastKwh
|
||||
? params.evcsNightTargetStrongForecastPct
|
||||
: nightForecastKwh >= params.evcsNightMediumForecastKwh
|
||||
? params.evcsNightTargetMediumForecastPct
|
||||
: params.evcsNightTargetWeakForecastPct;
|
||||
|
||||
// =====================================================
|
||||
// ADVISOR IA — PREMIER CÂBLAGE RÉEL (09/08/2026, HANDOFF §20)
|
||||
// La cible SOC matin suit la recommandation de l'advisor UNIQUEMENT si :
|
||||
// - toggle input_boolean.evcs_advisor_apply_night_target ON (rollback 1 clic)
|
||||
// - dernier run advisor en statut 'ok'
|
||||
// - recommandation fraîche (≤ 120 min, l'advisor tourne toutes les 15 min)
|
||||
// - valeur bornée [max(22, hard floor), 90]
|
||||
// Sinon : règles forecast historiques (comportement inchangé).
|
||||
// =====================================================
|
||||
const ADVISOR_TARGET_MAX_AGE_MIN = 120;
|
||||
const advisorTargetAgeMin = minutesSince(params.advisorLastRunMs, nowMs);
|
||||
const advisorNightTargetApplied =
|
||||
params.advisorApplyNightTarget &&
|
||||
params.advisorStatusOk &&
|
||||
Number.isFinite(params.advisorNightTargetSocPct) &&
|
||||
advisorTargetAgeMin !== null &&
|
||||
advisorTargetAgeMin <= ADVISOR_TARGET_MAX_AGE_MIN;
|
||||
|
||||
const batteryMorningTargetPct =
|
||||
advisorNightTargetApplied
|
||||
? clamp(
|
||||
params.advisorNightTargetSocPct,
|
||||
Math.max(22, batteryHardFloorPct),
|
||||
90
|
||||
)
|
||||
: batteryMorningTargetRulePct;
|
||||
|
||||
const maxBatteryDischargePoints =
|
||||
nightSessionActive && Number.isFinite(nightSessionStartSocPct)
|
||||
? Math.max(0, nightSessionStartSocPct - batteryMorningTargetPct)
|
||||
@@ -706,6 +733,8 @@ return [{
|
||||
|
||||
batteryHardFloorPct,
|
||||
batteryMorningTargetPct,
|
||||
batteryMorningTargetRulePct,
|
||||
advisorNightTargetApplied,
|
||||
maxBatteryDischargePoints,
|
||||
gridTakeoverTriggerPct,
|
||||
|
||||
|
||||
Reference in New Issue
Block a user