Summary

D-BOX Odyssee is a haptic motion engine (HEMC / HaptiSync Hub / Motion Engine PC). Spec covers the Motion Engine Remote Control Communication Protocol over RS-232, TCP/IP and UDP. Same command set on all three transports. Commands are STX/ETX-framed ASCII mnemonics (5 chars, R=read, W=write) with RS-separated parameters; optional leading target byte addresses individual motion platforms (0 = unit itself, 1..N = platform).

Transport

protocols:
  - tcp
  - udp
  - serial
addressing:
  tcp_port: 61555
  udp_port: 61556
serial:
  baud_rate: 19200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
  electrical: EIA-232
  connector: DB-9
  cable: null-modem  # source: "connecting the unit from a standard PC requires a Null-Modem cable"
auth:
  type: none  # inferred: no auth procedure in source
framing:
  start_of_block: "0x02"  # STX
  end_of_block: "0x03"    # ETX
  record_separator: "0x1E"  # RS
  empty_record: "0x19"    # EM
  enquiry: "0x05"         # ENQ - when present, response echoes original request prefixed by GS (0x1D)
  request_separator: "0x1D"  # GS
  nak: "0x15"             # returned on unrecognized mnemonic or unavailable target
target_addressing:
  description: "Optional ASCII target byte after STX. 0 = unit itself (default if absent), 1..N = motion platform index."
wake_on_lan:
  supported: true
  transport: ethernet  # source: Wi-Fi not supported for WoL
  payload: "standard Magic Packet - 6 bytes of 0xFF followed by 16 repetitions of unit MAC (102 bytes total)"
  precondition: "unit must have been powered at least once without losing power"

Traits

- powerable    # inferred from WSTOP shutdown + Wake-on-LAN power-on
- queryable    # inferred from RPCNT/RFILM/RMOTL/RVIBL/RMUTE/RNAME/RDLAY/RTOLR/RCAPD/REXPM/RFLNB query commands
- levelable    # inferred from WMOTL motion intensity dB and WVIBL vibration level dB

Actions

- id: set_motion_intensity
  label: Set Motion Intensity Level
  kind: action
  command: "<STX>{target}WMOTL<RS>{level_db}<ETX>"
  params:
    - name: target
      type: integer
      description: "Target platform number. 0 = unit, 1..N = motion platform. Optional; defaults to 0."
    - name: level_db
      type: number
      description: "Motion intensity in dB. Range -20 (min) to 0 (max). Examples: 0, -5.5, -20."

- id: set_vibration_level
  label: Set Vibration Level
  kind: action
  command: "<STX>{target}WVIBL<RS>{level_db}<ETX>"
  params:
    - name: target
      type: integer
      description: "Target platform number. 0 = unit, 1..N = motion platform."
    - name: level_db
      type: number
      description: "Vibration level in dB. Range -20 to 0. Examples: 0, -5.5, -20."

- id: set_mute
  label: Set Mute
  kind: action
  command: "<STX>{target}WMUTE<RS>{mute}<ETX>"
  params:
    - name: target
      type: integer
      description: "Target platform number. 0 = unit, 1..N = motion platform."
    - name: mute
      type: enum
      values: [0, 1]
      description: "0 = mute deactivated, 1 = mute activated."

- id: set_unit_name
  label: Set Unit Name
  kind: action
  command: "<STX>WNAME<RS>{name}<ETX>"
  params:
    - name: name
      type: string
      description: "Name of the unit."

- id: set_motion_delay
  label: Set Motion Delay
  kind: action
  command: "<STX>WDLAY<RS>{delay_ms}<ETX>"
  params:
    - name: delay_ms
      type: integer
      description: "Motion delay in milliseconds."

- id: set_recognition_tolerance
  label: Set Recognition Tolerance
  kind: action
  command: "<STX>WTOLR<RS>{seconds}<ETX>"
  params:
    - name: seconds
      type: number
      description: "Recognition tolerance in seconds."

- id: shutdown
  label: Shut Down Unit
  kind: action
  command: "<STX>WSTOP<ETX>"
  params: []

- id: set_capture_device
  label: Set Capture Device
  kind: action
  command: "<STX>WCAPD<RS>{mode}<RS>{device_id}<ETX>"
  params:
    - name: mode
      type: enum
      values: [0, 1, 2]
      description: "0 = Manual (use device_id), 1 = OS Default, 2 = USB Preferred."
    - name: device_id
      type: string
      description: "Capture device identification (as returned by RCAPD). Use <EM> (0x19) empty record when mode != 0."

- id: set_experience_mode
  label: Set Experience Mode
  kind: action
  command: "<STX>WEXPM<RS>{mode}<ETX>"
  params:
    - name: mode
      type: enum
      values: [0, 1, 2, 3]
      description: "0 = D-BOX Coded Video, 1 = D-BOX Coded Gaming, 2 = Adaptive Audio, 3 = Adaptive Gaming."

