Chauffe-eau : Grafana « Le chauffe-eau », historisation (compteur rattrape depuis le 14/08), jour faible = aussi surplus solaire reel et securite douche de 20 h

This commit is contained in:
Tallagrand Thierry
2026-10-07 07:25:41 +02:00
parent c9e0e4bb5a
commit 36c2fb713a
10 changed files with 654 additions and 12 deletions

View File

@@ -0,0 +1,468 @@
{
"templating": {
"list": []
},
"uid": "evcs-chauffe-eau",
"title": "Le chauffe-eau",
"description": "Quand le chauffe-eau chauffe, et sur quoi : solaire, batterie ou EDF. Les jours faibles il doit chauffer la nuit sur EDF (decision du bilan apres 07:24), jamais sur la batterie.",
"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": false,
"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) AND genre <> 'bilan' ORDER BY 1"
}
}
]
},
"panels": [
{
"type": "stat",
"title": "Maintenant",
"description": "Energie des 24 dernieres heures (securite eau chaude : sous 1,5 kWh il chauffe meme un jour faible) et puissance mesuree par le workflow ECS sur ses 5 dernieres minutes (morte jusqu'au 07/10).",
"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 now() AS time,\n (SELECT valeur FROM mesure WHERE cle = 'sensor.evcs_chauffe_eau_24h_kwh' ORDER BY ts DESC LIMIT 1) AS \"Sur 24 h\",\n (SELECT valeur FROM mesure WHERE cle = 'input_number.victron_water_heater_observed_power_w' ORDER BY ts DESC LIMIT 1) AS \"Puissance\""
}
],
"gridPos": {
"x": 0,
"y": 0,
"w": 8,
"h": 4
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "text",
"value": null
}
]
},
"mappings": []
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Sur 24 h"
},
"properties": [
{
"id": "unit",
"value": "kwatth"
},
{
"id": "decimals",
"value": 2
}
]
},
{
"matcher": {
"id": "byName",
"options": "Puissance"
},
"properties": [
{
"id": "unit",
"value": "watt"
}
]
}
]
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"orientation": "horizontal",
"textMode": "auto",
"colorMode": "value",
"graphMode": "none",
"justifyMode": "center",
"percentChangeColorMode": "standard",
"noValue": "—",
"wideLayout": true
}
},
{
"type": "table",
"title": "Decisions et etats",
"description": "Decision quotidienne du bilan (jour faible : eau chaude en HC de nuit), mise sous tension / coupure, changements de regime (pompe a chaleur, resistance). Journalise depuis le 07/10.",
"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 to_char(ts AT TIME ZONE 'Europe/Paris', 'DD/MM HH24:MI') AS \"Quand\", resume AS \"Quoi\"\nFROM evenement WHERE genre = 'chauffe_eau' AND $__timeFilter(ts) ORDER BY ts DESC"
}
],
"gridPos": {
"x": 8,
"y": 0,
"w": 16,
"h": 8
},
"fieldConfig": {
"defaults": {
"custom": {
"align": "left",
"cellOptions": {
"type": "auto"
},
"filterable": true
}
},
"overrides": []
},
"options": {
"showHeader": true,
"cellHeight": "sm",
"footer": {
"show": false
}
}
},
{
"type": "timeseries",
"title": "Energie par heure, selon d'ou elle venait",
"description": "Une barre par heure. Contexte de l'heure : EDF si le reseau fournit plus de 300 W en moyenne, solaire si la production couvre la maison, batterie sinon (attribution par heure). Le rouge est ce qu'on veut faire disparaitre : de l'eau chauffee sur la batterie.",
"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": "WITH h AS (SELECT generate_series(date_trunc('hour', $__timeFrom()::timestamptz),\n date_trunc('hour', least(now(), $__timeTo()::timestamptz)), interval '1 hour') AS t),\nv AS (SELECT t, (SELECT valeur FROM mesure WHERE cle = 'sensor.tt_chauffe_eau_pleumeur_energie_totale' AND ts <= t\n ORDER BY ts DESC LIMIT 1) AS e FROM h),\nk AS (SELECT t, greatest(0, lead(e) OVER (ORDER BY t) - e) AS kwh FROM v),\nc AS (SELECT k.t, k.kwh,\n coalesce((SELECT avg(valeur) FROM mesure WHERE cle = 'sensor.victron_grid_power_l1' AND ts >= k.t AND ts < k.t + interval '1 hour'), (SELECT valeur FROM mesure WHERE cle = 'sensor.victron_grid_power_l1' AND ts < k.t ORDER BY ts DESC LIMIT 1), 0) AS reseau,\n coalesce((SELECT avg(valeur) FROM mesure WHERE cle = 'sensor.victron_pv_power_system' AND ts >= k.t AND ts < k.t + interval '1 hour'), (SELECT valeur FROM mesure WHERE cle = 'sensor.victron_pv_power_system' AND ts < k.t ORDER BY ts DESC LIMIT 1), 0) AS pv,\n coalesce((SELECT avg(valeur) FROM mesure WHERE cle = 'sensor.victron_consumption_power_l1' AND ts >= k.t AND ts < k.t + interval '1 hour'), (SELECT valeur FROM mesure WHERE cle = 'sensor.victron_consumption_power_l1' AND ts < k.t ORDER BY ts DESC LIMIT 1), 0) AS maison\n FROM k WHERE k.kwh IS NOT NULL),\nx AS (SELECT t, kwh, CASE WHEN reseau > 300 THEN 'EDF' WHEN pv >= maison THEN 'solaire'\n ELSE 'batterie' END AS ctx FROM c)\nSELECT t AS time,\n CASE WHEN ctx = 'solaire' THEN kwh END AS \"Solaire\",\n CASE WHEN ctx = 'batterie' THEN kwh END AS \"Batterie\",\n CASE WHEN ctx = 'EDF' THEN kwh END AS \"EDF\"\nFROM x ORDER BY t"
}
],
"gridPos": {
"x": 0,
"y": 8,
"w": 24,
"h": 9
},
"fieldConfig": {
"defaults": {
"unit": "kwatth",
"color": {
"mode": "palette-classic"
},
"custom": {
"drawStyle": "bars",
"fillOpacity": 85,
"lineWidth": 0,
"stacking": {
"mode": "normal",
"group": "A"
},
"showPoints": "never",
"spanNulls": false
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Solaire"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "yellow"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "Batterie"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "red"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "EDF"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "blue"
}
}
]
}
]
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom",
"showLegend": true,
"calcs": []
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"type": "barchart",
"title": "Par jour",
"description": "kWh du chauffe-eau par jour et par contexte. Repere : le 06/10, 5,4 kWh dont une partie sur la batterie a midi ; un jour faible reussi n'a que du bleu (EDF en heures creuses).",
"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": "WITH h AS (SELECT generate_series(date_trunc('hour', $__timeFrom()::timestamptz),\n date_trunc('hour', least(now(), $__timeTo()::timestamptz)), interval '1 hour') AS t),\nv AS (SELECT t, (SELECT valeur FROM mesure WHERE cle = 'sensor.tt_chauffe_eau_pleumeur_energie_totale' AND ts <= t\n ORDER BY ts DESC LIMIT 1) AS e FROM h),\nk AS (SELECT t, greatest(0, lead(e) OVER (ORDER BY t) - e) AS kwh FROM v),\nc AS (SELECT k.t, k.kwh,\n coalesce((SELECT avg(valeur) FROM mesure WHERE cle = 'sensor.victron_grid_power_l1' AND ts >= k.t AND ts < k.t + interval '1 hour'), (SELECT valeur FROM mesure WHERE cle = 'sensor.victron_grid_power_l1' AND ts < k.t ORDER BY ts DESC LIMIT 1), 0) AS reseau,\n coalesce((SELECT avg(valeur) FROM mesure WHERE cle = 'sensor.victron_pv_power_system' AND ts >= k.t AND ts < k.t + interval '1 hour'), (SELECT valeur FROM mesure WHERE cle = 'sensor.victron_pv_power_system' AND ts < k.t ORDER BY ts DESC LIMIT 1), 0) AS pv,\n coalesce((SELECT avg(valeur) FROM mesure WHERE cle = 'sensor.victron_consumption_power_l1' AND ts >= k.t AND ts < k.t + interval '1 hour'), (SELECT valeur FROM mesure WHERE cle = 'sensor.victron_consumption_power_l1' AND ts < k.t ORDER BY ts DESC LIMIT 1), 0) AS maison\n FROM k WHERE k.kwh IS NOT NULL),\nx AS (SELECT t, kwh, CASE WHEN reseau > 300 THEN 'EDF' WHEN pv >= maison THEN 'solaire'\n ELSE 'batterie' END AS ctx FROM c)\nSELECT to_char(t AT TIME ZONE 'Europe/Paris', 'DD/MM') AS \"Jour\",\n round(sum(kwh) FILTER (WHERE ctx = 'solaire')::numeric, 2) AS \"Solaire\",\n round(sum(kwh) FILTER (WHERE ctx = 'batterie')::numeric, 2) AS \"Batterie\",\n round(sum(kwh) FILTER (WHERE ctx = 'EDF')::numeric, 2) AS \"EDF\"\nFROM x GROUP BY 1, date_trunc('day', t AT TIME ZONE 'Europe/Paris')\nORDER BY date_trunc('day', t AT TIME ZONE 'Europe/Paris')"
}
],
"gridPos": {
"x": 0,
"y": 17,
"w": 24,
"h": 8
},
"fieldConfig": {
"defaults": {
"unit": "kwatth",
"color": {
"mode": "palette-classic"
},
"custom": {
"lineWidth": 1,
"fillOpacity": 80,
"gradientMode": "none",
"axisBorderShow": false
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Solaire"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "yellow"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "Batterie"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "red"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "EDF"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "blue"
}
}
]
}
]
},
"options": {
"orientation": "auto",
"xTickLabelRotation": -45,
"showValue": "never",
"stacking": "none",
"groupWidth": 0.7,
"barWidth": 0.9,
"legend": {
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "none"
}
}
},
{
"type": "timeseries",
"title": "Puissance mesuree et regime",
"description": "Puissance moyenne sur 5 minutes calculee par le workflow ECS depuis le compteur. Pompe a chaleur : puissance basse, ~5 h pour 55 °C ; resistance (~1,2 kW) : de 55 a 65 °C. Disponible depuis le 07/10 (avant, la mesure ne lisait jamais ses horodatages).",
"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 \"Puissance\" FROM mesure\nWHERE cle = 'input_number.victron_water_heater_observed_power_w' AND $__timeFilter(ts) ORDER BY ts"
}
],
"gridPos": {
"x": 0,
"y": 25,
"w": 24,
"h": 8
},
"fieldConfig": {
"defaults": {
"unit": "watt",
"color": {
"mode": "palette-classic"
},
"custom": {
"drawStyle": "line",
"lineInterpolation": "stepAfter",
"fillOpacity": 20
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom",
"showLegend": true,
"calcs": []
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
}
]
}