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

@CONSULitAS …und ewig grüßt das Murmeltier:

************** Traceback ***************
Traceback (most recent call last):
File „/app/Polestar_2_MQTT.py“, line 575, in
main()
~~~~^^
File „/app/Polestar_2_MQTT.py“, line 528, in main
access_token, expiry_time, refresh_token = ensure_valid_token(
~~~~~~~~~~~~~~~~~~^
access_token,
^^^^^^^^^^^^^
…<3 lines>…
POLESTAR_PASSWORD
^^^^^^^^^^^^^^^^^
)
^
File „/app/Polestar_2_MQTT.py“, line 383, in ensure_valid_token
access_token, expiry_time, refresh_token = get_token(email, password)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File „/app/Polestar_2_MQTT.py“, line 303, in get_token
path_token, cookie, code_verifier = get_path_token() # code_verifier will be generated on each login
~~~~~~~~~~~~~~^^
File „/app/Polestar_2_MQTT.py“, line 208, in get_path_token
path_token=body.split(„url:“)[1].split(„/“)[2]
~~~~~~~~~~~~~~~~~~^^^
IndexError: list index out of range

Nichts geht mehr :face_vomiting:
Ich steige temporär 'mal auf die „alte Tibber-Anbindung“ um - die läuft noch und ist zum Zielladen ausreichend. Ich glaube ich nutze die Feiertage um eine automatische Umschaltung Polestar/Tibber zu basteln.
Ist zwar blöd, aber so oft wie Polestar die API ändert, ist es schön wenn wenigstens Zielladen funktioniert. Das Aufzeichnen und Dokumentieren externer Ladevorgänge, sowie Kilometerstand geht dann halt nicht, braucht aber ehrlich niemand wirklich im Leben :laughing:.

1 „Gefällt mir“

Der Pfad für den Resume Path hat sich mal wieder geändert. Ich habe das vorhin auch für EVCC gefixed, vielleicht hilft dir das ja @CONSULitAS

3 „Gefällt mir“

Also irgendwas ist seltsam.
Ich habe nichts geändert und Jochen ist wohl in den Osterferien.
Mein Container liefert aber immer noch brav korrekte Daten. Grad erst wieder probiert. Auto abgesteckt, zufällig innerhalb von wenigen Sekunden das Update bekommen.
Kann es sein, dass das bei mir noch funktioniert, weil das refresh-token noch gültig ist und bei euch ist das bereits abgelaufen?

Der Access Token ist nur wenige Minuten gültig aber wenn dein Refresh Token noch gültig ist, wird das Problem bei dir nicht auftauchen. Wenn du deinen Container neu startest, läuft der ganze Login-Prozess durch, dann wirst du auf den Fehler kommen.

1 „Gefällt mir“

Refresh-Token hab ich gemeint, hab’s geändert.

Also wird es bei mir auch bald soweit sein.

image
@CONSULitAS Danke!

Same procedure as last year - 'mal wieder geht nichts mehr (die XXX sind korrekte Daten):

"2025-05-21T10:20:08.937259815Z Polestar_2_MQTT.py startet

2025-05-21T10:20:08.937425535Z ==========================

2025-05-21T10:20:08.937626698Z MQTT (Unknown): attempt 1 to reconnect… (waiting 1 seconds)

2025-05-21T10:20:09.939280087Z MQTT (Unknown): Reconnected successfully after 1.00 seconds!

2025-05-21T10:20:09.940576880Z ensure_valid_token()

2025-05-21T10:20:09.940667693Z get_token(), no refresh token available

2025-05-21T10:20:09.940694785Z get_path_token()

2025-05-21T10:20:09.947410820Z MQTT connected with result code ‚Success‘: polestar2/container/connected=online

2025-05-21T10:20:10.074553941Z code_verifier = E-_rUU4ePwczT_x6Z71v0hzWV7irj9ZBBh6bpOf9XXE

2025-05-21T10:20:10.074654180Z code_challenge = QCsxo56lC5nFrr8k6Y45rpejnAv3jqLQq1J-SA7HU5c

2025-05-21T10:20:10.074681920Z cookies = PF=IRTpHvGQQifrNqbQAiquefrx59jkivH5HlNZ7rUEdeIP; Path=/; Expires=Wed, 21-May-2025 11:20:10 GMT; Max-Age=3600; Secure; HttpOnly; SameSite=None, PF.PERSISTENT=gjP7qn20iO81Pk5Ccp9CBmB4y; Path=/; Expires=Tue, 19-Aug-2025 10:20:10 GMT; Max-Age=7776000; Secure; HttpOnly; SameSite=None

