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
OBD is disconnected/unavailable (the Pi already knows this from `connection` state).
### FEAT-08 — Predictable IP on phone hotspot (DHCP reservation / static IP)
- **Status**: `IDEA`
### FEAT-08 — Predictable IP on phone hotspot (DHCP client-id)
- **Status**: `SHIPPED` 2026-08-11 (Phase 22)
- **Area**: `deploy/yaris_uplink.py`, phone-hotspot NM profile
- **Phase**: Phase 27
- **Requested**: 2026-08-11 — owner wants the Pi to always get the same IP when connected
to the phone hotspot, to avoid needing to check Settings for the "Last phone IP".
- **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.
- **What**: `dhcp-client-id=yaris-obd` in the NM keyfile gives the Pi a consistent DHCP
lease. The "Last phone IP" link on Settings shows the current address. Pixel testing
confirmed same IP across disconnects.
### FEAT-09 — mDNS (yaris.local) on phone hotspot
- **Status**: `IDEA`
- **Status**: `WONTFIX` 2026-08-12 — hardware/OS limitation
- **Area**: Avahi, phone-hotspot NM profile
- **Phase**: Phase 27
- **Requested**: 2026-08-11 — owner wants `yaris.local` to resolve on phone hotspot.
- **Idea**: Phone hotspot hosts (Android, iOS) typically don't relay multicast DNS. Avahi
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.
- **What**: Phone hotspot hosts (Android, iOS) don't relay multicast DNS. Avahi publishes
correctly on wlan0 AP and home WiFi. Settings "Last phone IP" link is the workaround.
Cannot be fixed in software — this is a phone-OS limitation.
---
+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)
**Started 2026-08-11.** Phase 26 is complete.
### Phase 27: Feature additions — ✅ DONE (3 shipped, 4 candidates remain)
**Completed 2026-08-12.** Three features shipped; remaining 4 are low-priority ideas
tracked in FEATURES.md.
**Shipped:**
- **FEAT-03 — Manual odometer fallback** (2026-08-11): Settings page has an "Odometer
baseline (km)" field. `odometer_km = baseline + cumulative trip distance`. Dashboard
label shows "(manual)" when using baseline. Falls back to live OBD when baseline is 0.
Changed files: `modules/app_settings.py`, `modules/app_sql.py`, `templates/settings.html`,
`templates/index.html`, `static/js/settings.js`, `FEATURES.md`.
- **FEAT-03 — Manual odometer baseline** (2026-08-11): Pi settings has "Odometer baseline
(km)". Dashboard shows `odometer_km = baseline + trip distance`. Pushes to server on save
via `POST /api/device-config/push`. Portal shows read-only synced value. Server overview
stat card. Four sync bugs fixed during implementation:
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)
2. **FEAT-02** — QR / claim-code device pairing flow (medium)
3. **FEAT-04** — Replace SIM868 2G GSM with 4G LTE modem (large)
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)
**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).
- **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.
- **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),
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