Operator Manual · Iziko Constantia AV operations

Constantia BrightSign Wall

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.

1. What it is

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.

PieceRole
BrightSign players (LS-series)Play the room videos. Controlled over their Diagnostic Web Server (DWS) on the LAN.
Q-SYS CorePlays 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.

2. Install & first run

  1. Download the latest ConstantiaBSWall-Setup-<version>-x64.exe from the project's download page.
  2. Run it. It detects any previous version, offers to back up settings, and adds the Windows Firewall rule for the bridge (TCP 5000). Allow the elevation prompt if it appears.
  3. Launch from the Start menu / desktop shortcut. The embedded bridge starts automatically on 127.0.0.1:5000 — the header shows Bridge: running on :5000 (green).
After this first manual install, the app updates itself — see §9. Use the Setup installer (not the portable build) so it can self-update.

3. Dashboard

One tile per player: a live screenshot, an online/offline dot, IP, and the bridge ID. Controls in the header:

ControlWhat it does
Auto-refresh + intervalRefresh 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 screen1–3 columns, or scale every tile to fit the window (no scroll) — good for a glance or a screen recording.
Refresh now / Reboot allForce a refresh; reboot every player at once.
Per-tile reboot / full-screenReboot a single player; click a tile to view it full-screen.
⏱ Boot profileSide-by-side boot diagnostics (see §8).
⤓ Check for updatesManually check for a newer version (see §9).

4. Adding players

Manually

+ Add player → enter IP, DWS port (usually 80), and the DWS username/password (default admin + the unit's serial number).

Bulk import

⭳ 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.

Bridge IDs are deterministic (derived from ip:port), so they stay stable across re-installs and re-imports — Q-SYS never needs re-pasting.

5. Q-SYS setup

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.

  1. Bridge URL — pick the laptop IP on the Core's subnet (port 5000).
  2. Per-player Lua — paste into each player's Text Controller; set its PlayerIP. Used for manual single-player control.
  3. Master Lua — paste into one "Master" Text Controller; it owns the fleet (reboot + audio).
  4. Wiring — follow the diagram (see §6).
  5. Test / Live log — confirm the Core actually reaches the bridge; every request is logged.
A Text Controller only runs with pins defined + Start Automatically = Yes + F5 (Save to Core & Run). A "Stopped" badge means it isn't running.

6. Synchronised playback (Q-SYS)

One Play / Stop button drives the whole experience. On Play, the master controller:

  1. Pre-flight — waits until all players are reachable, so none is stranded.
  2. Synced reboot — reboots all players at once (restarts video from the start).
  3. Wait for ready — polls until every player is back online.
  4. Audio — starts the audio zones from position 0, aligned with the fresh video.

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.

Sync accuracy is ±seconds (bounded by per-unit boot time), with audio restarted from 0. Frame-exact lip-sync would require player-side timecode and is not enabled.

7. Player Scripts (remote BrightScript)

The Player Scripts tab backs up and updates a player's on-device script over the network — no SD-card swap, no site visit.

  1. Back up — pull the player's scripts to a local dated folder.
  2. Inject — push a new .brs (disabled until a backup exists).
  3. Reboot — apply it.
A bad script can black-screen a player and may need a physical reset. Always back up first and test on one player before rolling out.

8. Boot profile & history

⏱ 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.

If one player is slow to boot

9. Updates

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.

10. Online dashboard (phone / browser)

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.

Signing in

  1. Open the link, enter your email, tap Continue.
  2. If you're on the access list, a 6-digit code is emailed — enter it (the email also has a one-tap link back to the code screen). Sessions last 24 h.
  3. Not on the list? You'll get an email with the app download + demo, and the team is notified to approve you.
Install it like an app: on Android tap the Install banner; on iPhone use Share → Add to Home Screen. Same icon as the Wall.

Tabs

TabWhat it shows / does
LogsBoot & 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 ViewThe latest screenshot of each player (near-live, not real-time).
Live Q-SYSRead-only live Core state (sync lock, show on/off, schedule, audio buses). If it looks stale, use Logs → Resync Q-SYS.
A/V SyncConfirm 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).
OpsShow 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.
DocumentationDemo video + this manual.
Reboot is Wall-only (June 2026). The cloud dashboard and Q-SYS can no longer reboot a player over the network — the only reboot path is the on-site Wall app's Reboot all / per-tile buttons. This stops accidental reboots during the show (e.g. on a design save). Day-to-day you never need to reboot — the show runs no-reboot.

Scheduling the show (June 2026 — Q-SYS countdown timers)

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.

Boot-status emails go to the team on each reboot (✅ all players back, or ⚠️ some missing), with the boot + audio tables. Each email has an unsubscribe link.

11. Troubleshooting

SymptomFix
Bridge pill not greenClick Start bridge; if a port clash, close the other app on :5000.
Q-SYS doesn't reach the bridgeConfirm 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 / unreachableReboot that player (per-tile). Never hot-swap its SD card while running.
Audio doesn't startPress Play in Q-SYS; watch the master Status walk to "all ready". Ensure the bridge is up before pressing Play.
Player slow to come backSee §8 — usually SD speed or firmware.

12. Wall header buttons (v0.10.73+)

ButtonWhat it does
🔔 / 🔕 NotifyToggles 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 updatesOpens 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\.
🌗 ThemeToggle dark / light. Persisted.
🔎 VersionsPer-player firmware + uptime table.
📡 UDP ListenerLive UDP packets received on Wall :5000 (incl. Master_BrightSign hello).

13. Player Scripts tab — per-player buttons

ButtonWhat it does
⤓ Backup scriptsPulls every .brs / config file from the player's SD into %APPDATA%\Constantia BrightSign Wall\Backups\<player>\<date>\.
↥ Inject .brsPush a single .brs file you select to the player's SD root.
⟳ RebootSoft reboot via DWS.
🔧 Deploy BA bundlePush the full BA:Connected bundle to the player. Asks if you want a clean wipe first (recommended for first deploy).
🛟 Restore stockPush 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 backupPick any snapshot from Backups\<player>\<date>\ + push it back to SD. Optional wipe first.
🆘 Divert next bootEmergency 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 divertRe-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 deployList SD root via DWS + classify the layout (BA bundle / Stock BA / partial). Flags orphan files.

14. Q-SYS master Lua — silent-test knob (v2.20.2+)

The master Lua drives audio via TWO independent paths on Play/Stop:

  1. Output Trigger pins (AudioStart / AudioStop) — fire only if you wired them to Audio Player components on the schematic.
  2. Component.New direct drive — sets 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.

Caveat. Edit ONLY this knob. Other inline edits to the master Lua have caused script load failures in the past (orphan duplicate handlers, malformed pasted snippets). Best practice: paste the full file from Q-SYS Setup → Master LUA wizard in the Wall app, then change only the single line.

15. Recovery from a reboot loop

If a Deploy goes wrong and the player won't stop rebooting:

  1. Try Wall's 🆘 Divert next boot on the looping tile. Wait 60s. If it lands, you'll see "DIVERT LANDED on attempt #N". Then reboot the player — it'll come up in idle.
  2. Once idle, 🔧 Deploy BA bundle or 📁 Load local zip… to push a clean bundle. Deploy auto-clears the divert flag on success.
  3. If divert doesn't land (DWS window too narrow → "socket hang up" errors): pull SD, reflash on a host with a card reader. Same files at player-autorun/Master_BrightSign/ in the repo. Eject properly (don't pull mid-write).

16. Schedule didn't fire?

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).

17. Support

For help, contact the UWC Immersive Zone.