Polestar-API zu MQTT im Container (openWB-V1-Anbindung möglich)

Könnt ihr mal gucken ob euer Container aktuell tut?

Meiner nicht. Status “error”. Letztes Update angeblich heute 10:37.

Pull und Neustart auch erledigt, nichts gebracht.

Ist online und läuft, alle 280s neue Abfrage.

1 „Gefällt mir“

Na bravo. Meiner spackt. Hab das monatelang nicht angefasst, bis auf den nötigen Pull neulich weil sie wieder die API geändert hatten.

Lief bis heute früh um 10:37 und will jetzt nicht mehr.

Logs:

Polestar_2_MQTT.py startet
==========================
    MQTT (Unknown): attempt 1 to reconnect... (waiting 1 seconds)
    MQTT (Unknown): Reconnected successfully after 1.00 seconds!
ensure_valid_token()
get_token(), no refresh token available
 get_path_token()
    MQTT connected with result code 'Success': polestar2/container/connected=online
  code_verifier  = 1E8nMyFBoD6Tst0XO0-HfbJyrOsRdi214eXqNpt_gw0
  code_challenge = 9UueBTtgQGeLBIK29ns1pIbztU_X115anbHVyfrYgr4
  cookies        = PF=XQAZYhiso6MP2bfpG3KYIijs3bgaQgVzWU4PepCvOif1; Path=/; Expires=Fri, 17 Apr 2026 12:13:21 GMT; Max-Age=3600; Secure; HttpOnly; SameSite=None
  cookie         = PF=XQAZYhiso6MP2bfpG3KYIijs3bgaQgVzWU4PepCvOif1
  path_token     = YIDopXo7f4
 perform_login()
  max_age    = 15780000
  uid        = NONE
  code       = olE7RrUJ5fNJ-fCiY2U0TqbySibGlFwAUx9HrI0N
 get_api_token()
  access_token  = eyJhbGciOiJSUzI1NiIsImtpZCI6Ikl4cVA1RVd...
  refresh_token = 232ELWVdfHooJbB30TIOJIgi6XWf3hRmoX7h7PhSQE
  expires_in    = 299 (seconds)
  expiry_time   = 2026-04-17 13:18:20 CEST+0200
get_car_data()
get_car_data(): unexpected API response
{
  "data": null,
  "errors": [
    {
      "path": null,
      "locations": [
        {
          "line": 12,
          "column": 9,
          "sourceName": null
        }
      ],
      "message": "Validation error of type FieldUndefined: Field 'hasPerformancePackage' in type 'VehicleInformation' is undefined @ 'getConsumerCarsV2/hasPerformancePackage'"
    },
    {
      "path": null,
      "locations": [
        {
          "line": 19,
          "column": 9,
          "sourceName": null
        }
      ],
      "message": "Validation error of type FieldUndefined: Field 'content' in type 'VehicleInformation' is undefined @ 'getConsumerCarsV2/content'"
    }
  ]
}

Kann damit jemand was anfangen? Als ob wieder was geändert worden wäre.

Es werden versucht Felder zu lesen, die es nicht mehr in der API gibt. Konkret hasPerformancePackage und content

Ich würde vermuten, das wird bei allen anderen auch auf die Bretter gehen, wenn ihr eure Container neustartet.

Denke ich auch. Warum allerdings meiner schon die Grätsche gemacht hat, weiß ich nicht.

content/model/name ist jetzt modelName :man_shrugging:

1 „Gefällt mir“

Hallo Martin,

den Fehler hatte ich auch.
Ich habe jetzt nach einiger Suche die Abfrage in der Datei “graphql_queries.py“ im Container geändert.

Mit der stark gekürzten Version bekomme ich wieder aktuelle Daten mit dem Container aus der API-Schnittstelle.

GET_CONSUMER_CARS_V2_QUERY = """
query GetConsumerCarsV2 {
    getConsumerCarsV2 {
        vin
        internalVehicleIdentifier
        registrationNo
        market
        originalMarket
        currentPlannedDeliveryDate
        deliveryDate
        edition
        pno34
        # hasPerformancePackage
        modelYear
        # commercialModelYears
        computedModelYear
        structureWeek
        primaryDriver
        userIsPrimaryDriver
    }
}

Liebe Grüße
Micha

1 „Gefällt mir“

Danke Micha

Hast du das direkt im Container geändert oder außerhalb und den Container neu gebaut?

Edit: Ich habe mir nun so geholfen:

Die Datei aus dem Container auf meinen Host kopiert.

Datei editiert mit Micha’s Änderungen.

Wieder zurück kopiert.

Container Restart.

Bekomme nun wieder Updates. Einen docker pull überlebt das sicherlich nicht. Reicht aber erst mal, bis das offiziell gefixt ist.

Danke für die Hinweise.

Ich habe den Container neu gebaut und das erst einmal so umgesetzt.

Außerdem habe ich ein neues Feature eingebaut:

################

GraphQL overrides

The container now mounts ./local-files to /local-files.

If /local-files/graphql_queries.py exists inside the container, the app prefers that file over the built-in src/graphql_queries.py. This lets you customize GraphQL queries without modifying the shipped source code.

Included template:

Usage:

  1. copy local-files/graphql_queries.py_sample to local-files/graphql_queries.py
  2. adjust the queries or payload builders as needed
  3. restart the container

Keep the function names build_getconsumercarsv2_payload() and build_cartelematicsv2_payload(vin) unchanged, because the main program imports exactly these names.

################

Damit könnt Ihr die Queries im Notfall selber lokal anpassen, ohne den Container anfassen zu müssen.

Wenn es dann klappt, gerne per Pull-Request (habe ich dann schnell merged, oder auch hier im Forum.

Außerdem kann man den Code jetzt auch lokal unter Linux ohne Container laufen lassen. Ideal zum Test und zur Weiterentwicklung:

################

Local startup

  1. create .env from .env.example
  2. create .env_local from .env_local.example
  3. adjust both files to your environment
  4. run ./run_local.sh

run_local.sh creates .venv if needed, installs Python dependencies, and then starts the app locally.

################

Das sollte eigentlich auch auf dem Mac klappen, wenn Python installiert ist (brew install python). Habe ich aber noch nicht probiert.

Gerne nehme ich auch Anregungen für Optimierungen. :smiling_face_with_sunglasses:

1 „Gefällt mir“