From f248e0cc77d5be9234d4e7d3ab18b1861aa945a9 Mon Sep 17 00:00:00 2001 From: Claude Bot Date: Fri, 17 Jul 2026 00:35:15 +0200 Subject: [PATCH] fix(home-climate): real room sensors only, repair empty heating panels, readable legends - All temperature/humidity panels: replace vendor regexes (shelly.*temp etc.) that dragged in device-internal temperatures (pond pump 34C, power meter 60C, relay 76C) with explicit allow-lists of verified room sensors - Add missing sensors: shelly_blu_h_t_7203 (KG Schlafzimmer), treppenhaus_eg_bewegungsmelder (EG Treppenhaus), vento humidity sensors, Shelly Wall Display (DG Buero) - OG & DG panel: regex had no og_ alternative and showed only device internals; now honest DG-only series + description (OG deliberately has no sensor) - Heating System / Hot Water panels were empty (domain climate/water_heater does not exist in the C measurement) -> use vitocal_250_a_* sensors - Current-value panels: fixed -6h window so dead sensors (EG Shelly H&T trio, DG Meter Pro) disappear instead of showing stale values as live - Legends: map entity_ids to room names in Flux + displayName, removes the '_value xyz' prefix - Align CO2 thresholds between gauge and history (800/1000/1500) --- .../monitoring/dashboards/home-climate.json | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/kubernetes/apps/monitoring/dashboards/home-climate.json b/kubernetes/apps/monitoring/dashboards/home-climate.json index 26698c58..5eda88f2 100644 --- a/kubernetes/apps/monitoring/dashboards/home-climate.json +++ b/kubernetes/apps/monitoring/dashboards/home-climate.json @@ -17,11 +17,13 @@ }, { "datasource": { "type": "influxdb", "uid": "influxdb" }, + "description": "Nur echte Raumsensoren (explizite Liste, keine Geräte-Innentemperaturen). Zeigt nur Werte der letzten 6 h — tote Sensoren (leere Batterie/offline) verschwinden, statt einen veralteten Wert als aktuell auszugeben. OG hat bewusst keinen Temperatursensor.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, + "displayName": "${__field.labels.entity_id}", "mappings": [], - "max": 30, + "max": 35, "min": 10, "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }, { "color": "green", "value": 18 }, { "color": "yellow", "value": 24 }, { "color": "red", "value": 28 }] }, "unit": "celsius" @@ -31,7 +33,7 @@ "gridPos": { "h": 6, "w": 24, "x": 0, "y": 1 }, "id": 1, "options": { "displayMode": "lcd", "minVizHeight": 10, "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "showUnfilled": true, "valueMode": "color" }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /(shelly.*temp|meter_pro)/) |> last() |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: -6h) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^(eg_bad_shellyht_temperature|eg_schlafzimmer_shelly_h_t_temperature|eg_wohnzimmer_shellyht_temperature|i_9psl_temperature|i_9psl_temperature_2|treppenhaus_eg_bewegungsmelder_temperature|dg_buro_meter_pro|shellywalldisplay_00082266e106_temperature|kg_heizungskeller_shelly_h_t_temperature|kg_vorratskeller_klimasensor_temperature|shelly_blu_h_t_7203_temperature)$/) |> last() |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"i_9psl_temperature\" then \"EG Schlafzimmer\" else if r.entity_id == \"i_9psl_temperature_2\" then \"EG Diele\" else if r.entity_id == \"eg_bad_shellyht_temperature\" then \"EG Bad\" else if r.entity_id == \"eg_schlafzimmer_shelly_h_t_temperature\" then \"EG Schlafzimmer (Shelly HT)\" else if r.entity_id == \"eg_wohnzimmer_shellyht_temperature\" then \"EG Wohnzimmer\" else if r.entity_id == \"treppenhaus_eg_bewegungsmelder_temperature\" then \"EG Treppenhaus\" else if r.entity_id == \"dg_buro_meter_pro\" then \"DG Büro\" else if r.entity_id == \"shellywalldisplay_00082266e106_temperature\" then \"DG Büro (Wall Display)\" else if r.entity_id == \"kg_heizungskeller_shelly_h_t_temperature\" then \"KG Waschküche\" else if r.entity_id == \"kg_vorratskeller_klimasensor_temperature\" then \"KG Vorratskeller\" else if r.entity_id == \"shelly_blu_h_t_7203_temperature\" then \"KG Schlafzimmer\" else r.entity_id})) |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }], "title": "All Room Temperatures", "type": "bargauge" }, @@ -47,6 +49,7 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "unit": "celsius" @@ -56,7 +59,7 @@ "gridPos": { "h": 10, "w": 24, "x": 0, "y": 8 }, "id": 10, "options": { "legend": { "calcs": ["mean", "min", "max", "lastNotNull"], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^eg_.*shelly.*temp/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^(eg_bad_shellyht_temperature|eg_schlafzimmer_shelly_h_t_temperature|eg_wohnzimmer_shellyht_temperature|i_9psl_temperature|i_9psl_temperature_2|treppenhaus_eg_bewegungsmelder_temperature)$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"i_9psl_temperature\" then \"EG Schlafzimmer\" else if r.entity_id == \"i_9psl_temperature_2\" then \"EG Diele\" else if r.entity_id == \"eg_bad_shellyht_temperature\" then \"EG Bad\" else if r.entity_id == \"eg_schlafzimmer_shelly_h_t_temperature\" then \"EG Schlafzimmer (Shelly HT)\" else if r.entity_id == \"eg_wohnzimmer_shellyht_temperature\" then \"EG Wohnzimmer\" else if r.entity_id == \"treppenhaus_eg_bewegungsmelder_temperature\" then \"EG Treppenhaus\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], "title": "Erdgeschoss Temperatures", "type": "timeseries" }, @@ -66,6 +69,7 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "unit": "celsius" @@ -75,7 +79,7 @@ "gridPos": { "h": 10, "w": 12, "x": 0, "y": 18 }, "id": 11, "options": { "legend": { "calcs": ["mean", "min", "max", "lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /(kg_.*shelly.*temp|keller.*temp)/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^(kg_heizungskeller_shelly_h_t_temperature|kg_vorratskeller_klimasensor_temperature|shelly_blu_h_t_7203_temperature)$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"kg_heizungskeller_shelly_h_t_temperature\" then \"KG Waschküche\" else if r.entity_id == \"kg_vorratskeller_klimasensor_temperature\" then \"KG Vorratskeller\" else if r.entity_id == \"shelly_blu_h_t_7203_temperature\" then \"KG Schlafzimmer\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], "title": "Keller Temperatures", "type": "timeseries" }, @@ -85,16 +89,18 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "unit": "celsius" }, "overrides": [] }, + "description": "OG hat bewusst keinen Temperatursensor — daher keine OG-Serie. DG Büro: SwitchBot Meter Pro (derzeit offline, letzte Daten 2026-07-15) und Shelly Wall Display (leichter Eigenwärme-Bias) als Referenz.", "gridPos": { "h": 10, "w": 12, "x": 12, "y": 18 }, "id": 12, "options": { "legend": { "calcs": ["mean", "min", "max", "lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /(^dg_|meter_pro|i_9psl.*temp)/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^(dg_buro_meter_pro|shellywalldisplay_00082266e106_temperature)$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"dg_buro_meter_pro\" then \"DG Büro\" else if r.entity_id == \"shellywalldisplay_00082266e106_temperature\" then \"DG Büro (Wall Display)\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], "title": "Obergeschoss & Dachgeschoss", "type": "timeseries" }, @@ -109,6 +115,7 @@ "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "max": 100, "min": 0, @@ -117,10 +124,11 @@ }, "overrides": [] }, + "description": "Nur Raumsensoren (explizite Liste). Zeigt nur Werte der letzten 6 h — tote/offline Sensoren verschwinden statt veraltete Werte anzuzeigen.", "gridPos": { "h": 5, "w": 12, "x": 0, "y": 29 }, "id": 20, "options": { "displayMode": "lcd", "minVizHeight": 10, "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "showUnfilled": true, "valueMode": "color" }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id =~ /(shelly.*humidity|i_9psl.*humidity|meter_pro.*humidity)/) |> last() |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: -6h) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id =~ /^(i_9psl_humidity|i_9psl_humidity_2|eg_schlafzimmer_vento_humidity|eg_bad_shellyht_humidity|eg_schlafzimmer_shelly_h_t_humidity|eg_wohnzimmer_shellyht_humidity|dg_buro_meter_pro_humidity|shellywalldisplay_00082266e106_humidity|kg_heizungskeller_shelly_h_t_humidity|kg_waschkuche_vento_humidity|kg_vorratskeller_klimasensor_humidity|shelly_blu_h_t_7203_humidity)$/) |> last() |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"i_9psl_humidity\" then \"EG Schlafzimmer\" else if r.entity_id == \"i_9psl_humidity_2\" then \"EG Diele\" else if r.entity_id == \"eg_schlafzimmer_vento_humidity\" then \"EG Schlafzimmer (Vento)\" else if r.entity_id == \"eg_bad_shellyht_humidity\" then \"EG Bad\" else if r.entity_id == \"eg_schlafzimmer_shelly_h_t_humidity\" then \"EG Schlafzimmer (Shelly HT)\" else if r.entity_id == \"eg_wohnzimmer_shellyht_humidity\" then \"EG Wohnzimmer\" else if r.entity_id == \"dg_buro_meter_pro_humidity\" then \"DG Büro\" else if r.entity_id == \"shellywalldisplay_00082266e106_humidity\" then \"DG Büro (Wall Display)\" else if r.entity_id == \"kg_heizungskeller_shelly_h_t_humidity\" then \"KG Waschküche\" else if r.entity_id == \"kg_waschkuche_vento_humidity\" then \"KG Waschküche (Vento)\" else if r.entity_id == \"kg_vorratskeller_klimasensor_humidity\" then \"KG Vorratskeller\" else if r.entity_id == \"shelly_blu_h_t_7203_humidity\" then \"KG Schlafzimmer\" else r.entity_id})) |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }], "title": "Current Humidity", "type": "bargauge" }, @@ -130,6 +138,7 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "unit": "percent" @@ -139,7 +148,7 @@ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 29 }, "id": 21, "options": { "legend": { "calcs": ["mean", "min", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id =~ /shelly.*humidity/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id =~ /^(i_9psl_humidity|i_9psl_humidity_2|eg_schlafzimmer_vento_humidity|eg_bad_shellyht_humidity|eg_schlafzimmer_shelly_h_t_humidity|eg_wohnzimmer_shellyht_humidity|dg_buro_meter_pro_humidity|shellywalldisplay_00082266e106_humidity|kg_heizungskeller_shelly_h_t_humidity|kg_waschkuche_vento_humidity|kg_vorratskeller_klimasensor_humidity|shelly_blu_h_t_7203_humidity)$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"i_9psl_humidity\" then \"EG Schlafzimmer\" else if r.entity_id == \"i_9psl_humidity_2\" then \"EG Diele\" else if r.entity_id == \"eg_schlafzimmer_vento_humidity\" then \"EG Schlafzimmer (Vento)\" else if r.entity_id == \"eg_bad_shellyht_humidity\" then \"EG Bad\" else if r.entity_id == \"eg_schlafzimmer_shelly_h_t_humidity\" then \"EG Schlafzimmer (Shelly HT)\" else if r.entity_id == \"eg_wohnzimmer_shellyht_humidity\" then \"EG Wohnzimmer\" else if r.entity_id == \"dg_buro_meter_pro_humidity\" then \"DG Büro\" else if r.entity_id == \"shellywalldisplay_00082266e106_humidity\" then \"DG Büro (Wall Display)\" else if r.entity_id == \"kg_heizungskeller_shelly_h_t_humidity\" then \"KG Waschküche\" else if r.entity_id == \"kg_waschkuche_vento_humidity\" then \"KG Waschküche (Vento)\" else if r.entity_id == \"kg_vorratskeller_klimasensor_humidity\" then \"KG Vorratskeller\" else if r.entity_id == \"shelly_blu_h_t_7203_humidity\" then \"KG Schlafzimmer\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], "title": "Humidity History", "type": "timeseries" }, @@ -154,6 +163,7 @@ "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "max": 2000, "min": 400, @@ -162,10 +172,11 @@ }, "overrides": [] }, + "description": "Alle CO2-Sensoren (ppm). Zeigt nur Werte der letzten 6 h — der DG Büro Meter Pro ist derzeit offline und erscheint daher nicht.", "gridPos": { "h": 6, "w": 8, "x": 0, "y": 38 }, "id": 30, "options": { "orientation": "auto", "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"ppm\" and r._field == \"value\" and r.domain == \"sensor\") |> last() |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: -6h) |> filter(fn: (r) => r._measurement == \"ppm\" and r._field == \"value\" and r.domain == \"sensor\") |> last() |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"i_9psl_carbon_dioxide\" then \"EG Schlafzimmer\" else if r.entity_id == \"i_9psl_carbon_dioxide_2\" then \"EG Diele\" else if r.entity_id == \"dg_buro_meter_pro_carbon_dioxide\" then \"DG Büro\" else r.entity_id})) |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }], "title": "CO2 Levels", "type": "gauge" }, @@ -175,8 +186,9 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "line+area" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], - "thresholds": { "mode": "absolute", "steps": [{ "color": "transparent", "value": null }, { "color": "yellow", "value": 800 }, { "color": "red", "value": 1000 }] }, + "thresholds": { "mode": "absolute", "steps": [{ "color": "transparent", "value": null }, { "color": "yellow", "value": 800 }, { "color": "orange", "value": 1000 }, { "color": "red", "value": 1500 }] }, "unit": "ppm" }, "overrides": [] @@ -184,7 +196,7 @@ "gridPos": { "h": 8, "w": 16, "x": 8, "y": 38 }, "id": 31, "options": { "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"ppm\" and r._field == \"value\" and r.domain == \"sensor\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], + "targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"ppm\" and r._field == \"value\" and r.domain == \"sensor\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"i_9psl_carbon_dioxide\" then \"EG Schlafzimmer\" else if r.entity_id == \"i_9psl_carbon_dioxide_2\" then \"EG Diele\" else if r.entity_id == \"dg_buro_meter_pro_carbon_dioxide\" then \"DG Büro\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }], "title": "CO2 History", "type": "timeseries" }, @@ -200,6 +212,7 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "unit": "celsius" @@ -210,7 +223,7 @@ "id": 40, "options": { "legend": { "calcs": ["mean", "lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, "targets": [ - { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.domain == \"climate\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" } + { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^vitocal_250_a_vitocal_(flow|return|buffer|outside)_temperature$|^vitocal_250_a_vitocal_circuit_(2|3)_supply_temperature$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"vitocal_250_a_vitocal_flow_temperature\" then \"Vorlauf\" else if r.entity_id == \"vitocal_250_a_vitocal_return_temperature\" then \"Rücklauf\" else if r.entity_id == \"vitocal_250_a_vitocal_buffer_temperature\" then \"Pufferspeicher\" else if r.entity_id == \"vitocal_250_a_vitocal_outside_temperature\" then \"Außentemperatur\" else if r.entity_id == \"vitocal_250_a_vitocal_circuit_2_supply_temperature\" then \"HK2 Vorlauf\" else if r.entity_id == \"vitocal_250_a_vitocal_circuit_3_supply_temperature\" then \"HK3 Vorlauf\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" } ], "title": "Heating System Temperatures", "type": "timeseries" @@ -221,6 +234,7 @@ "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 5, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": 3600000, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, + "displayName": "${__field.labels.entity_id}", "mappings": [], "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "unit": "celsius" @@ -231,7 +245,7 @@ "id": 41, "options": { "legend": { "calcs": ["mean", "lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, "targets": [ - { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.domain == \"water_heater\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" } + { "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"°C\" and r._field == \"value\" and r.entity_id =~ /^vitocal_250_a_vitocal_dhw_(temperature|setpoint)$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> map(fn: (r) => ({r with entity_id: if r.entity_id == \"vitocal_250_a_vitocal_dhw_temperature\" then \"Warmwasser Ist\" else if r.entity_id == \"vitocal_250_a_vitocal_dhw_setpoint\" then \"Warmwasser Soll\" else r.entity_id})) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" } ], "title": "Hot Water Temperature", "type": "timeseries" -- 2.54.0