Une carte pour savoir QUI limite la charge de la batterie

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
This commit is contained in:
Tallagrand Thierry
2026-09-13 21:04:46 +02:00
parent 43bda3df01
commit d64aef24ea
3 changed files with 197 additions and 2 deletions

View File

@@ -158,6 +158,63 @@ views:
- entity: switch.edf_general_ok_switch - entity: switch.edf_general_ok_switch
name: Réseau EDF 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 - title: Profils & réglages
path: profils path: profils
@@ -186,11 +243,47 @@ views:
pleine à cette heure : au-delà de 25 %, la production maximale pleine à cette heure : au-delà de 25 %, la production maximale
observée est minorée et le bilan le signale.* 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 - type: entities
title: Réglages title: Réglages
entities: entities:
- entity: input_number.evcs_balance_usable_capacity_kwh - entity: input_number.evcs_balance_modules_en_service
name: Capacité batterie utile name: Parc batterie (équivalents US2000C)
- entity: input_boolean.evcs_balance_enabled - entity: input_boolean.evcs_balance_enabled
name: Bilan actif (kill-switch) name: Bilan actif (kill-switch)
- type: divider - type: divider

63
packages/airtria_concierge.yaml Executable file
View File

@@ -0,0 +1,63 @@
# Concierge vehicule — espace de noms de l'agent Airtria (OpenClaw)
#
# Airtria detecte qu'une session de charge s'ouvre alors que l'etiquette du
# vehicule est douteuse, demande par WhatsApp au proprietaire de quelle voiture
# il s'agit, et depose ici la reponse. Le service d'historisation — seul
# proprietaire de la table `session_charge` — la lit et l'applique.
#
# ⚠️ CE PAQUET NE DOIT CONTENIR QUE DES ENTITEES `airtria_*`. C'est la
# frontiere d'ecriture de l'agent. Elle est CONVENTIONNELLE et non
# structurelle : le jeton Home Assistant qu'il porte peut techniquement
# ecrire n'importe quel service. La garantie repose donc entierement sur la
# discipline de son code — un test de portee doit echouer si une ecriture
# sort de la constante, et aucun nom d'entite ne doit etre construit
# dynamiquement.
#
# ⚠️ `max: 255` EXPLICITE. Le defaut de Home Assistant est 100, et un texte
# trop long est rejete EN SILENCE : le 08/09/2026, `evcs_balance_forecast_updated`
# etait declare a 32 et avalait les messages d'erreur de 43 caracteres — quatre
# heures quarante-cinq de panne sans une seule trace. Airtria relit l'etat
# apres chaque ecriture pour detecter un rejet.
#
# Cree le 13/09/2026.
input_boolean:
# Kill-switch cote CONSOMMATEUR. A OFF, le service d'historisation cesse
# d'appliquer les etiquettes, qu'Airtria continue ou non de publier. Meme
# role que `evcs_balance_enabled` et `evcs_advisor_enabled` : tout
# consommateur de ce projet doit pouvoir etre coupe sans toucher a son
# producteur. Pas d'`initial:` — il desactiverait la restauration d'etat et
# forcerait la valeur a chaque demarrage (piege corrige le 06/09).
airtria_concierge_enabled:
name: Airtria - Appliquer les etiquettes de vehicule
icon: mdi:car-info
input_text:
# Une confirmation humaine, en JSON, atomique :
#
# {"sessions":["2026-09-08 19:39:12.334+02","2026-09-09 01:26:04.887+02"],
# "label":"VW","confirmed_at":"2026-09-13T19:40:00+02:00","source":"whatsapp"}
#
# `sessions` est une LISTE et non une clef unique : un branchement couvre
# souvent plusieurs sessions (la cloture a 10 min coupe entre le solaire du
# soir et l'ouverture des heures creuses), et des ecritures successives sur
# un helper unique perdraient une confirmation sur deux — le service ne passe
# que toutes les 60 s et ne verrait que la derniere.
#
# Les horodatages de `sessions` sont les clefs `session_charge.debut`
# VERBATIM, millisecondes comprises. Le service joint sur une fenetre de
# ±1 s ; une valeur arrondie a la minute ne correspondrait a aucune ligne.
#
# `confirmed_at` est l'horodatage de LA VALEUR, pas du run de l'agent. Une
# valeur perimee doit pouvoir etre reconnue comme telle meme si son
# producteur tourne encore — c'est la lecon du cablage de la cible SOC,
# retire le 13/09 parce que sa garde de fraicheur datait le run.
#
# Une auto-correction est une republication avec un `confirmed_at` plus
# recent. Le helper n'est JAMAIS remis a vide : l'invalidation est
# structurelle (une clef de session perimee ne correspond a aucune ligne
# nouvelle), et le vider ouvrirait une fenetre de perte sans rien proteger.
airtria_vehicle_label:
name: Airtria - Etiquette de vehicule confirmee
max: 255
icon: mdi:label-outline

View File

@@ -0,0 +1,39 @@
# Deux grandeurs que le systeme mesure et que RIEN n'affichait (13/09/2026).
#
# 1. L'ecart entre cellules. Le BMS publie la plus haute et la plus basse, mais
# c'est leur DIFFERENCE qui dit si le parc est sain : 2 mV sur le parc actuel,
# contre 168 mV sur l'ancien module 3 a 80 % de SOC, juste avant qu'il fasse
# effondrer le courant de charge de tout le monde.
# C'est la grandeur a surveiller quand on releve un plafond de charge.
#
# 2. Le nombre de chargeurs solaires qui SE RETIENNENT. Chaque MPPT declare son
# regime : `mppt_active` = il donne tout, `voltage_current_limited` = il se
# bride faute de preneur. Six entites publient cet etat et aucun tableau ne
# les montrait, alors que c'est le seul signal DIRECT de ressource refusee —
# la puissance mesuree, elle, est censuree par construction sur cette
# installation sans injection.
# ⚠️ `off` ne compte pas comme bride : la nuit tous les chargeurs sont `off`
# sans qu'aucune ressource ne soit refusee.
template:
- sensor:
- name: "Batterie - Ecart entre cellules"
unique_id: batterie_ecart_cellules_mv
unit_of_measurement: "mV"
state_class: measurement
icon: mdi:arrow-expand-vertical
state: >
{% set hi = states('sensor.airtria_8_us2000c_tension_maximale_de_la_cellule') | float(0) %}
{% set lo = states('sensor.airtria_8_us2000c_tension_minimale_de_la_cellule') | float(0) %}
{% if hi > 0 and lo > 0 %}{{ ((hi - lo) * 1000) | round(0) }}{% else %}unknown{% endif %}
- name: "Solaire - Chargeurs qui se retiennent"
unique_id: solaire_chargeurs_brides
unit_of_measurement: "sur 6"
state_class: measurement
icon: mdi:solar-power-variant
state: >
{{ states.sensor
| selectattr('entity_id', 'search', 'operation_mode')
| selectattr('state', 'search', 'limited')
| list | count }}