From 6f9e9481a439ccaf7df7f42db7afd2f5271075ee Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Thu, 1 Oct 2026 07:50:17 +0200 Subject: [PATCH] Bilan energetique : carte Cible du matin (source bilan ou repli, prochain depart, urgence) --- HANDOFF.md | 7 ++++ dashboards/bilan_energetique.yaml | 55 +++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index cb506a7..81d2bba 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1366,6 +1366,13 @@ ferme **06:00 -> 06:38** (2,15 kWh importes, HC). Mode sans_edf, budget publie 5 mutations qui mordent ; golden-acm 20/20, hysteresis 24/24. Deploye ~07:50. ⚠️ A surveiller : le bilan p50 peut sous-estimer une nuit ; la batterie descend alors plus bas qu'avec le palier 35 %. Le filet reste l'hysteresis a 20 % et la session de nuit. + **Carte « Cible du matin »** (Bilan energetique, onglet Bilan, a la place de la carte + perimee « Seuil calcule contre seuil fixe ») : cible appliquee + (`input_number.victron_evcs_night_target_soc`), source (bilan ou repli palier), marge, + prochain depart du matin du vehicule selectionne (jours compris) et heure a partir de + laquelle l'urgence avant depart peut agir. Carte vivante (Jinja), rendu verifie par + `/api/template` : SOC 34, cible 26 (bilan), depart ven 02/10 06:30, aucune urgence. + Sauvegarde `bilan_energetique.yaml.bak-20261001-cible`. --- *Document mis a jour le : 01/10/2026 (~07:35) — premiere nuit du budget : ecritures perdues et verrou P12 corriges, faux positif de depart a 06:00 ; commande vocale du mode de nuit validee, premiere nuit budget a suivre ; budget voiture de la nuit sans EDF (bilan + controleur) ; fiche de l'agent allegee (25 831 car.), concierge sans silence, calendrier JEEP mar/sam ; nuit du 28-29 verifiee, achat EDF annonce = maison en HC + manque batterie ; regle HC active, vehicule branche a midi (JEEP/VW/ZERO), prevision de nuit a trois verdicts, nuits superposees et bilan recale sur la soiree* diff --git a/dashboards/bilan_energetique.yaml b/dashboards/bilan_energetique.yaml index 797a83a..2d2e26a 100644 --- a/dashboards/bilan_energetique.yaml +++ b/dashboards/bilan_energetique.yaml @@ -39,33 +39,54 @@ views: {{ states('input_text.evcs_balance_reason') }} - # --- LA comparaison qui décidera du câblage --------------------- + # --- Cible du matin (01/10/2026) ----------------------------------- + # Remplace « Seuil calcule contre seuil fixe » (epoque du mode ombre). + # Carte VIVANTE : elle se recalcule seule a chaque changement des + # grandeurs lues (controleur toutes les 30 s, bilan toutes les 5 min). - type: markdown - title: Seuil calculé contre seuil fixe + title: Cible du matin content: | - {% set req = states('input_number.evcs_balance_required_soc') | float(0) %} - {% set fixe = states('input_number.victron_grid_soc_off') | float(0) %} + {% set cible = states('input_number.victron_evcs_night_target_soc') | float(0) %} + {% set req = states('input_number.evcs_balance_required_soc') | float(-1) %} {% set soc = states('sensor.victron_battery_soc') | float(0) %} - {% set ecart = req - fixe %} + {% set statut = states('input_text.evcs_balance_status') %} + {% set du_bilan = statut == 'ok' and req >= 0 and (cible - [req, 22] | max) | abs < 0.15 %} + {% set ecart = soc - cible %} | | | |---|---:| | SOC batterie **maintenant** | **{{ soc | round(0) }} %** | - | Seuil **calculé** par le bilan | **{{ req | round(1) }} %** | - | Seuil **fixe** encore en vigueur | {{ fixe | round(0) }} % | - | Écart | {{ '+' if ecart >= 0 else '' }}{{ ecart | round(1) }} points | + | **Cible du matin** appliquée par le contrôleur | **{{ cible | round(1) }} %** | + | Source | {{ '**bilan** (SOC requis ' ~ (req | round(1)) ~ ' %)' if du_bilan else '⚠️ **repli** : palier de prévision (bilan ' ~ statut ~ ')' }} | + | Marge | {{ '+' if ecart >= 0 else '' }}{{ ecart | round(1) }} points | - {% if req > fixe %} - Le seuil fixe est aujourd'hui **trop bas** : il laisserait la batterie - descendre sous ce qu'il faut pour tenir jusqu'au croisement. - {% elif req < fixe %} - Le seuil fixe est aujourd'hui **trop haut** : il fait importer du - réseau au-delà du nécessaire. + {% set vsel = {'JEEP': 'jeep', 'VW': 'vw', 'ZERO': 'zero'}.get(states('input_select.victron_evcs_vehicle'), 'vw') %} + {% set heure = states('input_datetime.' ~ {'vw': 'victron_evcs_departure_time', 'jeep': 'victron_evcs_departure_time_jeep', 'zero': 'victron_evcs_departure_time_zero'}[vsel]) %} + {% set jours = states('input_text.victron_evcs_' ~ vsel ~ '_morning_departure_days') | lower %} + {% set noms = ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'] %} + {% set branche = is_state('binary_sensor.victron_evcs_vehicle_connected', 'on') %} + {% if heure not in ['unknown', 'unavailable', ''] %} + {% set d = today_at(heure) if today_at(heure) > now() else today_at(heure) + timedelta(days=1) %} + {% set jour_ok = jours in ['unknown', 'unavailable', ''] or noms[d.weekday()] in jours.split() %} + **Prochain départ du matin** ({{ states('input_select.victron_evcs_vehicle') }}{{ ', branchée' if branche else ', non branchée' }}) : + {% if jour_ok %} + {{ noms[d.weekday()] }} {{ d.strftime('%d/%m à %H:%M') }}. + {% if ecart >= 0 %} + Il ne manque rien à la batterie : **aucune urgence avant départ**. {% else %} - Les deux coïncident. + {% set manque = (cible - soc) * 0.30 %} + {% set minutes = manque / 2.5 * 60 + 30 %} + Il manque **{{ manque | round(1) }} kWh** : l'urgence avant départ peut fermer EDF + à partir de **{{ (d - timedelta(minutes=minutes)).strftime('%H:%M') }}** si la batterie + n'est pas remontée d'ici là (session de nuit en heures creuses). + {% endif %} + {% else %} + pas de départ {{ noms[d.weekday()] }} ({{ jours }}) : **aucune urgence avant départ**. + {% endif %} {% endif %} - *C'est l'accumulation de cet écart, jour après jour, qui décidera si - le bilan prend la main.* + *La cible suit le besoin calculé par le bilan, dans les deux sens ; le + palier de prévision (35/55/85 %) ne sert que si le bilan est absent ou + périmé. Elle se recalcule en continu : il n'y a rien à mettre à jour.* # --- Décision immédiate ---------------------------------------- - type: entities