From 575a99feb571227b3546f5d68aa71bbf5c49ae23 Mon Sep 17 00:00:00 2001 From: Logan Cusano Date: Sun, 27 Sep 2026 14:41:27 -0400 Subject: [PATCH] checkin: report an unreachable secondary-sdr as null, never keep stale 'Running' QA blocker: when the secondary-sdr container was down, the checkin omitted secondary_sdr_running / sdr_devices / op25_sdr_serial, and C2 only overwrites keys that are present, so the dashboard kept the last 'Running' forever. Send explicit nulls. The local card also says 'not reported' rather than 'not plugged in' for a pin it can't check. Co-Authored-By: Claude Opus 5.5 --- drb-edge-node/app/internal/mqtt_manager.py | 6 ++++++ drb-edge-node/app/templates/index.html | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) 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'