4 Commits
Author SHA1 Message Date
christianandClaude Fable 5.1 5d66805687 Step 0 of the settings page: registry, safe restart, remembered state, test verb, page markers
- schema.py: every setting with type, default, help, owner screen and the rules a config must
  pass; tests/test_schema.py keeps it in step with the code (every key the code reads is declared,
  every default matches, check types and fix kinds agree, the glossary covers every word a key can
  show, today's config still builds today's pages apart from the key notes)
- status_panel.py: VERSION + started.json; SIGTERM lets a running fix finish and starts nothing new
  (RESTARTING SOON); fixes-running.json and live-now.json for the settings page; state.json keeps
  the ALARMS override, acknowledgements, auto-fix tries and fix times across restarts, keyed by
  what a check is about rather than its position; 'test' and 'resurvey' commands; queued commands
  dropped at start; overnight windows; a HyperDeck switched off is always switched back on;
  the spotify fix kind (playlist set once, in config 'spotify'); Windows remote checks batched for
  cmd.exe with conditional echoes; every fix's kind and host validated; never_auto; wording and
  numbers from config (site block, timing, page_hold_ms, auto-fix keep_months); hyperdeck_probe
  removed; --check and --exit-timeout
- make_page.py: numbers from config, markers on every key, nav templates per Companion version,
  --out; push_page.py: a page is overwritten only when every key carries a marker (foreign keys
  named by position), secret-free fetch, host from the site; nav_keys.py: host from the site;
  netgear.py: switches and the shared-port limit from config
- install.sh: validates with the new code first, keeps prev/ for --rollback, --keep-config,
  derived ExitTimeOut, wider deploy list, waits for the start stamp
- config.json: site, timing, spotify sections; Windows hosts marked; deployed to NA Ingest and
  both pages re-imported once (--force) so every key carries its marker

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-13 16:00:41 -04:00
christianandClaude Opus 5.5 d06798adf0 Find Dante PoE devices by MAC automatically instead of hard-coding ports.
Every 10 minutes the watchdog maps each Dante device: name and IP from
Companion, MAC from NA Ingest's ARP table, switch port and PoE state from
the Netgear switches in dante_switches, saved to dante-map.json. A DANTE hold
on a missing PoE-powered device power-cycles the port it is on now (found
live by MAC, or its last known port if it has aged out and nothing else is
there); never a port with more than 2 devices. Re-patching, adding or
renaming devices needs no config change. First live map: 19 devices, the 4
Studio B boxes on PoE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:31:51 -04:00
christianandClaude Opus 5.5 c8b9216ea5 A DANTE hold power-cycles a missing Studio B PoE box on its Netgear switch port.
STUDIO-B-SOLO-MON, MON, TB and TB-MON map to ports 0/14-0/17 on the Netgear
M4250 Dante switch 10.66.1.102. netgear.py poe_cycle first checks the port's
MAC table and refuses if a different device is plugged in there, then runs
poe reset. Tested 2026-10-08 13:10 on SOLO-MON: dropped off Dante and was
back about 17 s later. install.sh now copies netgear.py too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:12:45 -04:00
christianandClaude Opus 5.5 9838ce9292 Add netgear.py: read the Dante switches' MAC table and PoE status.
The Dante network runs on two Netgear M4250 AV switches (10.66.1.100
M4250-8G2XF-PoE+, 10.66.1.102 M4250-26G4XF-PoE+), managed by Engage from NA
Ingest. netgear.py logs in over their CLI with the login stored in NA
Ingest's login keychain (service netgear-status-panel) and, read-only, finds
which port a MAC is on and what PoE a port is delivering. The Studio B AVIOs
and talkback are on 10.66.1.102 ports 0/14-0/17.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:09:13 -04:00