Le proprietaire demande comment suivre l'effet du relevement du plafond. Verification faite : la DVCC n'apparait que dans deux tableaux de debug, et l'ecart entre cellules comme le mode des chargeurs solaires n'apparaissent NULLE PART — alors que ce sont exactement les trois grandeurs a regarder. Deux capteurs modeles crees (`batterie_qui_limite.yaml`), parce que le systeme publiait les ingredients sans jamais la grandeur : - **Ecart entre cellules** : le BMS donne la plus haute et la plus basse, mais c'est leur difference qui dit si le parc est sain. 2 mV aujourd'hui, contre 168 mV sur l'ancien module 3 juste avant qu'il fasse effondrer le courant de tout le monde. C'est le garde-fou d'un relevement de plafond. - **Chargeurs qui se retiennent** : six entites publient leur regime et aucune n'etait affichee, alors que c'est le seul signal DIRECT de ressource refusee — la puissance mesuree etant censuree par construction sur une installation sans injection. `off` ne compte pas : la nuit tout est `off` sans que rien ne soit refuse. Carte « Charge de la batterie — qui limite ? » sur le tableau Bilan : le courant pris face au plafond que NOUS imposons et a celui que le BMS autorise, idem pour la tension, puis l'ecart entre cellules et les chargeurs brides. Avec le mode d'emploi de lecture, parce qu'une carte qui ne dit pas comment l'interpreter se lit de travers. Nombre de modules et capacite installee du BMS volontairement absents : ils ne comptent que le groupe maitre (4 modules, 400 Ah pour un parc de neuf). Le paquet du concierge vehicule entre aussi dans le depot. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
308 lines
13 KiB
YAML
308 lines
13 KiB
YAML
views:
|
||
# ===================================================================
|
||
- title: Bilan
|
||
path: bilan
|
||
icon: mdi:scale-balance
|
||
cards:
|
||
- type: vertical-stack
|
||
cards:
|
||
- type: custom:mushroom-title-card
|
||
title: Bilan énergétique
|
||
subtitle: Mode ombre — observe et publie, ne pilote rien
|
||
|
||
- type: conditional
|
||
conditions:
|
||
- entity: input_text.evcs_balance_status
|
||
state: "indisponible"
|
||
card:
|
||
type: markdown
|
||
content: |
|
||
## ⚠️ Bilan indisponible
|
||
|
||
{{ states('input_text.evcs_balance_reason') }}
|
||
|
||
Les contrôleurs fonctionnent sur leurs règles historiques.
|
||
|
||
- type: conditional
|
||
conditions:
|
||
- entity: input_text.evcs_balance_status
|
||
state: "degrade"
|
||
card:
|
||
type: markdown
|
||
content: |
|
||
## 🟠 Bilan dégradé
|
||
|
||
Les chiffres sont publiés, mais ils reposent sur une base
|
||
incomplète : soit aucun croisement production/consommation
|
||
n'apparaît sur l'horizon, soit la forme de production des heures
|
||
de déficit vient d'un repli sur l'enveloppe mesurée.
|
||
|
||
{{ states('input_text.evcs_balance_reason') }}
|
||
|
||
# --- LA comparaison qui décidera du câblage ---------------------
|
||
- type: markdown
|
||
title: Seuil calculé contre seuil fixe
|
||
content: |
|
||
{% set req = states('input_number.evcs_balance_required_soc') | float(0) %}
|
||
{% set fixe = states('input_number.victron_grid_soc_off') | float(0) %}
|
||
{% set soc = states('sensor.victron_battery_soc') | float(0) %}
|
||
{% set ecart = req - fixe %}
|
||
| | |
|
||
|---|---:|
|
||
| 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 |
|
||
|
||
{% 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.
|
||
{% else %}
|
||
Les deux coïncident.
|
||
{% endif %}
|
||
|
||
*C'est l'accumulation de cet écart, jour après jour, qui décidera si
|
||
le bilan prend la main.*
|
||
|
||
# --- Décision immédiate ----------------------------------------
|
||
- type: entities
|
||
title: Décision immédiate
|
||
state_color: true
|
||
entities:
|
||
- entity: input_boolean.evcs_balance_grid_needed
|
||
name: Réseau nécessaire
|
||
- entity: input_text.evcs_balance_crossing_hour
|
||
name: Croisement production / consommation
|
||
- entity: input_number.evcs_balance_energy_to_cover_kwh
|
||
name: Énergie à couvrir d'ici là
|
||
- entity: input_number.evcs_balance_grid_energy_needed_kwh
|
||
name: Énergie réseau strictement nécessaire
|
||
- type: divider
|
||
- entity: input_number.evcs_balance_required_soc
|
||
name: SOC requis (décision)
|
||
- entity: input_number.evcs_balance_required_soc_prudent
|
||
name: SOC requis (planification)
|
||
|
||
# --- La nuit qui vient ------------------------------------------
|
||
- type: entities
|
||
title: Prochaine traversée déficitaire
|
||
entities:
|
||
- entity: input_text.evcs_balance_next_deficit_window
|
||
name: Fenêtre
|
||
- entity: input_number.evcs_balance_next_deficit_kwh
|
||
name: Énergie à fournir
|
||
- entity: input_number.evcs_balance_next_deficit_required_soc
|
||
name: SOC à atteindre avant
|
||
- entity: input_number.evcs_balance_storage_shortfall_kwh
|
||
name: Capacité de stockage manquante
|
||
|
||
- type: conditional
|
||
conditions:
|
||
- entity: input_number.evcs_balance_storage_shortfall_kwh
|
||
state_not: "0.0"
|
||
card:
|
||
type: markdown
|
||
content: |
|
||
### 🔋 Stockage insuffisant pour cette traversée
|
||
|
||
Il manque **{{ states('input_number.evcs_balance_storage_shortfall_kwh') }} kWh**
|
||
de capacité utile : même chargée à 100 %, la batterie actuelle
|
||
({{ states('input_number.evcs_balance_usable_capacity_kwh') }} kWh)
|
||
ne passe pas la fenêtre sans réseau.
|
||
|
||
*Un module US2000C ≈ 2,4 kWh nominal.*
|
||
|
||
# --- Ce qu'on jette ---------------------------------------------
|
||
- type: markdown
|
||
title: Production
|
||
content: |
|
||
{% set bride = is_state('input_boolean.evcs_balance_pv_censored', 'on') %}
|
||
|
||
{% if bride %}
|
||
### 🔻 Production actuellement **bridée**
|
||
|
||
Motif : *{{ states('input_text.evcs_balance_censor_reason') }}*
|
||
|
||
Sans injection réseau, l'onduleur ne produit que ce que le système
|
||
peut absorber. Le soleil est là, il manque un preneur.
|
||
{% else %}
|
||
### ☀️ Production **libre**
|
||
|
||
Rien ne bride l'onduleur en ce moment : la mesure de production
|
||
reflète la ressource réelle.
|
||
{% endif %}
|
||
|
||
Surplus attendu pour le véhicule aujourd'hui :
|
||
**{{ states('input_number.evcs_balance_vehicle_surplus_kwh') }} kWh**
|
||
|
||
- type: history-graph
|
||
title: SOC réel contre seuil calculé
|
||
hours_to_show: 48
|
||
entities:
|
||
- entity: sensor.victron_battery_soc
|
||
name: SOC batterie
|
||
- entity: input_number.evcs_balance_required_soc
|
||
name: Seuil calculé
|
||
- entity: input_number.victron_grid_soc_off
|
||
name: Seuil fixe
|
||
|
||
- type: history-graph
|
||
title: Bridage de la production
|
||
hours_to_show: 48
|
||
entities:
|
||
- entity: input_boolean.evcs_balance_pv_censored
|
||
name: Production bridée
|
||
- entity: switch.edf_general_ok_switch
|
||
name: Réseau EDF
|
||
|
||
- type: entities
|
||
title: Charge de la batterie — qui limite ?
|
||
entities:
|
||
- entity: sensor.victron_battery_soc
|
||
name: SOC
|
||
- entity: sensor.victron_battery_current
|
||
name: Courant pris par le parc
|
||
- entity: sensor.victron_max_charge_current_setting
|
||
name: ↳ plafond que NOUS imposons (DVCC)
|
||
- entity: sensor.airtria_8_us2000c_maximum_allowed_charge_current
|
||
name: ↳ plafond que le BMS autorise
|
||
- type: divider
|
||
- entity: sensor.victron_battery_voltage
|
||
name: Tension du parc
|
||
- entity: sensor.victron_max_charge_voltage_setting
|
||
name: ↳ consigne que NOUS imposons
|
||
- entity: sensor.airtria_8_us2000c_maximum_allowed_charging_voltage
|
||
name: ↳ tension que le BMS autorise
|
||
- entity: input_text.victron_charge_mode
|
||
name: Profil Auto Charge Manager
|
||
- type: divider
|
||
- entity: sensor.batterie_ecart_entre_cellules
|
||
name: Écart entre cellules
|
||
- entity: sensor.airtria_8_us2000c_tension_de_cellule_elevee
|
||
name: Alarme tension de cellule
|
||
- entity: sensor.airtria_8_us2000c_nombre_de_modules_bloquant_la_charge
|
||
name: Modules bloquant la charge
|
||
- type: divider
|
||
- entity: sensor.solaire_chargeurs_qui_se_retiennent
|
||
name: Chargeurs solaires qui se retiennent
|
||
- entity: sensor.victron_pv_power_system
|
||
name: Production
|
||
|
||
- type: markdown
|
||
content: >
|
||
**Comment lire cette carte.** Le courant pris contre le plafond DVCC
|
||
dit *qui* limite la charge. Collé au plafond : c'est nous. Loin en
|
||
dessous alors que la tension approche la consigne : c'est la fin de
|
||
charge normale. Loin en dessous avec une tension basse : il n'y a
|
||
simplement pas assez de soleil.
|
||
|
||
|
||
L'écart entre cellules est le garde-fou quand on relève un plafond —
|
||
quelques millivolts, le parc est sain ; s'il s'ouvre, on redescend.
|
||
À titre de repère, l'ancien module défaillant atteignait 168 mV.
|
||
|
||
|
||
Les chargeurs qui se retiennent sont le seul signal **direct** de
|
||
ressource refusée : sans injection, la production mesurée est
|
||
censurée par construction et ne dit rien de ce que le soleil pourrait
|
||
donner.
|
||
|
||
|
||
⚠️ *Nombre de modules* et *capacité installée* publiés par le BMS ne
|
||
comptent que le groupe maître — 4 modules et 400 Ah pour un parc qui
|
||
en a neuf. Ils ne sont pas sur cette carte volontairement.
|
||
|
||
# ===================================================================
|
||
- title: Profils & réglages
|
||
path: profils
|
||
icon: mdi:chart-bell-curve
|
||
cards:
|
||
- type: custom:mushroom-title-card
|
||
title: Profils mesurés
|
||
subtitle: Recalculés chaque nuit à 03:30 sur l'historique réel
|
||
|
||
- type: markdown
|
||
title: Profil horaire de consommation (kWh/h, hors véhicule)
|
||
content: |
|
||
{% set p50 = states('input_text.evcs_balance_consumption_p50').split(',') %}
|
||
{% set p80 = states('input_text.evcs_balance_consumption_p80').split(',') %}
|
||
{% set env = states('input_text.evcs_balance_envelope').split(',') %}
|
||
{% set cen = states('input_text.evcs_balance_censorship_rate').split(',') %}
|
||
{% set ok = p50 | length == 24 and p80 | length == 24 and env | length == 24 and cen | length == 24 %}
|
||
{% if not ok %}Profils indisponibles — le recalcul quotidien n'a pas encore publié.
|
||
{% else %}
|
||
| h | conso typique | conso prudente | production max | censure |
|
||
|---:|---:|---:|---:|---:|
|
||
{% for i in range(24) %}| {{ '%02d' | format(i) }} | {{ p50[i] }} | {{ p80[i] }} | {{ env[i] }} | {{ (cen[i] | float(1) * 100) | round(0) }} % |
|
||
{% endfor %}{% endif %}
|
||
|
||
*La colonne « censure » indique la part des jours où la batterie était
|
||
pleine à cette heure : au-delà de 25 %, la production maximale
|
||
observée est minorée et le bilan le signale.*
|
||
|
||
- type: markdown
|
||
content: |
|
||
### ⚠️ Taille du parc — en équivalents US2000C
|
||
|
||
Un **US5000 compte pour DEUX**, il fait 100 Ah contre 50.
|
||
|
||
| parc réel | valeur à saisir |
|
||
|---|---:|
|
||
| 4 × US2000C | **4** |
|
||
| 4 × US2000C + 4 × US5000 | **12** |
|
||
| 8 × US2000C | **8** |
|
||
|
||
Cette valeur alimente trois calculs à la fois : la capacité utile du
|
||
contrôleur, la conversion énergie/SOC du bilan, et l'échelle des
|
||
limites de courant batterie. À corriger **après** que les nouveaux
|
||
modules aient démarré et que les groupes se soient accouplés.
|
||
|
||
- type: markdown
|
||
title: Capacité utile — calculée, pas saisie
|
||
content: |
|
||
{% set n = states('input_number.evcs_balance_modules_en_service') | float(7) %}
|
||
{% set haut = 0.169 * n / 7 %}
|
||
{% set bas = 0.097 * n / 7 %}
|
||
{% set dc = 67 * haut + 11 * bas %}
|
||
**{{ (dc * 0.955) | round(1) }} kWh** réellement livrés à la maison,
|
||
de 100 % au plancher de 22 %.
|
||
|
||
Déduit de la courbe mesurée le 03/09 sur 576 paliers
|
||
({{ (haut * 1000) | round(0) }} Wh par point de SOC au-dessus de 33 %,
|
||
{{ (bas * 1000) | round(0) }} Wh en dessous) et du parc déclaré
|
||
ci-dessus. **Rien à saisir ici.**
|
||
|
||
*L'ancien réglage « capacité batterie utile » (15 kWh) ne pilote plus
|
||
rien depuis le 03/09 : il ne sert que de garde de complétude au
|
||
bilan. Il a été retiré de cette carte pour ne plus induire en erreur.*
|
||
|
||
- type: entities
|
||
title: Réglages
|
||
entities:
|
||
- entity: input_number.evcs_balance_modules_en_service
|
||
name: Parc batterie (équivalents US2000C)
|
||
- entity: input_boolean.evcs_balance_enabled
|
||
name: Bilan actif (kill-switch)
|
||
- type: divider
|
||
- entity: input_text.evcs_balance_status
|
||
name: Statut
|
||
- entity: input_text.evcs_balance_last_run
|
||
name: Dernière exécution
|
||
- entity: input_text.evcs_balance_reason
|
||
name: Explication
|
||
|
||
- type: markdown
|
||
content: |
|
||
### À propos
|
||
|
||
Ce bilan remplace des seuils fixes par des grandeurs mesurées. Il
|
||
**n'écrit que dans ses propres entités** `evcs_balance_*` : aucun
|
||
interrupteur, aucune consigne de borne, aucune stratégie. Cette
|
||
garantie est vérifiée par la suite de tests du dépôt, qui échoue si
|
||
une écriture sort de ce périmètre.
|
||
|
||
Détail de la démarche : `docs/CHANTIER_BILAN_ENERGETIQUE.md`.
|