feat: manual odometer baseline — Settings field computes baseline + trip distance, Dashboard shows (manual) label

This commit is contained in:
Mathieu Moran
2026-08-11 18:51:11 -04:00
parent 887a001723
commit 34253b3ffb
7 changed files with 58 additions and 30 deletions
+6 -13
View File
@@ -45,20 +45,13 @@ dedicated PLAN.md phase (or fold it into the relevant existing work) and mark it
first, add pairing only if provisioning still feels annoying.
### FEAT-03 — Manual start odometer fallback when OBD odometer is unavailable
- **Status**: `IDEA`
- **Area**: Settings page / odometer display (Pi `app_settings`, `/api/stats`, trip odometer)
- **Status**: `SHIPPED` 2026-08-11
- **Area**: Settings page, Dashboard, `modules/app_settings.py`, `modules/app_sql.py`
- **Phase**: Phase 27
- **Requested**: owner — the 2013 Yaris's ECU is (as expected) NOT exposing OBD PID 0xA6
odometer (see Phase 24.6), so the odometer reads nothing.
- **Idea**: allow the owner to enter the vehicle's current odometer reading once in the Settings
page; the app then computes a rolling odometer by adding subsequent trip distances
(from `trips` table cumulative distance) to that entered baseline, instead of relying on the
unavailable OBD odometer PID.
- **Outstanding considerations**: what happens when the user's entered value comes from the car's
instrument cluster vs the OBD one being absent — this would be the *only* odometer source in
that case; needs a clear "this is a manual baseline" indicator in the UI so it's not mistaken
for a live OBD reading; decide whether it should also sync to the remote device config
(Phase 25.5) or stay local.
- **What**: Settings page now has an "Odometer baseline (km)" field. The app stores
this value and computes `odometer_km = baseline + cumulative trip distance`. Dashboard
shows "(manual)" label when using baseline. When baseline is 0, falls back to live
OBD reading (the original behavior). Also appears in `/api/stats` response.
### FEAT-04 — Replace SIM868 2G GSM hat with 4G LTE modem (Huawei E3372h-153)
- **Status**: `IDEA`