diff --git a/assets/js/types/evcc.ts b/assets/js/types/evcc.ts index d478f5e27..22f697402 100644 --- a/assets/js/types/evcc.ts +++ b/assets/js/types/evcc.ts @@ -1131,8 +1131,10 @@ export interface Battery { capacity: number; /** Charge level in %. Weighted by capacity across all batteries. */ soc: number; - /** Total battery energy in kWh. */ + /** Total discharged energy in kWh. */ energy?: number; + /** Total charged energy in kWh. */ + returnEnergy?: number; /** Measurement data per battery meter. */ devices?: BatteryMeter[]; /** Projected charge levels based on the solar and price forecast. */ diff --git a/core/site.go b/core/site.go index e345fb85e..0f42d6016 100644 --- a/core/site.go +++ b/core/site.go @@ -867,6 +867,12 @@ func (site *Site) updateBatteryMeters() { } return *m.Energy }) + site.battery.ReturnEnergy = lo.SumBy(mm, func(m types.Measurement) float64 { + if m.ReturnEnergy == nil { + return 0 + } + return *m.ReturnEnergy + }) site.battery.Devices = mm battery := site.battery diff --git a/core/types/types.go b/core/types/types.go index d060d1767..f3b254861 100644 --- a/core/types/types.go +++ b/core/types/types.go @@ -56,10 +56,11 @@ func (m Measurement) GetTitle() string { } type BatteryState struct { - Power float64 `json:"power"` - Energy float64 `json:"energy,omitempty"` - Capacity float64 `json:"capacity,omitempty"` - Soc float64 `json:"soc"` - Devices []Measurement `json:"devices,omitempty" influxdb:"battery"` - Forecast *BatteryForecast `json:"forecast,omitempty"` + Power float64 `json:"power"` + Energy float64 `json:"energy,omitempty"` + ReturnEnergy float64 `json:"returnEnergy,omitempty"` + Capacity float64 `json:"capacity,omitempty"` + Soc float64 `json:"soc"` + Devices []Measurement `json:"devices,omitempty" influxdb:"battery"` + Forecast *BatteryForecast `json:"forecast,omitempty"` } diff --git a/server/mcp/openapi.json b/server/mcp/openapi.json index 4a1d4537f..537003276 100644 --- a/server/mcp/openapi.json +++ b/server/mcp/openapi.json @@ -3843,7 +3843,11 @@ "type": "number" }, "energy": { - "description": "Total battery energy in kWh.", + "description": "Total discharged energy in kWh.", + "type": "number" + }, + "returnEnergy": { + "description": "Total charged energy in kWh.", "type": "number" }, "devices": { diff --git a/server/mqtt_test.go b/server/mqtt_test.go index 115800433..d16e6a36d 100644 --- a/server/mqtt_test.go +++ b/server/mqtt_test.go @@ -152,7 +152,7 @@ func (suite *mqttSuite) TestMeasurement() { func (suite *mqttSuite) TestBatteryState() { topics := lo.Map([]string{ - "power", "energy", "capacity", "soc", + "power", "energy", "returnEnergy", "capacity", "soc", "devices", "devices/1/name", "devices/1/title", "devices/1/icon", "devices/1/power", "devices/1/energy", "devices/1/returnEnergy", "devices/1/powers", "devices/1/currents", "devices/1/excessDCPower", "devices/1/capacity", "devices/1/soc", "devices/1/controllable", "devices/1/suggestion", "forecast", }, func(s string, _ int) string { @@ -169,5 +169,5 @@ func (suite *mqttSuite) TestBatteryState() { }) suite.Equal(topics, suite.topics, "topics") - suite.Equal([]string{"2", "", "", "20", "1", "", "", "", "1", "", "", "", "", "", "", "10", "", "", ""}, suite.payloads, "payloads") + suite.Equal([]string{"2", "", "", "", "20", "1", "", "", "", "1", "", "", "", "", "", "", "10", "", "", ""}, suite.payloads, "payloads") } diff --git a/server/openapi.state.yaml b/server/openapi.state.yaml index 62442c35c..664858fc7 100644 --- a/server/openapi.state.yaml +++ b/server/openapi.state.yaml @@ -302,7 +302,10 @@ components: description: Charge level in %. Weighted by capacity across all batteries. type: number energy: - description: Total battery energy in kWh. + description: Total discharged energy in kWh. + type: number + returnEnergy: + description: Total charged energy in kWh. type: number devices: description: Measurement data per battery meter.