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'