After a full re-login (doLogin), the library rebuilds its vehicle list with
new objects. The old vehicle reference in the collect loop was never updated
again, causing data to silently freeze. Re-select the vehicle from wc.vehicles
after every update() call to stay on the current object.
Also: update() now returns and logs its bool result; the record log line shows
which top-level keys changed each cycle (or "none" when the backend returned
identical data).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
If extract_all() returns None (Dashboard init failure), appending it to
store["records"] would cause _accept_loop to crash with AttributeError on
the next client connection. Since only OSError was caught, the thread
died permanently — no further clients could join push_clients, so live
broadcasts reached nobody.
- collect.py: skip None snapshots instead of appending them
- network.py: filter None records in _accept_loop; catch all exceptions
during history send (not just OSError) so the thread survives
- storage_helpers.py: filter None records when loading from disk
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the domain-based collect_snapshot with extract_all(), which iterates
all supported instruments via vw_dashboard.Dashboard. Each entry is stored as
{value, unit, str_state} grouped by component type. Units are validated against
a whitelist and normalised (d→days, °C→degC); unrecognised units are dropped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffs should always be computed against the last full snapshot,
not the last broadcast payload.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Always compute the payload (diff or full snapshot) regardless of
last_broadcast state, and store the broadcast payload — not the raw
snapshot — as last_broadcast so subsequent diffs are based on what
was actually sent.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Switches the VW API backend from carconnectivity + connector-volkswagen
to volkswagencarnet (local fork with the cariad-hybrid-auth-fix patch
applied), fixing authentication against the current CARIAD BFF endpoints.
- requirements.txt: point at local volkswagencarnet git repo via
git+file:// URL (editable path no longer needed now the patch is
committed there)
- we_connect.py: rewrite around the async volkswagencarnet Connection
class; a persistent asyncio event loop held in _Session lets the rest
of the code stay synchronous
- data_model.py: remap all extractors to volkswagencarnet Vehicle
properties and Paths constants; output shape preserved so
apply_procedural and the GUI client continue to work unchanged
- collect.py: swap carconnectivity error import, drop
TemporaryAuthenticationError (no equivalent), fix vehicle.vin.value →
vehicle.vin
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
run() stays in server/collect.py with relative imports.
main() (CLI arg parsing, credential loading) moves to server/main.py.
install.sh updated to use `python -m server.main` (required for relative
imports to resolve correctly when invoked as a module).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>