fix(home-energy): repair dead panels, wrong queries, misleading semantics #283

Merged
k.renner merged 1 commits from claude-bot/dash-home-energy into master 2026-07-17 13:15:21 +00:00
@@ -21,7 +21,7 @@
"defaults": {
"color": { "mode": "thresholds" },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 2000 }, { "color": "orange", "value": 4000 }, { "color": "red", "value": 6000 }] },
"thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }, { "color": "green", "value": 0 }, { "color": "yellow", "value": 2000 }, { "color": "orange", "value": 4000 }, { "color": "red", "value": 6000 }] },
"unit": "watt"
},
"overrides": []
@@ -30,7 +30,7 @@
"id": 1,
"options": { "colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "auto", "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" },
"targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"smart_meter_sum_active_instantaneous_power\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" }],
"title": "Total Power",
"title": "Grid Power (+ Import / − Export)",
"type": "stat"
},
{
@@ -39,7 +39,7 @@
"defaults": {
"color": { "mode": "thresholds" },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 1000 }, { "color": "red", "value": 2000 }] },
"thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }, { "color": "green", "value": 0 }, { "color": "yellow", "value": 1000 }, { "color": "red", "value": 2000 }] },
"unit": "watt"
},
"overrides": []
@@ -57,7 +57,7 @@
"defaults": {
"color": { "mode": "thresholds" },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 1000 }, { "color": "red", "value": 2000 }] },
"thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }, { "color": "green", "value": 0 }, { "color": "yellow", "value": 1000 }, { "color": "red", "value": 2000 }] },
"unit": "watt"
},
"overrides": []
@@ -75,7 +75,7 @@
"defaults": {
"color": { "mode": "thresholds" },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 1000 }, { "color": "red", "value": 2000 }] },
"thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }, { "color": "green", "value": 0 }, { "color": "yellow", "value": 1000 }, { "color": "red", "value": 2000 }] },
"unit": "watt"
},
"overrides": []
@@ -98,12 +98,16 @@
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } },
"custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] },
"unit": "watt"
},
"overrides": []
"overrides": [
{ "matcher": { "id": "byName", "options": "smart_meter_l1_active_instantaneous_power" }, "properties": [{ "id": "displayName", "value": "L1" }] },
{ "matcher": { "id": "byName", "options": "smart_meter_l2_active_instantaneous_power" }, "properties": [{ "id": "displayName", "value": "L2" }] },
{ "matcher": { "id": "byName", "options": "smart_meter_l3_active_instantaneous_power" }, "properties": [{ "id": "displayName", "value": "L3" }] }
]
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 8 },
"id": 10,
@@ -111,7 +115,7 @@
"targets": [
{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id =~ /^smart_meter_l[123]_active_instantaneous_power$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }
],
"title": "Power by Phase (Stacked)",
"title": "Grid Power by Phase",
"type": "timeseries"
},
{
@@ -122,15 +126,16 @@
"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": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] },
"unit": "watt"
"unit": "watt",
"displayName": "Grid Power"
},
"overrides": []
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 18 },
"id": 11,
"options": { "legend": { "calcs": ["mean", "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 == \"W\" and r._field == \"value\" and r.entity_id == \"smart_meter_sum_active_instantaneous_power\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" }],
"title": "Total Power Over Time",
"targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"smart_meter_sum_active_instantaneous_power\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"])", "refId": "A" }],
"title": "Grid Power Over Time (negative = Export)",
"type": "timeseries"
},
{
@@ -149,9 +154,13 @@
"thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "yellow", "value": 220 }, { "color": "green", "value": 230 }, { "color": "yellow", "value": 240 }, { "color": "red", "value": 250 }] },
"unit": "volt"
},
"overrides": []
"overrides": [
{ "matcher": { "id": "byName", "options": "smart_meter_l1_active_instantaneous_voltage" }, "properties": [{ "id": "displayName", "value": "L1" }] },
{ "matcher": { "id": "byName", "options": "smart_meter_l2_active_instantaneous_voltage" }, "properties": [{ "id": "displayName", "value": "L2" }] },
{ "matcher": { "id": "byName", "options": "smart_meter_l3_active_instantaneous_voltage" }, "properties": [{ "id": "displayName", "value": "L3" }] }
]
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 29 },
"gridPos": { "h": 9, "w": 12, "x": 0, "y": 29 },
"id": 20,
"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 == \"V\" and r._field == \"value\" and r.entity_id =~ /^smart_meter_l[123]_active_instantaneous_voltage$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }],
@@ -163,22 +172,26 @@
"fieldConfig": {
"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": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } },
"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": true, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] },
"unit": "amp"
},
"overrides": []
"overrides": [
{ "matcher": { "id": "byName", "options": "e380_energy_meter_e380_current_l1" }, "properties": [{ "id": "displayName", "value": "L1" }] },
{ "matcher": { "id": "byName", "options": "e380_energy_meter_e380_current_l2" }, "properties": [{ "id": "displayName", "value": "L2" }] },
{ "matcher": { "id": "byName", "options": "e380_energy_meter_e380_current_l3" }, "properties": [{ "id": "displayName", "value": "L3" }] }
]
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 29 },
"gridPos": { "h": 9, "w": 12, "x": 12, "y": 29 },
"id": 21,
"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 == \"A\" and r._field == \"value\" and r.entity_id =~ /smart_meter.*current/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }],
"title": "Current by Phase (if available)",
"targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"A\" and r._field == \"value\" and r.entity_id =~ /^e380_energy_meter_e380_current_l[123]$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }],
"title": "Current by Phase (E380)",
"type": "timeseries"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 37 },
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 38 },
"id": 103,
"title": "Device Power Consumption",
"type": "row"
@@ -189,22 +202,22 @@
"defaults": {
"color": { "mode": "thresholds" },
"mappings": [],
"max": 500,
"min": 0,
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 100 }, { "color": "orange", "value": 200 }, { "color": "red", "value": 300 }] },
"unit": "watt"
},
"overrides": []
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 38 },
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 39 },
"id": 30,
"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 == \"W\" and r._field == \"value\" and not (r.entity_id =~ /phase/)) |> last() |> filter(fn: (r) => r._value > 0) |> sort(columns: [\"_value\"], desc: true) |> limit(n: 20) |> keep(columns: [\"_value\", \"entity_id\"])", "refId": "A" }],
"title": "Top 20 Power Consuming Devices",
"targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: -30m) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\") |> filter(fn: (r) => r.entity_id !~ /^(all_|evcc_|solcast_|power_production_|smart_meter_|e380_|vitocharge_|vx3_|strom|hauslast|netzbezug|eigenverbrauch|erfasste_|erlaubte_|shellypro3em63_)/) |> filter(fn: (r) => r.entity_id !~ /_device_power$/) |> filter(fn: (r) => r.entity_id !~ /^(eg|og|dg|kg)_[a-z]+_power$/) |> filter(fn: (r) => r.entity_id !~ /^(erdgeschoss|obergeschoss|dachgeschoss|keller|ausenbereich|garten|galerie_leer|galerie_licht|treppenhaus_total)_power$/) |> filter(fn: (r) => r.entity_id !~ /^keller_[a-z]+_power$/) |> filter(fn: (r) => r.entity_id !~ /^(trockner|waschmaschine)_current_power$/) |> filter(fn: (r) => r.entity_id !~ /(thermal|refrigerant|heater|dhw_loading)_power$/) |> filter(fn: (r) => r.entity_id !~ /electric_consumption_w_2$/) |> last() |> filter(fn: (r) => r._value > 1.0) |> group() |> sort(columns: [\"_value\"], desc: true) |> limit(n: 20) |> keep(columns: [\"entity_id\", \"_value\"])", "refId": "A" }],
"transformations": [{ "id": "rowsToFields", "options": {} }],
"title": "Top 20 Power Consuming Devices (last 30 min)",
"type": "bargauge"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 48 },
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 49 },
"id": 104,
"title": "Energy Consumption",
"type": "row"
@@ -217,45 +230,51 @@
"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": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] },
"unit": "kwatth"
"unit": "watth"
},
"overrides": []
"overrides": [
{ "matcher": { "id": "byName", "options": "strom_bezug_tag" }, "properties": [{ "id": "displayName", "value": "Grid Import (today)" }] },
{ "matcher": { "id": "byName", "options": "strom_einspeisung_tag" }, "properties": [{ "id": "displayName", "value": "Grid Export (today)" }] },
{ "matcher": { "id": "byName", "options": "vitocharge_vx3_vx3_pv_production_today" }, "properties": [{ "id": "displayName", "value": "PV Production (today)" }] },
{ "matcher": { "id": "byName", "options": "vitocharge_vx3_vx3_battery_charge_today" }, "properties": [{ "id": "displayName", "value": "Battery Charge (today)" }] },
{ "matcher": { "id": "byName", "options": "vitocharge_vx3_vx3_battery_discharge_today" }, "properties": [{ "id": "displayName", "value": "Battery Discharge (today)" }] }
]
},
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 49 },
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 50 },
"id": 40,
"options": { "legend": { "calcs": ["lastNotNull", "diff"], "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 == \"kWh\" and r._field == \"value\" and r.entity_id =~ /(energy|verbrauch)/i) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }],
"title": "Energy Consumption (kWh)",
"options": { "legend": { "calcs": ["lastNotNull", "max"], "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 == \"Wh\" and r._field == \"value\" and r.entity_id =~ /^(strom_bezug_tag|strom_einspeisung_tag|vitocharge_vx3_vx3_pv_production_today|vitocharge_vx3_vx3_battery_charge_today|vitocharge_vx3_vx3_battery_discharge_today)$/) |> aggregateWindow(every: v.windowPeriod, fn: max, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }],
"title": "Energy Today (Grid / PV / Battery)",
"type": "timeseries"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 57 },
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 58 },
"id": 105,
"title": "Lights",
"title": "Lights & Standby",
"type": "row"
},
{
"datasource": { "type": "influxdb", "uid": "influxdb" },
"fieldConfig": {
"defaults": {
"color": { "mode": "thresholds" },
"custom": { "align": "auto", "cellOptions": { "type": "color-background" }, "inspect": false },
"color": { "mode": "palette-classic" },
"custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } },
"mappings": [],
"thresholds": { "mode": "absolute", "steps": [{ "color": "dark-green", "value": null }, { "color": "yellow", "value": 1 }, { "color": "orange", "value": 50 }, { "color": "light-yellow", "value": 100 }] },
"unit": "percent"
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] },
"unit": "watt"
},
"overrides": []
"overrides": [
{ "matcher": { "id": "byName", "options": "all_lights_power" }, "properties": [{ "id": "displayName", "value": "Lights (total)" }] },
{ "matcher": { "id": "byName", "options": "all_standby_power" }, "properties": [{ "id": "displayName", "value": "Standby (total)" }] },
{ "matcher": { "id": "byName", "options": "all_switches_power" }, "properties": [{ "id": "displayName", "value": "Switches (total)" }] }
]
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 58 },
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 59 },
"id": 50,
"options": { "showHeader": true, "cellHeight": "sm", "footer": { "show": false }, "sortBy": [{ "desc": true, "displayName": "Brightness" }] },
"pluginVersion": "10.0.0",
"targets": [{ "datasource": { "type": "influxdb", "uid": "influxdb" }, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r.domain == \"light\" and r._measurement == \"%\" and r._field == \"value\") |> last() |> filter(fn: (r) => r._value > 0) |> keep(columns: [\"entity_id\", \"_value\"])", "refId": "A" }],
"title": "Active Lights",
"transformations": [
{ "id": "organize", "options": { "excludeByName": { "Time": true, "__name__": true, "domain": true, "instance": true, "job": true }, "renameByName": { "_value": "Brightness", "entity_id": "Light" } } }
],
"type": "table"
"options": { "legend": { "calcs": ["mean", "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 == \"W\" and r._field == \"value\" and r.entity_id =~ /^all_(lights|standby|switches)_power$/) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\", \"entity_id\"])", "refId": "A" }],
"title": "Lights / Standby / Switches Power",
"type": "timeseries"
}
],
"refresh": "30s",