From 1501d7562e0a3533f2270079fc1c3e126a55c1a4 Mon Sep 17 00:00:00 2001 From: Moritz Graf Date: Tue, 7 Jul 2026 21:01:20 +0200 Subject: [PATCH] Adding recent k8s changes --- k8s/home-assistant/home-assistant.secret.yaml | Bin 7445 -> 9399 bytes .../grafana-dashboard-energy-monitor.yaml | 228 +++--- .../grafana-dashboard-fritzbox-hosts.yaml | 200 ++++++ .../grafana-dashboard-fritzbox.yaml | 651 ++++++++++++++++++ .../grafana-dashboard-home-climate.yaml | 312 ++++++--- .../grafana-dashboard-outdoor-weather.yaml | 190 +++-- k8s/monitoring/fritzbox-exporter.secret.yaml | Bin 0 -> 191 bytes k8s/monitoring/fritzbox-exporter.yaml | 103 +++ 8 files changed, 1434 insertions(+), 250 deletions(-) create mode 100644 k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml create mode 100644 k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml create mode 100644 k8s/monitoring/fritzbox-exporter.secret.yaml create mode 100644 k8s/monitoring/fritzbox-exporter.yaml diff --git a/k8s/home-assistant/home-assistant.secret.yaml b/k8s/home-assistant/home-assistant.secret.yaml index 9d7f3aa42310f7920f6ce87978e40581490a1ef3..fac001e9ea8b892cfe39a61ef51fd48cd6523512 100644 GIT binary patch literal 9399 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 TiV&cWB3&4$kt)wPV3N(o3y_o6 diff --git a/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml b/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml index 8d13aaf..c6347d2 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml @@ -1,92 +1,146 @@ apiVersion: v1 +data: + energy-monitor.json: '{"uid": "energy-monitor", "title": "\u26a1 Energy Monitor", + "tags": ["home", "energy", "solar", "power", "auto-generated"], "timezone": "browser", + "schemaVersion": 39, "version": 1, "refresh": "5m", "editable": false, "graphTooltip": + 1, "time": {"from": "now-24h", "to": "now"}, "panels": [{"title": "\u26a1 Live + Power", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 0}, "collapsed": + false}, {"title": "\u2600\ufe0f Solar", "type": "stat", "datasource": {"type": + "prometheus", "uid": "prometheus"}, "gridPos": {"h": 4, "w": 4, "x": 0, "y": 1}, + "fieldConfig": {"defaults": {"unit": "watt", "decimals": 0, "thresholds": {"mode": + "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#FFD700", "value": + 100}, {"color": "#73BF69", "value": 500}, {"color": "#37872D", "value": 2000}]}, + "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": + "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}, "targets": [{"expr": "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_systemleistung\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83c\udfe0 Self-Use", "type": + "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 4, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", + "value": null}, {"color": "#73BF69", "value": 100}, {"color": "#FFD700", "value": + 1000}, {"color": "#FF7383", "value": 3000}]}, "color": {"mode": "thresholds"}}}, + "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", + "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"expr": + "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_eigene_leistung\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udd0c Grid Import", + "type": "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 8, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", + "value": null}, {"color": "#FFD700", "value": 500}, {"color": "#FF7383", "value": + 2000}, {"color": "#C4162A", "value": 5000}]}, "color": {"mode": "thresholds"}}}, + "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", + "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"expr": + "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_bezugsleistung\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\u2197\ufe0f Grid Export", + "type": "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 12, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", + "value": null}, {"color": "#5794F2", "value": 100}, {"color": "#1F60C4", "value": + 500}, {"color": "#3274D9", "value": 2000}]}, "color": {"mode": "thresholds"}}}, + "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", + "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"expr": + "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_einspeiseleistung\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udd0b Battery SoC", + "type": "gauge", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 16, "y": 1}, "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "min": 0, "max": 100, "thresholds": {"mode": "absolute", "steps": + [{"color": "#C4162A", "value": null}, {"color": "#FF7383", "value": 20}, {"color": + "#FFD700", "value": 40}, {"color": "#73BF69", "value": 60}]}, "color": {"mode": + "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, + "orientation": "auto", "showThresholdLabels": true, "showThresholdMarkers": true}, + "targets": [{"expr": "homeassistant_sensor_battery_percent{entity=\"sensor.ladeaufstellung_soc\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83c\udfe1 Total House", + "type": "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 20, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", + "value": null}, {"color": "#73BF69", "value": 200}, {"color": "#FFD700", "value": + 1000}, {"color": "#FF7383", "value": 3000}, {"color": "#C4162A", "value": 5000}]}, + "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": + "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}, "targets": [{"expr": "homeassistant_sensor_power_w{entity=\"sensor.home_strommesserat_currentpowerconsumption\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udcc8 Power Flow", + "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 5}, "collapsed": false}, + {"title": "Power Timeline", "type": "timeseries", "datasource": {"type": "prometheus", + "uid": "prometheus"}, "gridPos": {"h": 10, "w": 24, "x": 0, "y": 6}, "fieldConfig": + {"defaults": {"unit": "watt", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": + true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": + "Solar"}, "properties": [{"id": "color", "value": {"fixedColor": "#FFD700", "mode": + "fixed"}}, {"id": "custom.fillOpacity", "value": 15}]}, {"matcher": {"id": "byName", + "options": "Self-Use"}, "properties": [{"id": "color", "value": {"fixedColor": + "#73BF69", "mode": "fixed"}}]}, {"matcher": {"id": "byName", "options": "Grid + Import"}, "properties": [{"id": "color", "value": {"fixedColor": "#FF7383", "mode": + "fixed"}}]}, {"matcher": {"id": "byName", "options": "Grid Export"}, "properties": + [{"id": "color", "value": {"fixedColor": "#5794F2", "mode": "fixed"}}, {"id": + "custom.lineStyle", "value": {"fill": "dash", "dash": [8, 4]}}]}, {"matcher": + {"id": "byName", "options": "Local Load"}, "properties": [{"id": "color", "value": + {"fixedColor": "#C4162A", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": + "table", "placement": "bottom", "calcs": ["max", "mean", "lastNotNull"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "SOLAR", "expr": "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_systemleistung\"}", + "format": "time_series"}, {"refId": "SELF", "expr": "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_eigene_leistung\"}", + "format": "time_series"}, {"refId": "IMPORT", "expr": "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_bezugsleistung\"}", + "format": "time_series"}, {"refId": "EXPORT", "expr": "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_einspeiseleistung\"}", + "format": "time_series"}, {"refId": "LOAD", "expr": "homeassistant_sensor_power_w{entity=\"sensor.garten_bzp3n7g1b0_lokale_lastleistung\"}", + "format": "time_series"}]}, {"title": "\ud83d\udcca Energy Summary (Today)", "type": + "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 16}, "collapsed": false}, {"title": + "\u2600\ufe0f Solar Produced", "type": "bargauge", "datasource": {"type": "prometheus", + "uid": "prometheus"}, "gridPos": {"h": 4, "w": 6, "x": 0, "y": 17}, "fieldConfig": + {"defaults": {"unit": "kwatth", "decimals": 1, "min": 0, "thresholds": {"mode": + "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#FFD700", "value": + 5}, {"color": "#73BF69", "value": 15}, {"color": "#37872D", "value": 30}]}, "color": + {"mode": "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}, "orientation": "horizontal", "displayMode": "basic", "showUnfilled": + true}, "targets": [{"expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.garten_bzp3n7g1b0_systemerzeugung_heute\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83c\udfe0 Self-Consumed", + "type": "bargauge", "datasource": {"type": "prometheus", "uid": "prometheus"}, + "gridPos": {"h": 4, "w": 6, "x": 6, "y": 17}, "fieldConfig": {"defaults": {"unit": + "kwatth", "decimals": 1, "min": 0, "thresholds": {"mode": "absolute", "steps": + [{"color": "#555", "value": null}, {"color": "#73BF69", "value": 5}, {"color": + "#FFD700", "value": 15}, {"color": "#FF7383", "value": 30}]}, "color": {"mode": + "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, + "orientation": "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": + [{"expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.garten_bzp3n7g1b0_eigenverbrauch_heute\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udd0c Grid Imported", + "type": "bargauge", "datasource": {"type": "prometheus", "uid": "prometheus"}, + "gridPos": {"h": 4, "w": 6, "x": 12, "y": 17}, "fieldConfig": {"defaults": {"unit": + "kwatth", "decimals": 1, "min": 0, "thresholds": {"mode": "absolute", "steps": + [{"color": "#73BF69", "value": null}, {"color": "#FFD700", "value": 2}, {"color": + "#FF7383", "value": 10}, {"color": "#C4162A", "value": 20}]}, "color": {"mode": + "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, + "orientation": "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": + [{"expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.garten_bzp3n7g1b0_netzbezug_heute\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\u2197\ufe0f Grid Exported", + "type": "bargauge", "datasource": {"type": "prometheus", "uid": "prometheus"}, + "gridPos": {"h": 4, "w": 6, "x": 18, "y": 17}, "fieldConfig": {"defaults": {"unit": + "kwatth", "decimals": 1, "min": 0, "thresholds": {"mode": "absolute", "steps": + [{"color": "#555", "value": null}, {"color": "#5794F2", "value": 2}, {"color": + "#1F60C4", "value": 10}, {"color": "#3274D9", "value": 20}]}, "color": {"mode": + "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, + "orientation": "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": + [{"expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.export_ins_netz_heute\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udcc8 Energy Trend", + "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 21}, "collapsed": false}, + {"title": "Daily Energy", "type": "timeseries", "datasource": {"type": "prometheus", + "uid": "prometheus"}, "gridPos": {"h": 10, "w": 24, "x": 0, "y": 22}, "fieldConfig": + {"defaults": {"unit": "kwatth", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": + true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": + "Solar"}, "properties": [{"id": "color", "value": {"fixedColor": "#FFD700", "mode": + "fixed"}}]}, {"matcher": {"id": "byName", "options": "Self-Use"}, "properties": + [{"id": "color", "value": {"fixedColor": "#73BF69", "mode": "fixed"}}]}, {"matcher": + {"id": "byName", "options": "Grid Import"}, "properties": [{"id": "color", "value": + {"fixedColor": "#FF7383", "mode": "fixed"}}]}, {"matcher": {"id": "byName", "options": + "Grid Export"}, "properties": [{"id": "color", "value": {"fixedColor": "#5794F2", + "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": + "bottom", "calcs": ["sum", "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, + "targets": [{"refId": "SOLAR", "expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.garten_bzp3n7g1b0_systemerzeugung_heute\"}", + "format": "time_series"}, {"refId": "SELF", "expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.garten_bzp3n7g1b0_eigenverbrauch_heute\"}", + "format": "time_series"}, {"refId": "IMPORT", "expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.garten_bzp3n7g1b0_netzbezug_heute\"}", + "format": "time_series"}, {"refId": "EXPORT", "expr": "homeassistant_sensor_energy_kwh{entity=\"sensor.export_ins_netz_heute\"}", + "format": "time_series"}]}]}' kind: ConfigMap metadata: - name: grafana-dashboard-energy-monitor - namespace: monitoring + annotations: + grafana_dashboard_folder: "\U0001F3E0 Home" labels: grafana_dashboard: '1' - annotations: - grafana_dashboard_folder: 🏠 Home -data: - energy-monitor.json: '{"uid": "energy-monitor", "title": "⚡ Energy Monitor", "tags": ["home", "energy", "solar", "power", "auto-generated"], "timezone": "browser", "schemaVersion": 39, "version": 1, "refresh": - "5m", "editable": false, "graphTooltip": 1, "time": {"from": "now-24h", "to": "now"}, "panels": [{"title": "⚡ Live Power", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 0}, "collapsed": false}, - {"title": "☀️ Solar", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 0, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", "decimals": - 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#FFD700", "value": 100}, {"color": "#73BF69", "value": 500}, {"color": "#37872D", "value": 2000}]}, "color": - {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: - \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_systemleistung\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "🏠 Self-Use", "type": "stat", "datasource": {"type": "influxdb", - "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 4, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", "value": - null}, {"color": "#73BF69", "value": 100}, {"color": "#FFD700", "value": 1000}, {"color": "#FF7383", "value": 3000}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": - "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_eigene_leistung\")\n |> aggregateWindow(every: v.windowPeriod, - fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "🔌 Grid Import", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, - "gridPos": {"h": 4, "w": 4, "x": 8, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", "value": null}, {"color": "#FFD700", - "value": 500}, {"color": "#FF7383", "value": 2000}, {"color": "#C4162A", "value": 5000}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": - "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) - => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_bezugsleistung\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: - false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "↗️ Grid Export", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, - "w": 4, "x": 12, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#5794F2", "value": 100}, - {"color": "#1F60C4", "value": 500}, {"color": "#3274D9", "value": 2000}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": - {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] - == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_einspeiseleistung\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> - yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "🔋 Battery SoC", "type": "gauge", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": - 16, "y": 1}, "fieldConfig": {"defaults": {"unit": "percent", "decimals": 0, "min": 0, "max": 100, "thresholds": {"mode": "absolute", "steps": [{"color": "#C4162A", "value": null}, {"color": "#FF7383", - "value": 20}, {"color": "#FFD700", "value": 40}, {"color": "#73BF69", "value": 60}]}, "color": {"mode": "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, "orientation": - "auto", "showThresholdLabels": true, "showThresholdMarkers": true}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: -15m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and - r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"ladeaufstellung_soc\")\n |> last()\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "🏡 Total House", "type": - "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 20, "y": 1}, "fieldConfig": {"defaults": {"unit": "watt", "decimals": 0, "thresholds": {"mode": - "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#73BF69", "value": 200}, {"color": "#FFD700", "value": 1000}, {"color": "#FF7383", "value": 3000}, {"color": "#C4162A", "value": 5000}]}, - "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": - "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id - == \"home_strommesserat_currentpowerconsumption\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": - "📈 Power Flow", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 5}, "collapsed": false}, {"title": "Power Timeline", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, - "gridPos": {"h": 10, "w": 24, "x": 0, "y": 6}, "fieldConfig": {"defaults": {"unit": "watt", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": - {"id": "byName", "options": "Solar"}, "properties": [{"id": "color", "value": {"fixedColor": "#FFD700", "mode": "fixed"}}, {"id": "custom.fillOpacity", "value": 15}]}, {"matcher": {"id": "byName", "options": - "Self-Use"}, "properties": [{"id": "color", "value": {"fixedColor": "#73BF69", "mode": "fixed"}}]}, {"matcher": {"id": "byName", "options": "Grid Import"}, "properties": [{"id": "color", "value": {"fixedColor": - "#FF7383", "mode": "fixed"}}]}, {"matcher": {"id": "byName", "options": "Grid Export"}, "properties": [{"id": "color", "value": {"fixedColor": "#5794F2", "mode": "fixed"}}, {"id": "custom.lineStyle", - "value": {"fill": "dash", "dash": [8, 4]}}]}, {"matcher": {"id": "byName", "options": "Local Load"}, "properties": [{"id": "color", "value": {"fixedColor": "#C4162A", "mode": "fixed"}}]}]}, "options": - {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["max", "mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "SOLAR", "query": "from(bucket: - \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_systemleistung\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"source\", value: \"Solar\")", "resultFormat": "time_series"}, {"refId": "SELF", "query": - "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id - == \"garten_bzp3n7g1b0_eigene_leistung\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"source\", value: \"Self-Use\")", "resultFormat": - "time_series"}, {"refId": "IMPORT", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] - == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_bezugsleistung\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> - set(key: \"source\", value: \"Grid Import\")", "resultFormat": "time_series"}, {"refId": "EXPORT", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_einspeiseleistung\")\n |> aggregateWindow(every: v.windowPeriod, - fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"source\", value: \"Grid Export\")", "resultFormat": "time_series"}, {"refId": "LOAD", "query": "from(bucket: \"default\")\n |> - range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"W\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_lokale_lastleistung\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"source\", value: \"Local Load\")", "resultFormat": "time_series"}]}, {"title": "📊 Energy - Summary (Today)", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 16}, "collapsed": false}, {"title": "☀️ Solar Produced", "type": "bargauge", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, - "gridPos": {"h": 4, "w": 6, "x": 0, "y": 17}, "fieldConfig": {"defaults": {"unit": "kwatth", "decimals": 1, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", "value": null}, {"color": - "#FFD700", "value": 5}, {"color": "#73BF69", "value": 15}, {"color": "#37872D", "value": 30}]}, "color": {"mode": "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, - "orientation": "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: -15m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"kWh\" - and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_systemerzeugung_heute\")\n |> last()\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": - "🏠 Self-Consumed", "type": "bargauge", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 6, "x": 6, "y": 17}, "fieldConfig": {"defaults": {"unit": "kwatth", "decimals": - 1, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#73BF69", "value": 5}, {"color": "#FFD700", "value": 15}, {"color": "#FF7383", "value": 30}]}, - "color": {"mode": "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, "orientation": "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": [{"query": - "from(bucket: \"default\")\n |> range(start: -15m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"kWh\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_eigenverbrauch_heute\")\n |> - last()\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "🔌 Grid Imported", "type": "bargauge", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": - 4, "w": 6, "x": 12, "y": 17}, "fieldConfig": {"defaults": {"unit": "kwatth", "decimals": 1, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", "value": null}, {"color": "#FFD700", - "value": 2}, {"color": "#FF7383", "value": 10}, {"color": "#C4162A", "value": 20}]}, "color": {"mode": "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, "orientation": - "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: -15m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"kWh\" and r[\"_field\"] - == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_netzbezug_heute\")\n |> last()\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "↗️ Grid Exported", - "type": "bargauge", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 6, "x": 18, "y": 17}, "fieldConfig": {"defaults": {"unit": "kwatth", "decimals": 1, "min": - 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#555", "value": null}, {"color": "#5794F2", "value": 2}, {"color": "#1F60C4", "value": 10}, {"color": "#3274D9", "value": 20}]}, "color": {"mode": - "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, "orientation": "horizontal", "displayMode": "basic", "showUnfilled": true}, "targets": [{"query": "from(bucket: - \"default\")\n |> range(start: -15m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"kWh\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"export_ins_netz_heute\")\n |> last()\n |> - yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "📈 Energy Trend", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 21}, "collapsed": false}, {"title": "Daily Energy", "type": - "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 10, "w": 24, "x": 0, "y": 22}, "fieldConfig": {"defaults": {"unit": "kwatth", "custom": {"lineWidth": 2, - "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": "Solar"}, "properties": [{"id": "color", "value": {"fixedColor": "#FFD700", "mode": - "fixed"}}]}, {"matcher": {"id": "byName", "options": "Self-Use"}, "properties": [{"id": "color", "value": {"fixedColor": "#73BF69", "mode": "fixed"}}]}, {"matcher": {"id": "byName", "options": "Grid - Import"}, "properties": [{"id": "color", "value": {"fixedColor": "#FF7383", "mode": "fixed"}}]}, {"matcher": {"id": "byName", "options": "Grid Export"}, "properties": [{"id": "color", "value": {"fixedColor": - "#5794F2", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["sum", "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": - "SOLAR", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"kWh\" and r[\"_field\"] == \"value\")\n |> - filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_systemerzeugung_heute\")\n |> aggregateWindow(every: 1d, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"type\", value: - \"Solar\")", "resultFormat": "time_series"}, {"refId": "SELF", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] - == \"kWh\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_eigenverbrauch_heute\")\n |> aggregateWindow(every: 1d, fn: mean, createEmpty: false)\n |> yield(name: - \"mean\") |> set(key: \"type\", value: \"Self-Use\")", "resultFormat": "time_series"}, {"refId": "IMPORT", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"kWh\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"garten_bzp3n7g1b0_netzbezug_heute\")\n |> aggregateWindow(every: 1d, fn: mean, - createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"type\", value: \"Grid Import\")", "resultFormat": "time_series"}, {"refId": "EXPORT", "query": "from(bucket: \"default\")\n |> range(start: - v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"kWh\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"export_ins_netz_heute\")\n |> - aggregateWindow(every: 1d, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"type\", value: \"Grid Export\")", "resultFormat": "time_series"}]}]}' + name: grafana-dashboard-energy-monitor + namespace: monitoring diff --git a/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml new file mode 100644 index 0000000..65b26e3 --- /dev/null +++ b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml @@ -0,0 +1,200 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-fritzbox-hosts + namespace: monitoring + labels: + grafana_dashboard: '1' + annotations: + grafana_dashboard_folder: "🏠 Home" +data: + fritzbox-hosts.json: |- + { + "uid": "fritzbox-hosts", + "title": "📶 FRITZ!Box Home Network", + "tags": ["network", "fritzbox", "hosts", "prometheus"], + "timezone": "browser", + "schemaVersion": 39, + "version": 1, + "refresh": "30s", + "editable": false, + "graphTooltip": 2, + "time": { + "from": "now-24h", + "to": "now" + }, + "panels": [ + { + "title": "Device Status", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 0, + "y": 0 + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "type": "value", + "options": { + "0": { + "text": "OFFLINE", + "color": "red" + }, + "1": { + "text": "ONLINE", + "color": "green" + } + } + } + ], + "color": { + "mode": "thresholds" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "background", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_host_active{hostname=\"$host\"}", + "legendFormat": "Status", + "refId": "A" + } + ] + }, + { + "title": "Device Info", + "type": "table", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 5, + "w": 16, + "x": 8, + "y": 0 + }, + "targets": [ + { + "expr": "gateway_host_active{hostname=\"$host\"}", + "format": "table", + "instant": true, + "refId": "A" + } + ], + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true, + "__name__": true, + "gateway": true, + "job": true, + "instance": true, + "hostname": true + }, + "renameByName": { + "ipaddress": "IP Address", + "macaddress": "MAC Address", + "interfacetype": "Connection Interface" + } + } + } + ] + }, + { + "title": "Connection History", + "type": "state-timeline", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 5 + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "type": "value", + "options": { + "0": { + "text": "OFFLINE", + "color": "red" + }, + "1": { + "text": "ONLINE", + "color": "green" + } + } + } + ], + "color": { + "mode": "thresholds" + } + } + }, + "options": { + "showValue": "never", + "align": "left", + "mergeValues": true + }, + "targets": [ + { + "expr": "gateway_host_active{hostname=\"$host\"}", + "legendFormat": "{{hostname}}", + "refId": "A" + } + ] + } + ], + "templating": { + "list": [ + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "definition": "label_values(gateway_host_active, hostname)", + "hide": 0, + "includeAll": false, + "label": "Select Local Device", + "multi": false, + "name": "host", + "options": [], + "query": { + "query": "label_values(gateway_host_active, hostname)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + } + } diff --git a/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml new file mode 100644 index 0000000..f1da482 --- /dev/null +++ b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml @@ -0,0 +1,651 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-fritzbox + namespace: monitoring + labels: + grafana_dashboard: '1' + annotations: + grafana_dashboard_folder: "🏠 Home" +data: + fritzbox.json: |- + { + "uid": "fritzbox", + "title": "📶 FRITZ!Box Status", + "tags": ["network", "fritzbox", "infrastructure", "prometheus"], + "timezone": "browser", + "schemaVersion": 39, + "version": 1, + "refresh": "10s", + "editable": false, + "graphTooltip": 2, + "time": { + "from": "now-24h", + "to": "now" + }, + "panels": [ + { + "title": "🌐 WAN Connectivity", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "collapsed": false + }, + { + "title": "IP Connection Status", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 1 + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "type": "value", + "options": { + "0": { + "text": "DISCONNECTED", + "color": "red" + }, + "1": { + "text": "CONNECTED", + "color": "green" + } + } + } + ], + "color": { + "mode": "thresholds" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "background", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_connection_status{connection=\"IP\"}", + "legendFormat": "IP Status", + "refId": "A" + } + ] + }, + { + "title": "DSL Link Status", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 1 + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "type": "value", + "options": { + "0": { + "text": "LINK DOWN", + "color": "red" + }, + "1": { + "text": "LINK UP", + "color": "green" + } + } + } + ], + "color": { + "mode": "thresholds" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "background", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_connection_status{connection=\"Physical Link\"}", + "legendFormat": "DSL Link", + "refId": "A" + } + ] + }, + { + "title": "Connection Uptime", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 1 + }, + "fieldConfig": { + "defaults": { + "unit": "s", + "color": { + "mode": "fixed", + "fixedColor": "blue" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "value", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_connection_uptime_seconds", + "legendFormat": "Uptime", + "refId": "A" + } + ] + }, + { + "title": "Downstream DSL Sync", + "type": "gauge", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 1 + }, + "fieldConfig": { + "defaults": { + "unit": "bps", + "min": 0, + "max": 300000000, + "color": { + "mode": "fixed", + "fixedColor": "green" + } + } + }, + "options": { + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_max_bitrate{direction=\"Down\"}", + "legendFormat": "Down Sync", + "refId": "A" + } + ] + }, + { + "title": "Upstream DSL Sync", + "type": "gauge", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 1 + }, + "fieldConfig": { + "defaults": { + "unit": "bps", + "min": 0, + "max": 50000000, + "color": { + "mode": "fixed", + "fixedColor": "green" + } + } + }, + "options": { + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_max_bitrate{direction=\"Up\"}", + "legendFormat": "Up Sync", + "refId": "A" + } + ] + }, + { + "title": "📈 Traffic & Speed", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "collapsed": false + }, + { + "title": "Real-time Traffic Rates", + "type": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 0, + "y": 6 + }, + "fieldConfig": { + "defaults": { + "unit": "Bps", + "custom": { + "lineWidth": 2, + "fillOpacity": 10, + "spanNulls": true, + "showPoints": "never" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Download (Rx)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#4CAF50", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Upload (Tx)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2196F3", + "mode": "fixed" + } + } + ] + } + ] + }, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "calcs": [ + "lastNotNull", + "mean", + "max" + ] + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "expr": "gateway_traffic_rate{direction=\"Received\"}", + "legendFormat": "Download (Rx)", + "refId": "A" + }, + { + "expr": "gateway_traffic_rate{direction=\"Sent\"}", + "legendFormat": "Upload (Tx)", + "refId": "B" + } + ] + }, + { + "title": "Total Downloaded Data", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 8, + "x": 16, + "y": 6 + }, + "fieldConfig": { + "defaults": { + "unit": "bytes", + "color": { + "mode": "fixed", + "fixedColor": "green" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "value", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_traffic_64{direction=\"Received\", unit=\"Bytes\"}", + "legendFormat": "Total Downloaded", + "refId": "A" + } + ] + }, + { + "title": "Total Uploaded Data", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 8, + "x": 16, + "y": 10 + }, + "fieldConfig": { + "defaults": { + "unit": "bytes", + "color": { + "mode": "fixed", + "fixedColor": "blue" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "value", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "gateway_traffic_64{direction=\"Sent\", unit=\"Bytes\"}", + "legendFormat": "Total Uploaded", + "refId": "A" + } + ] + }, + { + "title": "🛡️ WireGuard VPN Tunnel", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "collapsed": false + }, + { + "title": "VPN Connection Status", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 15 + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "type": "value", + "options": { + "0": { + "text": "DISCONNECTED", + "color": "red" + }, + "1": { + "text": "CONNECTED", + "color": "green" + } + } + } + ], + "color": { + "mode": "thresholds" + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "background", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "(time() - wireguard_latest_handshake_seconds{interface=\"wg0\"} < 300) or on() vector(0)", + "legendFormat": "VPN Status", + "refId": "A" + } + ] + }, + { + "title": "Last VPN Handshake", + "type": "stat", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 15 + }, + "fieldConfig": { + "defaults": { + "unit": "s", + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 300 + }, + { + "color": "red", + "value": 600 + } + ] + } + } + }, + "options": { + "graphMode": "none", + "colorMode": "value", + "textMode": "auto", + "reduceOptions": { + "values": false, + "calcs": [ + "lastNotNull" + ] + } + }, + "targets": [ + { + "expr": "time() - wireguard_latest_handshake_seconds{interface=\"wg0\"}", + "legendFormat": "Handshake Delay", + "refId": "A" + } + ] + }, + { + "title": "VPN Traffic Rates", + "type": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 15 + }, + "fieldConfig": { + "defaults": { + "unit": "Bps", + "custom": { + "lineWidth": 2, + "fillOpacity": 10, + "spanNulls": true, + "showPoints": "never" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Received (Rx)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#4CAF50", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Sent (Tx)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2196F3", + "mode": "fixed" + } + } + ] + } + ] + }, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "calcs": [ + "lastNotNull", + "mean", + "max" + ] + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "expr": "rate(wireguard_received_bytes_total{interface=\"wg0\"}[5m])", + "legendFormat": "Received (Rx)", + "refId": "A" + }, + { + "expr": "rate(wireguard_sent_bytes_total{interface=\"wg0\"}[5m])", + "legendFormat": "Sent (Tx)", + "refId": "B" + } + ] + } + ] + } diff --git a/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml b/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml index 71703c6..588cac2 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml @@ -1,98 +1,224 @@ apiVersion: v1 +data: + home-climate.json: '{"uid": "home-climate", "title": "\ud83c\udfe0 Home Climate", + "tags": ["home", "climate", "temperature", "humidity", "auto-generated", "prometheus"], + "timezone": "browser", "schemaVersion": 39, "version": 2, "refresh": "5m", "editable": + false, "graphTooltip": 1, "time": {"from": "now-24h", "to": "now"}, "panels": + [{"type": "row", "title": "\ud83c\udf10 Overview Trends", "gridPos": {"x": 0, + "y": 0, "w": 24, "h": 1}, "collapsed": false}, {"type": "timeseries", "title": + "Indoor vs Outdoor Temperature", "datasource": {"type": "prometheus", "uid": "prometheus"}, + "gridPos": {"x": 0, "y": 1, "w": 12, "h": 8}, "targets": [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.regensburg_regensburg_temperatur\"}", + "legendFormat": "Outdoor (Regensburg)"}, {"expr": "avg(homeassistant_sensor_temperature_celsius{entity=~\"sensor.home_.*_thermostat_temperature|sensor.home_wall_mounted_thermostat_pro_temperature\"})", + "legendFormat": "Average Indoor"}], "fieldConfig": {"defaults": {"unit": "celsius", + "custom": {"lineWidth": 2, "fillOpacity": 5}}, "overrides": [{"matcher": {"id": + "byName", "options": "Outdoor (Regensburg)"}, "properties": [{"id": "color", "value": + {"fixedColor": "light-blue", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": + {"fill": "dash", "dash": [10, 5]}}]}, {"matcher": {"id": "byName", "options": + "Average Indoor"}, "properties": [{"id": "color", "value": {"fixedColor": "orange", + "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": + "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": + "desc"}}}, {"type": "timeseries", "title": "Average Indoor Humidity", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 12, "y": 1, "w": + 12, "h": 8}, "targets": [{"expr": "avg(homeassistant_sensor_humidity_percent{entity=~\".*_humidity\"})", + "legendFormat": "Average Humidity"}], "fieldConfig": {"defaults": {"unit": "percent", + "custom": {"lineWidth": 2, "fillOpacity": 20}, "color": {"mode": "fixed", "fixedColor": + "blue"}}}, "options": {"legend": {"displayMode": "table", "placement": "bottom", + "calcs": ["mean", "lastNotNull"]}, "tooltip": {"mode": "multi"}}}, {"type": "row", + "title": "\ud83d\udcca Room Details", "gridPos": {"x": 0, "y": 9, "w": 24, "h": + 1}, "collapsed": false}, {"type": "timeseries", "title": "Wohnzimmer", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 0, "y": 10, "w": + 12, "h": 9}, "targets": [{"expr": "homeassistant_climate_target_temperature_celsius{entity=\"climate.home_wohnzimmer\"}", + "legendFormat": "\ud83c\udfaf Target"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wall_mounted_thermostat_pro_temperature\"}", + "legendFormat": "\ud83c\udf21\ufe0f Thermostat"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wohnzimmer_temperature\"}", + "legendFormat": "\ud83d\udd25 Heater"}, {"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_wall_mounted_thermostat_pro_humidity\"}", + "legendFormat": "\ud83d\udca7 Humidity"}], "fieldConfig": {"defaults": {"unit": + "celsius", "custom": {"spanNulls": true}}, "overrides": [{"matcher": {"id": "byName", + "options": "\ud83c\udfaf Target"}, "properties": [{"id": "custom.lineStyle", "value": + {"fill": "dash", "dash": [10, 10]}}, {"id": "color", "value": {"fixedColor": "dark-orange", + "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 3}]}, {"matcher": {"id": + "byName", "options": "\ud83c\udf21\ufe0f Thermostat"}, "properties": [{"id": "color", + "value": {"fixedColor": "orange", "mode": "fixed"}}, {"id": "custom.lineWidth", + "value": 2}]}, {"matcher": {"id": "byRegexp", "options": ".*Heater.*"}, "properties": + [{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [2, 5]}}, {"id": + "color", "value": {"fixedColor": "red", "mode": "fixed"}}]}, {"matcher": {"id": + "byName", "options": "\ud83d\udca7 Humidity"}, "properties": [{"id": "custom.axisPlacement", + "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "custom.fillOpacity", + "value": 10}, {"id": "custom.lineWidth", "value": 1}, {"id": "color", "value": + {"fixedColor": "blue", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": + "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}}, {"type": "timeseries", "title": "Wohnzimmer + #2", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": + 12, "y": 10, "w": 12, "h": 9}, "targets": [{"expr": "homeassistant_climate_target_temperature_celsius{entity=\"climate.home_wohnzimmer_2_og\"}", + "legendFormat": "\ud83c\udfaf Target"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wohnzimmer_2_thermostat_temperature\"}", + "legendFormat": "\ud83c\udf21\ufe0f Thermostat"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wohnzimmer_2_temperature\"}", + "legendFormat": "\ud83d\udd25 Heater"}, {"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_wohnzimmer_2_thermostat_humidity\"}", + "legendFormat": "\ud83d\udca7 Humidity"}], "fieldConfig": {"defaults": {"unit": + "celsius", "custom": {"spanNulls": true}}, "overrides": [{"matcher": {"id": "byName", + "options": "\ud83c\udfaf Target"}, "properties": [{"id": "custom.lineStyle", "value": + {"fill": "dash", "dash": [10, 10]}}, {"id": "color", "value": {"fixedColor": "dark-orange", + "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 3}]}, {"matcher": {"id": + "byName", "options": "\ud83c\udf21\ufe0f Thermostat"}, "properties": [{"id": "color", + "value": {"fixedColor": "orange", "mode": "fixed"}}, {"id": "custom.lineWidth", + "value": 2}]}, {"matcher": {"id": "byRegexp", "options": ".*Heater.*"}, "properties": + [{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [2, 5]}}, {"id": + "color", "value": {"fixedColor": "red", "mode": "fixed"}}]}, {"matcher": {"id": + "byName", "options": "\ud83d\udca7 Humidity"}, "properties": [{"id": "custom.axisPlacement", + "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "custom.fillOpacity", + "value": 10}, {"id": "custom.lineWidth", "value": 1}, {"id": "color", "value": + {"fixedColor": "blue", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": + "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}}, {"type": "timeseries", "title": "Arbeitszimmer", + "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 0, + "y": 19, "w": 12, "h": 9}, "targets": [{"expr": "homeassistant_climate_target_temperature_celsius{entity=\"climate.home_arbeitszimmer_og\"}", + "legendFormat": "\ud83c\udfaf Target"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_arbeitszimmer_thermostat_temperature\"}", + "legendFormat": "\ud83c\udf21\ufe0f Thermostat"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_arbeitszimmer_temperature\"}", + "legendFormat": "\ud83d\udd25 Heater"}, {"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_arbeitszimmer_thermostat_humidity\"}", + "legendFormat": "\ud83d\udca7 Humidity"}], "fieldConfig": {"defaults": {"unit": + "celsius", "custom": {"spanNulls": true}}, "overrides": [{"matcher": {"id": "byName", + "options": "\ud83c\udfaf Target"}, "properties": [{"id": "custom.lineStyle", "value": + {"fill": "dash", "dash": [10, 10]}}, {"id": "color", "value": {"fixedColor": "dark-orange", + "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 3}]}, {"matcher": {"id": + "byName", "options": "\ud83c\udf21\ufe0f Thermostat"}, "properties": [{"id": "color", + "value": {"fixedColor": "orange", "mode": "fixed"}}, {"id": "custom.lineWidth", + "value": 2}]}, {"matcher": {"id": "byRegexp", "options": ".*Heater.*"}, "properties": + [{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [2, 5]}}, {"id": + "color", "value": {"fixedColor": "red", "mode": "fixed"}}]}, {"matcher": {"id": + "byName", "options": "\ud83d\udca7 Humidity"}, "properties": [{"id": "custom.axisPlacement", + "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "custom.fillOpacity", + "value": 10}, {"id": "custom.lineWidth", "value": 1}, {"id": "color", "value": + {"fixedColor": "blue", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": + "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}}, {"type": "timeseries", "title": "K\u00fcche", + "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 12, + "y": 19, "w": 12, "h": 9}, "targets": [{"expr": "homeassistant_climate_target_temperature_celsius{entity=\"climate.home_kuche\"}", + "legendFormat": "\ud83c\udfaf Target"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_kuche_wandthermostat_temperature\"}", + "legendFormat": "\ud83c\udf21\ufe0f Thermostat"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_kuche_vorne_temperature\"}", + "legendFormat": "\ud83d\udd25 Heater 1"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_kuche_bar_temperature\"}", + "legendFormat": "\ud83d\udd25 Heater 2"}, {"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_kuche_wandthermostat_humidity\"}", + "legendFormat": "\ud83d\udca7 Humidity"}], "fieldConfig": {"defaults": {"unit": + "celsius", "custom": {"spanNulls": true}}, "overrides": [{"matcher": {"id": "byName", + "options": "\ud83c\udfaf Target"}, "properties": [{"id": "custom.lineStyle", "value": + {"fill": "dash", "dash": [10, 10]}}, {"id": "color", "value": {"fixedColor": "dark-orange", + "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 3}]}, {"matcher": {"id": + "byName", "options": "\ud83c\udf21\ufe0f Thermostat"}, "properties": [{"id": "color", + "value": {"fixedColor": "orange", "mode": "fixed"}}, {"id": "custom.lineWidth", + "value": 2}]}, {"matcher": {"id": "byRegexp", "options": ".*Heater.*"}, "properties": + [{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [2, 5]}}, {"id": + "color", "value": {"fixedColor": "red", "mode": "fixed"}}]}, {"matcher": {"id": + "byName", "options": "\ud83d\udca7 Humidity"}, "properties": [{"id": "custom.axisPlacement", + "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "custom.fillOpacity", + "value": 10}, {"id": "custom.lineWidth", "value": 1}, {"id": "color", "value": + {"fixedColor": "blue", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": + "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}}, {"type": "timeseries", "title": "Badezimmer", + "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 0, + "y": 28, "w": 12, "h": 9}, "targets": [{"expr": "homeassistant_climate_target_temperature_celsius{entity=\"climate.home_badezimmer\"}", + "legendFormat": "\ud83c\udfaf Target"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wandthermostat_bad_temperature\"}", + "legendFormat": "\ud83c\udf21\ufe0f Thermostat"}, {"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_badezimmer_thermostat_temperature\"}", + "legendFormat": "\ud83d\udd25 Heater"}, {"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_wandthermostat_bad_humidity\"}", + "legendFormat": "\ud83d\udca7 Humidity"}], "fieldConfig": {"defaults": {"unit": + "celsius", "custom": {"spanNulls": true}}, "overrides": [{"matcher": {"id": "byName", + "options": "\ud83c\udfaf Target"}, "properties": [{"id": "custom.lineStyle", "value": + {"fill": "dash", "dash": [10, 10]}}, {"id": "color", "value": {"fixedColor": "dark-orange", + "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 3}]}, {"matcher": {"id": + "byName", "options": "\ud83c\udf21\ufe0f Thermostat"}, "properties": [{"id": "color", + "value": {"fixedColor": "orange", "mode": "fixed"}}, {"id": "custom.lineWidth", + "value": 2}]}, {"matcher": {"id": "byRegexp", "options": ".*Heater.*"}, "properties": + [{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [2, 5]}}, {"id": + "color", "value": {"fixedColor": "red", "mode": "fixed"}}]}, {"matcher": {"id": + "byName", "options": "\ud83d\udca7 Humidity"}, "properties": [{"id": "custom.axisPlacement", + "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "custom.fillOpacity", + "value": 10}, {"id": "custom.lineWidth", "value": 1}, {"id": "color", "value": + {"fixedColor": "blue", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": + "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}}, {"type": "row", "title": "\ud83c\udf21\ufe0f + Current State", "gridPos": {"x": 0, "y": 37, "w": 24, "h": 1}, "collapsed": false}, + {"type": "stat", "title": "Wohnzimmer Temp", "datasource": {"type": "prometheus", + "uid": "prometheus"}, "gridPos": {"x": 2, "y": 38, "w": 4, "h": 4}, "targets": + [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wall_mounted_thermostat_pro_temperature\"}", + "legendFormat": "Temp"}], "fieldConfig": {"defaults": {"unit": "celsius", "decimals": + 1, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", "steps": + [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": + "orange", "value": 22}, {"color": "red", "value": 26}]}}}, "options": {"graphMode": + "area", "colorMode": "background", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}}, {"type": "stat", "title": "Wohnzimmer #2 Temp", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 6, "y": 38, "w": + 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wohnzimmer_2_thermostat_temperature\"}", + "legendFormat": "Temp"}], "fieldConfig": {"defaults": {"unit": "celsius", "decimals": + 1, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", "steps": + [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": + "orange", "value": 22}, {"color": "red", "value": 26}]}}}, "options": {"graphMode": + "area", "colorMode": "background", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}}, {"type": "stat", "title": "Arbeitszimmer Temp", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 10, "y": 38, "w": + 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_arbeitszimmer_thermostat_temperature\"}", + "legendFormat": "Temp"}], "fieldConfig": {"defaults": {"unit": "celsius", "decimals": + 1, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", "steps": + [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": + "orange", "value": 22}, {"color": "red", "value": 26}]}}}, "options": {"graphMode": + "area", "colorMode": "background", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}}, {"type": "stat", "title": "K\u00fcche Temp", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 14, "y": 38, "w": + 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_kuche_wandthermostat_temperature\"}", + "legendFormat": "Temp"}], "fieldConfig": {"defaults": {"unit": "celsius", "decimals": + 1, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", "steps": + [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": + "orange", "value": 22}, {"color": "red", "value": 26}]}}}, "options": {"graphMode": + "area", "colorMode": "background", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}}, {"type": "stat", "title": "Badezimmer Temp", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 18, "y": 38, "w": + 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.home_wandthermostat_bad_temperature\"}", + "legendFormat": "Temp"}], "fieldConfig": {"defaults": {"unit": "celsius", "decimals": + 1, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", "steps": + [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": + "orange", "value": 22}, {"color": "red", "value": 26}]}}}, "options": {"graphMode": + "area", "colorMode": "background", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}}, {"type": "stat", "title": "Wohnzimmer Hum", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": 2, "y": 42, "w": + 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_wall_mounted_thermostat_pro_humidity\"}", + "legendFormat": "Humidity"}], "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", + "steps": [{"color": "red", "value": null}, {"color": "orange", "value": 30}, {"color": + "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": + 70}]}}}, "options": {"graphMode": "area", "colorMode": "background", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}}, {"type": "stat", "title": "Wohnzimmer + #2 Hum", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"x": 6, "y": 42, "w": 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_wohnzimmer_2_thermostat_humidity\"}", + "legendFormat": "Humidity"}], "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", + "steps": [{"color": "red", "value": null}, {"color": "orange", "value": 30}, {"color": + "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": + 70}]}}}, "options": {"graphMode": "area", "colorMode": "background", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}}, {"type": "stat", "title": "Arbeitszimmer + Hum", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": + 10, "y": 42, "w": 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_arbeitszimmer_thermostat_humidity\"}", + "legendFormat": "Humidity"}], "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", + "steps": [{"color": "red", "value": null}, {"color": "orange", "value": 30}, {"color": + "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": + 70}]}}}, "options": {"graphMode": "area", "colorMode": "background", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}}, {"type": "stat", "title": "K\u00fcche + Hum", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": + 14, "y": 42, "w": 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_kuche_wandthermostat_humidity\"}", + "legendFormat": "Humidity"}], "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", + "steps": [{"color": "red", "value": null}, {"color": "orange", "value": 30}, {"color": + "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": + 70}]}}}, "options": {"graphMode": "area", "colorMode": "background", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}}, {"type": "stat", "title": "Badezimmer + Hum", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"x": + 18, "y": 42, "w": 4, "h": 4}, "targets": [{"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.home_wandthermostat_bad_humidity\"}", + "legendFormat": "Humidity"}], "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "color": {"mode": "thresholds"}, "thresholds": {"mode": "absolute", + "steps": [{"color": "red", "value": null}, {"color": "orange", "value": 30}, {"color": + "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": + 70}]}}}, "options": {"graphMode": "area", "colorMode": "background", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}}]}' kind: ConfigMap metadata: - name: grafana-dashboard-home-climate - namespace: monitoring + annotations: + grafana_dashboard_folder: "\U0001F3E0 Home" labels: grafana_dashboard: '1' - annotations: - grafana_dashboard_folder: 🏠 Home -data: - home-climate.json: '{"uid": "home-climate", "title": "🏠 Home Climate", "tags": ["home", "climate", "temperature", "humidity", "auto-generated"], "timezone": "browser", "schemaVersion": 39, "version": - 1, "refresh": "5m", "editable": false, "graphTooltip": 1, "time": {"from": "now-24h", "to": "now"}, "panels": [{"title": "🌡️ Current Temperatures", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, - "y": 0}, "collapsed": false}, {"title": "Wohnzimmer", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 0, "y": 1}, "fieldConfig": {"defaults": - {"unit": "celsius", "decimals": 1, "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": "orange", "value": 22}, {"color": "red", - "value": 26}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": - [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: - (r) => r.entity_id == \"home_wall_mounted_thermostat_pro_temperature\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, - {"title": "Wohnzimmer #2", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 4, "y": 1}, "fieldConfig": {"defaults": {"unit": "celsius", - "decimals": 1, "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": "orange", "value": 22}, {"color": "red", "value": 26}]}, "color": - {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: - \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == - \"home_wohnzimmer_2_thermostat_temperature\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Arbeitszimmer", - "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 8, "y": 1}, "fieldConfig": {"defaults": {"unit": "celsius", "decimals": 1, "thresholds": - {"mode": "absolute", "steps": [{"color": "blue", "value": null}, {"color": "green", "value": 18}, {"color": "orange", "value": 22}, {"color": "red", "value": 26}]}, "color": {"mode": "thresholds"}}}, - "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> - range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_arbeitszimmer_thermostat_temperature\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Küche", "type": "stat", "datasource": {"type": "influxdb", - "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 12, "y": 1}, "fieldConfig": {"defaults": {"unit": "celsius", "decimals": 1, "thresholds": {"mode": "absolute", "steps": [{"color": "blue", - "value": null}, {"color": "green", "value": 18}, {"color": "orange", "value": 22}, {"color": "red", "value": 26}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", - "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_kuche_wandthermostat_temperature\")\n |> aggregateWindow(every: v.windowPeriod, - fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Bad", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": - {"h": 4, "w": 4, "x": 16, "y": 1}, "fieldConfig": {"defaults": {"unit": "celsius", "decimals": 1, "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}, {"color": "green", "value": - 18}, {"color": "orange", "value": 22}, {"color": "red", "value": 26}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": - {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] - == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wandthermostat_bad_temperature\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> - yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "📈 Temperature Trends", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 5}, "collapsed": false}, {"title": "All Rooms Temperature", - "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 10, "w": 16, "x": 0, "y": 6}, "fieldConfig": {"defaults": {"unit": "celsius", "custom": {"lineWidth": - 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["mean", "lastNotNull", "min", "max"]}, "tooltip": {"mode": - "multi", "sort": "desc"}}, "targets": [{"refId": "Wo", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == - \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wall_mounted_thermostat_pro_temperature\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> - set(key: \"room\", value: \"Wohnzimmer\")\n |> yield(name: \"mean\")", "resultFormat": "time_series"}, {"refId": "Wo2", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: - v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wohnzimmer_2_thermostat_temperature\")\n |> aggregateWindow(every: - v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Wohnzimmer #2\")\n |> yield(name: \"mean\")", "resultFormat": "time_series"}, {"refId": "Ar", "query": "from(bucket: - \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == - \"home_arbeitszimmer_thermostat_temperature\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Arbeitszimmer\")\n |> yield(name: \"mean\")", - "resultFormat": "time_series"}, {"refId": "Kü", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" - and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_kuche_wandthermostat_temperature\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Küche\")\n |> yield(name: - \"mean\")", "resultFormat": "time_series"}, {"refId": "Ba", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wandthermostat_bad_temperature\")\n |> aggregateWindow(every: v.windowPeriod, - fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Bad\")\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Indoor vs Outdoor", "type": "timeseries", "datasource": - {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 10, "w": 8, "x": 16, "y": 6}, "fieldConfig": {"defaults": {"unit": "celsius", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": - true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": "Outdoor"}, "properties": [{"id": "color", "value": {"fixedColor": "light-blue", "mode": "fixed"}}, {"id": "custom.lineStyle", - "value": {"fill": "dash", "dash": [10, 5]}}]}, {"matcher": {"id": "byName", "options": "Indoor Avg"}, "properties": [{"id": "color", "value": {"fixedColor": "orange", "mode": "fixed"}}]}]}, "options": - {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "OUT", "query": "from(bucket: \"default\")\n |> - range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_temperatur\")\n |> - aggregateWindow(every: 1h, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")\n |> set(key: \"location\", value: \"Outdoor\")", "resultFormat": "time_series"}, {"refId": "IN", "query": "from(bucket: - \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id =~ - /^home_/)\n |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")\n |> group()\n |> mean()\n |> set(key: \"location\", value: \"Indoor Avg\")", "resultFormat": - "time_series"}]}, {"title": "💧 Humidity", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 16}, "collapsed": false}, {"title": "Wohnzimmer", "type": "stat", "datasource": {"type": "influxdb", - "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 0, "y": 17}, "fieldConfig": {"defaults": {"unit": "percent", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "red", - "value": null}, {"color": "orange", "value": 30}, {"color": "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": 70}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": - "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, - stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wall_mounted_thermostat_pro_humidity\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Arbeitszimmer", "type": "stat", "datasource": {"type": - "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 4, "y": 17}, "fieldConfig": {"defaults": {"unit": "percent", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": - "red", "value": null}, {"color": "orange", "value": 30}, {"color": "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": 70}]}, "color": {"mode": "thresholds"}}}, "options": - {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: - v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_arbeitszimmer_thermostat_humidity\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Wohnzimmer #2", "type": "stat", "datasource": {"type": - "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 8, "y": 17}, "fieldConfig": {"defaults": {"unit": "percent", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": - "red", "value": null}, {"color": "orange", "value": 30}, {"color": "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": 70}]}, "color": {"mode": "thresholds"}}}, "options": - {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: - v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wohnzimmer_2_thermostat_humidity\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Bad", "type": "stat", "datasource": {"type": "influxdb", - "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 12, "y": 17}, "fieldConfig": {"defaults": {"unit": "percent", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "red", - "value": null}, {"color": "orange", "value": 30}, {"color": "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": 70}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": - "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, - stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wandthermostat_bad_humidity\")\n |> aggregateWindow(every: - v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Küche", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, - "gridPos": {"h": 4, "w": 4, "x": 16, "y": 17}, "fieldConfig": {"defaults": {"unit": "percent", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "red", "value": null}, {"color": - "orange", "value": 30}, {"color": "green", "value": 40}, {"color": "orange", "value": 60}, {"color": "red", "value": 70}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": - "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_kuche_wandthermostat_humidity\")\n |> aggregateWindow(every: v.windowPeriod, - fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "Humidity Trends", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, - "gridPos": {"h": 8, "w": 24, "x": 0, "y": 20}, "fieldConfig": {"defaults": {"unit": "percent", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}}, "options": {"legend": - {"displayMode": "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "Wo", "query": "from(bucket: \"default\")\n |> - range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wall_mounted_thermostat_pro_humidity\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Wohnzimmer\")\n |> yield(name: \"mean\")", "resultFormat": "time_series"}, {"refId": "Ar", "query": - "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id - == \"home_arbeitszimmer_thermostat_humidity\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Arbeitszimmer\")\n |> yield(name: \"mean\")", - "resultFormat": "time_series"}, {"refId": "Wo2", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and - r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wohnzimmer_2_thermostat_humidity\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Wohnzimmer #2\")\n |> yield(name: - \"mean\")", "resultFormat": "time_series"}, {"refId": "Ba", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> - filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_wandthermostat_bad_humidity\")\n |> aggregateWindow(every: v.windowPeriod, - fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Bad\")\n |> yield(name: \"mean\")", "resultFormat": "time_series"}, {"refId": "Kü", "query": "from(bucket: \"default\")\n |> range(start: - v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"home_kuche_wandthermostat_humidity\")\n |> - aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> set(key: \"room\", value: \"Küche\")\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}]}' + name: grafana-dashboard-home-climate + namespace: monitoring diff --git a/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml b/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml index 1fa264f..ac2b2b2 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml @@ -1,75 +1,125 @@ apiVersion: v1 +data: + outdoor-weather.json: '{"uid": "outdoor-weather", "title": "\ud83c\udf21\ufe0f Outdoor + & Weather", "tags": ["home", "weather", "outdoor", "auto-generated"], "timezone": + "browser", "schemaVersion": 39, "version": 1, "refresh": "5m", "editable": false, + "graphTooltip": 1, "time": {"from": "now-24h", "to": "now"}, "panels": [{"title": + "\ud83c\udf24\ufe0f Current Conditions", "type": "row", "gridPos": {"h": 1, "w": + 24, "x": 0, "y": 0}, "collapsed": false}, {"title": "\ud83c\udf21\ufe0f Temperature", + "type": "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 0, "y": 1}, "fieldConfig": {"defaults": {"unit": "celsius", + "decimals": 1, "thresholds": {"mode": "absolute", "steps": [{"color": "#5794F2", + "value": null}, {"color": "#73BF69", "value": 0}, {"color": "#FFD700", "value": + 15}, {"color": "#FF7383", "value": 25}, {"color": "#C4162A", "value": 30}]}, "color": + {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", + "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, + "targets": [{"expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.regensburg_regensburg_temperatur\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udca7 Humidity", "type": + "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 4, "y": 1}, "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#FF7383", + "value": null}, {"color": "#FFD700", "value": 30}, {"color": "#73BF69", "value": + 40}, {"color": "#FFD700", "value": 70}, {"color": "#5794F2", "value": 90}]}, "color": + {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", + "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, + "targets": [{"expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.regensburg_regensburg_luftfeuchtigkeit\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udd35 Pressure", "type": + "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 8, "y": 1}, "fieldConfig": {"defaults": {"unit": "pressurehpa", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#FF7383", + "value": null}, {"color": "#FFD700", "value": 990}, {"color": "#73BF69", "value": + 1010}, {"color": "#FFD700", "value": 1030}, {"color": "#FF7383", "value": 1040}]}, + "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": + "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": + ["lastNotNull"]}}, "targets": [{"expr": "homeassistant_sensor_pressure_hpa{entity=\"sensor.regensburg_regensburg_druck\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udca8 Wind", "type": + "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 12, "y": 1}, "fieldConfig": {"defaults": {"unit": "velocitykmh", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", + "value": null}, {"color": "#FFD700", "value": 20}, {"color": "#FF7383", "value": + 40}, {"color": "#C4162A", "value": 60}]}, "color": {"mode": "thresholds"}}}, "options": + {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"expr": "homeassistant_sensor_wind_speed_km_per_h{entity=\"sensor.regensburg_regensburg_windgeschwindigkeit\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83c\udf27\ufe0f Rain", + "type": "stat", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 16, "y": 1}, "fieldConfig": {"defaults": {"unit": "mm/h", + "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", + "value": null}, {"color": "#5794F2", "value": 0.1}, {"color": "#1F60C4", "value": + 1}, {"color": "#3274D9", "value": 5}]}, "color": {"mode": "thresholds"}}}, "options": + {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": + {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"expr": "homeassistant_sensor_precipitation_intensity_mm_per_h{entity=\"sensor.regensburg_regensburg_niederschlag\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\u2601\ufe0f Cloud Cover", + "type": "gauge", "datasource": {"type": "prometheus", "uid": "prometheus"}, "gridPos": + {"h": 4, "w": 4, "x": 20, "y": 1}, "fieldConfig": {"defaults": {"unit": "percent", + "decimals": 0, "min": 0, "max": 100, "thresholds": {"mode": "absolute", "steps": + [{"color": "#5794F2", "value": null}, {"color": "#73BF69", "value": 20}, {"color": + "#FFD700", "value": 50}, {"color": "#808080", "value": 80}]}, "color": {"mode": + "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, + "orientation": "auto", "showThresholdLabels": true, "showThresholdMarkers": true}, + "targets": [{"expr": "homeassistant_sensor_unit_percent{entity=\"sensor.regensburg_regensburg_bewolkungsgrad\"}", + "format": "time_series", "refId": "A"}]}, {"title": "\ud83d\udcc8 Temperature + & Humidity Trend", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 5}, + "collapsed": false}, {"title": "Temperature", "type": "timeseries", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"h": 8, "w": 12, "x": + 0, "y": 6}, "fieldConfig": {"defaults": {"unit": "celsius", "custom": {"lineWidth": + 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": + [{"matcher": {"id": "byName", "options": "Temperature"}, "properties": [{"id": + "color", "value": {"fixedColor": "#FF7383", "mode": "fixed"}}]}]}, "options": + {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["min", "max", + "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": + "T", "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.regensburg_regensburg_temperatur\"}", + "format": "time_series"}]}, {"title": "Humidity", "type": "timeseries", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"h": 8, "w": 12, "x": + 12, "y": 6}, "fieldConfig": {"defaults": {"unit": "percent", "custom": {"lineWidth": + 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": + [{"matcher": {"id": "byName", "options": "Humidity"}, "properties": [{"id": "color", + "value": {"fixedColor": "#5794F2", "mode": "fixed"}}]}]}, "options": {"legend": + {"displayMode": "table", "placement": "bottom", "calcs": ["min", "max", "mean"]}, + "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "H", "expr": + "homeassistant_sensor_humidity_percent{entity=\"sensor.regensburg_regensburg_luftfeuchtigkeit\"}", + "format": "time_series"}]}, {"title": "\ud83d\udcca Pressure & Wind", "type": + "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 14}, "collapsed": false}, {"title": + "Pressure", "type": "timeseries", "datasource": {"type": "prometheus", "uid": + "prometheus"}, "gridPos": {"h": 8, "w": 12, "x": 0, "y": 15}, "fieldConfig": {"defaults": + {"unit": "pressurehpa", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": + true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": + "Pressure"}, "properties": [{"id": "color", "value": {"fixedColor": "#8F3BB8", + "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": + "bottom", "calcs": ["min", "max", "mean"]}, "tooltip": {"mode": "multi", "sort": + "desc"}}, "targets": [{"refId": "P", "expr": "homeassistant_sensor_pressure_hpa{entity=\"sensor.regensburg_regensburg_druck\"}", + "format": "time_series"}]}, {"title": "Wind Speed", "type": "timeseries", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"h": 8, "w": 12, "x": + 12, "y": 15}, "fieldConfig": {"defaults": {"unit": "velocitykmh", "custom": {"lineWidth": + 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": + [{"matcher": {"id": "byName", "options": "Wind"}, "properties": [{"id": "color", + "value": {"fixedColor": "#5794F2", "mode": "fixed"}}]}]}, "options": {"legend": + {"displayMode": "table", "placement": "bottom", "calcs": ["max", "mean"]}, "tooltip": + {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "W", "expr": "homeassistant_sensor_wind_speed_km_per_h{entity=\"sensor.regensburg_regensburg_windgeschwindigkeit\"}", + "format": "time_series"}]}, {"title": "\ud83c\udf27\ufe0f Precipitation & Cloud", + "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 23}, "collapsed": false}, + {"title": "Rain", "type": "timeseries", "datasource": {"type": "prometheus", "uid": + "prometheus"}, "gridPos": {"h": 8, "w": 12, "x": 0, "y": 24}, "fieldConfig": {"defaults": + {"unit": "mm/h", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, + "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": + "Rain"}, "properties": [{"id": "color", "value": {"fixedColor": "#3274D9", "mode": + "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", + "calcs": ["mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, + "targets": [{"refId": "R", "expr": "homeassistant_sensor_precipitation_intensity_mm_per_h{entity=\"sensor.regensburg_regensburg_niederschlag\"}", + "format": "time_series"}]}, {"title": "Cloud Cover", "type": "timeseries", "datasource": + {"type": "prometheus", "uid": "prometheus"}, "gridPos": {"h": 8, "w": 12, "x": + 12, "y": 24}, "fieldConfig": {"defaults": {"unit": "percent", "custom": {"lineWidth": + 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": + [{"matcher": {"id": "byName", "options": "Cloud Cover"}, "properties": [{"id": + "color", "value": {"fixedColor": "#808080", "mode": "fixed"}}]}]}, "options": + {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["mean"]}, + "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "C", "expr": + "homeassistant_sensor_unit_percent{entity=\"sensor.regensburg_regensburg_bewolkungsgrad\"}", + "format": "time_series"}]}]}' kind: ConfigMap metadata: - name: grafana-dashboard-outdoor-weather - namespace: monitoring + annotations: + grafana_dashboard_folder: "\U0001F3E0 Home" labels: grafana_dashboard: '1' - annotations: - grafana_dashboard_folder: 🏠 Home -data: - outdoor-weather.json: '{"uid": "outdoor-weather", "title": "🌡️ Outdoor & Weather", "tags": ["home", "weather", "outdoor", "auto-generated"], "timezone": "browser", "schemaVersion": 39, "version": 1, "refresh": - "5m", "editable": false, "graphTooltip": 1, "time": {"from": "now-24h", "to": "now"}, "panels": [{"title": "🌤️ Current Conditions", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 0}, "collapsed": - false}, {"title": "🌡️ Temperature", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 0, "y": 1}, "fieldConfig": {"defaults": {"unit": - "celsius", "decimals": 1, "thresholds": {"mode": "absolute", "steps": [{"color": "#5794F2", "value": null}, {"color": "#73BF69", "value": 0}, {"color": "#FFD700", "value": 15}, {"color": "#FF7383", - "value": 25}, {"color": "#C4162A", "value": 30}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, - "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"°C\" and r[\"_field\"] - == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_temperatur\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": - "time_series"}]}, {"title": "💧 Humidity", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 4, "y": 1}, "fieldConfig": {"defaults": {"unit": - "percent", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#FF7383", "value": null}, {"color": "#FFD700", "value": 30}, {"color": "#73BF69", "value": 40}, {"color": "#FFD700", - "value": 70}, {"color": "#5794F2", "value": 90}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, - "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] - == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_luftfeuchtigkeit\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", - "resultFormat": "time_series"}]}, {"title": "🔵 Pressure", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 8, "y": 1}, "fieldConfig": - {"defaults": {"unit": "pressurehpa", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#FF7383", "value": null}, {"color": "#FFD700", "value": 990}, {"color": "#73BF69", "value": - 1010}, {"color": "#FFD700", "value": 1030}, {"color": "#FF7383", "value": 1040}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", - "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] - == \"hPa\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_druck\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: - \"mean\")", "resultFormat": "time_series"}]}, {"title": "💨 Wind", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 12, "y": 1}, "fieldConfig": - {"defaults": {"unit": "velocitykmh", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", "value": null}, {"color": "#FFD700", "value": 20}, {"color": "#FF7383", "value": - 40}, {"color": "#C4162A", "value": 60}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": - ["lastNotNull"]}}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"km/h\" and r[\"_field\"] - == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_windgeschwindigkeit\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", - "resultFormat": "time_series"}]}, {"title": "🌧️ Rain", "type": "stat", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 16, "y": 1}, "fieldConfig": {"defaults": - {"unit": "mm/h", "decimals": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "#73BF69", "value": null}, {"color": "#5794F2", "value": 0.1}, {"color": "#1F60C4", "value": 1}, {"color": "#3274D9", - "value": 5}]}, "color": {"mode": "thresholds"}}}, "options": {"graphMode": "area", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}}, "targets": - [{"query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"mm/h\" and r[\"_field\"] == \"value\")\n |> filter(fn: - (r) => r.entity_id == \"regensburg_regensburg_niederschlag\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, - {"title": "☁️ Cloud Cover", "type": "gauge", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 4, "w": 4, "x": 20, "y": 1}, "fieldConfig": {"defaults": {"unit": "percent", - "decimals": 0, "min": 0, "max": 100, "thresholds": {"mode": "absolute", "steps": [{"color": "#5794F2", "value": null}, {"color": "#73BF69", "value": 20}, {"color": "#FFD700", "value": 50}, {"color": - "#808080", "value": 80}]}, "color": {"mode": "thresholds"}}}, "options": {"reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, "orientation": "auto", "showThresholdLabels": true, "showThresholdMarkers": - true}, "targets": [{"query": "from(bucket: \"default\")\n |> range(start: -15m)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id - == \"regensburg_regensburg_bewolkungsgrad\")\n |> last()\n |> yield(name: \"mean\")", "resultFormat": "time_series"}]}, {"title": "📈 Temperature & Humidity Trend", "type": "row", "gridPos": {"h": - 1, "w": 24, "x": 0, "y": 5}, "collapsed": false}, {"title": "Temperature", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 8, "w": 12, "x": 0, - "y": 6}, "fieldConfig": {"defaults": {"unit": "celsius", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": - "Temperature"}, "properties": [{"id": "color", "value": {"fixedColor": "#FF7383", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["min", "max", - "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "T", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) - => r[\"_measurement\"] == \"°C\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_temperatur\")\n |> aggregateWindow(every: 30m, fn: mean, createEmpty: - false)\n |> yield(name: \"mean\") |> set(key: \"metric\", value: \"Temperature\")", "resultFormat": "time_series"}]}, {"title": "Humidity", "type": "timeseries", "datasource": {"type": "influxdb", - "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 8, "w": 12, "x": 12, "y": 6}, "fieldConfig": {"defaults": {"unit": "percent", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": - "never"}}, "overrides": [{"matcher": {"id": "byName", "options": "Humidity"}, "properties": [{"id": "color", "value": {"fixedColor": "#5794F2", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": - "table", "placement": "bottom", "calcs": ["min", "max", "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "H", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, - stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_luftfeuchtigkeit\")\n |> aggregateWindow(every: - 30m, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"metric\", value: \"Humidity\")", "resultFormat": "time_series"}]}, {"title": "📊 Pressure & Wind", "type": "row", "gridPos": - {"h": 1, "w": 24, "x": 0, "y": 14}, "collapsed": false}, {"title": "Pressure", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 8, "w": 12, "x": - 0, "y": 15}, "fieldConfig": {"defaults": {"unit": "pressurehpa", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": - "Pressure"}, "properties": [{"id": "color", "value": {"fixedColor": "#8F3BB8", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["min", "max", "mean"]}, - "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "P", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] - == \"hPa\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_druck\")\n |> aggregateWindow(every: 30m, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> - set(key: \"metric\", value: \"Pressure\")", "resultFormat": "time_series"}]}, {"title": "Wind Speed", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": - {"h": 8, "w": 12, "x": 12, "y": 15}, "fieldConfig": {"defaults": {"unit": "velocitykmh", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": - {"id": "byName", "options": "Wind"}, "properties": [{"id": "color", "value": {"fixedColor": "#5794F2", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": - ["max", "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "W", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: - (r) => r[\"_measurement\"] == \"km/h\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_windgeschwindigkeit\")\n |> aggregateWindow(every: 30m, fn: mean, - createEmpty: false)\n |> yield(name: \"mean\") |> set(key: \"metric\", value: \"Wind\")", "resultFormat": "time_series"}]}, {"title": "🌧️ Precipitation & Cloud", "type": "row", "gridPos": {"h": 1, - "w": 24, "x": 0, "y": 23}, "collapsed": false}, {"title": "Rain", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": 8, "w": 12, "x": 0, "y": 24}, - "fieldConfig": {"defaults": {"unit": "mm/h", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": "byName", "options": "Rain"}, "properties": - [{"id": "color", "value": {"fixedColor": "#3274D9", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": ["mean", "lastNotNull"]}, "tooltip": {"mode": - "multi", "sort": "desc"}}, "targets": [{"refId": "R", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"mm/h\" - and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_niederschlag\")\n |> aggregateWindow(every: 30m, fn: mean, createEmpty: false)\n |> yield(name: \"mean\") |> - set(key: \"metric\", value: \"Rain\")", "resultFormat": "time_series"}]}, {"title": "Cloud Cover", "type": "timeseries", "datasource": {"type": "influxdb", "uid": "P2AB959DC95E5519F"}, "gridPos": {"h": - 8, "w": 12, "x": 12, "y": 24}, "fieldConfig": {"defaults": {"unit": "percent", "custom": {"lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never"}}, "overrides": [{"matcher": {"id": - "byName", "options": "Cloud Cover"}, "properties": [{"id": "color", "value": {"fixedColor": "#808080", "mode": "fixed"}}]}]}, "options": {"legend": {"displayMode": "table", "placement": "bottom", "calcs": - ["mean"]}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [{"refId": "C", "query": "from(bucket: \"default\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: - (r) => r[\"_measurement\"] == \"%\" and r[\"_field\"] == \"value\")\n |> filter(fn: (r) => r.entity_id == \"regensburg_regensburg_bewolkungsgrad\")\n |> aggregateWindow(every: 30m, fn: mean, createEmpty: - false)\n |> yield(name: \"mean\") |> set(key: \"metric\", value: \"Cloud Cover\")", "resultFormat": "time_series"}]}]}' + name: grafana-dashboard-outdoor-weather + namespace: monitoring diff --git a/k8s/monitoring/fritzbox-exporter.secret.yaml b/k8s/monitoring/fritzbox-exporter.secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4867bf1857a4f2da862b4f206aca6e68ad9b2b07 GIT binary patch literal 191 zcmV;w06_l$M@dveQdv+`07(z*RAFo$0p#m0D+-Gaa66QfTVMYiF7AObqoyQFP!QYA zBEgx5l;(`U`!7YYBMxs4FM8g4R#0WHK$4V}OfEer9@B^8K=UBDsZF-e+#^ZHR-cT4gr{sXL$-EeWFIZDny4N&9SB*R0RM4 literal 0 HcmV?d00001 diff --git a/k8s/monitoring/fritzbox-exporter.yaml b/k8s/monitoring/fritzbox-exporter.yaml new file mode 100644 index 0000000..32d760c --- /dev/null +++ b/k8s/monitoring/fritzbox-exporter.yaml @@ -0,0 +1,103 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fritzbox-exporter + namespace: monitoring + labels: + app: fritzbox-exporter +spec: + replicas: 1 + selector: + matchLabels: + app: fritzbox-exporter + template: + metadata: + labels: + app: fritzbox-exporter + spec: + containers: + - name: fritzbox-exporter + image: ghcr.io/sberk42/fritzbox_exporter/fritzbox_exporter:latest + imagePullPolicy: IfNotPresent + env: + - name: USERNAME + valueFrom: + secretKeyRef: + name: fritzbox-exporter-secret + key: username + - name: PASSWORD + valueFrom: + secretKeyRef: + name: fritzbox-exporter-secret + key: password + - name: GATEWAY_URL + value: "http://192.168.10.1:49000" + - name: LISTEN_ADDRESS + value: "0.0.0.0:9042" + ports: + - name: http-metrics + containerPort: 9042 + resources: + requests: + cpu: 10m + memory: 32Mi + limits: + cpu: 100m + memory: 64Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: fritzbox-exporter + namespace: monitoring + labels: + app: fritzbox-exporter +spec: + ports: + - name: http-metrics + port: 9042 + targetPort: 9042 + protocol: TCP + selector: + app: fritzbox-exporter +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: fritzbox-exporter + namespace: monitoring + labels: + app: fritzbox-exporter + release: prometheus-operator +spec: + selector: + matchLabels: + app: fritzbox-exporter + namespaceSelector: + matchNames: + - monitoring + endpoints: + - port: http-metrics + path: /metrics + interval: 60s + scrapeTimeout: 15s +--- +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: fritzbox-exporter-alerts + namespace: monitoring + labels: + release: prometheus-operator +spec: + groups: + - name: fritzbox-exporter.rules + rules: + - alert: FritzBoxExporterOffline + expr: up{job="fritzbox-exporter"} == 0 + for: 5m + labels: + severity: warning + annotations: + summary: "FritzBox exporter is offline" + description: "The FritzBox exporter pod in the cluster cannot reach the router at 192.168.10.1 or the exporter itself is down."