Commit Graph
74 Commits
Author SHA1 Message Date
christianandClaude Opus 5.5 77daf7424d HyperDeck IPs from Companion, Vista Art-Net heartbeat, quiet Tascam module
- The hold-to-fix deck probe takes each HyperDeck's IP from its Companion
  connection's "ip" variable, so the config no longer repeats them.
- APPS shows "VISTA SILENT" when the Lighting PC's Art-Net poll (every 0.5 s)
  is not heard for 5 s: a crashed or closed Vista shows in seconds, not the
  minute macOS takes to drop a network MIDI peer.
- tascam-quiet/ builds the Tascam DA-6400 module 1.3.1-quiet: the recorder's
  "Illegal Status" warning is logged once a minute, not 5 times a second.
- README: hold-to-fix table fixed and updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:46:49 -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
christianandClaude Opus 5.5 7c5f086bd5 A DANTE hold on missing hardware restarts Companion's Dante module.
Dante Virtual Soundcard on the four Macs is restarted directly; for hardware
(consoles, racks, cards, AVIOs) nothing can be restarted from here, so a hold
re-checks via a fresh Dante module connection (harmless to audio and routing).
If the device is still gone it is really off or unplugged. A check's fix can
now be "restart-connection", and a fix map can use "*" for every other sub-check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:42:00 -04:00
christianandClaude Opus 5.5 df4da8f42e Never reboot a HyperDeck to fix a connection that is switched off; turn connections back on instead.
On 2026-10-08 a hold on HD1, whose Companion connection had been disabled,
sent the deck a reboot. Now a disabled connection on any button is fixed by
enabling it, before any other fix is considered. The HyperDeck fix asks the
deck itself (transport info on port 9993): if it answers - recording or not -
only Companion's connection is restarted; only a deck that accepts a
connection and says nothing at all is rebooted; an unreachable deck is left
alone and the button shows FIX FAILED. Tested against a fake deck.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:23:05 -04:00
christianandClaude Opus 5.5 b8748be655 Fix NA Ingest's own DVS from the DANTE button, and stop saying NOTHING TO FIX when something is failing.
STUDIO-A-Ingest now maps to a local dvs_ingest fix (same helper as the other
Macs, which NA Ingest also needs). A hold on a failing button that has no
automatic fix now shows NO AUTO FIX instead of NOTHING TO FIX.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:19:26 -04:00
christianandClaude Opus 5.5 ef9d755982 Let a DANTE hold start Dante Virtual Soundcard's engine, not just open the app.
remote-access/mac-dvs-helper.sh (run once per Mac through Remote Desktop as
root) installs an admin-owned script that does what pressing Start in DVS
does (wantToRun = 1, restart the DVS service) and a sudoers rule letting the
logged-in user run only that script. The dvs_ fixes call it with sudo -n, so
until it is installed the hold shows FIX FAILED rather than pretending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:02:39 -04:00
christianandClaude Opus 5.5 10466cae80 Show on the button what a hold is doing.
A hold now turns the button blue with FIXING <what> while the fix runs, then
CHECKING for 20 s (green if it worked, back to the alarm if not), orange FIX
FAILED if the command failed, and grey NOTHING TO FIX or JUST TRIED / WAIT 1
MIN so a hold always visibly registers. The page redraws as soon as a command
arrives instead of on the next 1 s tick.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:41:44 -04:00
christianandClaude Opus 5.5 51f09900ab Hold a failing button to fix what it is failing on.
Fixes come from config.json only and run over SSH with NA Ingest's
status-panel key (ProPresenter restart, Ableton / Church Translate start,
reopen DVS), locally (Resi bridge, captions, ProdDash) or as a HyperDeck
reboot. A green button does nothing, each fix waits 60 s before it can run
again, and a recording deck is never rebooted. New remote checks ask the Macs
every 10 s whether their apps are running. Group buttons and INGEST now have a
hold too; tests never run a real fix or open an SSH connection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:34:44 -04:00
christianandClaude Opus 5.5 e873d1aa40 Make the Mac key setup work when Remote Desktop runs it as root.
It now targets whoever is logged in at the console instead of the user the
command runs as, and hands the .ssh folder back to them when run as root.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:23:49 -04:00
christianandClaude Opus 5.5 117a80023e Add one-time remote access setup for the Macs and Windows PCs.
mac-authorize.sh is a one-liner for Apple Remote Desktop's Send UNIX Command:
it authorizes NA Ingest's status-panel key for the logged-in user and prints
the account name. windows-setup.ps1 turns on Windows' OpenSSH server,
authorizes the same key, creates desktop start tasks for OBS, Arena, rtpMIDI
and the Bible app, and enables Wake-on-LAN where the adapter allows it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:16:41 -04:00
christianandClaude Opus 5.5 51bd44f9a0 Tell a dead device, a failed connection and a disabled connection apart.
Ping failures now read NO PING, Companion connection errors OFFLINE, and a
watched connection that is disabled in Companion shows amber DISABLED instead
of going quietly grey.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 10:29:50 -04:00
christianandClaude Opus 5.5 1f2c5719fb Ping the NovaStar processors and the Resi decoder as a second opinion.
The UHD Jr was switched off and the NovaStar module still reported
Connected (even after a restart), so LED stayed green. LED now also checks
that each processor answers ping; the Resi decoder (send-only RossTalk) gets
the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 10:27:29 -04:00
christianandClaude Opus 5.5 7f1f37a809 Make a tap on the page number key go to page 1 outright.
The converted key's "startup" page resolves to the current page on surfaces
set to "use last page", so a tap did nothing. The tap page is now
nav_tap_page in config.json (1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:58:59 -04:00
christianandClaude Opus 5.5 a5972d646f Hold the page number key for one second to jump to the status page.
A tap still goes to the start page, now on release so a hold does not flash
through page 1 first. Hold time is nav_hold_ms in config.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:52:21 -04:00
christianandClaude Opus 5.5 815a4ae0e4 Say in the README that only the page number key follows ALL.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:44:12 -04:00
christianandClaude Opus 5.5 1da404c299 Only the page number key follows the ALL button; UP and DOWN are normal again.
New config setting nav_keys (now ["pagenum"]) picks which nav keys are
coloured; nav_keys.py restores the built-in key for any kind not listed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:44:03 -04:00
christianandClaude Opus 5.5 3118cdc281 Colour the page nav keys on every page to follow the ALL button.
nav_templates.json holds Companion's own UP / page number / DOWN keys after
'convert to regular button'; make_page.py colours them from the ALL tile and
nav_keys.py copies them onto all 96 other pages (288 keys, recorded in
nav_locations.json; --revert restores the built-in keys). Also rewrites the
README's top half, which an earlier edit had duplicated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:40:45 -04:00
christianandClaude Opus 5.5 161596cefb Add push_page.py to import the status page without the UI.
It uploads the page file over Companion's own API (tRPC over WebSocket, the
same calls the web UI makes) and imports it into page 19, refusing unless that
page is empty or already the status page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:30:56 -04:00
christianandClaude Opus 5.5 c0c83459e5 Regroup Dante, MIDI and apps into one button each, and fix the morning Bonjour check.
DANTE now alarms for all 19 devices by name. MIDI covers the Lighting PC and
SuperRack peers plus the Lighting PC and NA Tracks sessions; APPS covers
ProPresenter, Ableton, the tracks Mac and the Bible TV app. Five buttons
became three, and a check's tag names the device in the message.