2025-05-21T10:20:10.074751308Z cookie = PF=IRTpHvGQQifrNqbQAiquefrx59jkivH5HlNZ7rUEdeIP

2025-05-21T10:20:10.074775474Z path_token = CVFQGpCxNq

2025-05-21T10:20:10.075215892Z perform_login()

2025-05-21T10:20:10.223000740Z max_age = 15780000

2025-05-21T10:20:10.223115849Z uid = NONE

2025-05-21T10:20:10.223143330Z code = J-VrkuhvXVzGtUkjp1uowpksFlkOrCPK4JhbFJyL

2025-05-21T10:20:10.223660210Z get_api_token()

2025-05-21T10:20:10.361021621Z access_token = eyJhbGciOiJSUzI1NiIsImtpZCI6InhyQnI5ajR…

2025-05-21T10:20:10.361110490Z refresh_token = s72NYRarK7JjZ7IOL09Bg4zwlV2ocRHvIgELG2b2t1

2025-05-21T10:20:10.361135193Z expires_in = 299 (seconds)

2025-05-21T10:20:10.424919657Z expiry_time = 2025-05-21 12:25:09 CEST+0200

2025-05-21T10:20:10.425500444Z get_car_data()

2025-05-21T10:20:11.458740338Z {

2025-05-21T10:20:11.458890150Z „vin“: „XXXXXXXXXXX“,

2025-05-21T10:20:11.458918483Z „internalVehicleIdentifier“: „XXXXXXX“,

2025-05-21T10:20:11.458943705Z „modelYear“: „2021“,

2025-05-21T10:20:11.458968149Z „hasPerformancePackage“: true,

2025-05-21T10:20:11.458990723Z „software“: {

2025-05-21T10:20:11.459012667Z „version“: „P03.04“,

2025-05-21T10:20:11.459035426Z „versionTimestamp“: „2025-03-21 17:45:22“

2025-05-21T10:20:11.459057851Z },

2025-05-21T10:20:11.459080018Z „registrationNo“: „XXXXXXXX“,

2025-05-21T10:20:11.459102610Z „factoryCompleteDate“: „XXXXXX“,

2025-05-21T10:20:11.459125295Z „registrationDate“: „XXXXX“,

2025-05-21T10:20:11.459148257Z „deliveryDate“: „XXXXXX“,

2025-05-21T10:20:11.459170183Z „currentPlannedDeliveryDate“: „XXXXX“

2025-05-21T10:20:11.459192479Z }

2025-05-21T10:20:11.460941264Z get_car_telemetry_data()

2025-05-21T10:20:11.744106167Z Error : ‚NoneType‘ object is not subscriptable

2025-05-21T10:20:11.744260312Z in line: 484

2025-05-21T10:20:11.744286979Z type : TypeError

2025-05-21T10:20:11.744332089Z message: ‚NoneType‘ object is not subscriptable

2025-05-21T10:20:11.744356070Z ************** Traceback ***************

2025-05-21T10:20:11.746036060Z Traceback (most recent call last):

2025-05-21T10:20:11.746114411Z File „/app/Polestar_2_MQTT.py“, line 575, in

2025-05-21T10:20:11.746141207Z main()

2025-05-21T10:20:11.746164243Z ~~~~^^

2025-05-21T10:20:11.746226039Z File „/app/Polestar_2_MQTT.py“, line 545, in main

2025-05-21T10:20:11.746250408Z car_telemetry_data = get_car_telemetry_data(POLESTAR_VIN, access_token)

2025-05-21T10:20:11.746272778Z File „/app/Polestar_2_MQTT.py“, line 484, in get_car_telemetry_data

2025-05-21T10:20:11.746294611Z return response.json()[‚data‘][‚carTelematics‘]

2025-05-21T10:20:11.746315389Z ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^

2025-05-21T10:20:11.746336963Z TypeError: ‚NoneType‘ object is not subscriptable

1 „Gefällt mir“

Docker Container stürzt leider ab…

