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:
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user