False alarms between services at NA: RESI AUDIO SILENT only while recording; TRACKS MIDI waits 2 min

2026-10-25 09:00 between services NA showed 2 DOWN while everything was fine: the Resi send is quiet
between services (the silence check now judges only while a HyperDeck records), and the NA Tracks
Bonjour advert blips for 10-70 s (24 times on record) while the real MIDI links stay up (its check now
waits 120 s). Applied on NA between services together with the queued RESI VOX.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 09:06:55 -04:00
co-authored by Claude Opus 5.5
parent b6221e0d63
commit c471ac2c92
5 changed files with 24 additions and 14 deletions
+16 -7
View File
@@ -350,15 +350,24 @@ class TestChecks(unittest.TestCase):
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):
red in auto-fix's hours or while a deck records, left alone at 4 AM when the console may be off."""
red while a deck records (a service is on); between services the Resi send is quiet on purpose."""
self.assertEqual(sp.atem_levels(CONFIG["atem"]["silence"]), {"levels": {"16": "Resi - RX1"}, "silence_seconds": 30})
engine = sp.Engine(CONFIG)
sunday_7am = datetime(2026, 10, 25, 7, 0).timestamp() # the tests' auto-fix hours start 06:30
quiet = ["input 16 Resi - RX1: no audio for 30 s or more"]
decks = [c["conn"] for t in CONFIG["tiles"] for c in t.get("checks", []) if c["type"] == "hyperdeck"]
for d in decks:
self.snap.vars[(d, "status")] = "stopped"
self.snap.atem = {"connected": True, "audio": [], "camera": [], "silence": quiet, "time": sunday_7am}
self.assertEqual(run_steps(engine, self.snap, sunday_7am, 4)[0]["atem"]["x"], "ATEM\nRESI AUDIO SILENT")
self.assertEqual(run_steps(engine, self.snap, sunday_7am, 4)[0]["atem"]["x"], "ATEM\nOK") # between services
recording = [c for t in CONFIG["tiles"] for c in t.get("checks", []) if c["type"] == "hyperdeck"][0]["conn"]
self.snap.conns[recording] = {"id": "x", "enabled": True, "category": "good", "message": ""}
self.snap.vars[(recording, "status")] = "record"
engine = sp.Engine(CONFIG)
self.assertEqual(run_steps(engine, self.snap, sunday_7am + 10, 4)[0]["atem"]["x"], "ATEM\nRESI AUDIO SILENT")
thursday_4am = datetime(2026, 10, 22, 4, 0).timestamp()
engine = sp.Engine(CONFIG)
self.snap.vars[(recording, "status")] = "stopped" # nothing recording: no verdict on silence
self.snap.atem = dict(self.snap.atem, time=thursday_4am)
self.assertEqual(run_steps(engine, self.snap, thursday_4am, 4)[0]["atem"]["x"], "ATEM\nOK")
@@ -520,12 +529,12 @@ class TestChecks(unittest.TestCase):
if p["name"] != "Lighting PC"]
self.snap.mdns.discard("NA Tracks")
tiles, _ = run_steps(sp.Engine(CONFIG), self.snap, self.now, 4)
self.assertEqual(tiles["midi"]["x"], "MIDI\nLIGHT PC MIDI LOST\n+1")
self.assertEqual(tiles["show"]["x"], "SHOW\nLIGHT PC MIDI LOST\n+1") # named, no "MIDI" prefix
self.assertEqual(tiles["midi"]["x"], "MIDI\nLIGHT PC MIDI LOST") # the Bonjour blip waits 2 min (2026-10-25)
self.assertEqual(tiles["show"]["x"], "SHOW\nLIGHT PC MIDI LOST") # named, no "MIDI" prefix
self.assertNotIn("MIDI TRACKS", tiles["show"]["x"])
self.snap.midi["NA Ingest"]["peers"].append({"name": "Lighting PC", "address": "", "state": "running"})
tiles, _ = run_steps(sp.Engine(CONFIG), self.snap, self.now, 4)
self.assertEqual(tiles["midi"]["x"], "MIDI\nTRACKS MIDI GONE")
tiles, _ = run_steps(sp.Engine(CONFIG), self.snap, self.now, 125)
self.assertEqual(tiles["midi"]["x"], "MIDI\nTRACKS MIDI GONE") # still gone after 2 minutes
def test_bible_tv_app_down(self):
self.snap.http["http://10.6.7.13:8080/"] = False
@@ -1520,7 +1529,7 @@ class TestFixes(unittest.TestCase):
self.assertEqual(self.plan("dante"), [("fix", "dvs_ingest")])
# A failure with no fix must not claim there is nothing wrong.
self.snap.mdns = self.snap.mdns - {"NA Tracks"} # an advert gone: nothing to reconnect
_, t = run_steps(self.engine, self.snap, SUNDAY, 4)
_, t = run_steps(self.engine, self.snap, SUNDAY, 125)
self.engine.run_fixes("midi", self.snap, None, t)
self.assertEqual(self.engine.notes["midi"]["text"], "NO AUTO\nFIX")