From 3206fd6a209e73c6a9693a66b19c99d06c90afb4 Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 7 Oct 2025 18:52:05 +0200 Subject: [PATCH] Cardata: reduce logging (#24205) --- vehicle/bmw/cardata/mqtt.go | 22 ++++++++++++---------- vehicle/bmw/cardata/provider.go | 9 +++++++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/vehicle/bmw/cardata/mqtt.go b/vehicle/bmw/cardata/mqtt.go index 6e78aee17..e0356761a 100644 --- a/vehicle/bmw/cardata/mqtt.go +++ b/vehicle/bmw/cardata/mqtt.go @@ -12,7 +12,6 @@ import ( mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/eclipse/paho.mqtt.golang/packets" "github.com/evcc-io/evcc/util" - "github.com/golang-jwt/jwt/v5" "golang.org/x/oauth2" ) @@ -57,6 +56,16 @@ func (v *MqttConnector) Subscribe(vin string) <-chan StreamingMessage { return ch } +func (v *MqttConnector) Unsubscribe(vin string) { + v.mu.Lock() + defer v.mu.Unlock() + + if ch, ok := v.subscriptions[vin]; ok { + delete(v.subscriptions, vin) + close(ch) + } +} + func (v *MqttConnector) run(ctx context.Context, ts oauth2.TokenSource) { bo := backoff.NewExponentialBackOff(backoff.WithMaxInterval(time.Minute)) @@ -76,7 +85,7 @@ func (v *MqttConnector) run(ctx context.Context, ts oauth2.TokenSource) { v.log.ERROR.Println(err) // don't reset backoff - if errors.Is(err, packets.ErrorRefusedBadUsernameOrPassword) { + if errors.Is(err, packets.ErrorRefusedBadUsernameOrPassword) || errors.Is(err, packets.ErrorRefusedNotAuthorised) { continue } } @@ -89,14 +98,7 @@ func (v *MqttConnector) runMqtt(ctx context.Context, token *oauth2.Token) error gcid := TokenExtra(token, "gcid") idToken := TokenExtra(token, "id_token") - var claims jwt.RegisteredClaims - parsed, err := jwt.ParseWithClaims(idToken, &claims, nil) - if err != nil && !errors.Is(err, jwt.ErrTokenUnverifiable) { - return fmt.Errorf("get %w for %s", err, idToken) - } - idExpiry, _ := parsed.Claims.GetExpirationTime() - - v.log.DEBUG.Printf("connect streaming (using gcid %s/ id_token %s, IDT valid: %v, AT valid: %v)", gcid, idToken, idExpiry.Round(time.Second), token.Expiry.Round(time.Second)) + v.log.DEBUG.Printf("connect streaming (using gcid %s, id_token %s, valid: %v)", gcid, idToken, token.Expiry.Round(time.Second)) paho := mqtt.NewClient( mqtt.NewClientOptions(). diff --git a/vehicle/bmw/cardata/provider.go b/vehicle/bmw/cardata/provider.go index b350b6df3..93ff41c14 100644 --- a/vehicle/bmw/cardata/provider.go +++ b/vehicle/bmw/cardata/provider.go @@ -39,9 +39,14 @@ func NewProvider(ctx context.Context, log *util.Logger, api *API, ts oauth2.Toke streaming: make(map[string]StreamingData), } - go func() { - mqtt := NewMqttConnector(ctx, log, clientID, ts) + mqtt := NewMqttConnector(context.Background(), log, clientID, ts) + go func() { + <-ctx.Done() + mqtt.Unsubscribe(vin) + }() + + go func() { for msg := range mqtt.Subscribe(vin) { v.mu.Lock() maps.Copy(v.streaming, msg.Data)