From 8e2b4f3e3491899d23ea6159b857bf0e83eb3154 Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Sat, 5 Sep 2026 13:41:28 +0200 Subject: [PATCH] Un tableau Grafana pour les cellules, et le plafond du BMS enfin historise Le GX n'expose que l'agregat du parc : les quinze tensions d'un module ne sortent que par la console de son BMS. Le tableau les trace, avec les paliers d'alarme du materiel lui-meme - 3480, 3520, 3550, 3600 mV - et met la cellule meneuse en regard du plafond de charge. Le plafond impose par le BMS, grandeur centrale de tout ce diagnostic, n'etait pas historise : il l'est desormais, comme l'alarme de tension de cellule. Ils manquaient tous les deux a la memoire. Les quatre requetes cellule echouent tant que la table n'existe pas ; elles passeront apres redemarrage du service et import. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ --- .../grafana/dashboards/batteries.json | 471 ++++++++++++++++++ docs/mesures/batteries/202609051304-suivi.csv | 18 + tools/gen-grafana-dashboards.py | 107 +++- tools/historise-evcs.mjs | 7 + 4 files changed, 602 insertions(+), 1 deletion(-) create mode 100644 deploy/historisation/grafana/dashboards/batteries.json diff --git a/deploy/historisation/grafana/dashboards/batteries.json b/deploy/historisation/grafana/dashboards/batteries.json new file mode 100644 index 0000000..3f0af9e --- /dev/null +++ b/deploy/historisation/grafana/dashboards/batteries.json @@ -0,0 +1,471 @@ +{ + "templating": { + "list": [ + { + "name": "module", + "label": "Module", + "type": "query", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "refresh": 1, + "includeAll": false, + "multi": false, + "query": "SELECT DISTINCT module FROM cellule ORDER BY 1" + } + ] + }, + "uid": "evcs-batteries", + "title": "Les batteries", + "description": "Les quinze tensions de cellule de chaque module Pylontech, relevees sur la console de leur BMS. Aucune de ces valeurs n'existe cote Victron, qui ne publie que l'agregat du parc. Les paliers de couleur sont ceux du materiel lui-meme : 3480, 3520, 3550 et 3600 mV.", + "tags": [ + "evcs" + ], + "timezone": "Europe/Paris", + "editable": true, + "schemaVersion": 39, + "version": 1, + "refresh": "1m", + "time": { + "from": "now-7d", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "30s", + "1m", + "5m", + "15m", + "1h" + ] + }, + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "name": "Annotations & Alerts", + "iconColor": "rgba(0, 211, 255, 1)", + "type": "dashboard" + }, + { + "name": "Evenements", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "enable": true, + "iconColor": "semi-dark-orange", + "hide": false, + "target": { + "format": "table", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, resume AS text, genre || ',' || coalesce(source,'?') AS tags FROM evenement WHERE $__timeFilter(ts) ORDER BY 1" + } + } + ] + }, + "panels": [ + { + "type": "timeseries", + "title": "Cellule par cellule — $module", + "description": "Une courbe par cellule. Une cellule saine suit exactement ses quatorze voisines ; une cellule qui a perdu de la capacite s'en detache en haut de charge ET en bas de decharge, parce qu'elle se remplit et se vide avant les autres.", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "time_series", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, 'cellule ' || lpad(cellule::text, 2, '0') AS metric,\n mv\nFROM cellule\nWHERE module = '$module' AND $__timeFilter(ts)\nORDER BY 1, 2" + } + ], + "gridPos": { + "x": 0, + "y": 0, + "w": 24, + "h": 10 + }, + "fieldConfig": { + "defaults": { + "custom": { + "lineWidth": 1 + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 3480 + }, + { + "color": "orange", + "value": 3520 + }, + { + "color": "red", + "value": 3550 + }, + { + "color": "dark-red", + "value": 3600 + } + ] + }, + "custom.thresholdsStyle": { + "mode": "dashed" + } + } + }, + "options": { + "legend": { + "displayMode": "list", + "placement": "right", + "showLegend": true, + "calcs": [] + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + } + }, + { + "type": "timeseries", + "title": "Ecart entre la plus haute et la plus basse", + "description": "L'indicateur qui resume un module en une courbe. Un module sain de ce parc tient sous 20 mV ; au-dela de 150 mV le BMS commence a reduire le courant de charge de TOUT le parc.", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "time_series", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, module AS metric, max(mv) - min(mv) AS ecart\nFROM cellule WHERE $__timeFilter(ts)\nGROUP BY ts, module ORDER BY 1" + } + ], + "gridPos": { + "x": 0, + "y": 10, + "w": 12, + "h": 8 + }, + "fieldConfig": { + "defaults": { + "unit": "mvolt", + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 2, + "fillOpacity": 8, + "showPoints": "never", + "spanNulls": true, + "axisBorderShow": false, + "gradientMode": "opacity" + } + }, + "overrides": [] + }, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "calcs": [] + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + } + }, + { + "type": "timeseries", + "title": "La cellule meneuse, contre le plafond que le BMS impose", + "description": "Le plafond de charge est trace a l'echelle (20 mV par ampere) pour tenir sur le meme axe. Le 05/09 a 13:05:08 la cellule meneuse est passee de 3541 a 3555 mV ; cinq secondes plus tard le plafond tombait de 50 a 30 A. Ensuite le courant baisse, la cellule se detend, l'alarme repasse au vert — et le plafond, lui, reste bas.", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "time_series", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, module || ' — cellule meneuse' AS metric,\n max(mv) AS mv\nFROM cellule WHERE $__timeFilter(ts)\nGROUP BY ts, module ORDER BY 1" + }, + { + "refId": "B", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "time_series", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, 'plafond de charge (A)' AS metric,\n valeur * 20 AS mv\nFROM mesure\nWHERE cle = 'sensor.airtria_8_us2000c_maximum_allowed_charge_current'\n AND $__timeFilter(ts) ORDER BY 1" + } + ], + "gridPos": { + "x": 12, + "y": 10, + "w": 12, + "h": 8 + }, + "fieldConfig": { + "defaults": { + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 3480 + }, + { + "color": "orange", + "value": 3520 + }, + { + "color": "red", + "value": 3550 + }, + { + "color": "dark-red", + "value": 3600 + } + ] + } + } + }, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "calcs": [] + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + } + }, + { + "type": "table", + "title": "Amplitude de chaque cellule sur la periode", + "description": "Le classement qui designe les cellules a traiter. Sur un module sain les quinze amplitudes sont identiques a quelques millivolts pres. Une amplitude de trois a quatre fois celle des voisines designe une cellule qui a perdu sa capacite — et cela ne se rattrape pas par un reequilibrage.", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "table", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT cellule AS \"Cellule\",\n min(mv) AS \"Minimum\", max(mv) AS \"Maximum\",\n max(mv) - min(mv) AS \"Amplitude\"\nFROM cellule\nWHERE module = '$module' AND $__timeFilter(ts)\nGROUP BY cellule ORDER BY 4 DESC" + } + ], + "gridPos": { + "x": 0, + "y": 18, + "w": 12, + "h": 10 + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": "left", + "cellOptions": { + "type": "auto" + }, + "filterable": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Amplitude" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "color-background" + } + }, + { + "id": "unit", + "value": "mvolt" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 250 + }, + { + "color": "orange", + "value": 400 + }, + { + "color": "red", + "value": 600 + } + ] + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Minimum" + }, + "properties": [ + { + "id": "unit", + "value": "mvolt" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Maximum" + }, + "properties": [ + { + "id": "unit", + "value": "mvolt" + } + ] + } + ] + }, + "options": { + "showHeader": true, + "cellHeight": "sm", + "footer": { + "show": false + } + } + }, + { + "type": "timeseries", + "title": "Etat de charge du parc pendant les relevés", + "description": "Le contexte sans lequel un ecart entre cellules ne veut rien dire : l'ecart grandit avec l'etat de charge, et l'excursion de la cellule abimee grandit avec le courant. Le 05/09, a tension de parc egale, la meneuse etait a 3555 mV sous 50 A et a 3496 mV sous 30 A.", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "time_series", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, valeur AS \"SOC du parc\"\nFROM mesure WHERE cle = 'sensor.victron_battery_soc'\n AND $__timeFilter(ts) ORDER BY 1" + }, + { + "refId": "B", + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "evcs-pg" + }, + "format": "time_series", + "rawQuery": true, + "editorMode": "code", + "rawSql": "SELECT ts AS time, valeur AS \"Courant du parc\"\nFROM mesure WHERE cle = 'sensor.victron_battery_current'\n AND $__timeFilter(ts) ORDER BY 1" + } + ], + "gridPos": { + "x": 12, + "y": 18, + "w": 12, + "h": 10 + }, + "fieldConfig": { + "defaults": { + "unit": "", + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 2, + "fillOpacity": 8, + "showPoints": "never", + "spanNulls": true, + "axisBorderShow": false, + "gradientMode": "opacity" + } + }, + "overrides": [] + }, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "calcs": [] + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + } + } + ] +} diff --git a/docs/mesures/batteries/202609051304-suivi.csv b/docs/mesures/batteries/202609051304-suivi.csv index 715891d..8459471 100644 --- a/docs/mesures/batteries/202609051304-suivi.csv +++ b/docs/mesures/batteries/202609051304-suivi.csv @@ -305,3 +305,21 @@ heure_reelle,etat,courant_mA,c1_mV,c2_mV,c3_mV,c4_mV,c5_mV,c6_mV,c7_mV,c8_mV,c9_ 2026-09-05T11:39:15.257Z,module1,,3383,3384,3384,3382,3387,3497,3467,3385,3386,3384,3409,3469,3387,3528,3384,146 2026-09-05T11:39:15.414Z,module2,,3417,3415,3417,3417,3417,3413,3416,3415,3416,3405,3415,3417,3417,3414,3413,12 2026-09-05T11:39:15.572Z,module3,,3389,3410,3386,3387,3387,3486,3386,3387,3389,3430,3390,3503,3387,3389,3495,117 +2026-09-05T11:39:35.718Z,module1,,3384,3385,3385,3383,3387,3498,3468,3385,3387,3385,3410,3470,3387,3529,3385,146 +2026-09-05T11:39:35.876Z,module2,,3418,3416,3418,3418,3418,3413,3417,3415,3417,3405,3416,3417,3418,3415,3414,13 +2026-09-05T11:39:36.033Z,module3,,3390,3411,3387,3388,3387,3485,3387,3388,3389,3429,3390,3503,3388,3389,3494,116 +2026-09-05T11:39:56.179Z,module1,,3385,3385,3385,3383,3387,3494,3466,3386,3388,3385,3410,3467,3388,3527,3385,144 +2026-09-05T11:39:56.336Z,module2,,3418,3415,3417,3417,3416,3413,3416,3414,3416,3404,3415,3417,3417,3414,3413,14 +2026-09-05T11:39:56.520Z,module3,,3390,3410,3386,3388,3387,3482,3387,3388,3389,3424,3390,3498,3388,3389,3489,112 +2026-09-05T11:40:16.665Z,module1,,3384,3386,3385,3383,3388,3493,3464,3386,3388,3385,3410,3466,3388,3526,3385,143 +2026-09-05T11:40:16.823Z,module2,,3417,3415,3417,3417,3416,3412,3416,3414,3416,3403,3414,3417,3417,3414,3413,14 +2026-09-05T11:40:16.983Z,module3,,3390,3410,3387,3388,3388,3480,3387,3388,3390,3424,3390,3495,3388,3390,3488,108 +2026-09-05T11:40:37.130Z,module1,,3384,3386,3385,3383,3388,3490,3463,3386,3388,3385,3410,3464,3388,3524,3386,141 +2026-09-05T11:40:37.287Z,module2,,3417,3415,3417,3417,3416,3412,3415,3414,3416,3403,3414,3416,3416,3413,3412,14 +2026-09-05T11:40:37.444Z,module3,,3391,3413,3388,3390,3389,3479,3388,3389,3391,3426,3392,3494,3389,3391,3488,106 +2026-09-05T11:40:57.590Z,module1,,3385,3386,3386,3384,3388,3489,3462,3386,3388,3385,3411,3463,3389,3523,3385,139 +2026-09-05T11:40:57.747Z,module2,,3416,3414,3416,3416,3416,3412,3415,3414,3415,3402,3414,3416,3416,3413,3412,14 +2026-09-05T11:40:57.904Z,module3,,3393,3415,3390,3391,3391,3480,3390,3391,3392,3426,3394,3494,3391,3392,3487,104 +2026-09-05T11:41:18.038Z,module1,,3385,3386,3386,3383,3388,3487,3460,3386,3388,3385,3410,3462,3388,3522,3386,139 +2026-09-05T11:41:18.195Z,module2,,3416,3415,3416,3416,3416,3412,3415,3414,3416,3402,3414,3416,3416,3413,3412,14 +2026-09-05T11:41:18.382Z,module3,,3394,3418,3391,3392,3392,3480,3391,3392,3394,3425,3395,3494,3392,3394,3486,103 diff --git a/tools/gen-grafana-dashboards.py b/tools/gen-grafana-dashboards.py index 2a96fcf..061fa03 100644 --- a/tools/gen-grafana-dashboards.py +++ b/tools/gen-grafana-dashboards.py @@ -1069,11 +1069,116 @@ vehicules = dashboard("evcs-vehicules", "Les vehicules", ( sur("P max", [{"id": "unit", "value": "watt"}])]), ]) +# ===================================================================== +# 7. LES BATTERIES — ce qu'aucun capteur Victron ne publie +# ===================================================================== +# Le GX n'expose que l'agregat du parc : une tension, un courant, un SOC. Les +# quinze tensions de cellule d'un module ne sortent QUE par la console serie de +# son BMS. C'est pour cela que le desequilibre est reste invisible des annees. + +VARIABLE_MODULE = { + "name": "module", "label": "Module", "type": "query", "datasource": PG, + "refresh": 1, "includeAll": False, "multi": False, + "query": "SELECT DISTINCT module FROM cellule ORDER BY 1", +} + +# Echelle d'alarme du materiel, lue dans `sysinfo` du LVHUB le 05/09/2026. +# Ce ne sont pas des valeurs choisies ici. +SEUILS_CELLULE = seuils(("green", None), ("#EAB839", 3480), ("orange", 3520), + ("red", 3550), ("dark-red", 3600)) + +batteries = dashboard("evcs-batteries", "Les batteries", ( + "Les quinze tensions de cellule de chaque module Pylontech, relevees sur la " + "console de leur BMS. Aucune de ces valeurs n'existe cote Victron, qui ne " + "publie que l'agregat du parc. Les paliers de couleur sont ceux du materiel " + "lui-meme : 3480, 3520, 3550 et 3600 mV."), [ + + ts("Cellule par cellule — $module", [ + sql("A", "SELECT ts AS time, 'cellule ' || lpad(cellule::text, 2, '0') AS metric,\n" + " mv\n" + "FROM cellule\n" + "WHERE module = '$module' AND $__timeFilter(ts)\n" + "ORDER BY 1, 2")], + PG, 0, 0, 24, 10, unit="mvolt", + desc="Une courbe par cellule. Une cellule saine suit exactement ses " + "quatorze voisines ; une cellule qui a perdu de la capacite s'en " + "detache en haut de charge ET en bas de decharge, parce qu'elle se " + "remplit et se vide avant les autres.", + extra={"fieldConfig": {"defaults": {"custom": {"lineWidth": 1}, + "thresholds": SEUILS_CELLULE, + "custom.thresholdsStyle": {"mode": "dashed"}}}}, + legend="right"), + + ts("Ecart entre la plus haute et la plus basse", [ + sql("A", "SELECT ts AS time, module AS metric, max(mv) - min(mv) AS ecart\n" + "FROM cellule WHERE $__timeFilter(ts)\n" + "GROUP BY ts, module ORDER BY 1")], + PG, 0, 10, 12, 8, unit="mvolt", + desc="L'indicateur qui resume un module en une courbe. Un module sain de " + "ce parc tient sous 20 mV ; au-dela de 150 mV le BMS commence a " + "reduire le courant de charge de TOUT le parc."), + + ts("La cellule meneuse, contre le plafond que le BMS impose", [ + sql("A", "SELECT ts AS time, module || ' — cellule meneuse' AS metric,\n" + " max(mv) AS mv\n" + "FROM cellule WHERE $__timeFilter(ts)\n" + "GROUP BY ts, module ORDER BY 1"), + sql("B", "SELECT ts AS time, 'plafond de charge (A)' AS metric,\n" + " valeur * 20 AS mv\n" + "FROM mesure\n" + "WHERE cle = 'sensor.airtria_8_us2000c_maximum_allowed_charge_current'\n" + " AND $__timeFilter(ts) ORDER BY 1")], + PG, 12, 10, 12, 8, unit="mvolt", + desc="Le plafond de charge est trace a l'echelle (20 mV par ampere) pour " + "tenir sur le meme axe. Le 05/09 a 13:05:08 la cellule meneuse est " + "passee de 3541 a 3555 mV ; cinq secondes plus tard le plafond " + "tombait de 50 a 30 A. Ensuite le courant baisse, la cellule se " + "detend, l'alarme repasse au vert — et le plafond, lui, reste bas.", + extra={"fieldConfig": {"defaults": {"thresholds": SEUILS_CELLULE}}}), + + table("Amplitude de chaque cellule sur la periode", [ + sql("A", "SELECT cellule AS \"Cellule\",\n" + " min(mv) AS \"Minimum\", max(mv) AS \"Maximum\",\n" + " max(mv) - min(mv) AS \"Amplitude\"\n" + "FROM cellule\n" + "WHERE module = '$module' AND $__timeFilter(ts)\n" + "GROUP BY cellule ORDER BY 4 DESC", fmt="table")], + PG, 0, 18, 12, 10, + desc="Le classement qui designe les cellules a traiter. Sur un module " + "sain les quinze amplitudes sont identiques a quelques millivolts " + "pres. Une amplitude de trois a quatre fois celle des voisines " + "designe une cellule qui a perdu sa capacite — et cela ne se " + "rattrape pas par un reequilibrage.", + overrides=[sur("Amplitude", [{"id": "custom.cellOptions", + "value": {"type": "color-background"}}, + {"id": "unit", "value": "mvolt"}, + {"id": "thresholds", "value": seuils( + ("green", None), ("#EAB839", 250), + ("orange", 400), ("red", 600))}]), + sur("Minimum", [{"id": "unit", "value": "mvolt"}]), + sur("Maximum", [{"id": "unit", "value": "mvolt"}])]), + + ts("Etat de charge du parc pendant les relevés", [ + sql("A", "SELECT ts AS time, valeur AS \"SOC du parc\"\n" + "FROM mesure WHERE cle = 'sensor.victron_battery_soc'\n" + " AND $__timeFilter(ts) ORDER BY 1"), + sql("B", "SELECT ts AS time, valeur AS \"Courant du parc\"\n" + "FROM mesure WHERE cle = 'sensor.victron_battery_current'\n" + " AND $__timeFilter(ts) ORDER BY 1")], + PG, 12, 18, 12, 10, + desc="Le contexte sans lequel un ecart entre cellules ne veut rien dire : " + "l'ecart grandit avec l'etat de charge, et l'excursion de la cellule " + "abimee grandit avec le courant. Le 05/09, a tension de parc egale, " + "la meneuse etait a 3555 mV sous 50 A et a 3496 mV sous 30 A."), + +], frm="now-7d", variables=[VARIABLE_MODULE]) + base = pathlib.Path('deploy/historisation/grafana/dashboards') for nom, d in [('nuit.json', nuit), ('solaire.json', solaire), ('prevision.json', prevision), ('telephone.json', telephone), ('systeme.json', systeme), - ('vehicules.json', vehicules)]: + ('vehicules.json', vehicules), + ('batteries.json', batteries)]: (base / nom).write_text(json.dumps(d, indent=2, ensure_ascii=False) + '\n') print(f"{nom:16s} {len(d['panels'])} panneaux") diff --git a/tools/historise-evcs.mjs b/tools/historise-evcs.mjs index a464e04..884e5a8 100644 --- a/tools/historise-evcs.mjs +++ b/tools/historise-evcs.mjs @@ -70,6 +70,12 @@ const MESURES = [ 'sensor.victron_vebus_dc_power_system', 'sensor.sun_solar_elevation', 'sensor.victron_max_charge_current_setting', + // Le plafond impose par le BMS lui-meme, a distinguer de la limite DVCC + // ci-dessus que l'Auto Charge Manager ecrit. C'est LUI qui s'effondre quand + // une cellule atteint 3550 mV, et il commande tout le parc. + 'sensor.airtria_8_us2000c_maximum_allowed_charge_current', + 'sensor.airtria_8_us2000c_maximum_allowed_charging_voltage', + 'sensor.victron_max_charge_voltage_setting', 'number.gx_device_ac_power_setpoint', 'input_number.evcs_balance_required_soc', 'input_number.evcs_balance_energy_to_cover_kwh', @@ -90,6 +96,7 @@ const MESURES = [ // decisions du controleur non plus (elles sont dans `decision`) : un evenement // qui double une autre table est du bruit. const TRANSITIONS_SUIVIES = [ + ['sensor.airtria_8_us2000c_tension_de_cellule_elevee', 'batterie', 'Alarme tension de cellule'], ['switch.edf_general_ok_switch', 'reseau', 'Contacteur EDF'], ['input_boolean.victron_evcs_night_grid_session_committed','reseau', 'Session reseau de nuit'], ['input_boolean.victron_evcs_night_grid_takeover_needed', 'reseau', 'Reprise reseau nuit'],