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:
471
deploy/historisation/grafana/dashboards/batteries.json
Normal file
471
deploy/historisation/grafana/dashboards/batteries.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user