Bilan : tenir jusqu'a la prochaine fenetre HC (strategie du proprietaire, 28/09)

Nuit du 26-27/09 : P12 a charge la JEEP sur la batterie (72 -> 44 %) ; la
journee sombre n'a pas reconstitue la reserve. Strategie : voiture branchee =
charge en HC sur le reseau ; la batterie tient jusqu'a la prochaine HC, midi
complete si besoin.
- HA transmet la fin de la fenetre HC en cours et le debut des suivantes (le
  calendrier reste dans HA, §73)
- pendant une fenetre HC, required_soc >= SOC pour atteindre la PROCHAINE HC
  (engage ET finance la session, insere dans coverage() comme le plancher
  manuel) ; required_soc_prudent (plancher de P12) >= SOC pour atteindre la
  NUIT SUIVANTE -> journee sombre = voiture sur le reseau HC
- a midi la session et la voiture en grid_hc_allowed se chargent ensemble
  (aucun changement du controleur)
- 4 scenarios reels du 27/09, bilan 54/54, deux mutations qui mordent

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011uJ47NxgfpGnuuMr3f2n7Z
This commit is contained in:
Tallagrand Thierry
2026-09-28 02:06:06 +02:00
parent 72c1f6035f
commit 8de284cd17
6 changed files with 196 additions and 8 deletions

View File

@@ -1,5 +1,30 @@
{#- Fenetres d'heures creuses (28/09/2026). Le calendrier tarifaire reste dans
Home Assistant (helpers victron_evcs_hc_*) ; le bilan ne recoit que deux
instants : la fin de la fenetre HC en cours (vide hors fenetre) et le debut
de la fenetre HC suivante. Strategie du proprietaire : la batterie doit
tenir jusqu'a la prochaine fenetre HC. -#}
{%- set ns = namespace(fin='', suivant='', nuit='', fen=[]) -%}
{%- for j in [0, 1, 2] -%}
{%- for a, b, t in [('victron_evcs_hc_night_start', 'victron_evcs_hc_night_stop', 'nuit'), ('victron_evcs_hc_midday_start', 'victron_evcs_hc_midday_stop', 'midi')] -%}
{%- set d = today_at(states('input_datetime.' ~ a)) + timedelta(days=j) -%}
{%- set f = today_at(states('input_datetime.' ~ b)) + timedelta(days=j) -%}
{%- set f = f + timedelta(days=1) if f <= d else f -%}
{%- set ns.fen = ns.fen + [[d, f, t]] -%}
{%- endfor -%}
{%- endfor -%}
{%- for w in ns.fen | sort(attribute='0') -%}
{%- if w[0] <= now() < w[1] and ns.fin == '' -%}{%- set ns.fin = w[1] -%}{%- endif -%}
{%- endfor -%}
{%- set repere = ns.fin if ns.fin != '' else now() -%}
{%- for w in ns.fen | sort(attribute='0') -%}
{%- if w[0] >= repere and ns.suivant == '' -%}{%- set ns.suivant = w[0] -%}{%- endif -%}
{%- if w[0] >= repere and w[2] == 'nuit' and ns.nuit == '' -%}{%- set ns.nuit = w[0] -%}{%- endif -%}
{%- endfor -%}
{{ {
"ts": now().isoformat(),
"hc_window_end_ms": (as_timestamp(ns.fin) * 1000) if ns.fin != '' else none,
"next_hc_start_ms": (as_timestamp(ns.suivant) * 1000) if ns.suivant != '' else none,
"next_night_hc_start_ms": (as_timestamp(ns.nuit) * 1000) if ns.nuit != '' else none,
"nowMs": as_timestamp(now()) * 1000,
"balance_enabled": states("input_boolean.evcs_balance_enabled"),