fix(home-climate): real room sensors only, repair empty heating panels, readable legends #280

Merged
k.renner merged 1 commits from claude-bot/dash-home-climate into master 2026-07-17 11:20:49 +00:00
@@ -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"