From 37e565993624e6938f9abc36ba02e97a4af43ae6 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 9 May 2026 14:43:26 +0200 Subject: [PATCH] Batteries: track energy metrics (#29780) --- core/site.go | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/core/site.go b/core/site.go index b5904f887..8f3c39d14 100644 --- a/core/site.go +++ b/core/site.go @@ -88,6 +88,7 @@ type Site struct { pvEnergy map[string]*metrics.Accumulator homeEnergy, gridEnergy *metrics.Collector + batteryEnergy map[string]*metrics.Collector // per-battery, keyed by meter ref // cached state gridPower float64 // Grid power @@ -216,6 +217,12 @@ func (site *Site) Boot(log *util.Logger, loadpoints []*Loadpoint, tariffs *tarif return err } site.batteryMeters = append(site.batteryMeters, dev) + + me, err := metrics.NewCollector(metrics.Battery, ref) + if err != nil { + return err + } + site.batteryEnergy[ref] = me } // meters used only for monitoring @@ -251,10 +258,11 @@ func (site *Site) Boot(log *util.Logger, loadpoints []*Loadpoint, tariffs *tarif // NewSite creates a Site with sane defaults func NewSite() *Site { site := &Site{ - log: util.NewLogger("site"), - Voltage: 230, // V - pvEnergy: make(map[string]*metrics.Accumulator), - fcstEnergy: metrics.NewAccumulator(), + log: util.NewLogger("site"), + Voltage: 230, // V + pvEnergy: make(map[string]*metrics.Accumulator), + batteryEnergy: make(map[string]*metrics.Collector), + fcstEnergy: metrics.NewAccumulator(), } return site @@ -671,6 +679,22 @@ func (site *Site) updateBatteryMeters() { site.battery.Devices = mm + // accumulate per-battery energy (charging = import, discharging = export — from battery POV toward grid root) + for i, dev := range site.batteryMeters { + ref := dev.Config().Name + c, ok := site.batteryEnergy[ref] + if !ok { + continue + } + var exportEnergy *float64 + if mm[i].Energy > 0 { + exportEnergy = &mm[i].Energy + } + if err := c.AddEnergy(nil, exportEnergy, -mm[i].Power); err != nil { + site.log.ERROR.Printf("persist battery %d energy: %v", i+1, err) + } + } + site.publish(keys.Battery, site.battery) }