diff --git a/kubernetes/apps/monitoring/dashboards/pv-system-roi.json b/kubernetes/apps/monitoring/dashboards/pv-system-roi.json index f9a693ac..4dbd434f 100644 --- a/kubernetes/apps/monitoring/dashboards/pv-system-roi.json +++ b/kubernetes/apps/monitoring/dashboards/pv-system-roi.json @@ -29,8 +29,8 @@ }, "gridPos": {"h": 4, "w": 4, "x": 4, "y": 0}, "id": 2, - "options": {"colorMode": "value", "graphMode": "area", "justifyMode": "auto", "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 == \"vitocharge_vx3_vx3_pv_power\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A"}], + "options": {"colorMode": "value", "graphMode": "none", "justifyMode": "auto", "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 == \"vitocharge_vx3_vx3_pv_power\") |> last()", "refId": "A"}], "title": "Solar Power", "type": "stat" }, @@ -50,7 +50,7 @@ { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 4, "x": 12, "y": 0}, @@ -63,7 +63,7 @@ { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "purple", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "purple", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 4, "x": 16, "y": 0}, @@ -90,7 +90,7 @@ { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "orange", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "orange", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 3, "x": 0, "y": 4}, @@ -103,7 +103,7 @@ { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 3, "x": 3, "y": 4}, @@ -116,7 +116,7 @@ { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 3, "x": 6, "y": 4}, @@ -225,9 +225,9 @@ "id": 20, "options": {"legend": {"calcs": ["mean", "max", "lastNotNull"], "displayMode": "table", "placement": "right", "showLegend": true}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [ - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_solar_power\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_pv_power\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Solar Power\"})", "refId": "A"}, - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_battery_power_in_absolute\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_battery_power\") |> map(fn: (r) => ({_time: r._time, _value: if r._value < 0.0 then -r._value else 0.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Battery Charge\"})", "refId": "B"}, - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_battery_power_out_absolute\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_battery_power\") |> map(fn: (r) => ({_time: r._time, _value: if r._value > 0.0 then r._value else 0.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Battery Discharge\"})", "refId": "C"} + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_solar_power\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_pv_power\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: true) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Solar Power\"})", "refId": "A"}, + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_battery_power_in_absolute\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_battery_power\") |> map(fn: (r) => ({_time: r._time, _value: if r._value < 0.0 then -r._value else 0.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: true) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Battery Charge\"})", "refId": "B"}, + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_battery_power_out_absolute\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_battery_power\") |> map(fn: (r) => ({_time: r._time, _value: if r._value > 0.0 then r._value else 0.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: true) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Battery Discharge\"})", "refId": "C"} ], "title": "Solar & Battery Power", "type": "timeseries" @@ -250,7 +250,7 @@ "id": 21, "options": {"legend": {"calcs": ["mean", "min", "max"], "displayMode": "table", "placement": "right", "showLegend": true}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [ - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_power_exchange_with_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_power\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Grid Exchange\"})", "refId": "A"} + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_power_exchange_with_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"W\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_power\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: true) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Grid Exchange\"})", "refId": "A"} ], "title": "Grid Exchange (+ Import / - Export)", "type": "timeseries" @@ -271,7 +271,7 @@ "id": 22, "options": {"legend": {"calcs": ["mean", "min", "max"], "displayMode": "table", "placement": "right", "showLegend": true}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [ - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_battery\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_battery_soc\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Battery Level\"})", "refId": "A"} + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_battery\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"%\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_battery_soc\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: true) |> keep(columns: [\"_time\", \"_value\"]) |> rename(columns: {_value: \"Battery Level\"})", "refId": "A"} ], "title": "Battery State of Charge", "type": "timeseries" @@ -292,7 +292,7 @@ "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": true, "stacking": {"group": "A", "mode": "none"}, "thresholdsStyle": {"mode": "off"}}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": null}]}, - "unit": "kwh" + "unit": "kwatth" }, "overrides": [ {"matcher": {"id": "byName", "options": "Solar Production"}, "properties": [{"id": "color", "value": {"fixedColor": "yellow", "mode": "fixed"}}]}, @@ -331,9 +331,9 @@ "id": 24, "options": {"legend": {"calcs": ["min", "max", "lastNotNull"], "displayMode": "table", "placement": "right", "showLegend": true}, "tooltip": {"mode": "multi", "sort": "desc"}}, "targets": [ - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "solar = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_solar_energy_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_pv_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"solar\")\nexport_kwh = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_energy_export_to_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_feed_in_energy\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"export\")\nprice = from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"EUR/kWh\" and r._field == \"value\" and r.entity_id == \"strompreis\") |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> set(key: \"src\", value: \"price\")\nunion(tables: [solar, export_kwh, price]) |> pivot(rowKey: [\"_time\"], columnKey: [\"src\"], valueColumn: \"_value\") |> filter(fn: (r) => exists r.solar and exists r.export and exists r.price) |> map(fn: (r) => ({_time: r._time, _value: (r.solar - r.export) * r.price})) |> rename(columns: {_value: \"Self-Use Savings\"})", "refId": "A"}, + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "solar = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_solar_energy_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_pv_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"solar\")\nexport_kwh = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_energy_export_to_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_feed_in_energy\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"export\")\nprice = from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"EUR/kWh\" and r._field == \"value\" and r.entity_id == \"strompreis\") |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> set(key: \"src\", value: \"price\")\nunion(tables: [solar, export_kwh, price]) |> group() |> pivot(rowKey: [\"_time\"], columnKey: [\"src\"], valueColumn: \"_value\") |> sort(columns: [\"_time\"]) |> fill(column: \"price\", usePrevious: true) |> fill(column: \"solar\", usePrevious: true) |> fill(column: \"export\", usePrevious: true) |> filter(fn: (r) => exists r.solar and exists r.export and exists r.price) |> map(fn: (r) => ({_time: r._time, _value: (r.solar - r.export) * r.price})) |> rename(columns: {_value: \"Self-Use Savings\"})", "refId": "A"}, {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_energy_export_to_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_feed_in_energy\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> map(fn: (r) => ({_time: r._time, _value: r._value * ${feed_in_tariff}})) |> rename(columns: {_value: \"Feed-in Revenue\"})", "refId": "B"}, - {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "solar = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_solar_energy_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_pv_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"solar\")\nexport_kwh = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_energy_export_to_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_feed_in_energy\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"export\")\nprice = from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"EUR/kWh\" and r._field == \"value\" and r.entity_id == \"strompreis\") |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> set(key: \"src\", value: \"price\")\nunion(tables: [solar, export_kwh, price]) |> pivot(rowKey: [\"_time\"], columnKey: [\"src\"], valueColumn: \"_value\") |> filter(fn: (r) => exists r.solar and exists r.export and exists r.price) |> map(fn: (r) => ({_time: r._time, _value: (r.solar - r.export) * r.price + r.export * ${feed_in_tariff}})) |> rename(columns: {_value: \"Total Value\"})", "refId": "C"} + {"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "solar = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_solar_energy_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_pv_production_total\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"solar\")\nexport_kwh = union(tables: [\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"Wh\" and r._field == \"value\" and r.entity_id == \"e3_vitocharge_03_energy_export_to_grid\") |> map(fn: (r) => ({_time: r._time, _value: r._value / 1000.0})),\n from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWh\" and r._field == \"value\" and r.entity_id == \"vitocharge_vx3_vx3_grid_feed_in_energy\") |> map(fn: (r) => ({_time: r._time, _value: r._value}))])\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> set(key: \"src\", value: \"export\")\nprice = from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"EUR/kWh\" and r._field == \"value\" and r.entity_id == \"strompreis\") |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> keep(columns: [\"_time\", \"_value\"]) |> set(key: \"src\", value: \"price\")\nunion(tables: [solar, export_kwh, price]) |> group() |> pivot(rowKey: [\"_time\"], columnKey: [\"src\"], valueColumn: \"_value\") |> sort(columns: [\"_time\"]) |> fill(column: \"price\", usePrevious: true) |> fill(column: \"solar\", usePrevious: true) |> fill(column: \"export\", usePrevious: true) |> filter(fn: (r) => exists r.solar and exists r.export and exists r.price) |> map(fn: (r) => ({_time: r._time, _value: (r.solar - r.export) * r.price + r.export * ${feed_in_tariff}})) |> rename(columns: {_value: \"Total Value\"})", "refId": "C"} ], "title": "Cumulative Value", "type": "timeseries" @@ -368,14 +368,15 @@ "gridPos": {"h": 4, "w": 6, "x": 6, "y": 35}, "id": 26, "options": {"colorMode": "value", "graphMode": "none", "justifyMode": "auto", "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 == \"kWp\" and r._field == \"value\" and r.domain == \"input_number\" and r.entity_id == \"e3_vitocharge_03_solar_power_installed\") |> last()", "refId": "A"}], + "targets": [{"datasource": {"type": "influxdb", "uid": "influxdb"}, "query": "from(bucket: \"suedstr28\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == \"kWp\" and r._field == \"value\" and r.domain == \"input_number\" and r.entity_id == \"e3_vitocharge_03_solar_power_installed\") |> last() |> map(fn: (r) => ({r with _value: r._value / 1000.0}))", "refId": "A"}], "title": "Solar Installed", + "description": "Installed PV peak power. The HA input_number stores 8140 (Wp) despite its kWp unit label, so the value is divided by 1000 here.", "type": "stat" }, { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "blue", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 6, "x": 12, "y": 35}, @@ -388,7 +389,7 @@ { "datasource": {"type": "influxdb", "uid": "influxdb"}, "fieldConfig": { - "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "purple", "value": null}]}, "unit": "kwh"}, + "defaults": {"color": {"mode": "thresholds"}, "mappings": [], "thresholds": {"mode": "absolute", "steps": [{"color": "purple", "value": null}]}, "unit": "kwatth"}, "overrides": [] }, "gridPos": {"h": 4, "w": 6, "x": 18, "y": 35},