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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-05 13:41:28 +02:00
parent f762616893
commit 8e2b4f3e34
4 changed files with 602 additions and 1 deletions

View File

@@ -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"
}
}
}
]
}

View File

@@ -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
1 heure_reelle etat courant_mA c1_mV c2_mV c3_mV c4_mV c5_mV c6_mV c7_mV c8_mV c9_mV c10_mV c11_mV c12_mV c13_mV c14_mV c15_mV ecart_mV
305 2026-09-05T11:39:15.257Z module1 3383 3384 3384 3382 3387 3497 3467 3385 3386 3384 3409 3469 3387 3528 3384 146
306 2026-09-05T11:39:15.414Z module2 3417 3415 3417 3417 3417 3413 3416 3415 3416 3405 3415 3417 3417 3414 3413 12
307 2026-09-05T11:39:15.572Z module3 3389 3410 3386 3387 3387 3486 3386 3387 3389 3430 3390 3503 3387 3389 3495 117
308 2026-09-05T11:39:35.718Z module1 3384 3385 3385 3383 3387 3498 3468 3385 3387 3385 3410 3470 3387 3529 3385 146
309 2026-09-05T11:39:35.876Z module2 3418 3416 3418 3418 3418 3413 3417 3415 3417 3405 3416 3417 3418 3415 3414 13
310 2026-09-05T11:39:36.033Z module3 3390 3411 3387 3388 3387 3485 3387 3388 3389 3429 3390 3503 3388 3389 3494 116
311 2026-09-05T11:39:56.179Z module1 3385 3385 3385 3383 3387 3494 3466 3386 3388 3385 3410 3467 3388 3527 3385 144
312 2026-09-05T11:39:56.336Z module2 3418 3415 3417 3417 3416 3413 3416 3414 3416 3404 3415 3417 3417 3414 3413 14
313 2026-09-05T11:39:56.520Z module3 3390 3410 3386 3388 3387 3482 3387 3388 3389 3424 3390 3498 3388 3389 3489 112
314 2026-09-05T11:40:16.665Z module1 3384 3386 3385 3383 3388 3493 3464 3386 3388 3385 3410 3466 3388 3526 3385 143
315 2026-09-05T11:40:16.823Z module2 3417 3415 3417 3417 3416 3412 3416 3414 3416 3403 3414 3417 3417 3414 3413 14
316 2026-09-05T11:40:16.983Z module3 3390 3410 3387 3388 3388 3480 3387 3388 3390 3424 3390 3495 3388 3390 3488 108
317 2026-09-05T11:40:37.130Z module1 3384 3386 3385 3383 3388 3490 3463 3386 3388 3385 3410 3464 3388 3524 3386 141
318 2026-09-05T11:40:37.287Z module2 3417 3415 3417 3417 3416 3412 3415 3414 3416 3403 3414 3416 3416 3413 3412 14
319 2026-09-05T11:40:37.444Z module3 3391 3413 3388 3390 3389 3479 3388 3389 3391 3426 3392 3494 3389 3391 3488 106
320 2026-09-05T11:40:57.590Z module1 3385 3386 3386 3384 3388 3489 3462 3386 3388 3385 3411 3463 3389 3523 3385 139
321 2026-09-05T11:40:57.747Z module2 3416 3414 3416 3416 3416 3412 3415 3414 3415 3402 3414 3416 3416 3413 3412 14
322 2026-09-05T11:40:57.904Z module3 3393 3415 3390 3391 3391 3480 3390 3391 3392 3426 3394 3494 3391 3392 3487 104
323 2026-09-05T11:41:18.038Z module1 3385 3386 3386 3383 3388 3487 3460 3386 3388 3385 3410 3462 3388 3522 3386 139
324 2026-09-05T11:41:18.195Z module2 3416 3415 3416 3416 3416 3412 3415 3414 3416 3402 3414 3416 3416 3413 3412 14
325 2026-09-05T11:41:18.382Z module3 3394 3418 3391 3392 3392 3480 3391 3392 3394 3425 3395 3494 3392 3394 3486 103

View File

@@ -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")

View File

@@ -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'],