Tesla: graceful 400 na token refresh + one-shot reauth skript
400 invalid_grant = spálený token rotací NEBO ~10min výpadek po revokaci souhlasu (Tesla) — místo tracebacku log s návodem a return None (EMS jede dál na defaultech). deploy/tesla/reauth.sh: authorize URL → výměna → DB → ověření v jednom kroku (žádná příležitost pro rotační past). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -47,7 +47,11 @@ def parse_charge_state(vehicle_data: dict[str, Any]) -> dict[str, Any] | None:
|
||||
if level is None:
|
||||
return None
|
||||
odo_miles = vs.get("odometer")
|
||||
ds = resp.get("drive_state") or {}
|
||||
return {
|
||||
"latitude": ds.get("latitude"),
|
||||
"longitude": ds.get("longitude"),
|
||||
"shift_state": ds.get("shift_state"),
|
||||
"vin": resp.get("vin"),
|
||||
"battery_level": int(level),
|
||||
"charge_limit_soc": int(cs.get("charge_limit_soc") or 0) or None,
|
||||
@@ -91,7 +95,18 @@ async def _get_access_token(db: asyncpg.Connection) -> Optional[str]:
|
||||
"refresh_token": refresh,
|
||||
},
|
||||
)
|
||||
r.raise_for_status()
|
||||
if r.status_code >= 400:
|
||||
# 400 invalid_grant = token spálený rotací NEBO ~10min výpadek po
|
||||
# revokaci souhlasu (Tesla docs). Neshazovat volajícího tracebackem.
|
||||
body = r.text[:300]
|
||||
logger.error(
|
||||
"Tesla token refresh selhal (HTTP %s): %s — pokud jsi právě "
|
||||
"revokoval souhlas, počkej ~10 min; jinak obnov token dle "
|
||||
"docs/tesla-fleet-api.md (deploy/tesla/reauth.sh)",
|
||||
r.status_code,
|
||||
body,
|
||||
)
|
||||
return None
|
||||
data = r.json()
|
||||
|
||||
new_access = str(data["access_token"])
|
||||
@@ -144,7 +159,7 @@ async def get_charge_state(
|
||||
|
||||
r = await client.get(
|
||||
f"{API_BASE}/api/1/vehicles/{chosen['id']}/vehicle_data",
|
||||
params={"endpoints": "charge_state;vehicle_state"},
|
||||
params={"endpoints": "charge_state;vehicle_state;location_data"},
|
||||
)
|
||||
if r.status_code == 408:
|
||||
logger.info("Tesla: vozidlo spí / nedostupné (408) — SoC nedoplněno")
|
||||
|
||||
Reference in New Issue
Block a user