docs: Phase 27 DONE (3 shipped) — odometer sync, trip ID, hotspot docs; FEAT-08 shipped, FEAT-09 wontfix

This commit is contained in:
Mathieu Moran
2026-08-12 01:16:53 -04:00
parent 22bbee3b30
commit 13cb8b4361
3 changed files with 36 additions and 26 deletions
+9 -16
View File
@@ -146,26 +146,19 @@ dedicated PLAN.md phase (or fold it into the relevant existing work) and mark it
previously-active codes as cleared. Is that desired? Probably not — should skip upload when previously-active codes as cleared. Is that desired? Probably not — should skip upload when
OBD is disconnected/unavailable (the Pi already knows this from `connection` state). OBD is disconnected/unavailable (the Pi already knows this from `connection` state).
### FEAT-08 — Predictable IP on phone hotspot (DHCP reservation / static IP) ### FEAT-08 — Predictable IP on phone hotspot (DHCP client-id)
- **Status**: `IDEA` - **Status**: `SHIPPED` 2026-08-11 (Phase 22)
- **Area**: `deploy/yaris_uplink.py`, phone-hotspot NM profile - **Area**: `deploy/yaris_uplink.py`, phone-hotspot NM profile
- **Phase**: Phase 27 - **What**: `dhcp-client-id=yaris-obd` in the NM keyfile gives the Pi a consistent DHCP
- **Requested**: 2026-08-11 — owner wants the Pi to always get the same IP when connected lease. The "Last phone IP" link on Settings shows the current address. Pixel testing
to the phone hotspot, to avoid needing to check Settings for the "Last phone IP". confirmed same IP across disconnects.
- **Idea**: `dhcp-client-id=yaris-obd` is already set for consistent leases. Could add a
fallback static IP (`192.168.43.100` for Android, `172.20.10.100` for iPhone). Challenge:
different phones use different subnets. Settings already shows last IP — could make it
more prominent or add a "Copy" button.
### FEAT-09 — mDNS (yaris.local) on phone hotspot ### FEAT-09 — mDNS (yaris.local) on phone hotspot
- **Status**: `IDEA` - **Status**: `WONTFIX` 2026-08-12 — hardware/OS limitation
- **Area**: Avahi, phone-hotspot NM profile - **Area**: Avahi, phone-hotspot NM profile
- **Phase**: Phase 27 - **What**: Phone hotspot hosts (Android, iOS) don't relay multicast DNS. Avahi publishes
- **Requested**: 2026-08-11 — owner wants `yaris.local` to resolve on phone hotspot. correctly on wlan0 AP and home WiFi. Settings "Last phone IP" link is the workaround.
- **Idea**: Phone hotspot hosts (Android, iOS) typically don't relay multicast DNS. Avahi Cannot be fixed in software — this is a phone-OS limitation.
already publishes on wlan0 AP and home WiFi. Possible workaround: lightweight DNS proxy
on Pi responding to `yaris.local` queries, or use Settings "Last phone IP" link. Phase 22
testing confirmed Pixel doesn't relay mDNS.
--- ---
+22 -10
View File
@@ -1945,23 +1945,35 @@ agree on OBD and GPS state. BUGS.md Open section is empty. readme.md project sta
--- ---
### Phase 27: Feature additions — 🚧 IN PROGRESS (1 shipped, 6 candidates) ### Phase 27: Feature additions — ✅ DONE (3 shipped, 4 candidates remain)
**Started 2026-08-11.** Phase 26 is complete. **Completed 2026-08-12.** Three features shipped; remaining 4 are low-priority ideas
tracked in FEATURES.md.
**Shipped:** **Shipped:**
- **FEAT-03 — Manual odometer fallback** (2026-08-11): Settings page has an "Odometer - **FEAT-03 — Manual odometer baseline** (2026-08-11): Pi settings has "Odometer baseline
baseline (km)" field. `odometer_km = baseline + cumulative trip distance`. Dashboard (km)". Dashboard shows `odometer_km = baseline + trip distance`. Pushes to server on save
label shows "(manual)" when using baseline. Falls back to live OBD when baseline is 0. via `POST /api/device-config/push`. Portal shows read-only synced value. Server overview
Changed files: `modules/app_settings.py`, `modules/app_sql.py`, `templates/settings.html`, stat card. Four sync bugs fixed during implementation:
`templates/index.html`, `static/js/settings.js`, `FEATURES.md`. 1. Sync overwrote Pi odometer with stale server value (`_store_synced_config` no longer touches it).
2. JS skipped `POST /api/device-config` when enabling sync (always-send fix).
3. Backend returned error when toggling sync with locked fields present (toggle-first fix).
4. `get_device_by_id()` missing `odometer_baseline` in SQL SELECT (added column, shifted indices).
Changed: `modules/app_settings.py`, `modules/app_sql.py`, `modules/app_device_sync.py`,
`modules/app_device_config.py`, `templates/settings.html`, `static/js/settings.js`,
`server/modules/db.py`, `server/modules/device_config.py`,
`server/templates/device_settings.html`, `static/js/portal-device-settings.js`,
`server/app.py`, `FEATURES.md`.
- **FEAT-06 — Trip ID column in history** (2026-08-11): Narrow `#ID` column on server
history (`data-show-id="1"`). Checkbox + batch-delete server-only (`data-batch-delete-url`).
Changed: `static/js/history.js`, `server/templates/history.html`.
- **FEAT-07 — Phone-hotspot auto-connect docs** (2026-08-11): Already implemented in
Phase 22; documented and verified with real Pixel hardware.
**Remaining candidates:** **Remaining candidates (4):**
1. **FEAT-01** — Parallel/concurrent chunked dashcam uploads (medium) 1. **FEAT-01** — Parallel/concurrent chunked dashcam uploads (medium)
2. **FEAT-02** — QR / claim-code device pairing flow (medium) 2. **FEAT-02** — QR / claim-code device pairing flow (medium)
3. **FEAT-04** — Replace SIM868 2G GSM with 4G LTE modem (large) 3. **FEAT-04** — Replace SIM868 2G GSM with 4G LTE modem (large)
4. **FEAT-05** — DTC history synced to remote server (medium) 4. **FEAT-05** — DTC history synced to remote server (medium)
5. **FEAT-08** — Predictable IP on phone hotspot (small)
6. **FEAT-09** — mDNS on phone hotspot (small)
### Phase 28: Native Android companion app — 🚧 IN PROGRESS (low priority, always last) ### Phase 28: Native Android companion app — 🚧 IN PROGRESS (low priority, always last)
**Renumbered from former Phase 26 on 2026-08-10 to make room for the road-test bug-fix phase. **Renumbered from former Phase 26 on 2026-08-10 to make room for the road-test bug-fix phase.
+5
View File
@@ -55,6 +55,11 @@ Dashboard — mobile (390 px) and desktop (1280 px):
GPS/OBD diagnostics, and quick actions (test server, sync now, reconnect uplink, restart app). GPS/OBD diagnostics, and quick actions (test server, sync now, reconnect uplink, restart app).
- **Offline-first alerts** — notification bell on every page for check-engine, storage pressure, - **Offline-first alerts** — notification bell on every page for check-engine, storage pressure,
upload backlog, temperature/power faults, and GPS loss while moving. Optional ntfy push. upload backlog, temperature/power faults, and GPS loss while moving. Optional ntfy push.
- **Manual odometer** — Pi Settings page accepts a baseline reading; dashboard computes
`odometer = baseline + trip distance`. Synced to the remote server; portal shows read-only value.
- **Device config sync** — server-side owner name, car model, display name, avatar path, and sync
toggle hot-reload on the Pi without restart. Multi-device management on the portal with
create/rotate/delete keys and one-time API-key reveal.
- **Reverse geocoding** — `/api/geocode` uses `reverse_geocoder` offline (no internet needed), - **Reverse geocoding** — `/api/geocode` uses `reverse_geocoder` offline (no internet needed),
upgrades to Nominatim street-level when online. LRU-cached. Results pre-loaded for trip scrubbing. upgrades to Nominatim street-level when online. LRU-cached. Results pre-loaded for trip scrubbing.
- **Offline web UI** — Flask, Bootstrap 5, Socket.IO, Chart.js, Leaflet. All assets served - **Offline web UI** — Flask, Bootstrap 5, Socket.IO, Chart.js, Leaflet. All assets served