diff --git a/charger/eebus.go b/charger/eebus.go index e82595ad7..e3a4bb146 100644 --- a/charger/eebus.go +++ b/charger/eebus.go @@ -100,6 +100,12 @@ func NewEEBus(ctx context.Context, ski, ip string, hasMeter, hasChargedEnergy, v return nil, err } + // unregister device when context is cancelled (e.g. UI config validation) + go func() { + <-ctx.Done() + eebus.Instance.UnregisterDevice(ski, c) + }() + if hasMeter { var energyG func() (float64, error) if hasChargedEnergy { diff --git a/meter/eebus.go b/meter/eebus.go index f50f74a9f..6b2cfaf3c 100644 --- a/meter/eebus.go +++ b/meter/eebus.go @@ -99,6 +99,12 @@ func NewEEBus(ctx context.Context, ski, ip string, usage *templates.Usage) (api. return nil, err } + // unregister device when context is cancelled (e.g. UI config validation) + go func() { + <-ctx.Done() + eebus.Instance.UnregisterDevice(ski, c) + }() + // monitoring appliance eebus.LogEntities(c.log.DEBUG, "MA MPC", c.ma.MaMPCInterface) eebus.LogEntities(c.log.DEBUG, "MA MGCP", c.ma.MaMGCPInterface) diff --git a/server/eebus/eebus.go b/server/eebus/eebus.go index b55b331be..8cf5696a2 100644 --- a/server/eebus/eebus.go +++ b/server/eebus/eebus.go @@ -236,14 +236,18 @@ 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+1) } + + // only tear down SHIP connection when no more clients need it + if len(c.clients[ski]) == 0 { + delete(c.clients, ski) + c.service.UnregisterRemoteSKI(ski) + } } func (c *EEBus) CustomerEnergyManagement() *CustomerEnergyManagement {