-
Notifications
You must be signed in to change notification settings - Fork 74
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
polestar soc:trap failing api in fetch_soc #1614
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Die Fehlerbehandlung erfolgt zentral in
core/packages/modules/update_soc.py
Line 52 in 02b34ff
if ev.data.get.fault_state == 2: |
Der Kontexthandler
with SingleComponentUpdateContext(self.fault_state): |
Die Fehlerbehandlung in polestar/api.py muss angepasst werden:
- In Z16. das req.get_http_session() verwenden. Dort wird in einem Callback geprüft, ob ein Fehler aufgetreten ist und eine Exception geworfen.
- In Z.32 dann:
except Exception as e:
if result.status_code == 401:
self.auth.delete_token()
if self.auth.access_token is not None:
# if we got an access code but the query failed, VIN could be wrong, so let`s check it
self.check_vin()
raise e
- Z 36-40 können dann weg.
Ich habe das in den Wiki-Beitrag mit aufgenommen: #1616 |
Ich muss zugeben, dass das meine bescheidenen Programmierkenntnisse übersteigt... Das req.get_http_session() ist jetzt eingebaut, das jetzt überflüssige check_vin() in get_battery_data habe ich rausgenommen. |
# preset values will be returned if api fails | ||
soc = 0 | ||
est_range = 0 | ||
if bat_data is not None: | ||
soc = bat_data['batteryChargeLevelPercentage'] | ||
est_range = bat_data['estimatedDistanceToEmptyKm'] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
# preset values will be returned if api fails | |
soc = 0 | |
est_range = 0 | |
if bat_data is not None: | |
soc = bat_data['batteryChargeLevelPercentage'] | |
est_range = bat_data['estimatedDistanceToEmptyKm'] | |
soc = bat_data['batteryChargeLevelPercentage'] | |
est_range = bat_data['estimatedDistanceToEmptyKm'] |
Default-Werte werden zentral gesetzt.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Was heisst zentral? Das geht doch über die fetch_soc Funktion und die muss doch irgendwelche Werte übergeben. Auch hier soll eine unnötige Exception (und ein überflüssiger log Eintrag) vermieden werden
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In welchen Fällen ist bat_data == None? Wenn die Abfrage fehlgeschlagen ist. Und dieser Fehlschlag soll geloggt werden und dem Benutzer im UI angezeigt werden, damit er weiß, dass die SoC-Abfrage fehlgeschlagen ist.
Das setzt voraus, dass die fetch_soc-Funktion die Exception nicht abfängt und die Werte nicht mit einem Standart-Wert füllt.
Der Zweig von if bat_data is not None:
sollte nie erreicht werden, denn in diesem Fall muss die Funktion mit einer Exception verlassen worden sein, damit die Fehlerbehandlung das Loggen der Exception und die Meldung für das UI durchführen kann.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Auch hier soll eine unnötige Exception (und ein überflüssiger log Eintrag) vermieden werden
Was meinst Du mit unnötig? Wenn die Abfrage fehlschlägt, ist die Exception doch nicht unnötig, sondern nötig.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich hatte das noch nicht verstanden, dass die Funktion dann verlassen wird
In Z 20/21 entweder die weitere Verarbeitung abbrechen und eine Exception werfen |
|
Hallo,
mir ist aufgefallen, dass das Modul einen Fehler schmeisst, wenn die Authorisierung scheitert, z.B.
2024-05-07 01:33:44,450 - {modules.vehicles.polestar.api:21} - {ERROR:fetch soc_ev0} - query_params:not yet authenticated 2024-05-07 01:33:44,461 - {modules.common.fault_state:49} - {ERROR:fetch soc_ev0} - Polestar2: FaultState FaultStateLevel.ERROR, FaultStr <class 'TypeError'> ("'NoneType' object is not subscriptable",), Traceback: Traceback (most recent call last): File "/var/www/html/openWB/packages/modules/common/configurable_vehicle.py", line 66, in update car_state = self._get_carstate_by_source(vehicle_update_data, source) File "/var/www/html/openWB/packages/modules/common/configurable_vehicle.py", line 109, in _get_carstate_by_source return self.__component_updater(vehicle_update_data) File "/var/www/html/openWB/packages/modules/vehicles/polestar/soc.py", line 20, in updater return api.fetch_soc( File "/var/www/html/openWB/packages/modules/vehicles/polestar/api.py", line 94, in fetch_soc soc = bat_data['batteryChargeLevelPercentage'] TypeError: 'NoneType' object is not subscriptable
Deshalb würde ich die Variablen soc und est_range vorbelegen.
Momentan habe ich -1 gesetzt aber vielleicht habt ihr für diesen Fall einen anderen Wert vorgesehen?
Gruß,
Philipp