macOS's MIDINetworkSession API only reaches the default session (blank and disabled on NA Ingest and NA Tracks), so coremidi.connect_peer writes the named session's "apple.midirtp.session" settings with the peer added, as Audio MIDI Setup's Connect does. Existing peers are passed back unchanged. The watchdog remembers each peer's last address (config "address" is the fallback) and runs it locally for NA Ingest's session or over SSH on the Tracks Mac for NA Tracks' (FX lights). Checked live: both Macs answer "already" while the Lighting PC is connected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
151 lines
12 KiB
JSON
151 lines
12 KiB
JSON
{
|
|
"companion": { "host": "127.0.0.1", "port": 8000 },
|
|
"page": 19,
|
|
"page_name": "19\\nStatus",
|
|
"nav_keys": ["pagenum"],
|
|
"nav_hold_ms": 1000,
|
|
"nav_tap_page": 1,
|
|
"variables": { "state": "sp_state", "heartbeat": "sp_hb", "command": "sp_cmd" },
|
|
|
|
"service_windows": [
|
|
{ "days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "00:00", "end": "23:59" }
|
|
],
|
|
|
|
"debounce_seconds": 3,
|
|
"flap": { "count": 3, "window_seconds": 600 },
|
|
|
|
"network": {
|
|
"interface": "en0",
|
|
"gateway": "10.1.0.1",
|
|
"burst_connections": 4,
|
|
"burst_groups": 3,
|
|
"burst_window_seconds": 10,
|
|
"remember_seconds": 180
|
|
},
|
|
|
|
"alert_webhook": "",
|
|
|
|
"ssh_key": "~/.ssh/id_status_panel",
|
|
|
|
"dante_switches": ["10.66.1.100", "10.66.1.102"],
|
|
"hosts": {
|
|
"prop": { "ssh": "napropresenter@10.1.14.225" },
|
|
"tracks": { "ssh": "waterschurchmedia@10.1.3.227" },
|
|
"translation": { "ssh": "studio@10.1.7.39" },
|
|
"bibletv": { "ssh": "media@10.6.7.13" },
|
|
"lighting": { "ssh": "media@10.1.10.206" },
|
|
"livestream": { "ssh": "media@10.1.9.126", "mac": "6c:24:08:d7:fb:57", "wake_broadcast": "10.1.255.255" }
|
|
},
|
|
|
|
"fixes": {
|
|
"propresenter": { "host": "prop", "short": "PROPRES", "label": "restart ProPresenter (newest installed)",
|
|
"run": "APP=$(ls -d /Applications/ProPresenter*.app | sort -V | tail -1); if pgrep -xq ProPresenter; then pkill -TERM -x ProPresenter; for i in 1 2 3 4 5 6 7 8 9 10; do pgrep -xq ProPresenter || break; sleep 1; done; pkill -KILL -x ProPresenter; sleep 1; fi; open \"$APP\"" },
|
|
"ableton": { "host": "tracks", "short": "ABLETON", "label": "start Ableton if it is not running",
|
|
"run": "pgrep -xq Live || open -a 'Ableton Live 11 Suite'" },
|
|
"translate": { "host": "translation", "short": "TRANSLATE", "label": "start Church Translate if it is not running",
|
|
"run": "pgrep -xq 'Church Translate' || open -a 'Church Translate'" },
|
|
"dvs_prop": { "host": "prop", "short": "DVS", "label": "start Dante Virtual Soundcard on the ProPresenter Mac", "run": "sudo -n /usr/local/sbin/status-panel-dvs-start && open -a 'Dante Virtual Soundcard'" },
|
|
"dvs_tracks": { "host": "tracks", "short": "DVS", "label": "start Dante Virtual Soundcard on the Tracks Mac", "run": "sudo -n /usr/local/sbin/status-panel-dvs-start && open -a 'Dante Virtual Soundcard'" },
|
|
"dvs_translation": { "host": "translation", "short": "DVS", "label": "start Dante Virtual Soundcard on NA Translation", "run": "sudo -n /usr/local/sbin/status-panel-dvs-start && open -a 'Dante Virtual Soundcard'" },
|
|
"dvs_ingest": { "kind": "local", "short": "DVS", "label": "start Dante Virtual Soundcard on NA Ingest", "run": "sudo -n /usr/local/sbin/status-panel-dvs-start && open -a 'Dante Virtual Soundcard'" },
|
|
"bridge": { "kind": "local", "short": "BRIDGE", "label": "restart the Resi bridge",
|
|
"run": "launchctl kickstart -k gui/$(id -u)/org.waterschurch.resi-propresenter || launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/org.waterschurch.resi-propresenter.plist" },
|
|
"captions": { "kind": "local", "short": "CAPTIONS", "label": "restart lobby captions",
|
|
"run": "launchctl kickstart -k gui/$(id -u)/org.waterschurch.lobby-captions || launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/org.waterschurch.lobby-captions.plist" },
|
|
"bibleapp": { "host": "bibletv", "short": "BIBLE APP", "label": "restart the Bible app on the Sanctuary TV PC (Windows: cmd.exe)",
|
|
"run": "taskkill /F /T /IM \"Bible App.exe\" >nul 2>&1 & ping -n 3 127.0.0.1 >nul & schtasks /Run /TN \"\\StatusPanel\\Start BibleApp\"" },
|
|
"obs": { "host": "livestream", "short": "OBS", "label": "start OBS on the LiveStream PC if it is not running (wakes the PC if it is off), then reconnect Companion", "reconnect": true,
|
|
"run": "tasklist /NH /FI \"IMAGENAME eq obs64.exe\" | find /I \"obs64.exe\" >nul || schtasks /Run /TN \"\\StatusPanel\\Start OBS\"" },
|
|
"arena": { "host": "lighting", "short": "ARENA", "label": "start Resolume Arena on the Lighting PC if it is not running, then reconnect Companion", "reconnect": true,
|
|
"run": "tasklist /NH /FI \"IMAGENAME eq Arena.exe\" | find /I \"Arena.exe\" >nul || schtasks /Run /TN \"\\StatusPanel\\Start Arena\"" },
|
|
"vista": { "host": "lighting", "short": "VISTA", "label": "start Vista on the Lighting PC if it is not running (a running Vista is never closed)",
|
|
"run": "tasklist /NH /FI \"IMAGENAME eq Vista.exe\" | find /I \"Vista.exe\" >nul || schtasks /Run /TN \"\\StatusPanel\\Start Vista\"" },
|
|
"midi_reconnect": { "kind": "midi_connect", "short": "RECONNECT", "label": "reconnect the peer to the network MIDI session it dropped out of (like Connect in Audio MIDI Setup); the address is where it was last seen, else the check's \"address\"" },
|
|
"proddash": { "kind": "local", "short": "PRODDASH", "label": "start ProdDash", "run": "open /Applications/ProdDash.app" },
|
|
"hyperdeck": { "kind": "hyperdeck", "short": "HYPERDECK", "label": "reconnect Companion to the HyperDeck, or reboot the deck only if it is hung" }
|
|
},
|
|
|
|
"tiles": [
|
|
{ "id": "all", "label": "ALL", "pos": [0, 1], "kind": "master" },
|
|
{ "id": "rec", "label": "REC", "pos": [0, 2], "members": ["hd1", "hd2", "hd3", "hd4", "hd5", "hd6", "tascam"] },
|
|
{ "id": "audio", "label": "AUDIO", "pos": [0, 3], "members": ["x32", "dante"] },
|
|
{ "id": "rf", "label": "RF", "pos": [0, 4], "members": ["axient1", "axient2", "ulxd", "psm1", "psm2", "psm3"] },
|
|
{ "id": "show", "label": "SHOW", "pos": [0, 5], "members": ["midi", "apps"] },
|
|
{ "id": "video", "label": "VIDEO", "pos": [0, 6], "members": ["atem", "led", "arena"] },
|
|
{ "id": "stream", "label": "STREAM", "pos": [0, 7], "members": ["obs", "resi"] },
|
|
|
|
{ "id": "hd1", "label": "HD1", "pos": [1, 1], "checks": [{ "type": "hyperdeck", "conn": "HyperDeck_1", "fix": { "conn": "hyperdeck" } }] },
|
|
{ "id": "hd2", "label": "HD2", "pos": [1, 2], "checks": [{ "type": "hyperdeck", "conn": "HyperDeck_2", "optional": true, "fix": { "conn": "hyperdeck" } }] },
|
|
{ "id": "hd3", "label": "HD3", "pos": [1, 3], "checks": [{ "type": "hyperdeck", "conn": "HyperDeck_3", "fix": { "conn": "hyperdeck" } }] },
|
|
{ "id": "hd4", "label": "HD4", "pos": [1, 4], "checks": [{ "type": "hyperdeck", "conn": "HyperDeck_4", "optional": true, "fix": { "conn": "hyperdeck" } }] },
|
|
{ "id": "hd5", "label": "HD5", "pos": [1, 5], "checks": [{ "type": "hyperdeck", "conn": "HyperDeck_5", "fix": { "conn": "hyperdeck" } }] },
|
|
{ "id": "hd6", "label": "HD6", "pos": [1, 6], "checks": [{ "type": "hyperdeck", "conn": "HyperDeck_6", "fix": { "conn": "hyperdeck" } }] },
|
|
{ "id": "tascam", "label": "TASCAM", "pos": [1, 7], "checks": [{ "type": "tascam", "conn": "tascam" }] },
|
|
|
|
{ "id": "x32", "label": "X32", "pos": [2, 1], "checks": [{ "type": "conn", "conn": "x32" }] },
|
|
{ "id": "dante", "label": "DANTE", "pos": [2, 2], "checks": [
|
|
{ "type": "dante", "conn": "audinate-dantecontroller",
|
|
"fix": { "NA-ProPresenter-Mac": "dvs_prop", "NA-Tracks": "dvs_tracks", "NA-Translation": "dvs_translation",
|
|
"STUDIO-A-Ingest": "dvs_ingest",
|
|
"*": "dante-auto" },
|
|
"devices": {
|
|
"FOH-DiGiCo-DMI-1": "DMI-1", "FOH-DiGiCo-DMI-2": "DMI-2", "BOH-WING": "WING", "BOH-DQ-Rack": "DQ RACK",
|
|
"BOH-AD4Q-A": "AD4Q-A", "BOH-AD4Q-B": "AD4Q-B", "STUDIO-A-X32": "STA X32",
|
|
"STUDIO-A-Resi-AJA-SDI": "RESI AJA", "STUDIO-A-Ingest": "INGEST", "NA-Translation": "TRANSL",
|
|
"STUDIO-B-RedNet-TNX": "STB TNX", "STUDIO-B-TB": "STB TB", "STUDIO-B-TB-MON": "STB TB MON",
|
|
"STUDIO-B-MON": "STB MON", "STUDIO-B-SOLO-MON": "STB SOLO", "STUDIO-B-Tascam": "STB TASCAM",
|
|
"NA-Tracks": "TRACKS", "FOH-SuperRack-LiveBox": "SUPERRACK", "NA-ProPresenter-Mac": "PROP MAC" } }
|
|
] },
|
|
{ "id": "midi", "label": "MIDI", "pos": [2, 3], "checks": [
|
|
{ "type": "midi_peer", "session": "NA Ingest", "peer": "Lighting PC", "tag": "LIGHT PC", "fix": "midi_reconnect", "address": "10.1.10.206:5004" },
|
|
{ "type": "midi_peer", "session": "NA Ingest", "peer": "SuperRack-LiveBox", "tag": "SUPERRACK", "fix": "midi_reconnect", "address": "10.1.13.140:5004" },
|
|
{ "type": "midi_peer", "host": "tracks", "session": "NA Tracks", "peer": "Lighting PC", "tag": "FX LIGHTS", "fix": "midi_reconnect", "address": "10.1.10.206:5004" },
|
|
{ "type": "mdns", "instance": "Lighting PC", "name": "LIGHT PC MIDI" },
|
|
{ "type": "mdns", "instance": "NA Tracks", "name": "TRACKS MIDI" },
|
|
{ "type": "midi_rx", "source": "Network NA Ingest Listen", "name": "TRACKS IN" }
|
|
] },
|
|
{ "id": "apps", "label": "APPS", "pos": [2, 4], "checks": [
|
|
{ "type": "conn", "conn": "Propresenter-API", "tag": "PROPRES", "fix": "propresenter" },
|
|
{ "type": "remote", "host": "prop", "cmd": "pgrep -xq ProPresenter", "msg": "PROPRES NOT RUNNING", "fix": "propresenter" },
|
|
{ "type": "conn", "conn": "ableton", "tag": "ABLETON" },
|
|
{ "type": "remote", "host": "tracks", "cmd": "pgrep -xq Live", "msg": "ABLETON NOT RUNNING", "fix": "ableton" },
|
|
{ "type": "remote", "host": "translation", "cmd": "pgrep -xq 'Church Translate'", "msg": "TRANSLATE NOT RUNNING", "fix": "translate" },
|
|
{ "type": "ping", "host": "10.1.3.227", "name": "TRACKS MAC" },
|
|
{ "type": "artnet", "source": "10.1.10.206", "max_silence_seconds": 5, "msg": "VISTA SILENT", "fix": "vista" },
|
|
{ "type": "http", "url": "http://10.6.7.13:8080/", "msg": "BIBLE APP DOWN", "interval_seconds": 5, "fix": "bibleapp" },
|
|
{ "type": "conn", "conn": "BibleTV", "tag": "BIBLE OSC" }
|
|
] },
|
|
|
|
{ "id": "service", "label": "ALARMS", "pos": [3, 0], "kind": "service" },
|
|
{ "id": "atem", "label": "ATEM", "pos": [3, 1], "checks": [{ "type": "conn", "conn": "ATEM" }] },
|
|
{ "id": "obs", "label": "OBS", "pos": [3, 2], "checks": [{ "type": "conn", "conn": "OBS-Youtube", "service_only": true, "fix": "obs" }] },
|
|
{ "id": "resi", "label": "RESI", "pos": [3, 3], "checks": [
|
|
{ "type": "conn", "conn": "RESI_Decoder", "tag": "DECODER" },
|
|
{ "type": "ping", "host": "10.1.10.203", "name": "DECODER" },
|
|
{ "type": "conn", "conn": "resi-studio-cues" },
|
|
{ "type": "http", "url": "https://central.resi.io/", "name": "CLOUD" }
|
|
] },
|
|
{ "id": "net", "label": "NET", "pos": [3, 4], "kind": "network" },
|
|
{ "id": "ingest", "label": "INGEST", "pos": [3, 5], "checks": [
|
|
{ "type": "launchd", "label": "org.waterschurch.resi-propresenter", "name": "BRIDGE", "fix": "bridge" },
|
|
{ "type": "launchd", "label": "org.waterschurch.lobby-captions", "name": "CAPTIONS", "fix": "captions" },
|
|
{ "type": "process", "match": "/Applications/ProdDash.app/Contents/MacOS/ProdDash", "name": "PRODDASH", "fix": "proddash" },
|
|
{ "type": "disk", "path": "/", "warn_gb": 25, "err_gb": 8 }
|
|
] },
|
|
{ "id": "led", "label": "LED", "pos": [3, 6], "checks": [
|
|
{ "type": "conn", "conn": "VX1000", "tag": "VX1000" },
|
|
{ "type": "conn", "conn": "UHDJr", "tag": "UHDJR" },
|
|
{ "type": "ping", "host": "10.1.14.116", "name": "VX1000" },
|
|
{ "type": "ping", "host": "10.1.14.115", "name": "UHDJR" }
|
|
] },
|
|
{ "id": "arena", "label": "ARENA", "pos": [3, 7], "checks": [{ "type": "conn", "conn": "arena", "fix": "arena" }] },
|
|
|
|
{ "id": "axient1", "label": "AXIENT 1", "checks": [{ "type": "shure", "conn": "Axient_1", "channels": 4 }] },
|
|
{ "id": "axient2", "label": "AXIENT 2", "checks": [{ "type": "shure", "conn": "Axient_2", "channels": 4 }] },
|
|
{ "id": "ulxd", "label": "ULXD", "checks": [{ "type": "shure", "conn": "ULXD-4", "channels": 1 }] },
|
|
{ "id": "psm1", "label": "PSM 1", "checks": [{ "type": "psm", "conn": "PSM_1", "channels": 2 }] },
|
|
{ "id": "psm2", "label": "PSM 2", "checks": [{ "type": "psm", "conn": "PSM_2", "channels": 2 }] },
|
|
{ "id": "psm3", "label": "PSM 3", "checks": [{ "type": "psm", "conn": "PSM_3", "channels": 2 }] }
|
|
]
|
|
}
|