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