WATCHOUT 6 Protocol

WATCHOUT 7 includes a backward-compatible WATCHOUT 6 command interface. It is intended for existing integrations (Crestron, AMX, Extron, custom scripts) that already speak WO6 command syntax.

The Operative emulates the v6 WATCHMAKER role. From the perspective of a legacy control system, the Operative appears as a WATCHMAKER host accepting commands on the standard WATCHMAKER port.

This page documents behavior as implemented in the current WO6 compatibility source code.

Transport and Framing

  • Ports: 3040 (WATCHMAKER) and 3039 (WATCHPOINT)
  • Protocols: TCP and UDP listeners are started on both ports
  • Frame delimiter: \r\n (CRLF)
  • Max incoming frame size: 4096 bytes
  • Text format: command-oriented text protocol, one command per frame

Use CRLF in clients even if some line-ending variants may be tolerated.

Request IDs ([id] Prefix)

Commands may be prefixed with an ID tag: [my-id]ping

  • TCP replies echo this prefix: [my-id]Ready ...
  • For commands that return an empty success payload, the response is just the tag plus CRLF: [my-id]\r\n
  • For subscription commands with IDs, the first tagged response is empty acknowledgement; streamed updates then arrive untagged

Main Timeline Behavior

Commands that omit a timeline name target a timeline named exactly Main Timeline.

If that timeline does not exist, those commands fail with runtime error responses.

"Main Timeline" also appears in the list returned by getAuxTimelines. It is not filtered out from auxiliary timeline listings.

Syntax Rules

  • Command names are case-sensitive (getStatus, not getstatus)
  • Boolean arguments are true or false
  • Names containing spaces must be quoted
  • Extra unexpected tokens cause parse/runtime errors
  • Time values accept:
  • milliseconds: 5000
  • timestamp: HH:MM:SS.FFF
  • Medialon style: HH:MM:SS/FFF

Response Formats

TypeWire formatUsed by
ReadyReady "<version>" "WATCHMAKER" "<OS>" <bool>ping, authenticate, final phase of load
Status (old style)Reply ...getStatus (no args)
Status (new style)Status "" ...getStatus 1/2 (general)
Timeline statusStatus "TaskList:mItemList:mItems:TimelineTask \"<name>\"" <state> <pos> <world_clock>timeline variant of getStatus
BusyBusy "Open" "" 0first phase of load
Reply JSONReply { ... }getInputs, getAuxTimelines, getControlCues
Emptyempty payload (blank line)most action commands on success
ErrorError <code 1-8> 0 "<message>"parse/runtime/auth/unsupported failures

getStatus Modes

getStatus is one command with multiple modes (including timeline status and subscriptions).

RequestBehaviorResponse
getStatusold WO6 polling styleone Reply ...
getStatus 2one-shot general statusone Status "" ...
getStatus 1subscribe general statusstatus stream (Status "" ...)
getStatus 0unsubscribe general statusempty
getStatus 2 "TaskList:mItemList:mItems:TimelineTask \"Timeline 1\""one-shot timeline statusone timeline Status ...
getStatus 1 "TaskList:mItemList:mItems:TimelineTask \"Timeline 1\""subscribe timeline statustimeline status stream
getStatus 0 "TaskList:mItemList:mItems:TimelineTask \"Timeline 1\""unsubscribe timeline statusempty

Timeline state values in timeline-status responses are:

  • 0 = stopped
  • 1 = paused
  • 2 = running

Implemented Commands

CommandSyntaxSuccess responseNotes
authenticateauthenticate <level>Ready ...level is accepted; current implementation always returns ready
pingpingReady ...keepalive/version check; program name is always "WATCHMAKER", license field is always true
runrun [timeline_name]emptyno name = Main Timeline; timeline name is read until end of line in v7
halthalt [timeline_name]emptyno name = Main Timeline; timeline name is read until end of line in v7
killkill <timeline_name>emptytimeline name required; name is read until end of line in v7
resetresetemptystops aux timelines, sets main timeline to paused at time 0
getStatussee mode table aboveReply ... / Status ... / stream / emptyreplaces separate legacy status commands
gotoTimegotoTime <time> [timeline_name]emptypreserves run/pause state; stopped timelines are resumed as paused after jump
gotoControlCuegotoControlCue <cue_name> [reverse_only] [timeline_name]emptydefault search is forward then backward fallback
setInputsetInput <input_name> <value_or_delta> [transition_ms]empty+x/-x are relative changes
setInputssetInputs <transition_ms> <input_name> <value_or_delta> ...emptytransition is required; use 0 for immediate
getInputsgetInputs [input_name]Reply {"Inputs":...}returns one or all mapped inputs
getAuxTimelinesgetAuxTimelines [tree]Reply { ... }tree selects tree-shaped reply payload
getControlCuesgetControlCues <filter 0-7> [timeline_name]Reply {"Layers":...}filter bitmask: 1 no-op, 2 cross-timeline target, 4 unnamed
loadload <path> [condition] [go_online]Busy ... then Ready ...condition/go_online are parsed for compatibility; relative paths resolve via configured show directory
onlineonline <bool>emptyaccepted for compatibility; currently no-op

Response Details

  • ping response: The program name field is always "WATCHMAKER" and the license field is always true, regardless of the actual WATCHOUT 7 license state.
  • getStatus response (old style): The show name field returns the show's internal UUID (not the human-readable name). The busy, status, open, active, and programmer fields are hardcoded values for compatibility and do not reflect actual v7 state.
  • load go_online parameter: This parameter is parsed but currently ignored. WATCHOUT 7 does not have an offline mode equivalent to WO6.

setInput and setInputs value syntax:

  • absolute: 1.0
  • relative increase: +0.5
  • relative decrease: -0.5

Parsed but Not Implemented

These commands are parsed, but currently return runtime unimplemented errors (Error 7 0 "Request ... is not implemented in WATCHOUT 7 yet.") on TCP:

  • hitTest <x> <y>
  • list <magic_path> [depth]
  • getStage
  • standBy <bool> [transition_ms]
  • setRate <float>
  • timecodeMode <option> [offset]
  • powerDown
  • setLogoString <string>
  • getFile [look_in_shows] <magic_path>
  • serialPort <open> <name> [protocol] [baud] [data_bits] [stop_bits] [parity]
  • enableLayerCond <condition>
  • wait

Discover Compatibility Command

discover <digits> is accepted for legacy compatibility traffic.

  • TCP: returns empty response
  • UDP: ignored (no response)

UDP Behavior

UDP support is fire-and-forget: no responses are sent.

  • Side-effect commands (for example run, halt, gotoTime, setInput) are executed
  • Response-oriented commands are ignored on UDP, including getStatus, getInputs, getAuxTimelines, getControlCues, list, getStage, getFile, and hitTest

Differences from Older WO6 Integrations

  • getTimelineStatus, subscribeStatus, and related timeline-subscribe commands are represented through getStatus mode variants
  • loadShow is load
  • online is accepted but does not change runtime behavior
  • Main-timeline defaults require a timeline named Main Timeline
  • hitTest is not implemented in this protocol path

Migration Guidance

Use WO6 protocol compatibility to keep existing control systems running, but prefer newer interfaces for new development:

The WO6 layer is a compatibility bridge, not a full feature surface for WATCHOUT 7-specific workflows.