2025/05/21 12:20:24,stdout,
2025/05/21 12:20:24,stdout,TypeError: 'NoneType' object is not subscriptable
2025/05/21 12:20:24,stdout,           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
2025/05/21 12:20:24,stdout,    return response.json()['data']['carTelematics']
2025/05/21 12:20:24,stdout,"  File \"/app/Polestar_2_MQTT.py\", line 484, in get_car_telemetry_data
2025/05/21 12:20:24,stdout,"    car_telemetry_data = get_car_telemetry_data(POLESTAR_VIN,access_token)"
2025/05/21 12:20:24,stdout,"  File \"/app/Polestar_2_MQTT.py\", line 545, in main"
2025/05/21 12:20:24,stdout,    ~~~~^^
2025/05/21 12:20:24,stdout,    main()
2025/05/21 12:20:24,stdout,"  File \"/app/Polestar_2_MQTT.py\", line 575, in <module>"
2025/05/21 12:20:24,stdout,Traceback (most recent call last):
2025/05/21 12:20:24,stdout,************** Traceback ***************
2025/05/21 12:20:24,stdout,message: 'NoneType' object is not subscriptable
2025/05/21 12:20:24,stdout,type   : TypeError
2025/05/21 12:20:24,stdout,in line: 484
2025/05/21 12:20:24,stdout,Error  : 'NoneType' object is not subscriptable
2025/05/21 12:20:24,stdout,get_car_telemetry_data()
2025/05/21 12:20:24,stdout,}
2 „Gefällt mir“

Jepp - last update 11:21

Die GraphQL query hat sich schon wieder geändert :unamused:

evcc spuckt auch gerade. :persevere: kommt mir fast vor als machen die das mittlerweile absichtlich. Das HomeAssistant plugin ist auch schon seit einiger Zeit nicht mehr funktionsfähig.

Der Grund ist bei allen drei der gleiche: die API hat sich geändert.

Aus Spaß werden sie das nicht machen, das wird wohl die Vorbereitung auf irgendeine Änderung sein :man_shrugging:

Homeassistent geht bei mir seit heute Vormittag nicht mehr, vorher absolut problemlos.

Siehe oben 202020202020

hab ich mir auch gedacht, aber schauen wir mal, mit welchen tollen Erneuerungen wir rechnen können :slight_smile:

Möglich, aber bisher waren die Änderungen alle ohne sichtbares Kundenbenefit - nur Arbeit zur Anpassung der Schnittstelle. Hoffentlich reißt da 'mal nicht der Geduldsfaden bei Jochen @CONSULitAS

@Enso Markus, vielleicht kannst das Thema in deinem Jour-Fix anbringen.
Heute wird doch auf die Daten über das normale Portal zugegriffen. Jede Polestar-interne Änderung wirkt sich diesen Zugriff aus. Ich könnte mir vorstellen, dass eine „Kunden-API“ seitens Polestar gemacht wird, die (soweit möglich) stabil gehalten wird. Anpassungen für App, Portal u.ä. laufen dann daran vorbei.

Und was soll ich anbringen? Dass die bitte an ihren Daten nicht rumfummeln?
Wir haben die Daten ja abgegriffen. Das ist ja nicht offizielles.

Und die API wünschen wir uns seit 3 Olympiaden.

3 „Gefällt mir“

Na die 4 Olympiade​:stuck_out_tongue_winking_eye:… vielleicht begreifen sie irgendwann den Mehrwert. Im Sinne von Überschussladen, V2G und V2H wird die API immer wichtiger, für den ein oder anderen (mich) in Zukunft sogar kaufentscheidend.
Ich werde z.B. kein Geld für einen Speicher ausgeben, sondern das Auto entsprechend nutzen. Erlaubt das Auto dies nicht, werden (fiktiv?) diese Kosten zu Lasten des Autos gerechnet. Ohne API wird ein Polestar dann ca. 8000€ teurer und die Balance Auto/Speicher durch Überschuss laden muss manuell gemacht werden. Man kann den € halt nur einmal ausgeben und Komfort ist auch nicht zu verachten.

Es gibt mittlerweile eine Lösung:

Ich werde wahrscheinlich bis morgen ein Update bereitstellen können, da sich ein paar Dinge strukturell geändert haben. Über den Absturz bin ich schon weg…

5 „Gefällt mir“

Die größte Änderung ist, dass man jetzt ein Array von VINs bereitstellen muss und nicht eine einzelne. Entsprechend bekommt man auch ein Array an Ergebnissen. Hilfreich für alle, die mehr als einen Polestar haben.

1 „Gefällt mir“