# Handoff: RepeaterBook integration for the ID-5100 web panel ## Session Metadata - Created: 2026-06-14 ~16:30 - Project: /home/claude/bin/id5100 - Branch: master (repo NOW under git + pushed to git.sethpc.xyz/Seth/id5100) - Continues from: 2026-06-14-144031-id5100-civ-control-suite.md ## Current State — DONE, verified on live hardware, pushed Added a "Repeaters" feature to the existing ID-5100 panel: a RepeaterBook CSV is ingested into a local `repeaters.json`, the panel shows a proximity-ordered, searchable list, and tapping a row tunes the radio (freq + duplex direction + CTCSS tone) over CI-V with per-step status. Built brainstorm → spec → plan → subagent-driven execution → final review → hardening. 27 unit tests pass; full `tune_repeater` ACKed on the rig. ## What shipped (8 commits, baseline 0300070 → 5d48ad0) - `civ.py` — added CTCSS tone BCD codec + duplex/tone command constants. (Offset codec was added then REMOVED after live verification — see below.) - `repeaters.py` (new) — `normalize_csv`, `load`, `search` (rank-ordered), `ingest_csv` + `__main__`. Pure stdlib. `test_repeaters.py` (13 tests). - `repeaters.json` (generated) — 1073 records from `repeaterbook/RB_2606141409.csv`. - `radio.py` — `set_duplex/get_duplex/set_tone/get_tone/set_tone_on/tune_repeater`. - `server.py` — `GET /api/repeaters?q=&limit=`, `POST /api/tune-repeater` (per-step result). - `panel.html` — "Repeaters · nearest first" card (search + list + per-step ✓/✗). - README.md + DECISIONS.md updated; `docs/screenshots/repeaters-panel.png` (verified UI). - Spec: `docs/superpowers/specs/2026-06-14-repeaterbook-integration-design.md` (+ post-CSV revision note). Plan: `docs/superpowers/plans/2026-06-14-repeaterbook-integration.md`. ## CRITICAL live-CI-V findings (2026-06-14, verified on the rig) - **Duplex direction `0x0F`** works (read → 0x10 simplex). 0x10 simplex / 0x11 DUP− / 0x12 DUP+. - **Repeater tone `0x1B/0x00`** works; wire field is **3 bytes**: a `0x00` pad + 2-byte BCD (`00 08 85` = 88.5 Hz). radio.py adds the pad on set, strips it on get (`data[2:]`). - **Tone on/off `0x16/0x42`** works. - **Offset amount `0x0D` is REJECTED (NG)** — not supported on the ID-5100. The radio applies its own configured auto-offset (0.6/5 MHz) when a duplex direction is set, so standard repeaters work from duplex alone. Offset codec/methods were removed (honest YAGNI). - A full `tune_repeater` to W4CIA (147.210, DUP+, 110.9 Hz) returned all steps True, then state was restored to 146.520 simplex. ## Active processes / environment - **`server.py --port 8550` is RUNNING** (background, nohup, log `.server.log`) at http://192.168.0.141:8550/ — the new prod panel with all features. Holds `/dev/ttyUSB0`. Stop by PID (`pgrep -f "server.py --port 8550"` then `kill`); **do NOT** `pkill -f "server.py --port 8550"` — that string self-matches your own shell and kills it (hit this twice this session). - Radio on `/dev/ttyUSB0`, 9600 baud, addr 0x8C. Stop the server before any cli/probe (one owner). ## Data refresh workflow (CSV-only) RepeaterBook's API is now token-gated (401 auth_missing; manual app-token approval — request text is in the spec). We went CSV-only: drop a new export into `repeaterbook/` and run `python3 repeaters.py ingest repeaterbook/.csv repeaters.json`. The export has no lat/long but is proximity-sorted, so file order = rank. ## Possible next steps (all optional) - systemd user unit for `server.py` (still a bare background process; survives until reboot only). - Vendor web fonts locally (panel still pulls DSEG7/Google Fonts from CDNs). - If hands-off data refresh is ever wanted: request the RepeaterBook app token and revive the deferred API client + timer (design spec has the form text). - DV call-routing (URCALL/RPT1/RPT2) remains out of scope (RS-MS1A data-jack protocol). ## Known limitations (by design) - Tune is not atomic (per-step status shows what landed). - DV/D-STAR rows tune freq/direction only; call routing set on the head. - Offset amount comes from radio config, not RepeaterBook (CI-V can't set it on this radio).