From eea15dc944cc835dd0222dd23c9c978832a35da7 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 2 Nov 2025 17:16:19 +0100 Subject: [PATCH] Add dimming of meters (#24978) --- core/site.go | 4 ++++ core/site_circuits.go | 35 +++++++++++++++++++++++++++++++++++ meter/eebus.go | 2 +- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/core/site.go b/core/site.go index 3199d3455..24c4e273d 100644 --- a/core/site.go +++ b/core/site.go @@ -940,6 +940,10 @@ func (site *Site) update(lp updater) { } site.publishCircuits() + + if err := site.dimMeters(circuitDimmed(site.circuit)); err != nil { + site.log.ERROR.Println(err) + } } // prioritize if possible diff --git a/core/site_circuits.go b/core/site_circuits.go index 1a6305417..ee0e2b6f5 100644 --- a/core/site_circuits.go +++ b/core/site_circuits.go @@ -1,6 +1,11 @@ package core import ( + "errors" + "fmt" + "slices" + + "github.com/evcc-io/evcc/api" "github.com/evcc-io/evcc/core/keys" "github.com/evcc-io/evcc/util/config" "github.com/samber/lo" @@ -43,3 +48,33 @@ func (site *Site) publishCircuits() { site.publish(keys.Circuits, res) } + +func (site *Site) dimMeters(dim bool) error { + var errs error + + for _, dev := range slices.Concat(site.auxMeters, site.extMeters) { + m, ok := dev.Instance().(api.Dimmer) + if !ok { + continue + } + + if dimmed, err := m.Dimmed(); err == nil { + if dim == dimmed { + continue + } + } else { + if !errors.Is(err, api.ErrNotAvailable) { + errs = errors.Join(errs, fmt.Errorf("%s dimmed: %w", dev.Config().Name, err)) + } + continue + } + + if err := m.Dim(dim); err == nil { + site.log.DEBUG.Printf("%s dim: %t", dev.Config().Name, dim) + } else if !errors.Is(err, api.ErrNotAvailable) { + errs = errors.Join(errs, fmt.Errorf("%s dim: %w", dev.Config().Name, err)) + } + } + + return errs +} diff --git a/meter/eebus.go b/meter/eebus.go index 274df765b..2455429bd 100644 --- a/meter/eebus.go +++ b/meter/eebus.go @@ -275,7 +275,7 @@ func (c *EEBus) Dim(dim bool) error { defer c.mu.Unlock() if c.egLpcEntity == nil { - return errors.New("not connected") + return api.ErrNotAvailable } if !slices.Contains(c.eg.EgLPCInterface.AvailableScenariosForEntity(c.egLpcEntity), 1) {