- id: wake_on_lan
  label: Wake On LAN
  kind: action
  command: "Magic Packet: 6 bytes 0xFF followed by 16 × unit MAC (48-bit) - 102 bytes total, broadcast over Ethernet"
  params:
    - name: mac
      type: string
      description: "48-bit MAC address of the HEMC unit."

- id: query_platform_count
  label: Query Motion Platform Count
  kind: query
  command: "<STX>RPCNT<ETX>"
  params: []

- id: query_media_status
  label: Query Media Status
  kind: query
  command: "<STX>RFILM<ETX>"
  params: []

- id: query_motion_intensity
  label: Query Motion Intensity Level
  kind: query
  command: "<STX>{target}RMOTL<ETX>"
  params:
    - name: target
      type: integer
      description: "Target platform number. 0 = unit, 1..N = motion platform."

- id: query_vibration_level
  label: Query Vibration Level
  kind: query
  command: "<STX>{target}RVIBL<ETX>"
  params:
    - name: target
      type: integer
      description: "Target platform number."

- id: query_mute
  label: Query Mute State
  kind: query
  command: "<STX>{target}RMUTE<ETX>"
  params:
    - name: target
      type: integer
      description: "Target platform number."

- id: query_film_count
  label: Query Film Count By Letter
  kind: query
  command: "<STX>RFLNB<RS>{filter}<ETX>"
  params:
    - name: filter
      type: string
      description: "'*' all titles, '#' titles beginning with a number, 'A'..'Z' titles starting with a letter. Defaults to '*' when absent."

- id: query_unit_name
  label: Query Unit Name
  kind: query
  command: "<STX>RNAME<ETX>"
  params: []

- id: query_motion_delay
  label: Query Motion Delay
  kind: query
  command: "<STX>RDLAY<ETX>"
  params: []

- id: query_recognition_tolerance
  label: Query Recognition Tolerance
  kind: query
  command: "<STX>RTOLR<ETX>"
  params: []

- id: query_capture_devices
  label: Query Capture Devices
  kind: query
  command: "<STX>RCAPD<ETX>"
  params: []

- id: query_experience_mode
  label: Query Experience Mode
  kind: query
  command: "<STX>REXPM<ETX>"
  params: []

Feedbacks

- id: ack
  type: literal
  description: "Successful WRITE acknowledgement."
  payload: "<ETX>"

- id: nak
  type: literal
  description: "Unrecognized command mnemonic, malformed framing, or unavailable target/parameters."
  payload: "0x15 (NAK)"

- id: platform_count
  type: integer
  description: "Number of motion platforms connected to the unit. Response to RPCNT."
  payload: "<STX><count><ETX>"

- id: media_status
  type: structured
  description: "Response to RFILM. Seven RS-separated fields."
  fields:
    - name: source_status
      type: enum
      values: [0, 1, 2, 3]
      description: "0 = Off LED, 1 = Green, 2 = Yellow, 3 = Red."
    - name: source_status_description
      type: string
    - name: motion_code_status
      type: enum
      values: [0, 1, 2, 3]
      description: "0 = Off LED, 1 = Green, 2 = Yellow, 3 = Red."
    - name: motion_code_status_description
      type: string
    - name: media_title
      type: string
      description: "Blank if no media detected."
    - name: media_timecode_sec
      type: integer
      description: "0 if no media detected."
    - name: media_duration_sec
      type: integer
      description: "0 if no media detected."

- id: motion_intensity_value
  type: number
  description: "Motion intensity in dB, -20..0. Response to RMOTL."
  payload: "<STX><level><ETX>"

- id: vibration_level_value
  type: number
  description: "Vibration level in dB, -20..0. Response to RVIBL."
  payload: "<STX><level><ETX>"

- id: mute_state
  type: enum
  values: [0, 1]
  description: "Response to RMUTE. Source states: 1 = deactivated, 0 = activated. (Note: source text inverts the WMUTE convention - quoted verbatim.)"
  payload: "<STX><value><ETX>"

- id: film_count_value
  type: integer
  description: "Number of titles matching the RFLNB filter."
  payload: "<STX><count><ETX>"

- id: unit_name_value
  type: string
  description: "Response to RNAME."
  payload: "<STX><name><ETX>"

- id: motion_delay_value
  type: integer
  description: "Motion delay in ms. Response to RDLAY."
  payload: "<STX><delay><ETX>"

- id: recognition_tolerance_value
  type: number
  description: "Tolerance in seconds. Response to RTOLR."
  payload: "<STX><tolerance><ETX>"

- id: capture_devices_list
  type: structured
  description: "Response to RCAPD. One or more device records, each with six RS-separated fields."
  fields:
    - name: device_name
      type: string
    - name: device_description
      type: string
    - name: device_identification
      type: string
    - name: interface_type
      type: enum
      values: [0, 1]
      description: "0 = Internal, 1 = External (e.g. USB)."
    - name: in_use
      type: enum
      values: [0, 1]
      description: "Only one device may be in use at a time."
    - name: available
      type: enum
      values: [0, 1]
      description: "0 = Not available (e.g. disconnected), 1 = Available."

