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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 withFailed to open rtlsdr deviceand recording stopped until the config was hand-pinned tortl=00000001(the 800 MHz dongle).The hand pin is not durable. generate-config and config push rewrite
devices[].argsback tortl.Fix direction:
rtl=<serial>in generate-config. Keeprtlonly when there's a single SDR.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/statusreportsrunningwhile 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().:stableimage has nolsusb, so/op25/devices(node-26#9) logsSDR device enumeration failedevery poll andsdr_countis never reported. The branch added usbutils to the Dockerfile, but that image hasn't been rebuilt/promoted.Refs node-26#9.
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.