docs: WiFi role swap + hotspot settings feature (FEAT-11)

- PLAN.md: Hardware section + Architecture #2/#5 updated for wlan1=AP(5GHz), wlan0=uplink
- FEATURES.md: FEAT-11 SHIPPED (hotspot SSID/password UI + 5GHz role swap)
- readme.md: hardware table + hotspot feature line updated
- deploy/readme.md: profile names/bands updated (home-wifi on wlan0, Hotspot-local 5GHz on wlan1)
This commit is contained in:
Mathieu Moran
2026-08-12 16:25:16 -04:00
parent e222dbdba7
commit 14981c066b
4 changed files with 71 additions and 37 deletions
+36 -12
View File
@@ -18,18 +18,19 @@ dedicated PLAN.md phase (or fold it into the relevant existing work) and mark it
## Summary ## Summary
| ID | Status | Created | Title | Phase | | ID | Status | Title | Phase |
|----|--------|---------|-------|-------| |----|--------|-------|-------|
| FEAT-01 | `IDEA` | 2026-08-10 | Parallel/concurrent chunked dashcam uploads | Phase 27 | | FEAT-01 | `IDEA` | Parallel/concurrent chunked dashcam uploads | Phase 27 |
| FEAT-02 | `IDEA` | 2026-08-10 | QR / claim-code device pairing flow | Phase 27 | | FEAT-02 | `IDEA` | QR / claim-code device pairing flow | Phase 27 |
| FEAT-03 | `SHIPPED` | 2026-08-10 | Manual start odometer fallback | Phase 27 | | FEAT-03 | `SHIPPED` | Manual start odometer fallback | Phase 27 |
| FEAT-04 | `IDEA` | 2026-08-11 | Replace SIM868 2G with 4G LTE modem | Phase 27 | | FEAT-04 | `IDEA` | Replace SIM868 2G with 4G LTE modem | Phase 27 |
| FEAT-05 | `SHIPPED` | 2026-08-11 | DTC history synced to remote server | Phase 27 | | FEAT-05 | `SHIPPED` | DTC history synced to remote server | Phase 27 |
| FEAT-06 | `SHIPPED` | 2026-08-11 | Trip ID column in history table | Phase 26 | | FEAT-06 | `SHIPPED` | Trip ID column in history table | Phase 26 |
| FEAT-07 | `SHIPPED` | 2026-08-11 | Phone-hotspot auto-connect docs | Phase 22 | | FEAT-07 | `SHIPPED` | Phone-hotspot auto-connect docs | Phase 22 |
| FEAT-08 | `SHIPPED` | 2026-08-11 | Predictable IP on phone hotspot | Phase 22 | | FEAT-08 | `SHIPPED` | Predictable IP on phone hotspot | Phase 22 |
| FEAT-09 | `WONTFIX` | 2026-08-11 | mDNS (yaris.local) on phone hotspot | — | | FEAT-09 | `WONTFIX` | mDNS (yaris.local) on phone hotspot | — |
| FEAT-10 | `IDEA` | 2026-08-12 | Home Assistant integration | unassigned | | FEAT-10 | `IDEA` | Home Assistant integration | unassigned |
| FEAT-11 | `SHIPPED` | Hotspot SSID/password settings + 5GHz WiFi role swap | Phase 27 |
--- ---
@@ -184,3 +185,26 @@ dedicated PLAN.md phase (or fold it into the relevant existing work) and mark it
app.py startup unless the user explicitly configures it. app.py startup unless the user explicitly configures it.
### FEAT-11 — Hotspot SSID/password settings + 5GHz WiFi role swap
- **Status**: `SHIPPED` 2026-08-12
- **Area**: `app.py`, `templates/settings.html`, `static/js/settings.js`,
`deploy/yaris-hotspot.sudoers`, `deploy/yaris_uplink.py`, `deploy/install_netwatch.sh`,
`modules/app_network.py`
- **Phase**: Phase 27
- **What**: Two related changes:
1. **Hotspot settings UI** — the Pi Settings page "In-car access" card now has SSID +
password fields (password write-only). `GET /api/hotspot` reads the current SSID via
nmcli; `POST /api/hotspot` updates SSID/password and restarts the AP immediately.
Backed by `deploy/yaris-hotspot.sudoers` (privileged nmcli on the `Hotspot-local`
profile).
2. **WiFi role swap** — the fast TP-Link T3U (wlan1) now hosts the in-car AP on **5GHz**
("vroom vroom yaris de course" at 10.42.0.1) for fast phone access (Android dev, video
browsing); the weak onboard BCM43438 (wlan0) carries the internet uplink (home WiFi
"BuzzBis" + phone hotspot, static IP 192.168.50.220). This was done because the AP on
the onboard radio was too slow for interactive Android work. Tradeoff: away-from-home
uploads now run over the weak radio (accepted — background task). A single radio cannot
be AP + client at once, so the phone-hotspot uplink must stay on wlan0.
- **Files**: `yaris_uplink.py` (PRIMARY=wlan0, AP_INTERFACE=wlan1, AP_CONNECTION=Hotspot-local),
`app_network.py` (uplink on wlan0, AP on wlan1), `install_netwatch.sh` (rebinds profiles).
+19 -11
View File
@@ -12,9 +12,14 @@ pick up the project without needing prior chat history.
- **Board**: Raspberry Pi 3 Model B Rev 1.2, 906MB RAM. Confirmed too weak to run an AI coding - **Board**: Raspberry Pi 3 Model B Rev 1.2, 906MB RAM. Confirmed too weak to run an AI coding
agent — all agent-assisted dev work happens on a separate local machine; the Pi is only used agent — all agent-assisted dev work happens on a separate local machine; the Pi is only used
for hardware bring-up/testing/deployment via SSH (`yaris@<pi-ip>`). for hardware bring-up/testing/deployment via SSH (`yaris@<pi-ip>`).
- **WiFi**: Dual-radio setup — **TP-Link Archer T3U (RTL8812BU)** USB dongle as `wlan1` for - **WiFi**: Dual-radio setup — **TP-Link Archer T3U (RTL8812BU)** USB dongle as `wlan1` and the
Internet uplink (home WiFi, phone hotspot), onboard BCM43438 as `wlan0` running a permanent onboard BCM43438 as `wlan0`. **2026-08-12 role swap**: the fast T3U now hosts the in-car AP
AP ("yaris 911" at 10.42.0.1, password "yaris911!"). Both radios active simultaneously. ("vroom vroom yaris de course" on 5GHz at 10.42.0.1) for fast phone access (Android dev, video
browsing); the weak onboard radio carries the internet uplink (home WiFi "BuzzBis" +
phone hotspot, static IP 192.168.50.220, gw 192.168.50.1). Both radios active simultaneously.
Tradeoff: away-from-home uploads (dashcam/trip sync) now run over the weak onboard radio — a
background task, accepted by owner. A single radio cannot be AP + client at once, so the
phone-hotspot uplink cannot also live on wlan1 while it hosts the AP.
- **GPS/GSM**: Waveshare **SIM868 GSM/GPRS/GNSS/Bluetooth HAT**. GNSS provides live GPS fixes - **GPS/GSM**: Waveshare **SIM868 GSM/GPRS/GNSS/Bluetooth HAT**. GNSS provides live GPS fixes
(confirmed working, ~7 satellites, ~80s cold-start TTFF). GSM/GPRS cellular is **not in use** (confirmed working, ~7 satellites, ~80s cold-start TTFF). GSM/GPRS cellular is **not in use**
(no SIM card available); a Huawei **E3372h-153 4G LTE modem** has been purchased as a future (no SIM card available); a Huawei **E3372h-153 4G LTE modem** has been purchased as a future
@@ -66,13 +71,16 @@ pick up the project without needing prior chat history.
OSM tile usage policy. Bounding box is a required CLI arg (the user's own driving area, not OSM tile usage policy. Bounding box is a required CLI arg (the user's own driving area, not
committed here), zoom 8-15 by default (~14k tiles for a city-plus-suburbs-sized area, well committed here), zoom 8-15 by default (~14k tiles for a city-plus-suburbs-sized area, well
under MapTiler's 100k/month free quota). under MapTiler's 100k/month free quota).
2. **WiFi hotspot mode**: **Dual-radio** — the TP-Link Archer T3U (wlan1) handles all internet 2. **WiFi hotspot mode**: **Dual-radio** — the fast TP-Link Archer T3U (wlan1) hosts the
uplink traffic (home WiFi, phone hotspot), while the onboard WiFi (wlan0) runs a permanent in-car AP ("vroom vroom yaris de course" on 5GHz at 10.42.0.1), while the onboard BCM43438
AP ("yaris 911" at 10.42.0.1) that is never taken down by the uplink manager. The hotspot (wlan0) carries all internet uplink traffic (home WiFi, phone hotspot) and is never taken
is *only* for local web-UI viewing on a phone/laptop while driving — it is not part of the down by the uplink manager. The hotspot is *only* for local web-UI/Android access while
upload path. Remote-server uploads happen independently via home WiFi (when in range), driving — it is not part of the upload path. Remote-server uploads happen independently via
phone hotspot (Phase 22), or cellular fallback (decision #5). Phone-hotspot auto-connects home WiFi (when in range), phone hotspot (Phase 22, now on wlan0), or cellular fallback
on wlan1 within ~60s of appearing, falls back to home-wifi when it disappears. (decision #5). Phone-hotspot auto-connects on wlan0 within ~60s of appearing, falls back to
home-wifi when it disappears. **2026-08-12 swap** from the previous arrangement (uplink on
wlan1, AP on wlan0) to put the fast radio on the AP for interactive phone work; the weak
radio's uplink slowness is accepted because away-from-home upload is a background task.
3. **Local/remote persistence**: Keep SQLite locally (reliable local write path per trip). The 3. **Local/remote persistence**: Keep SQLite locally (reliable local write path per trip). The
original plan paired this with MongoDB Atlas for remote sync (`modules/app_db.py`, fixed in original plan paired this with MongoDB Atlas for remote sync (`modules/app_db.py`, fixed in
Phase 7) — **superseded by decision #4/Phase 9**: the actual remote store is the self-hosted Phase 7) — **superseded by decision #4/Phase 9**: the actual remote store is the self-hosted
@@ -81,7 +89,7 @@ pick up the project without needing prior chat history.
4. **Remote server**: Self-hosted — a custom server/API (e.g. on a home server or VPS) receives 4. **Remote server**: Self-hosted — a custom server/API (e.g. on a home server or VPS) receives
itinerary and dashcam uploads, rather than 3rd-party managed cloud services. itinerary and dashcam uploads, rather than 3rd-party managed cloud services.
5. **Remote upload uplink**: Three paths, tried in order: (1) WiFi/Ethernet via `requests`, 5. **Remote upload uplink**: Three paths, tried in order: (1) WiFi/Ethernet via `requests`,
(2) phone hotspot via wlan1 when configured and in range (Phase 22), (3) SIM868 GSM/GPRS (2) phone hotspot via wlan0 when configured and in range (Phase 22), (3) SIM868 GSM/GPRS
cellular fallback (AT-command HTTP client, tracking batches only — no dashcam video). cellular fallback (AT-command HTTP client, tracking batches only — no dashcam video).
Cellular is **untested** (no SIM card). A Huawei E3372h-153 4G LTE modem has been purchased Cellular is **untested** (no SIM card). A Huawei E3372h-153 4G LTE modem has been purchased
to replace the 2G-only SIM868 cellular path once a SIM is available (FEAT-04). to replace the 2G-only SIM868 cellular path once a SIM is available (FEAT-04).
+12 -11
View File
@@ -20,8 +20,8 @@ cd /home/yaris/app/yaris-obd
# REQUIRED before netwatch install: # REQUIRED before netwatch install:
# Create/update NetworkManager profiles named exactly: # Create/update NetworkManager profiles named exactly:
# - home-wifi (client WiFi) # - home-wifi (client WiFi → wlan0, the internet uplink)
# - Hotspot (local AP, shared at 10.42.0.1/24) # - Hotspot-local (local AP, shared at 10.42.0.1/24, on wlan1)
# See section 4 below for exact nmcli commands. # See section 4 below for exact nmcli commands.
bash deploy/install_service.sh bash deploy/install_service.sh
@@ -42,9 +42,10 @@ curl -I http://127.0.0.1/
## TP-Link Archer T3U (RTL8812BU) driver ## TP-Link Archer T3U (RTL8812BU) driver
This project expects the T3U USB adapter as `wlan1` for hotspot/uplink logic. This project expects the T3U USB adapter as `wlan1` for the in-car AP (5GHz)
On a fresh Pi, install the RTL8812BU DKMS driver before configuring WiFi and the onboard radio as `wlan0` for the internet uplink (home WiFi + phone
profiles: hotspot). On a fresh Pi, install the RTL8812BU DKMS driver before configuring
WiFi profiles:
```bash ```bash
sudo apt-get update sudo apt-get update
@@ -107,8 +108,8 @@ cd /home/yaris/app/yaris-obd
`deploy/install_netwatch.sh` expects two profiles to already exist: `deploy/install_netwatch.sh` expects two profiles to already exist:
- `home-wifi` (normal client connection) - `home-wifi` (normal client connection → wlan0, the internet uplink)
- `Hotspot` (local AP for phones/laptops in the car) - `Hotspot-local` (local 5GHz AP on wlan1 for phones/laptops in the car)
### 4a) Home WiFi profile (edit SSID/password) ### 4a) Home WiFi profile (edit SSID/password)
@@ -116,7 +117,7 @@ cd /home/yaris/app/yaris-obd
sudo nmcli connection add \ sudo nmcli connection add \
type wifi \ type wifi \
con-name home-wifi \ con-name home-wifi \
ifname wlan1 \ ifname wlan0 \
ssid "<HOME_WIFI_SSID>" \ ssid "<HOME_WIFI_SSID>" \
wifi-sec.key-mgmt wpa-psk \ wifi-sec.key-mgmt wpa-psk \
wifi-sec.psk "<HOME_WIFI_PASSWORD>" \ wifi-sec.psk "<HOME_WIFI_PASSWORD>" \
@@ -127,10 +128,10 @@ sudo nmcli connection add \
### 4b) Local hotspot profile (edit password) ### 4b) Local hotspot profile (edit password)
```bash ```bash
sudo nmcli connection add type wifi con-name Hotspot ifname wlan1 ssid yaris-obd sudo nmcli connection add type wifi con-name Hotspot-local ifname wlan1 ssid yaris-obd
sudo nmcli connection modify Hotspot \ sudo nmcli connection modify Hotspot-local \
802-11-wireless.mode ap \ 802-11-wireless.mode ap \
802-11-wireless.band bg \ 802-11-wireless.band a \
wifi-sec.key-mgmt wpa-psk \ wifi-sec.key-mgmt wpa-psk \
wifi-sec.psk "<HOTSPOT_PASSWORD>" \ wifi-sec.psk "<HOTSPOT_PASSWORD>" \
ipv4.method shared \ ipv4.method shared \
+4 -3
View File
@@ -36,8 +36,8 @@ Dashboard — mobile (390 px) and desktop (1280 px):
Automatic reconnects with clear adapter/ECU diagnostics. DTC codes persist across reboots. Automatic reconnects with clear adapter/ECU diagnostics. DTC codes persist across reboots.
- **Real GPS tracking** — Waveshare SIM868 GNSS HAT with GPIO PWRKEY auto-power-on. Live position - **Real GPS tracking** — Waveshare SIM868 GNSS HAT with GPIO PWRKEY auto-power-on. Live position
plotted on an offline Leaflet map (pre-cached tiles, no internet needed). plotted on an offline Leaflet map (pre-cached tiles, no internet needed).
- **WiFi hotspot** — auto-switches between home WiFi and a self-hosted AP for in-car phone access - **WiFi hotspot** — fast 5GHz in-car AP on the T3U (wlan1), internet uplink (home WiFi +
at `http://yaris.local` (no port number). Phone hotspot uplink supported for on-the-road sync. phone hotspot) on the onboard radio (wlan0). SSID/password configurable from the Settings page.
- **Dashcam workflow** — auto-detects any USB dashcam, mounts read-only, browses files before - **Dashcam workflow** — auto-detects any USB dashcam, mounts read-only, browses files before
importing. Import one, selected, or all files. Delete individual or all files directly from the importing. Import one, selected, or all files. Delete individual or all files directly from the
dashcam. Verified against real 28GB/87-file hardware. dashcam. Verified against real 28GB/87-file hardware.
@@ -74,7 +74,8 @@ Dashboard — mobile (390 px) and desktop (1280 px):
| Raspberry Pi 3 Model B Rev 1.2 | Web UI host, logger, uploader, and WiFi hotspot | | Raspberry Pi 3 Model B Rev 1.2 | Web UI host, logger, uploader, and WiFi hotspot |
| Waveshare SIM868 HAT | GNSS (GPS) + optional GSM/GPRS uplink, unused Bluetooth | | Waveshare SIM868 HAT | GNSS (GPS) + optional GSM/GPRS uplink, unused Bluetooth |
| USB OBD-II adapter | PL2303-based, ELM327-compatible (originally Bluetooth, switched to USB) | | USB OBD-II adapter | PL2303-based, ELM327-compatible (originally Bluetooth, switched to USB) |
| TP-Link Archer T3U (RTL8812BU) | USB WiFi dongle — AC1300 dual-band, replaces onboard wlan0 for hotspot + uplink | | TP-Link Archer T3U (RTL8812BU) | USB WiFi dongle — AC1300 dual-band. Hosts the 5GHz in-car AP (wlan1) since 2026-08-12 |
| Onboard BCM43438 (wlan0) | Internet uplink (home WiFi + phone hotspot) since 2026-08-12 |
| USB dashcam | Any brand — detected as generic USB mass storage | | USB dashcam | Any brand — detected as generic USB mass storage |
| 2013 Toyota Yaris | The patient | | 2013 Toyota Yaris | The patient |