diff --git a/dashboards/bilan_energetique.yaml b/dashboards/bilan_energetique.yaml index 3ecc580..8849058 100644 --- a/dashboards/bilan_energetique.yaml +++ b/dashboards/bilan_energetique.yaml @@ -158,6 +158,63 @@ views: - 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 @@ -186,11 +243,47 @@ views: 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_usable_capacity_kwh - name: Capacité batterie utile + - 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 diff --git a/packages/airtria_concierge.yaml b/packages/airtria_concierge.yaml new file mode 100755 index 0000000..fd0859c --- /dev/null +++ b/packages/airtria_concierge.yaml @@ -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 diff --git a/packages/batterie_qui_limite.yaml b/packages/batterie_qui_limite.yaml new file mode 100755 index 0000000..84593d5 --- /dev/null +++ b/packages/batterie_qui_limite.yaml @@ -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 }}