Monitoring & control desk for the museum's BrightSign video players — live screenshots, one-click reboot, Q-SYS-driven synchronised playback, remote script management, and self-updating.
The Wall is a Windows app that runs on the AV laptop on the museum LAN. It connects to every BrightSign player, shows a live thumbnail of each screen, and lets you reboot players and drive synchronised audio/video from the Q-SYS Core — all from one window. It also keeps a public status/history page and updates itself.
| Piece | Role |
|---|---|
| BrightSign players (LS-series) | Play the room videos. Controlled over their Diagnostic Web Server (DWS) on the LAN. |
| Q-SYS Core | Plays the audio zones; triggers the synchronised Play/Stop sequence. |
| The Wall (this app) | Monitors players + hosts the bridge Q-SYS talks to. Runs on the laptop. |
ConstantiaBSWall-Setup-<version>-x64.exe from the project's download page.127.0.0.1:5000 — the header shows Bridge: running on :5000 (green).One tile per player: a live screenshot, an online/offline dot, IP, and the bridge ID. Controls in the header:
| Control | What it does |
|---|---|
| Auto-refresh + interval | Refresh tiles automatically; choose 1 s up to 5 min. |
| Fast (1–2 s) | Screenshot-only refresh for a near-live view (lighter than a full refresh). |
| Cols / Fit screen | 1–3 columns, or scale every tile to fit the window (no scroll) — good for a glance or a screen recording. |
| Refresh now / Reboot all | Force a refresh; reboot every player at once. |
| Per-tile reboot / full-screen | Reboot a single player; click a tile to view it full-screen. |
| ⏱ Boot profile | Side-by-side boot diagnostics (see §8). |
| ⤓ Check for updates | Manually check for a newer version (see §9). |
+ Add player → enter IP, DWS port (usually 80), and the DWS
username/password (default admin + the unit's serial number).
⭳ Import configs reads one .txt per player from
the configured folder (label/value pairs: friendly name, IP, port, username,
password). Use this to load all players at once. The ⧉ Q-SYS IDs
button shows a Name / IP / Bridge ID table to copy into Q-SYS.
ip:port),
so they stay stable across re-installs and re-imports — Q-SYS never needs
re-pasting.Open the Q-SYS Setup tab. It generates the Lua scripts to paste into Q-SYS Designer, pre-filled for this laptop's bridge URL.
PlayerIP. Used for manual single-player control.One Play / Stop button drives the whole experience. On Play, the master controller:
Projectors power on (PJLink) in parallel while the players boot. The master is the single reboot authority — per-player controllers are for manual control only and stay off the global Play wiring.
The same show can be started three ways, all hitting the one Play / Stop toggle (the "big blue button"): the physical Q-SYS button, the web dashboard Play/Stop (see §10), and the schedule (auto on/off at set times). All three flip the same toggle, so the projectors and the show state always stay in sync.
The Player Scripts tab backs up and updates a player's on-device script over the network — no SD-card swap, no site visit.
.brs (disabled until a backup exists).⏱ Boot profile shows a side-by-side table — model, firmware,
uptime, network mode, content size — so a slow player stands out. Save
.txt writes a timestamped copy to the BootProfiles folder.
Every fleet reboot is also recorded to the public status page (back-online time per player). The page additionally shows current online/uptime and the last Q-SYS Core activity.
The Wall checks for a newer version on launch and every few hours. When one is found it downloads in the background and shows Restart & install — one click, no manual download.
A web dashboard at constantia-updates.pages.dev lets authorised staff monitor and control the show from anywhere — no need to be at the laptop. It works while the on-site app (the Wall) is running.
| Tab | What it shows / does |
|---|---|
| Logs | Boot & uptime history (South African time) + a Q-SYS audio-detail table. Log maintenance (June 2026): logs auto-keep the last 5 days; Download all + purge >5 days saves a .txt then trims; Resync Q-SYS (clear stale + restore) refreshes a frozen Live Q-SYS tab. |
| Live View | The latest screenshot of each player (near-live, not real-time). |
| Live Q-SYS | Read-only live Core state (sync lock, show on/off, schedule, audio buses). If it looks stale, use Logs → Resync Q-SYS. |
| A/V Sync | Confirm audio/video sync on one master clock; Grab audio from a video (June 2026) extracts a video's audio to a .wav in the browser + downloads it (importable to Q-SYS later). |
| Ops | Show control — Play / Stop the show remotely. Schedule — legacy ON/OFF editor (see note below; the show now runs on Q-SYS Core countdown timers). Plus a live status table. |
| Documentation | Demo video + this manual. |
The daily start/stop now runs on two countdown timers on the Q-SYS Core (set up by the AV team): a Startup timer counts down to the start time (e.g. 09:55) and a Shutdown timer to the end (e.g. 16:40). The times are typed into fields on those Q-SYS components, so changing the schedule is done there, not on this dashboard. The Core keeps its clock aligned to the on-site PC automatically, so the show fires at the real wall-clock time, and it survives an internet drop. The dashboard PLAY / STOP still work for a manual override any time.
| Symptom | Fix |
|---|---|
| Bridge pill not green | Click Start bridge; if a port clash, close the other app on :5000. |
| Q-SYS doesn't reach the bridge | Confirm the laptop firewall allows TCP 5000 (the installer adds this) and the Lua's bridge URL is the laptop's LAN IP, not 127.0.0.1. |
| Player tile black / unreachable | Reboot that player (per-tile). Never hot-swap its SD card while running. |
| Audio doesn't start | Press Play in Q-SYS; watch the master Status walk to "all ready". Ensure the bridge is up before pressing Play. |
| Player slow to come back | See §8 — usually SD speed or firmware. |
| Button | What it does |
|---|---|
| 🔔 / 🔕 Notify | Toggles email notifications on confirmed Play/Stop. OFF for on-site testing — Wall still relays the command to Q-SYS, just skips the Worker ack POST so no email fires. Persisted across restarts. |
| ⬇️ Content updates | Opens a dialog listing artifacts in the public manifest (Master Lua, BA bundle). Update all downloads via R2; 📁 Load local zip… imports a .zip from disk (no internet needed). Cached under %APPDATA%\Constantia BrightSign Wall\dependencies\. |
| 🌗 Theme | Toggle dark / light. Persisted. |
| 🔎 Versions | Per-player firmware + uptime table. |
| 📡 UDP Listener | Live UDP packets received on Wall :5000 (incl. Master_BrightSign hello). |
| Button | What it does |
|---|---|
| ⤓ Backup scripts | Pulls every .brs / config file from the player's SD into %APPDATA%\Constantia BrightSign Wall\Backups\<player>\<date>\. |
| ↥ Inject .brs | Push a single .brs file you select to the player's SD root. |
| ⟳ Reboot | Soft reboot via DWS. |
| 🔧 Deploy BA bundle | Push the full BA:Connected bundle to the player. Asks if you want a clean wipe first (recommended for first deploy). |
| 🛟 Restore stock | Push the original pre-Constantia BA snapshot (only for Master_BrightSign currently — a 16KB setup-mode autorun + helpers). Use as a rescue when a deploy goes wrong. |
| 🔄 Restore from backup | Pick any snapshot from Backups\<player>\<date>\ + push it back to SD. Optional wipe first. |
| 🆘 Divert next boot | Emergency only: hammers DWS /api/v1/control/divert-script for 60s (12-way parallel bursts) → next boot SKIPS autorun.brs → player lands in idle with DWS up indefinitely. Use when player is in a fast crash-reboot loop and normal Deploy can't catch the DWS window. |
| ↩ Clear divert | Re-enable autorun.brs on next boot. Auto-called at the end of a successful Deploy/Restore, so you usually don't need this. Manual override. |
| 🔍 Verify deploy | List SD root via DWS + classify the layout (BA bundle / Stock BA / partial). Flags orphan files. |
The master Lua drives audio via TWO independent paths on Play/Stop:
play.state = true / false on every Audio Player listed in AUDIO_PLAYERS. Independent of schematic wiring.To silence audio for a test run, change the knob at the top of bridge_controller_master.lua:
local DRIVE_AUDIO_DIRECT = false -- true = default, drive Component.New
-- false = pin-wire only (silent if unwired)
F5 (Save to Core & Run). The boot log will show
[BOOT] v2.20.x loaded ... DRIVE_AUDIO_DIRECT= false.
If a Deploy goes wrong and the player won't stop rebooting:
player-autorun/Master_BrightSign/ in the repo. Eject properly (don't pull mid-write).The Lua schedule fires only at the exact minute boundary, no catch-up. If the Q-SYS Core was rebooted / F5'd after the on-time, the schedule misses that day. Watch the console for the per-tick log line (v2.20.3+):
[SCHED] tick 2026-05-28 09:54 dow=3 enabled=true on=09:55(595) off=16:45(1005) dayOK=true lastOn= lastOff=
If enabled=false → the Wall hasn't pushed a schedule yet (Ops tab → Schedule → Save). If dayOK=false → today isn't in the configured days. If lastOn is already today → schedule fired earlier and the dedupe guard is preventing a re-fire (expected).
For help, contact the UWC Immersive Zone.