- id: experience_mode_status
  type: structured
  description: "Response to REXPM."
  fields:
    - name: mode
      type: enum
      values: [0, 1, 2, 3]
      description: "0 = D-BOX Coded Video, 1 = D-BOX Coded Gaming, 2 = Adaptive Audio, 3 = Adaptive Gaming."
    - name: mode_state
      type: enum
      values: [0, 1, 2]
      description: "0 = On (functional), 1 = Off (not functional), 2 = Transitioning."
    - name: status_code
      type: enum
      values: [0, 100, 101, 102, 103, 104, 200]
      description: "0 = Ok; 100 = Mode init failure; 101 = Motion init failure; 102 = HaptiSync Agent not connected (required for Adaptive Gaming); 103 = HaptiSync Agent response timeout; 104 = Unknown experience mode; 200 = Exception."

- id: enq_echo
  type: structured
  description: "When ENQ (0x05) is included before ETX in the request, the response is prefixed with the original request followed by GS (0x1D) before the normal response body."
  payload: "<STX>{original_request}<GS>{response_body}<ETX>"

Variables

- id: motion_intensity_db
  type: number
  range: [-20, 0]
  unit: dB
  read: query_motion_intensity
  write: set_motion_intensity

- id: vibration_level_db
  type: number
  range: [-20, 0]
  unit: dB
  read: query_vibration_level
  write: set_vibration_level

- id: mute
  type: enum
  values: [0, 1]
  read: query_mute
  write: set_mute

- id: unit_name
  type: string
  read: query_unit_name
  write: set_unit_name

- id: motion_delay_ms
  type: integer
  unit: ms
  read: query_motion_delay
  write: set_motion_delay

- id: recognition_tolerance_sec
  type: number
  unit: s
  read: query_recognition_tolerance
  write: set_recognition_tolerance

- id: capture_device
  type: structured
  read: query_capture_devices
  write: set_capture_device

- id: experience_mode
  type: enum
  values: [0, 1, 2, 3]
  read: query_experience_mode
  write: set_experience_mode

Events

# UNRESOLVED: source does not document unsolicited notifications. All responses are reactive to remote-control requests.

Macros

# UNRESOLVED: source does not document multi-step macro sequences.

Safety

confirmation_required_for:
  - shutdown  # WSTOP shuts the unit down; physical motion platform under control
interlocks: []
# UNRESOLVED: source does not document interlock procedures, power-on sequencing requirements,
# or safety warnings for the haptic motion platforms beyond shutdown semantics.

Notes

  • All three transports (RS-232, TCP/IP, UDP) share the same command set and ASCII framing.
  • TCP port 61555 and UDP port 61556 are stated explicitly; do not assume bidirectional same-port use.
  • Target prefix immediately follows STX and is in ASCII (e.g. <STX>1WMUTE... targets platform 1). Omitting the target defaults to 0 (the unit itself).
  • ENQ (0x05) may be inserted before ETX in the request; the response will then echo the original request, separated from the response body by GS (0x1D).
  • Malformed framing → silent drop (no response). Unknown mnemonic → single NAK byte. Unavailable target / bad params → NAK.
  • Extra parameters beyond what a command expects are silently ignored.
  • Wake-on-LAN requires Ethernet (Wi-Fi not supported) and the unit must have been powered at least once previously without losing mains power.
  • RMUTE response semantics in the source contradict WMUTE: source states "mute value is 1 when the platform is deactivated and 0 when it is activated" — opposite of WMUTE's 0/1 convention. Documented verbatim; verify with hardware before relying on it.

Provenance

source_domains:
  - support.d-box.com
  - applicationmarket.crestron.com
source_urls:
  - "https://support.d-box.com/hubfs/198-914-0016-EN6%20Motion%20Engine_Remote%20Protocol%20(RS-232_TCP_UDP).pdf"
  - https://applicationmarket.crestron.com/d-box-technologies-inc-odyssee-north-america/
retrieved_at: 2026-04-29T17:31:52.762Z
last_checked_at: 2026-06-02T21:41:22.778Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:41:22.778Z
matched_actions: 21
action_count: 21
confidence: medium
summary: "All 21 spec actions matched literally in source; shapes confirmed; all transport parameters verified; bidirectional coverage complete. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "firmware compatibility range not stated. Status codes 100/101/102/103/104/200 documented for REXPM only — fault recovery sequencing not specified."
- "source does not document unsolicited notifications. All responses are reactive to remote-control requests."
- "source does not document multi-step macro sequences."
- "source does not document interlock procedures, power-on sequencing requirements,"
- "firmware version compatibility not stated. Protocol version not stated. Maximum platform count N (target range) not stated. Exact NAK byte stream count not documented for malformed framing (source says \"ignore the command and not respond at all\" for bad framing vs single NAK for unknown mnemonic)."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0