diff --git a/drb-edge-node/app/internal/mqtt_manager.py b/drb-edge-node/app/internal/mqtt_manager.py
index 73aba28..f7e3030 100644
--- a/drb-edge-node/app/internal/mqtt_manager.py
+++ b/drb-edge-node/app/internal/mqtt_manager.py
@@ -236,6 +236,12 @@ class MQTTManager:
}
payload["sdr_pins"] = config.sdr_pins
secondary = await secondary_sdr_client.status()
+ # Unreachable secondary-sdr: say so with explicit nulls. C2 only
+ # overwrites keys present in the checkin, so omitting them would leave
+ # a dead decoder showing "Running" forever.
+ payload["secondary_sdr_running"] = None
+ payload["sdr_devices"] = None
+ payload["op25_sdr_serial"] = None
if secondary is not None:
payload["secondary_sdr_running"] = [r["mode"] for r in secondary.get("running", [])]
if secondary.get("devices") is not None:
diff --git a/drb-edge-node/app/templates/index.html b/drb-edge-node/app/templates/index.html
index de7e04e..cfe08d5 100644
--- a/drb-edge-node/app/templates/index.html
+++ b/drb-edge-node/app/templates/index.html
@@ -568,7 +568,8 @@
return `` +
devs.map(d => ``).join('') +
- (selected && !known ? `` : '');
+ (selected && !known ? `` : '');
}
function renderSdr() {
@@ -585,7 +586,7 @@
const running = sdr.running || [];
sdrRows.forEach((row, i) => {
const [name, hint] = SDR_LABELS[row.mode] || [row.mode, ''];
- const pinMissing = row.pin && !(sdr.devices || []).some(d => d.serial === row.pin);
+ const pinMissing = row.pin && sdr.devices !== null && !sdr.devices.some(d => d.serial === row.pin);
const state = !row.enabled ? 'Off'
: sdrDirty ? 'Unsaved'
: sdr.running === null ? 'Unknown'