|
|
|
|
@@ -1,4 +1,50 @@
|
|
|
|
|
{
|
|
|
|
|
"templating": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"name": "vue",
|
|
|
|
|
"label": "Vue",
|
|
|
|
|
"type": "custom",
|
|
|
|
|
"hide": 0,
|
|
|
|
|
"skipUrlSync": false,
|
|
|
|
|
"query": "Vue generale : Solaire|Reseau|Batterie|Maison|Voiture,Consommation : Maison|Voiture,Reseau : Reseau|Maison,Batterie : Batterie|Solaire|Maison,Chargeur VE : Voiture|Solaire",
|
|
|
|
|
"options": [
|
|
|
|
|
{
|
|
|
|
|
"selected": true,
|
|
|
|
|
"text": "Vue generale",
|
|
|
|
|
"value": "Solaire|Reseau|Batterie|Maison|Voiture"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"selected": false,
|
|
|
|
|
"text": "Consommation",
|
|
|
|
|
"value": "Maison|Voiture"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"selected": false,
|
|
|
|
|
"text": "Reseau",
|
|
|
|
|
"value": "Reseau|Maison"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"selected": false,
|
|
|
|
|
"text": "Batterie",
|
|
|
|
|
"value": "Batterie|Solaire|Maison"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"selected": false,
|
|
|
|
|
"text": "Chargeur VE",
|
|
|
|
|
"value": "Voiture|Solaire"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"current": {
|
|
|
|
|
"selected": true,
|
|
|
|
|
"text": "Vue generale",
|
|
|
|
|
"value": "Solaire|Reseau|Batterie|Maison|Voiture"
|
|
|
|
|
},
|
|
|
|
|
"multi": false,
|
|
|
|
|
"includeAll": false
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"uid": "evcs-systeme",
|
|
|
|
|
"title": "Le systeme",
|
|
|
|
|
"description": "Replique locale de la vue generale VRM. La console Victron est hebergee dans le cloud : elle disparait quand une coupure d'orage emporte Internet. Tout ce qui est affiche ici est lu sur le reseau local.",
|
|
|
|
|
@@ -93,7 +139,7 @@
|
|
|
|
|
"gridPos": {
|
|
|
|
|
"x": 0,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"w": 6,
|
|
|
|
|
"w": 5,
|
|
|
|
|
"h": 5
|
|
|
|
|
},
|
|
|
|
|
"fieldConfig": {
|
|
|
|
|
@@ -208,9 +254,9 @@
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"gridPos": {
|
|
|
|
|
"x": 6,
|
|
|
|
|
"x": 5,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"w": 5,
|
|
|
|
|
"w": 4,
|
|
|
|
|
"h": 5
|
|
|
|
|
},
|
|
|
|
|
"fieldConfig": {
|
|
|
|
|
@@ -333,9 +379,9 @@
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"gridPos": {
|
|
|
|
|
"x": 11,
|
|
|
|
|
"x": 9,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"w": 8,
|
|
|
|
|
"w": 10,
|
|
|
|
|
"h": 5
|
|
|
|
|
},
|
|
|
|
|
"fieldConfig": {
|
|
|
|
|
@@ -476,6 +522,10 @@
|
|
|
|
|
"justifyMode": "center",
|
|
|
|
|
"percentChangeColorMode": "standard",
|
|
|
|
|
"noValue": "—",
|
|
|
|
|
"text": {
|
|
|
|
|
"valueSize": 26,
|
|
|
|
|
"titleSize": 11
|
|
|
|
|
},
|
|
|
|
|
"wideLayout": true
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
@@ -633,7 +683,7 @@
|
|
|
|
|
"gridPos": {
|
|
|
|
|
"x": 0,
|
|
|
|
|
"y": 5,
|
|
|
|
|
"w": 6,
|
|
|
|
|
"w": 5,
|
|
|
|
|
"h": 8
|
|
|
|
|
},
|
|
|
|
|
"fieldConfig": {
|
|
|
|
|
@@ -724,9 +774,9 @@
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"gridPos": {
|
|
|
|
|
"x": 6,
|
|
|
|
|
"x": 5,
|
|
|
|
|
"y": 5,
|
|
|
|
|
"w": 18,
|
|
|
|
|
"w": 13,
|
|
|
|
|
"h": 8
|
|
|
|
|
},
|
|
|
|
|
"fieldConfig": {
|
|
|
|
|
@@ -850,6 +900,148 @@
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "stat",
|
|
|
|
|
"title": "Ce que le BMS impose",
|
|
|
|
|
"description": "« Charge max » est la limite que le BMS impose au systeme entier. Le 04/09 elle est tombee de 150 a 20 A en trois minutes, des 76 % de charge, au moment ou l'alarme de tension de cellule s'est declenchee — le parc n'etait alors qu'a 50,76 V pour 53,2 V autorises. Ce n'est pas le parc qui sature, c'est une cellule.",
|
|
|
|
|
"datasource": {
|
|
|
|
|
"type": "influxdb",
|
|
|
|
|
"uid": "evcs-influx"
|
|
|
|
|
},
|
|
|
|
|
"targets": [
|
|
|
|
|
{
|
|
|
|
|
"refId": "A",
|
|
|
|
|
"datasource": {
|
|
|
|
|
"type": "influxdb",
|
|
|
|
|
"uid": "evcs-influx"
|
|
|
|
|
},
|
|
|
|
|
"query": "from(bucket: \"evcs\")\n |> range(start: -48h)\n |> filter(fn: (r) => r._measurement == \"A\" and r.entity_id == \"airtria_8_us2000c_maximum_allowed_charge_current\" and r._field == \"value\")\n |> last()\n |> keep(columns: [\"_time\", \"_value\"])\n |> rename(columns: {_value: \"Charge max\"})"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"refId": "B",
|
|
|
|
|
"datasource": {
|
|
|
|
|
"type": "influxdb",
|
|
|
|
|
"uid": "evcs-influx"
|
|
|
|
|
},
|
|
|
|
|
"query": "from(bucket: \"evcs\")\n |> range(start: -48h)\n |> filter(fn: (r) => r._measurement == \"sensor.airtria_8_us2000c_tension_de_cellule_elevee\" and r._field == \"state\")\n |> last()\n |> keep(columns: [\"_time\", \"_value\"])\n |> rename(columns: {_value: \"Tension cellule\"})"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"refId": "C",
|
|
|
|
|
"datasource": {
|
|
|
|
|
"type": "influxdb",
|
|
|
|
|
"uid": "evcs-influx"
|
|
|
|
|
},
|
|
|
|
|
"query": "from(bucket: \"evcs\")\n |> range(start: -48h)\n |> filter(fn: (r) => r._measurement == \"sensor.airtria_8_us2000c_cell_imbalance\" and r._field == \"state\")\n |> last()\n |> keep(columns: [\"_time\", \"_value\"])\n |> rename(columns: {_value: \"Desequilibre\"})"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"refId": "D",
|
|
|
|
|
"datasource": {
|
|
|
|
|
"type": "influxdb",
|
|
|
|
|
"uid": "evcs-influx"
|
|
|
|
|
},
|
|
|
|
|
"query": "from(bucket: \"evcs\")\n |> range(start: -48h)\n |> filter(fn: (r) => r._measurement == \"%\" and r.entity_id == \"airtria_8_us2000c_state_of_health\" and r._field == \"value\")\n |> last()\n |> keep(columns: [\"_time\", \"_value\"])\n |> rename(columns: {_value: \"Sante\"})"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"gridPos": {
|
|
|
|
|
"x": 18,
|
|
|
|
|
"y": 5,
|
|
|
|
|
"w": 6,
|
|
|
|
|
"h": 8
|
|
|
|
|
},
|
|
|
|
|
"fieldConfig": {
|
|
|
|
|
"defaults": {
|
|
|
|
|
"color": {
|
|
|
|
|
"mode": "thresholds"
|
|
|
|
|
},
|
|
|
|
|
"thresholds": {
|
|
|
|
|
"mode": "absolute",
|
|
|
|
|
"steps": [
|
|
|
|
|
{
|
|
|
|
|
"color": "text",
|
|
|
|
|
"value": null
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"mappings": [
|
|
|
|
|
{
|
|
|
|
|
"type": "value",
|
|
|
|
|
"options": {
|
|
|
|
|
"no_alarm": {
|
|
|
|
|
"text": "OK",
|
|
|
|
|
"color": "green",
|
|
|
|
|
"index": 0
|
|
|
|
|
},
|
|
|
|
|
"warning": {
|
|
|
|
|
"text": "AVERTISSEMENT",
|
|
|
|
|
"color": "orange",
|
|
|
|
|
"index": 1
|
|
|
|
|
},
|
|
|
|
|
"alarm": {
|
|
|
|
|
"text": "ALARME",
|
|
|
|
|
"color": "red",
|
|
|
|
|
"index": 2
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"overrides": [
|
|
|
|
|
{
|
|
|
|
|
"matcher": {
|
|
|
|
|
"id": "byName",
|
|
|
|
|
"options": "Charge max"
|
|
|
|
|
},
|
|
|
|
|
"properties": [
|
|
|
|
|
{
|
|
|
|
|
"id": "unit",
|
|
|
|
|
"value": "amp"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "decimals",
|
|
|
|
|
"value": 0
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"matcher": {
|
|
|
|
|
"id": "byName",
|
|
|
|
|
"options": "Sante"
|
|
|
|
|
},
|
|
|
|
|
"properties": [
|
|
|
|
|
{
|
|
|
|
|
"id": "unit",
|
|
|
|
|
"value": "percent"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "decimals",
|
|
|
|
|
"value": 0
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"options": {
|
|
|
|
|
"reduceOptions": {
|
|
|
|
|
"calcs": [
|
|
|
|
|
"lastNotNull"
|
|
|
|
|
],
|
|
|
|
|
"fields": "",
|
|
|
|
|
"values": false
|
|
|
|
|
},
|
|
|
|
|
"orientation": "horizontal",
|
|
|
|
|
"textMode": "auto",
|
|
|
|
|
"colorMode": "value",
|
|
|
|
|
"graphMode": "none",
|
|
|
|
|
"justifyMode": "center",
|
|
|
|
|
"percentChangeColorMode": "standard",
|
|
|
|
|
"noValue": "—",
|
|
|
|
|
"text": {
|
|
|
|
|
"valueSize": 24,
|
|
|
|
|
"titleSize": 11
|
|
|
|
|
},
|
|
|
|
|
"wideLayout": true
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "timeseries",
|
|
|
|
|
"title": "Les flux",
|
|
|
|
|
@@ -985,12 +1177,22 @@
|
|
|
|
|
"mode": "multi",
|
|
|
|
|
"sort": "desc"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"transformations": [
|
|
|
|
|
{
|
|
|
|
|
"id": "filterFieldsByName",
|
|
|
|
|
"options": {
|
|
|
|
|
"include": {
|
|
|
|
|
"pattern": "^(time|Heure|$vue)$"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "barchart",
|
|
|
|
|
"title": "Energie heure par heure",
|
|
|
|
|
"description": "Obtenue en integrant la puissance, PAS en lisant les compteurs kWh du GX : ceux-ci se remettent a zero sans le signaler (verifie le 04/09, -373 kWh enregistres sur une heure cote Home Assistant).",
|
|
|
|
|
"title": "Energie par periode",
|
|
|
|
|
"description": "Le pas suit la periode choisie : l'heure jusqu'a 4 jours, le jour jusqu'a 70, le mois au-dela. Obtenue en integrant la puissance, PAS en lisant les compteurs kWh du GX : ceux-ci se remettent a zero sans le signaler (verifie le 04/09, -373 kWh enregistres sur une heure cote Home Assistant).",
|
|
|
|
|
"datasource": {
|
|
|
|
|
"type": "grafana-postgresql-datasource",
|
|
|
|
|
"uid": "evcs-pg"
|
|
|
|
|
@@ -1005,7 +1207,7 @@
|
|
|
|
|
"format": "table",
|
|
|
|
|
"rawQuery": true,
|
|
|
|
|
"editorMode": "code",
|
|
|
|
|
"rawSql": "WITH axe AS (\n SELECT generate_series(date_trunc('minute', $__timeFrom()::timestamptz),\n date_trunc('minute', $__timeTo()::timestamptz),\n interval '1 minute') AS t\n),\nreleve AS (\n SELECT date_trunc('minute', ts) AS t,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_pv_power_system') AS Solaire,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_grid_power_l1') AS Reseau,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_consumption_power_l1') AS Maison,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_evcs_ac_power') AS Voiture\n FROM mesure WHERE $__timeFilter(ts) GROUP BY 1\n),\npar_minute AS (\n SELECT axe.t, releve.Solaire, releve.Reseau, releve.Maison, releve.Voiture\n FROM axe LEFT JOIN releve USING (t)\n),\npaliers AS (\n SELECT t, Solaire, Reseau, Maison, Voiture,\n count(Solaire) OVER (ORDER BY t) AS g_Solaire,\n count(Reseau) OVER (ORDER BY t) AS g_Reseau,\n count(Maison) OVER (ORDER BY t) AS g_Maison,\n count(Voiture) OVER (ORDER BY t) AS g_Voiture\n FROM par_minute\n),\nreport AS (\n SELECT t,\n first_value(Solaire) OVER (PARTITION BY g_Solaire ORDER BY t) AS Solaire,\n first_value(Reseau) OVER (PARTITION BY g_Reseau ORDER BY t) AS Reseau,\n first_value(Maison) OVER (PARTITION BY g_Maison ORDER BY t) AS Maison,\n first_value(Voiture) OVER (PARTITION BY g_Voiture ORDER BY t) AS Voiture\n FROM paliers\n)\nSELECT to_char(t, 'DD/MM HH24') AS \"Heure\",\n round((avg(Solaire) * count(Solaire) / 60.0 / 1000.0)::numeric, 2) AS \"Solaire\",\n round((avg(Reseau) * count(Reseau) / 60.0 / 1000.0)::numeric, 2) AS \"Reseau\",\n round((avg(Maison) * count(Maison) / 60.0 / 1000.0)::numeric, 2) AS \"Maison\",\n round((avg(Voiture) * count(Voiture) / 60.0 / 1000.0)::numeric, 2) AS \"Voiture\"\nFROM report\nGROUP BY date_trunc('hour', t), to_char(t, 'DD/MM HH24')\nHAVING count(Solaire) > 0 OR count(Reseau) > 0 OR count(Maison) > 0 OR count(Voiture) > 0\nORDER BY date_trunc('hour', t)"
|
|
|
|
|
"rawSql": "WITH bornes AS (\n SELECT $__timeFrom()::timestamptz AS d, $__timeTo()::timestamptz AS f\n),\n-- Le pas s'adapte a la plage choisie. Sans cela, « 30 derniers jours » rend\n-- 720 barres illisibles — c'est exactement ce que fait VRM en passant de\n-- l'heure au jour puis au mois.\npas AS (\n SELECT CASE WHEN f - d > interval '70 days' THEN 'month'\n WHEN f - d > interval '4 days' THEN 'day'\n ELSE 'hour' END AS unite,\n CASE WHEN f - d > interval '70 days' THEN 'MM/YYYY'\n WHEN f - d > interval '4 days' THEN 'DD/MM'\n ELSE 'DD/MM HH24' END AS forme\n FROM bornes\n),\naxe AS (\n SELECT generate_series(date_trunc('minute', (SELECT d FROM bornes)),\n date_trunc('minute', (SELECT f FROM bornes)),\n interval '1 minute') AS t\n),\nreleve AS (\n SELECT date_trunc('minute', ts) AS t,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_pv_power_system') AS Solaire,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_grid_power_l1') AS Reseau,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_consumption_power_l1') AS Maison,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_evcs_ac_power') AS Voiture\n FROM mesure WHERE $__timeFilter(ts) GROUP BY 1\n),\npar_minute AS (\n SELECT axe.t, releve.Solaire, releve.Reseau, releve.Maison, releve.Voiture\n FROM axe LEFT JOIN releve USING (t)\n),\npaliers AS (\n SELECT t, Solaire, Reseau, Maison, Voiture,\n count(Solaire) OVER (ORDER BY t) AS g_Solaire,\n count(Reseau) OVER (ORDER BY t) AS g_Reseau,\n count(Maison) OVER (ORDER BY t) AS g_Maison,\n count(Voiture) OVER (ORDER BY t) AS g_Voiture\n FROM par_minute\n),\nreport AS (\n SELECT t,\n first_value(Solaire) OVER (PARTITION BY g_Solaire ORDER BY t) AS Solaire,\n first_value(Reseau) OVER (PARTITION BY g_Reseau ORDER BY t) AS Reseau,\n first_value(Maison) OVER (PARTITION BY g_Maison ORDER BY t) AS Maison,\n first_value(Voiture) OVER (PARTITION BY g_Voiture ORDER BY t) AS Voiture\n FROM paliers\n)\nSELECT to_char(date_trunc(pas.unite, t), pas.forme) AS \"Heure\",\n round((avg(Solaire) * count(Solaire) / 60.0 / 1000.0)::numeric, 2) AS \"Solaire\",\n round((avg(Reseau) * count(Reseau) / 60.0 / 1000.0)::numeric, 2) AS \"Reseau\",\n round((avg(Maison) * count(Maison) / 60.0 / 1000.0)::numeric, 2) AS \"Maison\",\n round((avg(Voiture) * count(Voiture) / 60.0 / 1000.0)::numeric, 2) AS \"Voiture\"\nFROM report, pas\nGROUP BY date_trunc(pas.unite, t), pas.forme\nHAVING count(Solaire) > 0 OR count(Reseau) > 0 OR count(Maison) > 0 OR count(Voiture) > 0\nORDER BY date_trunc(pas.unite, t)"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"gridPos": {
|
|
|
|
|
@@ -1045,7 +1247,17 @@
|
|
|
|
|
"mode": "multi",
|
|
|
|
|
"sort": "none"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"transformations": [
|
|
|
|
|
{
|
|
|
|
|
"id": "filterFieldsByName",
|
|
|
|
|
"options": {
|
|
|
|
|
"include": {
|
|
|
|
|
"pattern": "^(time|Heure|$vue)$"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
|