From fd72f8d25600ce2da2f0135cf0262d42d7d5d066 Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 30 Jul 2026 22:23:49 +0200 Subject: [PATCH] Cardata: delete obsolete streaming containers (#32314) --- vehicle/bmw/cardata/api.go | 5 ++++- vehicle/bmw/cardata/mqtt.go | 2 +- vehicle/bmw/cardata/provider.go | 21 +++++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/vehicle/bmw/cardata/api.go b/vehicle/bmw/cardata/api.go index 219baa824..a8857708c 100644 --- a/vehicle/bmw/cardata/api.go +++ b/vehicle/bmw/cardata/api.go @@ -33,7 +33,10 @@ var requiredKeys = []string{ "vehicle.vehicle.travelledDistance", } -const requiredVersion = "v6" +const ( + containerName = "evcc.io" + requiredVersion = "v6" +) type API struct { *request.Helper diff --git a/vehicle/bmw/cardata/mqtt.go b/vehicle/bmw/cardata/mqtt.go index 8b0801139..94fb9cf6c 100644 --- a/vehicle/bmw/cardata/mqtt.go +++ b/vehicle/bmw/cardata/mqtt.go @@ -205,7 +205,7 @@ func (v *MqttConnector) handler(_ mqtt.Client, m mqtt.Message) { return } - v.log.TRACE.Println("recv: " + string(m.Payload())) + v.log.TRACE.Printf("recv %s: %s", m.Topic(), string(m.Payload())) v.mu.RLock() defer v.mu.RUnlock() diff --git a/vehicle/bmw/cardata/provider.go b/vehicle/bmw/cardata/provider.go index cf9ab0e93..dd47620f1 100644 --- a/vehicle/bmw/cardata/provider.go +++ b/vehicle/bmw/cardata/provider.go @@ -71,14 +71,17 @@ func (v *Provider) findOrCreateContainer() (string, error) { return "", err } + // obsolete containers keep streaming, resulting in duplicate messages + defer v.deleteObsoleteContainers(containers) + if i := slices.IndexFunc(containers, func(c Container) bool { - return c.Name == "evcc.io" && c.Purpose == requiredVersion + return c.Name == containerName && c.Purpose == requiredVersion }); i >= 0 { return containers[i].ContainerId, nil } res, err := v.api.CreateContainer(CreateContainer{ - Name: "evcc.io", + Name: containerName, Purpose: requiredVersion, TechnicalDescriptors: requiredKeys, }) @@ -86,6 +89,20 @@ func (v *Provider) findOrCreateContainer() (string, error) { return res.ContainerId, err } +func (v *Provider) deleteObsoleteContainers(containers []Container) { + for _, c := range containers { + if c.Name != containerName || c.Purpose == requiredVersion { + continue + } + + v.log.DEBUG.Printf("deleting obsolete container %s (%s)", c.ContainerId, c.Purpose) + + if err := v.api.DeleteContainer(c.ContainerId); err != nil { + v.log.WARN.Printf("delete container %s: %v", c.ContainerId, err) + } + } +} + func (v *Provider) setupContainer() error { container, err := v.findOrCreateContainer() if err != nil {