From 4425e7d3165edce9f112cbfdda73b30f0cee1717 Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 3 Mar 2025 11:55:08 +0100 Subject: [PATCH] EEBus: unregister ski (#19331) --- charger/eebus.go | 3 ++- hems/eebus/eebus.go | 3 ++- meter/eebus.go | 3 ++- server/eebus/eebus.go | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/charger/eebus.go b/charger/eebus.go index 5618d3f69..83142b6a4 100644 --- a/charger/eebus.go +++ b/charger/eebus.go @@ -96,7 +96,8 @@ func NewEEBus(ctx context.Context, ski, ip string, hasMeter, hasChargedEnergy, v } if err := c.Wait(ctx); err != nil { - return c, err + eebus.Instance.UnregisterDevice(ski, c) + return nil, err } if hasMeter { diff --git a/hems/eebus/eebus.go b/hems/eebus/eebus.go index 8acb80329..722fbe9ef 100644 --- a/hems/eebus/eebus.go +++ b/hems/eebus/eebus.go @@ -106,7 +106,8 @@ func NewEEBus(ctx context.Context, ski string, limits Limits, root api.Circuit) } if err := c.Wait(ctx); err != nil { - return c, err + eebus.Instance.UnregisterDevice(ski, c) + return nil, err } // scenarios diff --git a/meter/eebus.go b/meter/eebus.go index f670caa7d..7aa4ed5e3 100644 --- a/meter/eebus.go +++ b/meter/eebus.go @@ -65,7 +65,8 @@ func NewEEBus(ctx context.Context, ski, ip string, timeout time.Duration) (*EEBu } if err := c.Wait(ctx); err != nil { - return c, err + eebus.Instance.UnregisterDevice(ski, c) + return nil, err } return c, nil diff --git a/server/eebus/eebus.go b/server/eebus/eebus.go index 3b7de6ace..931343fb1 100644 --- a/server/eebus/eebus.go +++ b/server/eebus/eebus.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net" + "slices" "strconv" "sync" "time" @@ -191,6 +192,20 @@ func (c *EEBus) RegisterDevice(ski, ip string, device Device) error { return nil } +func (c *EEBus) UnregisterDevice(ski string, device Device) { + ski = shiputil.NormalizeSKI(ski) + c.log.TRACE.Printf("unregistering ski: %s", ski) + + c.service.UnregisterRemoteSKI(ski) + + c.mux.Lock() + defer c.mux.Unlock() + + if idx := slices.Index(c.clients[ski], device); idx != -1 { + c.clients[ski] = slices.Delete(c.clients[ski], idx, idx) + } +} + func (c *EEBus) Evse() *UseCasesEVSE { return &c.evseUC }