OP25 binds its SDR by position ("rtl"), so on 2-SDR nodes it can lose its dongle to readsb and stop recording #11

Closed
opened 2026-09-27 13:27:03 -04:00 by logan · 1 comment
Owner

Happened 2026-09-27 on radio-box (x.58): OP25 was relaunched while readsb (secondary-sdr, ADS-B) held device 0. OP25's generated config is "args": "rtl", which means device 0, so it failed with Failed to open rtlsdr device and recording stopped until the config was hand-pinned to rtl=00000001 (the 800 MHz dongle).

The hand pin is not durable. generate-config and config push rewrite devices[].args back to rtl.

Fix direction:

  • Carry the primary SDR serial in NodeConfig (edge dashboard + C2), and emit rtl=<serial> in generate-config. Keep rtl only when there's a single SDR.
  • secondary-sdr already probes for a free index (b54624e), so once OP25 is serial-pinned the two can't collide in either start order. For symmetry, it could also exclude OP25's serial.

Related, same session:

  • /op25/status reports running while multi_rx is dead: the pgid check survives because the wrapper shell or liquidsoap is still alive. It's the same class of bug fixed in secondary-sdr via Popen.poll().
  • The op25 :stable image has no lsusb, so /op25/devices (node-26#9) logs SDR device enumeration failed every poll and sdr_count is never reported. The branch added usbutils to the Dockerfile, but that image hasn't been rebuilt/promoted.

Refs node-26#9.

**Happened 2026-09-27 on radio-box (x.58):** OP25 was relaunched while readsb (secondary-sdr, ADS-B) held device 0. OP25's generated config is `"args": "rtl"`, which means device 0, so it failed with `Failed to open rtlsdr device` and recording stopped until the config was hand-pinned to `rtl=00000001` (the 800 MHz dongle). **The hand pin is not durable.** generate-config and config push rewrite `devices[].args` back to `rtl`. Fix direction: - Carry the primary SDR serial in NodeConfig (edge dashboard + C2), and emit `rtl=<serial>` in generate-config. Keep `rtl` only when there's a single SDR. - secondary-sdr already probes for a free index (b54624e), so once OP25 is serial-pinned the two can't collide in either start order. For symmetry, it could also exclude OP25's serial. Related, same session: - `/op25/status` reports `running` while multi_rx is dead: the pgid check survives because the wrapper shell or liquidsoap is still alive. It's the same class of bug fixed in secondary-sdr via Popen.poll(). - The op25 `:stable` image has no `lsusb`, so `/op25/devices` (node-26#9) logs `SDR device enumeration failed` every poll and `sdr_count` is never reported. The branch added usbutils to the Dockerfile, but that image hasn't been rebuilt/promoted. Refs node-26#9.
logan closed this issue 2026-09-27 14:41:30 -04:00
Author
Owner

Fixed in 6bf2c9d (merge of feat/sdr-pins, 9b50ba8 + QA fix). OP25 now always opens its dongle by serial (rtl=<serial>, pinned or first-found), rewritten after every config generation, so no config push can revert it. Secondary decoders never touch OP25's dongle. Per-service pins are configurable in both UIs. Verified on radio-box: OP25 stayed up the whole time through priority and pin changes. The lsusb gap is worked around (the SDR count now comes from secondary-sdr). The op25 status false-positive is split into its own issue.

Fixed in 6bf2c9d (merge of feat/sdr-pins, 9b50ba8 + QA fix). OP25 now always opens its dongle by serial (`rtl=<serial>`, pinned or first-found), rewritten after every config generation, so no config push can revert it. Secondary decoders never touch OP25's dongle. Per-service pins are configurable in both UIs. Verified on radio-box: OP25 stayed up the whole time through priority and pin changes. The lsusb gap is worked around (the SDR count now comes from secondary-sdr). The op25 status false-positive is split into its own issue.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logan/node-26#11