Le plancher du soir vient de l energie a couvrir, plus d un niveau fixe
grep evcs_balance sur les deux workflows de decision renvoyait 0 depuis la mise en service du bilan le 26/08 : il calculait l heure de croisement, l energie a couvrir et le SOC requis, et personne ne l ecoutait. Le 03/09 a 19:44 les deux nombres coexistaient dans le meme systeme — evening_soc_start_min a 85 %, un niveau qui ne sait rien de la nuit, contre evcs_balance_required_soc a 99,7 %, l energie a couvrir jusqu au croisement de 9 h. A SOC 94 le premier autorisait la charge, le second disait que la batterie ne passerait pas la nuit seule. Le plancher de demarrage du soir vaut desormais max(regle, bilan). Sens unique delibere : le bilan peut durcir, jamais relacher. L assouplir — il dira souvent moins de 85 % par forte prevision d ete — autoriserait des charges qui n ont pas lieu aujourd hui, decision distincte a valider pour elle-meme. Le max rend au passage la garde robuste sans borne ni ecretage : une valeur nulle, negative ou aberrante ne peut pas relacher le plancher. Portee demarrage : le plancher de maintien reste min(...), donc a 80 %, et aucune charge en cours n est coupee. L abondance P6 continue de primer, etant une preuve mesuree que la ressource depasse ce que le systeme absorbe. Gardes : fraicheur inferieure a 30 min (six cycles du bilan), horodatage futur rejete, statut ok, valeur finie. Sinon regle historique. Aucun nouveau toggle : evcs_balance_enabled a OFF arrete les ecritures du bilan, balance_last_run se fige, la fraicheur expire et le plancher retombe seul sur 85 % en une demi-heure — un helper de plus aurait fait doublon. Gabarit complet re-rendu contre HA : 195 champs, JSON valide, aucun null. parseAdvisorRunToMs reutilise, l advisor et le bilan publiant le meme format. Golden 66 -> 70. Quatre mutations — bilan ignore, Math.max remplace par une affectation directe, garde de fraicheur supprimee, garde de statut supprimee — font tomber chacune exactement un scenario, et un different a chaque fois. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -1043,6 +1043,108 @@ export const scenarios = [
|
||||
},
|
||||
},
|
||||
|
||||
// ===== 03/09/2026 : le plancher du soir vient de l'energie a couvrir =====
|
||||
// Tous ces scenarios ont un VRAI excedent (PV 2000 W, maison 1000 W) et des
|
||||
// chargeurs qui se retiennent : les gardes de §36 et §37 sont donc passantes,
|
||||
// et le plancher est le SEUL discriminant.
|
||||
{
|
||||
id: 'bilan-plancher-soir-durci',
|
||||
label: "Soir, SOC 94 et vrai excédent, mais le bilan demande 99,7 % pour tenir jusqu'au croisement → le plancher passe de 85 à 99,7 → pas de charge",
|
||||
time: EVENING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
battery_current_a: '2',
|
||||
pv_power_w: '2000', pv_power_10m_avg_w: '2000', pv_trend_w: '0',
|
||||
house_ac_power_w: '1000', vebus_ac_out_l1_power_w: '1000',
|
||||
evcs_ac_power_w: '0',
|
||||
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited',
|
||||
soc_percent: '94',
|
||||
balance_required_soc: '99.7', balance_energy_to_cover_kwh: '11.66',
|
||||
balance_status: 'ok', balance_last_run: '08/08 17:58',
|
||||
},
|
||||
expect: {
|
||||
profile: 'evening_high_soc',
|
||||
state: 'idle_wait_conditions',
|
||||
decision: 'hold',
|
||||
desiredCharging: false,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
// SENS UNIQUE : le bilan ne doit JAMAIS relacher le plancher historique.
|
||||
// Sans ce scenario, remplacer Math.max par une affectation directe
|
||||
// passerait inapercu et autoriserait des charges qui n'ont pas lieu
|
||||
// aujourd'hui.
|
||||
id: 'bilan-plancher-soir-ne-relache-pas',
|
||||
label: "Soir, SOC 70, le bilan ne demande que 60 % → le plancher historique 85 % reste maître, pas de charge",
|
||||
time: EVENING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
battery_current_a: '2',
|
||||
pv_power_w: '2000', pv_power_10m_avg_w: '2000', pv_trend_w: '0',
|
||||
house_ac_power_w: '1000', vebus_ac_out_l1_power_w: '1000',
|
||||
evcs_ac_power_w: '0',
|
||||
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited',
|
||||
soc_percent: '70',
|
||||
balance_required_soc: '60', balance_energy_to_cover_kwh: '4.2',
|
||||
balance_status: 'ok', balance_last_run: '08/08 17:58',
|
||||
},
|
||||
expect: {
|
||||
profile: 'evening_high_soc',
|
||||
state: 'idle_wait_conditions',
|
||||
decision: 'hold',
|
||||
desiredCharging: false,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
id: 'bilan-perime-regle-historique',
|
||||
label: "Soir, SOC 94, bilan exigeant (99,7 %) mais vieux de 2 h → repli sur la règle historique 85 % → la charge démarre",
|
||||
time: EVENING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
battery_current_a: '2',
|
||||
pv_power_w: '2000', pv_power_10m_avg_w: '2000', pv_trend_w: '0',
|
||||
house_ac_power_w: '1000', vebus_ac_out_l1_power_w: '1000',
|
||||
evcs_ac_power_w: '0',
|
||||
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited',
|
||||
soc_percent: '94',
|
||||
balance_required_soc: '99.7', balance_energy_to_cover_kwh: '11.66',
|
||||
balance_status: 'ok', balance_last_run: '08/08 16:00',
|
||||
},
|
||||
expect: {
|
||||
profile: 'evening_high_soc',
|
||||
state: 'start_min_current',
|
||||
decision: 'start',
|
||||
desiredCharging: true,
|
||||
currentA: 6,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
id: 'bilan-statut-degrade-regle-historique',
|
||||
label: "Soir, SOC 94, bilan frais mais statut non 'ok' → repli sur la règle historique → la charge démarre",
|
||||
time: EVENING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
battery_current_a: '2',
|
||||
pv_power_w: '2000', pv_power_10m_avg_w: '2000', pv_trend_w: '0',
|
||||
house_ac_power_w: '1000', vebus_ac_out_l1_power_w: '1000',
|
||||
evcs_ac_power_w: '0',
|
||||
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited',
|
||||
soc_percent: '94',
|
||||
balance_required_soc: '99.7', balance_energy_to_cover_kwh: '11.66',
|
||||
balance_status: 'donnees_insuffisantes', balance_last_run: '08/08 17:58',
|
||||
},
|
||||
expect: {
|
||||
profile: 'evening_high_soc',
|
||||
state: 'start_min_current',
|
||||
decision: 'start',
|
||||
desiredCharging: true,
|
||||
currentA: 6,
|
||||
},
|
||||
},
|
||||
|
||||
// ===== 01/09/2026 : le depassement souple de la batterie doit DURER =====
|
||||
// Incident du 01/09 (14:26 et 14:56) : SOC 94, batterie en float, courant
|
||||
// oscillant entre +1,8 et -2,6 A d'un echantillon a l'autre. Le controleur
|
||||
|
||||
Reference in New Issue
Block a user