dns-sd pads hours before 10 AM with a space, which the Bonjour parser did not
allow for, so every session read as gone each morning. Parsing is now its
own function with a test for both cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:22:38 -04:00
christianandClaude Opus 5.5 38b6616e3f Make the DANTE button count all 19 watched devices.
It now reads 19/19 to match Dante Controller. NA-Tracks, SuperRack and the
ProPresenter Mac still alarm on their own buttons, so a drop is not flagged
twice; DANTE just shows 18/19 while one of them is missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:15:46 -04:00
christianandClaude Opus 5.5 195b111bb7 Watch Studio B's six Dante devices on the DANTE button too.
All 19 Dante devices are now watched: 16 on DANTE, and NA-Tracks, SuperRack
and the ProPresenter Mac on their own buttons so a drop is not counted twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:10:22 -04:00
christianandClaude Opus 5.5 246500f965 Add the Companion status page and its watchdog for NA Ingest.
status_panel.py runs on NA Ingest as a LaunchAgent. Every second it reads
Companion's connection statuses and module variables, adds what Companion
cannot see (network MIDI peers, Bonjour sessions, pings, launchd services,
disk, Resi cloud, the Bible TV app), and writes one JSON custom variable that
page 19 renders. Buttons acknowledge alarms, mute them, and restart a stuck
Companion connection on a two second hold. If the watchdog stops, the page
turns purple instead of freezing on stale green.

make_page.py builds the page export from config.json; tests/ runs offline
against a fake Companion and a CoreMIDI loopback.

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