From 44508e865c78fbc80f558f85c1604b1729fdea71 Mon Sep 17 00:00:00 2001 From: Moritz Graf Date: Wed, 15 Jul 2026 22:04:47 +0200 Subject: [PATCH] feat(monitoring): restructure dashboards into Grabengasse7 folder and add Z2M alerting --- k8s/monitoring/AGENTS.md | 7 +- .../grafana-dashboard-energy-monitor.yaml | 2 +- .../grafana-dashboard-fritzbox-hosts.yaml | 2 +- .../grafana-dashboard-fritzbox.yaml | 2 +- .../grafana-dashboard-heating-gas.yaml | 2 +- .../grafana-dashboard-home-climate.yaml | 2 +- .../grafana-dashboard-outdoor-weather.yaml | 2 +- .../grafana-dashboard-shelly-ws90.yaml | 410 ++++++++++-------- .../grafana-dashboard-taupi-fan.yaml | 2 +- .../grafana-dashboard-wireguard.yaml | 2 +- k8s/monitoring/prometheus-operator.secret.yml | 2 + k8s/monitoring/zigbee2mqtt.yaml | 38 ++ 12 files changed, 279 insertions(+), 194 deletions(-) diff --git a/k8s/monitoring/AGENTS.md b/k8s/monitoring/AGENTS.md index f9dc34c..6934a71 100644 --- a/k8s/monitoring/AGENTS.md +++ b/k8s/monitoring/AGENTS.md @@ -108,4 +108,9 @@ For the full creation workflow, Flux query templates, and InfluxDB conventions, - `../home-assistant/home-assistant.secret.yaml` — HA helm values (InfluxDB integration config) - `../home-assistant/tmp_long_lived_token.secret.yml` — HA API token for discovery -- `../influxdb/influxdb2.secret.yml` — InfluxDB helm values \ No newline at end of file +- `../influxdb/influxdb2.secret.yml` — InfluxDB helm values + +## Alerting Policy + +We prioritize a high threshold for alerts to prevent alarm fatigue in this private home lab environment: +* **Alert Duration Threshold:** Most alerts (including container downtime, offline bridges, and missing device metrics) are configured with a `for: 1h` duration. They are only treated as critical and trigger active alerts if they remain unresolved for longer than 1 hour. \ No newline at end of file diff --git a/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml b/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml index c6347d2..314fff9 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-energy-monitor.yaml @@ -139,7 +139,7 @@ data: kind: ConfigMap metadata: annotations: - grafana_dashboard_folder: "\U0001F3E0 Home" + grafana_dashboard_folder: "Grabengasse7" labels: grafana_dashboard: '1' name: grafana-dashboard-energy-monitor diff --git a/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml index 65b26e3..169edde 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox-hosts.yaml @@ -6,7 +6,7 @@ metadata: labels: grafana_dashboard: '1' annotations: - grafana_dashboard_folder: "🏠 Home" + grafana_dashboard_folder: "Grabengasse7" data: fritzbox-hosts.json: |- { diff --git a/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml index f1da482..9c2d727 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-fritzbox.yaml @@ -6,7 +6,7 @@ metadata: labels: grafana_dashboard: '1' annotations: - grafana_dashboard_folder: "🏠 Home" + grafana_dashboard_folder: "Grabengasse7" data: fritzbox.json: |- { diff --git a/k8s/monitoring/dashboards/grafana-dashboard-heating-gas.yaml b/k8s/monitoring/dashboards/grafana-dashboard-heating-gas.yaml index d0556c0..159f70b 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-heating-gas.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-heating-gas.yaml @@ -90,7 +90,7 @@ data: kind: ConfigMap metadata: annotations: - grafana_dashboard_folder: "\U0001F3E0 Home" + grafana_dashboard_folder: "Grabengasse7" labels: grafana_dashboard: '1' name: grafana-dashboard-heating-gas diff --git a/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml b/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml index 588cac2..a42ce4f 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-home-climate.yaml @@ -217,7 +217,7 @@ data: kind: ConfigMap metadata: annotations: - grafana_dashboard_folder: "\U0001F3E0 Home" + grafana_dashboard_folder: "Grabengasse7" labels: grafana_dashboard: '1' name: grafana-dashboard-home-climate diff --git a/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml b/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml index ac2b2b2..fc6ac7a 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-outdoor-weather.yaml @@ -118,7 +118,7 @@ data: kind: ConfigMap metadata: annotations: - grafana_dashboard_folder: "\U0001F3E0 Home" + grafana_dashboard_folder: "Grabengasse7" labels: grafana_dashboard: '1' name: grafana-dashboard-outdoor-weather diff --git a/k8s/monitoring/dashboards/grafana-dashboard-shelly-ws90.yaml b/k8s/monitoring/dashboards/grafana-dashboard-shelly-ws90.yaml index 852f67b..d2e7caa 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-shelly-ws90.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-shelly-ws90.yaml @@ -6,7 +6,7 @@ metadata: labels: grafana_dashboard: "1" annotations: - grafana_dashboard_folder: "🏡 Home" + grafana_dashboard_folder: "Grabengasse7" data: shelly-ws90.json: | { @@ -15,7 +15,7 @@ data: "tags": ["home", "weather", "outdoor", "prometheus"], "timezone": "browser", "schemaVersion": 39, - "version": 1, + "version": 3, "refresh": "30s", "editable": false, "graphTooltip": 2, @@ -95,7 +95,7 @@ data: { "id": 3, "type": "stat", - "title": "🧭 Barometric Pressure", + "title": "🧭 Current Pressure", "gridPos": { "x": 8, "y": 0, "w": 8, "h": 3 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ @@ -129,153 +129,159 @@ data: { "id": 4, "type": "stat", - "title": "☀️ Light Level", + "title": "🌧️ Rain Status", "gridPos": { "x": 16, "y": 0, "w": 8, "h": 3 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ { - "expr": "homeassistant_sensor_illuminance_lx{entity=\"sensor.shelly_ws90_illuminance\"}", + "expr": "homeassistant_binary_sensor_state{entity=\"binary_sensor.shelly_ws90_rain_status\"}", "refId": "A" } ], "fieldConfig": { "defaults": { - "unit": "lux", - "decimals": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "purple", "value": null }, - { "color": "orange", "value": 1000 }, - { "color": "yellow", "value": 5000 } - ] - }, - "color": { "mode": "value" } + "mappings": [ + { + "type": "value", + "options": { + "0": { "text": "Dry", "color": "green" }, + "1": { "text": "Wet", "color": "blue" } + } + } + ] } }, "options": { "graphMode": "none", - "colorMode": "value", - "textMode": "auto", + "colorMode": "background", + "textMode": "value", "reduceOptions": { "values": false, "calcs": ["lastNotNull"] } } }, { "id": 5, - "type": "stat", - "title": "🌡️ Outdoor Temperature", - "gridPos": { "x": 0, "y": 3, "w": 12, "h": 8 }, + "type": "timeseries", + "title": "🌡️ Thermal Comfort & Humidity History (24h)", + "gridPos": { "x": 0, "y": 3, "w": 24, "h": 8 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ { "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.shelly_ws90_temperatur\"}", + "legendFormat": "Temperature", "refId": "A" - } - ], - "fieldConfig": { - "defaults": { - "unit": "celsius", - "decimals": 1, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "#5794F2", "value": null }, - { "color": "#73BF69", "value": 15 }, - { "color": "#FFD700", "value": 22 }, - { "color": "#FF7383", "value": 26 }, - { "color": "#C4162A", "value": 30 } - ] - }, - "color": { "mode": "thresholds" } - } - }, - "options": { - "graphMode": "area", - "colorMode": "background", - "textMode": "auto", - "reduceOptions": { "values": false, "calcs": ["lastNotNull"] } - } - }, - { - "id": 6, - "type": "stat", - "title": "💧 Outdoor Humidity", - "gridPos": { "x": 12, "y": 3, "w": 12, "h": 8 }, - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "targets": [ + }, + { + "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.shelly_ws90_apparent_temperature\"}", + "legendFormat": "Apparent Temperature", + "refId": "B" + }, + { + "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.shelly_ws90_wind_chill\"}", + "legendFormat": "Wind Chill", + "refId": "C" + }, + { + "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.shelly_ws90_dew_point\"}", + "legendFormat": "Dew Point", + "refId": "D" + }, + { + "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.shelly_ws90_humidex\"}", + "legendFormat": "Humidex", + "refId": "E" + }, { "expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.shelly_ws90_luftfeuchtigkeit\"}", - "refId": "A" - } - ], - "fieldConfig": { - "defaults": { - "unit": "percent", - "decimals": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "#FF7383", "value": null }, - { "color": "#FFD700", "value": 30 }, - { "color": "#73BF69", "value": 40 }, - { "color": "#5794F2", "value": 70 } - ] - }, - "color": { "mode": "thresholds" } - } - }, - "options": { - "graphMode": "area", - "colorMode": "background", - "textMode": "auto", - "reduceOptions": { "values": false, "calcs": ["lastNotNull"] } - } - }, - { - "id": 7, - "type": "gauge", - "title": "💨 Wind Speed", - "gridPos": { "x": 0, "y": 11, "w": 6, "h": 6 }, - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "targets": [ + "legendFormat": "Relative Humidity", + "refId": "F" + }, { - "expr": "homeassistant_sensor_wind_speed_km_per_h{entity=\"sensor.shelly_ws90_wind_speed\"} or on() vector(0)", - "refId": "A" + "expr": "homeassistant_sensor_unit_percent{entity=\"sensor.shelly_ws90_heat_stress\"}", + "legendFormat": "Heat Stress", + "refId": "G" } ], "fieldConfig": { "defaults": { - "unit": "velocitykmh", - "min": 0, - "max": 100, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 15 }, - { "color": "orange", "value": 30 }, - { "color": "red", "value": 50 } + "custom": { + "lineWidth": 2, + "fillOpacity": 4, + "spanNulls": true, + "showPoints": "never" + } + }, + "overrides": [ + { + "matcher": { "id": "byName", "options": "Temperature" }, + "properties": [ + { "id": "unit", "value": "celsius" }, + { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] }, - "color": { "mode": "thresholds" } - } + { + "matcher": { "id": "byName", "options": "Apparent Temperature" }, + "properties": [ + { "id": "unit", "value": "celsius" }, + { "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Wind Chill" }, + "properties": [ + { "id": "unit", "value": "celsius" }, + { "id": "color", "value": { "fixedColor": "light-blue", "mode": "fixed" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Dew Point" }, + "properties": [ + { "id": "unit", "value": "celsius" }, + { "id": "color", "value": { "fixedColor": "cyan", "mode": "fixed" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Humidex" }, + "properties": [ + { "id": "unit", "value": "celsius" }, + { "id": "color", "value": { "fixedColor": "purple", "mode": "fixed" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Relative Humidity" }, + "properties": [ + { "id": "unit", "value": "percent" }, + { "id": "color", "value": { "fixedColor": "blue", "mode": "fixed" } }, + { "id": "custom.axisPlacement", "value": "right" } + ] + }, + { + "matcher": { "id": "byName", "options": "Heat Stress" }, + "properties": [ + { "id": "unit", "value": "percent" }, + { "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }, + { "id": "custom.axisPlacement", "value": "right" } + ] + } + ] }, "options": { - "reduceOptions": { "values": false, "calcs": ["lastNotNull"] }, - "orientation": "auto", - "showThresholdLabels": true, - "showThresholdMarkers": true + "legend": { + "displayMode": "table", + "placement": "bottom", + "calcs": ["lastNotNull", "min", "max", "mean"] + }, + "tooltip": { "mode": "multi", "sort": "desc" } } }, { "id": 8, "type": "gauge", - "title": "🧭 Wind Direction", - "gridPos": { "x": 6, "y": 11, "w": 6, "h": 6 }, + "title": "🧭 Wind Direction (Current)", + "gridPos": { "x": 0, "y": 11, "w": 6, "h": 8 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ { - "expr": "homeassistant_sensor_wind_direction_u0xb0{entity=\"sensor.shelly_ws90_wind_direction\"} or on() vector(0)", + "expr": "homeassistant_sensor_unit_u0xb0{entity=\"sensor.shelly_ws90_wind_direction\"} or on() vector(0)", "refId": "A" } ], @@ -301,90 +307,72 @@ data: } }, { - "id": 9, - "type": "gauge", - "title": "🌧️ Precipitation Rate", - "gridPos": { "x": 12, "y": 11, "w": 6, "h": 6 }, + "id": 7, + "type": "timeseries", + "title": "💨 Wind & Gust Speed History (24h)", + "gridPos": { "x": 6, "y": 11, "w": 18, "h": 8 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ { - "expr": "homeassistant_sensor_precipitation_intensity_mm_per_h{entity=\"sensor.shelly_ws90_rain_rate\"} or on() vector(0)", + "expr": "homeassistant_sensor_wind_speed_km_per_h{entity=\"sensor.shelly_ws90_wind_speed\"} or on() vector(0)", + "legendFormat": "Wind Speed", "refId": "A" + }, + { + "expr": "homeassistant_sensor_wind_speed_km_per_h{entity=\"sensor.shelly_ws90_gust_speed\"} or on() vector(0)", + "legendFormat": "Gust Speed", + "refId": "B" } ], "fieldConfig": { "defaults": { - "unit": "lengthmm", - "min": 0, - "max": 50, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "green", "value": null }, - { "color": "blue", "value": 0.1 }, - { "color": "dark-blue", "value": 5 } + "unit": "velocitykmh", + "custom": { + "lineWidth": 2, + "fillOpacity": 6, + "spanNulls": true, + "showPoints": "never" + } + }, + "overrides": [ + { + "matcher": { "id": "byName", "options": "Wind Speed" }, + "properties": [ + { "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } } ] }, - "color": { "mode": "thresholds" } - } + { + "matcher": { "id": "byName", "options": "Gust Speed" }, + "properties": [ + { "id": "color", "value": { "fixedColor": "yellow", "mode": "fixed" } } + ] + } + ] }, "options": { - "reduceOptions": { "values": false, "calcs": ["lastNotNull"] }, - "orientation": "auto", - "showThresholdLabels": true, - "showThresholdMarkers": true + "legend": { + "displayMode": "table", + "placement": "bottom", + "calcs": ["lastNotNull", "max"] + }, + "tooltip": { "mode": "multi", "sort": "desc" } } }, { "id": 10, - "type": "gauge", - "title": "🔆 Solar Illuminance", - "gridPos": { "x": 18, "y": 11, "w": 6, "h": 6 }, + "type": "timeseries", + "title": "🔆 Solar Illuminance & UV Index History (24h)", + "gridPos": { "x": 0, "y": 19, "w": 24, "h": 8 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ { "expr": "homeassistant_sensor_illuminance_lx{entity=\"sensor.shelly_ws90_illuminance\"}", - "refId": "A" - } - ], - "fieldConfig": { - "defaults": { - "unit": "lux", - "min": 0, - "max": 100000, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "blue", "value": null }, - { "color": "orange", "value": 1000 }, - { "color": "yellow", "value": 10000 } - ] - }, - "color": { "mode": "thresholds" } - } - }, - "options": { - "reduceOptions": { "values": false, "calcs": ["lastNotNull"] }, - "orientation": "auto", - "showThresholdLabels": true, - "showThresholdMarkers": true - } - }, - { - "id": 11, - "type": "timeseries", - "title": "📈 Temperature & Humidity History (24h)", - "gridPos": { "x": 0, "y": 17, "w": 12, "h": 8 }, - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "targets": [ - { - "expr": "homeassistant_sensor_temperature_celsius{entity=\"sensor.shelly_ws90_temperatur\"}", - "legendFormat": "Temperature", + "legendFormat": "Solar Illuminance", "refId": "A" }, { - "expr": "homeassistant_sensor_humidity_percent{entity=\"sensor.shelly_ws90_luftfeuchtigkeit\"}", - "legendFormat": "Humidity", + "expr": "homeassistant_sensor_state{entity=\"sensor.shelly_ws90_uv_index\"} or on() vector(0)", + "legendFormat": "UV Index", "refId": "B" } ], @@ -392,24 +380,25 @@ data: "defaults": { "custom": { "lineWidth": 2, - "fillOpacity": 10, + "fillOpacity": 5, "spanNulls": true, "showPoints": "never" } }, "overrides": [ { - "matcher": { "id": "byName", "options": "Temperature" }, + "matcher": { "id": "byName", "options": "Solar Illuminance" }, "properties": [ - { "id": "unit", "value": "celsius" }, + { "id": "unit", "value": "lux" }, { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] }, { - "matcher": { "id": "byName", "options": "Humidity" }, + "matcher": { "id": "byName", "options": "UV Index" }, "properties": [ - { "id": "unit", "value": "percent" }, - { "id": "color", "value": { "fixedColor": "blue", "mode": "fixed" } }, + { "id": "unit", "value": "none" }, + { "id": "decimals", "value": 0 }, + { "id": "color", "value": { "fixedColor": "purple", "mode": "fixed" } }, { "id": "custom.axisPlacement", "value": "right" } ] } @@ -419,7 +408,58 @@ data: "legend": { "displayMode": "table", "placement": "bottom", - "calcs": ["lastNotNull", "min", "max", "mean"] + "calcs": ["lastNotNull", "max"] + }, + "tooltip": { "mode": "multi", "sort": "desc" } + } + }, + { + "id": 9, + "type": "timeseries", + "title": "🌧️ Precipitation History (Hourly Bars)", + "gridPos": { "x": 0, "y": 27, "w": 12, "h": 8 }, + "datasource": { "type": "prometheus", "uid": "prometheus" }, + "targets": [ + { + "expr": "homeassistant_sensor_precipitation_intensity_mm_per_h{entity=\"sensor.shelly_ws90_rain_rate\"} or on() vector(0)", + "legendFormat": "Rain Intensity", + "refId": "A" + }, + { + "expr": "homeassistant_sensor_precipitation_mm{entity=\"sensor.shelly_ws90_precipitation\"} or on() vector(0)", + "legendFormat": "Daily Rain", + "refId": "B" + } + ], + "fieldConfig": { + "defaults": { + "unit": "lengthmm", + "custom": { + "drawStyle": "bars", + "fillOpacity": 60, + "spanNulls": true + } + }, + "overrides": [ + { + "matcher": { "id": "byName", "options": "Rain Intensity" }, + "properties": [ + { "id": "color", "value": { "fixedColor": "blue", "mode": "fixed" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Daily Rain" }, + "properties": [ + { "id": "color", "value": { "fixedColor": "dark-blue", "mode": "fixed" } } + ] + } + ] + }, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "calcs": ["lastNotNull", "max"] }, "tooltip": { "mode": "multi", "sort": "desc" } } @@ -427,8 +467,8 @@ data: { "id": 12, "type": "timeseries", - "title": "📉 Pressure & Precipitation History (24h)", - "gridPos": { "x": 12, "y": 17, "w": 12, "h": 8 }, + "title": "🧭 Barometric Pressure History (24h)", + "gridPos": { "x": 12, "y": 27, "w": 12, "h": 8 }, "datasource": { "type": "prometheus", "uid": "prometheus" }, "targets": [ { @@ -437,8 +477,8 @@ data: "refId": "A" }, { - "expr": "homeassistant_sensor_precipitation_intensity_mm_per_h{entity=\"sensor.shelly_ws90_rain_rate\"} or on() vector(0)", - "legendFormat": "Rain Intensity", + "expr": "homeassistant_sensor_unit_hpa_per_h{entity=\"sensor.shelly_ws90_pressure_trend\"} or on() vector(0)", + "legendFormat": "Pressure Trend", "refId": "B" } ], @@ -446,7 +486,7 @@ data: "defaults": { "custom": { "lineWidth": 2, - "fillOpacity": 10, + "fillOpacity": 5, "spanNulls": true, "showPoints": "never" } @@ -460,10 +500,10 @@ data: ] }, { - "matcher": { "id": "byName", "options": "Rain Intensity" }, + "matcher": { "id": "byName", "options": "Pressure Trend" }, "properties": [ - { "id": "unit", "value": "lengthmm" }, - { "id": "color", "value": { "fixedColor": "dark-blue", "mode": "fixed" } }, + { "id": "unit", "value": "none" }, + { "id": "color", "value": { "fixedColor": "cyan", "mode": "fixed" } }, { "id": "custom.axisPlacement", "value": "right" } ] } @@ -473,7 +513,7 @@ data: "legend": { "displayMode": "table", "placement": "bottom", - "calcs": ["lastNotNull", "min", "max", "mean"] + "calcs": ["lastNotNull", "min", "max"] }, "tooltip": { "mode": "multi", "sort": "desc" } } diff --git a/k8s/monitoring/dashboards/grafana-dashboard-taupi-fan.yaml b/k8s/monitoring/dashboards/grafana-dashboard-taupi-fan.yaml index 6b50fa4..c65a981 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-taupi-fan.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-taupi-fan.yaml @@ -6,7 +6,7 @@ metadata: labels: grafana_dashboard: '1' annotations: - grafana_dashboard_folder: 🏠 Home + grafana_dashboard_folder: "Grabengasse7" data: taupi-fan.json: | { diff --git a/k8s/monitoring/dashboards/grafana-dashboard-wireguard.yaml b/k8s/monitoring/dashboards/grafana-dashboard-wireguard.yaml index 917966d..ff8e0ed 100644 --- a/k8s/monitoring/dashboards/grafana-dashboard-wireguard.yaml +++ b/k8s/monitoring/dashboards/grafana-dashboard-wireguard.yaml @@ -6,7 +6,7 @@ metadata: labels: grafana_dashboard: '1' annotations: - grafana_dashboard_folder: 🏠 Home + grafana_dashboard_folder: "Grabengasse7" data: wireguard.json: | { diff --git a/k8s/monitoring/prometheus-operator.secret.yml b/k8s/monitoring/prometheus-operator.secret.yml index ddfe33b..313ad9b 100644 --- a/k8s/monitoring/prometheus-operator.secret.yml +++ b/k8s/monitoring/prometheus-operator.secret.yml @@ -181,6 +181,7 @@ grafana: searchNamespace: monitoring folder: /tmp/dashboards defaultFolderName: null + folderAnnotation: grafana_dashboard_folder provider: name: sidecarProvider orgId: 1 @@ -189,6 +190,7 @@ grafana: disableDeletion: false editable: false allowUiUpdates: false + foldersFromFilesStructure: true options: path: /tmp/dashboards diff --git a/k8s/monitoring/zigbee2mqtt.yaml b/k8s/monitoring/zigbee2mqtt.yaml index 2c3ba6b..6997191 100644 --- a/k8s/monitoring/zigbee2mqtt.yaml +++ b/k8s/monitoring/zigbee2mqtt.yaml @@ -166,3 +166,41 @@ spec: - hosts: - "zigbee2mqtt.moritzgraf.de" secretName: zigbee2mqtt-tls +--- +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: zigbee2mqtt-alerts + namespace: monitoring + labels: + release: prometheus-operator +spec: + groups: + - name: zigbee2mqtt.rules + rules: + - alert: Zigbee2MQTTDown + expr: kube_pod_container_status_ready{container="zigbee2mqtt", namespace="monitoring"} == 0 + for: 1h + labels: + severity: critical + annotations: + summary: "Zigbee2MQTT is down" + description: "The Zigbee2MQTT pod is not ready. This typically indicates a connection failure to the SLZB-MR1U coordinator host at 192.168.10.10:7638, or a crash within the Z2M application." + - alert: Zigbee2MQTTBridgeOffline + expr: homeassistant_binary_sensor_state{entity="binary_sensor.zigbee2mqtt_bridge_connection_state"} == 0 + for: 1h + labels: + severity: critical + annotations: + summary: "Zigbee2MQTT Bridge Connection Offline" + description: "The Zigbee2MQTT bridge connection is reported as offline. The bridge has lost communication with the MQTT broker or the Zigbee coordinator." + - alert: ShellyWS90MetricsStale + expr: absent(homeassistant_sensor_temperature_celsius{entity="sensor.shelly_ws90_temperatur"}) or (time() - homeassistant_last_updated_time_seconds{entity="sensor.shelly_ws90_temperatur"} > 0) + for: 1h + labels: + severity: warning + annotations: + summary: "Shelly WS90 Weather Station metrics are stale" + description: "No new metrics have been received from the Shelly WS90 weather station (sensor.shelly_ws90_temperatur) for over 1 hour. The device may be offline, out of range, or batteries might be depleted." + +