diff --git a/config.json b/config.json index 4c5d049..84975ef 100644 --- a/config.json +++ b/config.json @@ -2489,7 +2489,8 @@ }, { "conn": "resi-studio-cues", - "type": "conn" + "type": "conn", + "amber": true }, { "name": "CLOUD", diff --git a/schema.py b/schema.py index 249e1f7..4225997 100644 --- a/schema.py +++ b/schema.py @@ -294,6 +294,8 @@ field("tiles[].checks[].service_only", "bool", False, "Legacy: only during a ser "are armed all day).", "Keys", advanced=True) field("tiles[].checks[].debounce_seconds", "int", None, "Wait before this check's fault shows.", "Keys", advanced=True, lo=0, hi=60) +field("tiles[].checks[].amber", "bool", False, "A Companion connection whose errors show amber, not red (a cloud helper " + "like Resi cues: its trouble is not the stream being down).", "Keys", advanced=True) field("tiles[].checks[].ignore_warning", "bool", False, "Ignore Companion's yellow warning state.", "Keys") field("tiles[].checks[].optional", "bool", False, "A HyperDeck that may have no disk (grey, no alarm).", "Keys") field("tiles[].checks[].disk_service_only", "bool", True, "NO DISK only during a service.", "Keys", advanced=True) @@ -480,7 +482,7 @@ field("ready.mic_positions", "dict", {}, "Other PCO positions and the mic they n # fields: the keys that type reads; subs: the sub-check names it returns (fix tables use them); # identity: what it is about; module: the Companion module its connection is expected to use. CHECKS = { - "conn": {"fields": ["conn", "service_only", "ignore_warning"], "subs": ["conn"], "identity": ["conn"], "module": None, + "conn": {"fields": ["conn", "service_only", "ignore_warning", "amber"], "subs": ["conn"], "identity": ["conn"], "module": None, "question": "Is a device answering?", "words": "A Companion connection is good."}, "hyperdeck": {"fields": ["conn", "optional", "disk_service_only", "full_minutes", "low_minutes", "rec_sync", "ip"], "subs": ["conn", "disk", "rec"], "identity": ["conn"], "module": "bmd-hyperdeck", diff --git a/status_panel.py b/status_panel.py index 5a74fba..f33c9fc 100644 --- a/status_panel.py +++ b/status_panel.py @@ -273,6 +273,9 @@ def check_conn(chk, snap, ctx): c = snap.conns.get(chk["conn"], {}) if chk.get("ignore_warning") and res.level == WARN and c.get("enabled") and c.get("category") == "warning": res = Result(OK) + if chk.get("amber") and res.level == ERR and c.get("enabled"): + # A cloud helper (Resi cues): its error is not the stream being down (2026-10-25: "Poll failed"). + res = Result(WARN, res.msg, service_only=res.service_only) return [("conn", res)] diff --git a/tests/test_status_panel.py b/tests/test_status_panel.py index a0bd6cc..6dc83ce 100644 --- a/tests/test_status_panel.py +++ b/tests/test_status_panel.py @@ -355,6 +355,9 @@ class TestChecks(unittest.TestCase): tiles, _ = run_steps(sp.Engine(CONFIG), self.snap, self.now, 4) self.assertEqual(tiles["resi"]["x"], "RESI\nRATE LIMITED") self.assertNotEqual(level(tiles["resi"]), "err") + self.snap.conns["resi-studio-cues"]["message"] = "Poll failed" # its other error: amber too ("amber" on its check) + tiles, _ = run_steps(sp.Engine(CONFIG), self.snap, self.now, 4) + self.assertNotEqual(level(tiles["resi"]), "err") def test_resi_audio_silent(self): """An input stuck at the meter floor (2026-10-25: the Resi AJA passed no Dante audio and nothing said so):