Summary
16x16 DVI matrix router. Controlled over RS-232 (9-pole D-SUB female) or Ethernet TCP/IP. This spec covers the Lightware LW2 protocol (protocol #1): commands wrapped in curly brackets { }, responses in round brackets ( ) terminated CrLf (0x0D 0x0A). Covers crosspoint switching, mute/lock, 32 presets, port/preset naming, EDID router, and status queries.
Transport
protocols:
- serial
- tcp
serial:
# CONFLICT IN SOURCE - verify against hardware before use:
# Section 4.4.4 "Serial Port Settings": "57600 Baud, 8 data bit, 1 stop bit, no parity"
# Specifications appendix "RS-232 Control Port": "9600 Baud, 8 bit, 1 stop bit, no parity"
# Value below is the 4.4.4 figure, which the source labels the device default setting.
baud_rate: 57600 # CONFLICT: source also states 9600 in the specifications appendix
data_bits: 8
parity: none
stop_bits: 1
# UNRESOLVED: flow_control not stated. Pins 4/6 (DTR/DSR) and 7/8 (RTS/CTS) are
# internally looped per the pinout table, but the source never names a flow control mode.
addressing:
port: 10001 # factory default TCP port, stated in IP Settings and TCP Port Configuration sections
default_ip: "192.168.254.254" # factory default fix IP, stated in source
# NOTE: source's terminal-application walkthrough states a different default IP
# (192.168.0.100); the IP Settings and TCP Port Configuration sections both state
# 192.168.254.254. Value above follows the two agreeing sections.
port_range_allowed: "1025-65535, excluding 9999, 14000-14009, 30704, 30718" # stated in source
auth:
type: none # inferred: no login/password/auth procedure anywhere in source
Traits
- routable # inferred from crosspoint switching commands ({<in>@<out>}, {<in>@O})
- queryable # inferred from query commands returning state ({VC}, {VM}, {I}, {S}, {F})
# NOT powerable: source documents no power on/off command. {RST} restarts the CPU
# controller, which is a reboot, not a power state change.
# NOT levelable: no volume/gain/brightness commands in source (DVI video routing only).
Actions
# LW2 protocol. All commands sent surrounded by { }. Input is converted to uppercase
# by the device, so case in the command payload is not significant.
# Multiple commands may be concatenated as a batch with a single CrLf at the end.
# --- 7.3 Switching and control ---
- id: switch_input_to_output
label: Switch Input to Output
kind: action
command: "{<in>@<out>}"
params:
- name: in
type: string
description: Input number, 1- or 2-digit ASCII (e.g. 01, 5, 07, 16)
- name: out
type: string
description: Output number, 1- or 2-digit ASCII
response: "(O<out2>•I<in2>)CrLf"
notes: Switching a muted output does not unmute it.
- id: switch_input_to_all_outputs
label: Switch Input to All Outputs
kind: action
command: "{<in>@O}"
params:
- name: in
type: string
description: Input number, 1- or 2-digit ASCII
response: "(I<in2>•ALL)CrLf"
notes: Response does not indicate muted or locked outputs; query separately.
- id: query_io_connections
label: Query I/O Connections
kind: query
command: "{VC}"
params: []
response: "(ALL•<O1>•<O2>•...•<O16>)CrLf"
- id: reset_outputs
label: Reset Outputs to Factory Default
kind: action
command: "{r00}"
params: []
response: "(APWSE)CrLf"
- id: query_mute_states
label: Query Mute States
kind: query
command: "{VM}"
params: []
response: "(MUT•<M1>•<M2>•...•<M16>)CrLf"
- id: mute_output
label: Mute Output
kind: action
command: "{#<out>}"
params:
- name: out
type: string
description: Output number, 1- or 2-digit ASCII
response: "(1MT<out2>)CrLf"
notes: Disables the output; does not change crosspoint state.
- id: unmute_output
label: Unmute Output
kind: action
command: "{+<out>}"
params:
- name: out
type: string
description: Output number, 1- or 2-digit ASCII
response: "(0MT<out2>)CrLf"
- id: lock_output
label: Lock Output
kind: action
command: "{#><out>}"
params:
- name: out
type: string
description: Output number, 1- or 2-digit ASCII
response: "(1LO<out2>)CrLf"
- id: unlock_output
label: Unlock Output
kind: action
command: "{+<<out>}"
params:
- name: out
type: string
description: Output number, 1- or 2-digit ASCII
response: "(0LO<out2>)CrLf"
notes: Device responds identically regardless of previous lock state.
- id: save_preset
label: Save Preset
kind: action
command: "{$<id>}"
params:
- name: id
type: string
description: Preset number, 1- or 2-digit ASCII (max 32)
response: "(SPR<id2>)CrLf"
notes: Saves crosspoint and mute state. Lock states are NOT saved.
- id: load_preset
label: Load Preset
kind: action
command: "{%<id>}"
params:
- name: id
type: string
description: Preset number, 1- or 2-digit ASCII (max 32)
response: "(LPR<id2>)CrLf"
notes: Presets do not affect locked outputs.
- id: preset_preview
label: Preset Preview
kind: query
command: "{VP#<id>=?}"
params:
- name: id
type: string
description: Preset number
response: "(VP#<id>=•<O1>•<O2>•...•<O16>)CrLf"
# --- 7.4 Port/preset naming ---
- id: query_preset_name
label: Query Preset Name
kind: query
command: "{PNAME#<id>=?}"
params:
- name: id
type: string
description: Preset number
response: "(PNAME#<id>=•<preset_name>)CrLf"
- id: rename_preset
label: Rename Preset
kind: action
command: "{PNAME#<id>=<preset_name>}"
params:
- name: id
type: string
description: Preset number
- name: preset_name
type: string
description: New preset name
response: "(PNAME#<id>=•<preset_name>)CrLf"
- id: query_input_name
label: Query Input Name
kind: query
command: "{INAME#<in>=?}"
params:
- name: in
type: string
description: Input number
response: "(INAME#<in>=•<Input_name>)CrLf"
- id: rename_input
label: Rename Input
kind: action
command: "{INAME#<in>=<input_name>}"
params:
- name: in
type: string
description: Input number
- name: input_name
type: string
description: New input name
response: "(INAME#<in>=<input_name>)CrLf"
- id: query_output_name
label: Query Output Name
kind: query
command: "{ONAME#<out>=?}"
params:
- name: out
type: string
description: Output number
response: "(ONAME#<out>=•<output_name>)CrLf"
- id: rename_output
label: Rename Output
kind: action
command: "{ONAME#<out>=<output_name>}"
params:
- name: out
type: string
description: Output number
- name: output_name
type: string
description: New output name
response: "(ONAME#<out>=•<output_name>)CrLf"
- id: default_preset_names
label: Reset All Preset Names to Default
kind: action
command: "{PNAME#<id>=!}"
params:
- name: id
type: string
description: Any valid preset number; the value is ignored, ALL presets are affected
response: "(PNAME#<id>=•Preset•<id>)CrLf"
- id: default_input_names
label: Reset All Input Names to Default
kind: action
command: "{INAME#<id>=!}"
params:
- name: id
type: string
description: Any valid input number; the value is ignored, ALL inputs are affected
response: "(INAME#<id>=•Input•<id>)CrLf"
- id: default_output_names
label: Reset All Output Names to Default
kind: action
command: "{ONAME#<id>=!}"
params:
- name: id
type: string
description: Any valid output number; the value is ignored, ALL outputs are affected
response: "(ONAME#<id>=•Output•<id>)CrLf"
# --- 7.5 Communication setup ---
- id: query_ip_settings
label: Query IP Settings
kind: query
command: "{IP_CONFIG=?}"
params: []
response: "(IP_CONFIG=<id>•<ip_address>•<port>•<mask>•<gateway>)CrLf"
- id: reload_default_ip_settings
label: Reload Default IP Settings
kind: action
command: "{IP_CONFIG=!}"
params: []
response: "(Changing•IP•configuration…)CrLf then (DONE!)CrLf or (FAILED!)CrLf"
notes: Serial port only. Cannot be executed over the Ethernet connection.
- id: set_dynamic_ip
label: Set Dynamic IP Address (DHCP)
kind: action
command: "{IP_CONFIG=D}"
params: []
response: "(Changing•IP•configuration…)CrLf then (DONE!)CrLf or (FAILED!)CrLf"
notes: Serial port only. Port, subnet mask and gateway remain unchanged.
- id: query_network_components
label: Query Network Components
kind: query
command: "{LAN_VER=?}"
params: []
response: "(MAC_ADDR=<mac>)CrLf (WEB_VER=<web>)CrLf (SERVER_VER=<ser>)CrLf"
# --- 7.6 Port status ---
- id: input_port_status
label: Input Port Status
kind: query
command: "{:ISD}"
params: []
response: "(ISD•<INPUT_D>)CrLf"
notes: 32 decimal digits returned; only the first 16 valid on this model. 1 = source connected and sending 5V.
- id: output_port_status
label: Output Port Status
kind: query
command: "{:OSD}"
params: []
response: "(OSD•<OUTPUT_D>)CrLf"
notes: 32 decimal digits returned; only the first 16 valid on this model. 1 = sink presenting Hotplug.
# --- 7.7 Router status ---
- id: query_product_type
label: Query Product Type
kind: query
command: "{I}"
params: []
response: "(<PRODUCT_TYPE>)CrLf"
- id: query_serial_number
label: Query Serial Number
kind: query
command: "{S}"
params: []
response: "(SN:<SERIAL_N>)CrLf"
- id: query_cpu_fw_version
label: Query CPU Firmware Version
kind: query
command: "{F}"
params: []
response: "(FW:<FW_VER>)CrLf"
- id: query_cpu_fw_compile_time
label: Query CPU Firmware Compile Time
kind: query
command: "{CT}"
params: []
response: "(Compiled:•<DATE>•<TIME>•Build:•<tag>)CrLf"
- id: query_installed_io_boards
label: Query Installed I/O Boards
kind: query
command: "{IS}"
params: []
response: "(SL#•0•<MB_DESC>)CrLf ... (SL#•8•<IB_DESC>)CrLf"
notes: Compact model; Empty Slot descriptors are returned for compatibility only.
- id: query_controllers_firmware
label: Query Controllers' Firmware
kind: query
command: "{FC}"
params: []
response: "(<FIRMWARE_LIST>)CrLf"
- id: query_current_protocol
label: Query Current Protocol
kind: query
command: "{P_?}"
params: []
response: "(CURRENT•PROTOCOL•=•#<x>)CrLf"
- id: set_current_protocol
label: Set Current Protocol
kind: action
command: "{P_<x>}"
params:
- name: x
type: integer
description: "1 = Lightware protocol (default), 2 = P#2 protocol"
response: "(PROTOCOL•#<x>•SELECTED!)CrLf"
notes: Setting protocol 2 makes all other commands in this spec inapplicable on that interface.
- id: view_error_list
label: View Error List
kind: query
command: "{ELIST=?}"
params: []
response: "(<class>,<e_desc><e_code>,<e_occ>)CrLf per entry"
- id: clear_error_list
label: Clear Error List
kind: action
command: "{ELIST=!}"
params: []
response: "(List•is•empty!)CrLf"
# --- 7.8 EDID router ---
- id: static_edid_emulation
label: Static EDID Emulation
kind: action
command: "{<in>:<loc>}"
params:
- name: in
type: string
description: Input number
- name: loc
type: string
description: EDID memory location, 1..100 (static range)
response: "(E_S_C)CrLf - sent only if the new EDID differs from the previous one"
- id: dynamic_edid_emulation
label: Dynamic EDID Emulation
kind: action
command: "{<in>:<loc>}"
params:
- name: in
type: string
description: Input number
- name: loc
type: string
description: EDID memory location 101..116 on MX16x16DVI-Plus; outputs 1..16 map to 101..116
response: "(E_S_C)CrLf - sent only if the new EDID differs from the previous one"
notes: Input then tracks EDID changes on the mapped output.
- id: route_edid_to_all_inputs
label: Route EDID to All Inputs
kind: action
command: "{A:<loc>}"
params:
- name: loc
type: string
description: 1..100 static, 101..116 dynamic
notes: Takes about 10 seconds.
- id: query_emulated_edids
label: Query Emulated EDIDs
kind: query
command: "{VEDID}"
params: []
response: "(VEDID•<IN1>•<IN2>•...•<IN16>)CrLf"
- id: save_edid_learning
label: Save EDID (Learning)
kind: action
command: "{<out>><loc>}"
params:
- name: out
type: string
description: Output number to learn EDID from
- name: loc
type: string
description: Target memory location, 51..100 (user-writable range)
- id: view_edid_header
label: View EDID Header
kind: query
command: "{WH<loc>}"
params:
- name: loc
type: string
description: EDID memory location
response: "(EH#<loc>•<PNPID>•<res>•<name>)CrLf"
- id: query_edid_validity_table
label: Query EDID Validity Table
kind: query
command: "{WV}"
params: []
response: "(EV•<VALIDITY_TABLE>)CrLf - 164 characters"
notes: "0 = invalid, 1 = valid, 3 = changed."
- id: download_edid_content
label: Download EDID Content
kind: query
command: "{WE<loc>}"
params:
- name: loc
type: string
description: EDID memory location
response: "(EB#<loc>•<B1>•<B2>•...•<B256>)CrLf"
- id: begin_edid_upload
label: Begin EDID Upload
kind: action
command: "{WL#<loc>}"
params:
- name: loc
type: string
description: Target memory location, 51..100 (user programmable only)
response: "(E_L_S)CrLf"
notes: Step 1 of the EDID upload sequence. See Macros.
- id: send_edid_block
label: Send EDID Block
kind: action
command: "{WB#<num>•<B1>•<B2>•<B3>•<B4>•<B5>•<B6>•<B7>•<B8>}"
params:
- name: num
type: integer
description: Block sequence number, 1..32
- name: B1..B8
type: string
description: Eight EDID bytes as space-separated hex represented in ASCII
response: "(EL#<num>)CrLf"
- id: delete_all_edid
label: Delete All EDID from Memory
kind: action
command: "{:CLREDID}"
params: []
notes: Clears User, Emulated and Last-attached-Monitor EDIDs. Factory EDIDs are retained.
# --- 7.9 Router initiated ---
- id: restart_cpu
label: Restart CPU
kind: action
command: "{RST}"
params: []
response: "(CPU_RESET...)CrLf(<name>•Ready!)CrLf"
- id: restart_edid_controller
label: Restart EDID Controller
kind: action
command: "{:RST}"
params: []
response: "(Booting...)CrLf then per-slot BOOT SLOT n STARTED/FINISHED lines"
Feedbacks
- id: crosspoint_state
type: string
source_command: "{VC}"
description: >
Per-output connected input as 2-digit ASCII, optionally prefixed with a state letter.
prefix_legend:
"<none>": connected, neither muted nor locked
"M": connected, muted, unlocked
"L": connected, not muted, locked
"U": connected, muted and locked
- id: output_mute_state
type: enum
values: [0, 1]
source_command: "{VM}"
description: Per-output mute flag. 0 = unmuted, 1 = muted.
- id: switch_confirmation
type: string
source_command: "{<in>@<out>}"
pattern: "(O<out2>•I<in2>)CrLf"
- id: mute_confirmation
type: string
pattern: "(1MT<out2>)CrLf / (0MT<out2>)CrLf"
- id: lock_confirmation
type: string
pattern: "(1LO<out2>)CrLf / (0LO<out2>)CrLf"
- id: preset_confirmation
type: string
pattern: "(SPR<id2>)CrLf / (LPR<id2>)CrLf"
- id: input_port_signal_presence
type: string
source_command: "{:ISD}"
description: 32 digits, first 16 valid. 0 = no source or no 5V, 1 = source present with 5V.
- id: output_port_hotplug
type: string
source_command: "{:OSD}"
description: 32 digits, first 16 valid. 0 = no sink or no Hotplug, 1 = Hotplug present.
- id: product_type
type: string
source_command: "{I}"
- id: serial_number
type: string
source_command: "{S}"
description: 8-digit serial number.
- id: cpu_firmware_version
type: string
source_command: "{F}"
- id: current_protocol
type: enum
values: [1, 2]
source_command: "{P_?}"
description: 1 = Lightware protocol (default), 2 = P#2 protocol.
- id: ip_configuration
type: string
source_command: "{IP_CONFIG=?}"
description: "<id> <ip_address> <port> <mask> <gateway>; id 0 = fix IP, 7 = DHCP."
- id: edid_validity_table
type: string
source_command: "{WV}"
description: 164 characters. 0 = invalid, 1 = valid, 3 = changed.
- id: emulated_edid_map
type: string
source_command: "{VEDID}"
description: Per-input 3-digit EDID location currently emulated.
Variables
- id: preset_name
type: string
get: "{PNAME#<id>=?}"
set: "{PNAME#<id>=<preset_name>}"
range: preset id 1..32
- id: input_name
type: string
get: "{INAME#<in>=?}"
set: "{INAME#<in>=<input_name>}"
- id: output_name
type: string
get: "{ONAME#<out>=?}"
set: "{ONAME#<out>=<output_name>}"
- id: tcp_port
type: integer
get: "{IP_CONFIG=?}"
default: 10001
range: "1025-65535, excluding 9999, 14000-14009, 30704, 30718"
notes: >
Source states port 23 is required for Barco Encore and 10001 for Vista Spyder.
UNRESOLVED: no protocol command for setting an arbitrary port is documented;
only {IP_CONFIG=!} (defaults) and {IP_CONFIG=D} (DHCP) exist in this protocol.
- id: control_protocol
type: enum
values: [1, 2]
get: "{P_?}"
set: "{P_<x>}"
Events
- id: edid_status_changed
pattern: "(E_S_C)CrLf"
description: >
Unsolicited. Sent after an EDID-changing command, or when a new EDID source is
connected. Recommended handling: issue {WV} and read every location marked '3'.
notes: >
Not re-sent if a display with an identical EDID is reconnected to the same output,
because the router retains the last attached display's EDID.
- id: crosspoint_broadcast
description: >
Responses to crosspoint switch, mute/unmute, lock/unlock and preset setting commands
are sent to ALL connected interfaces, not only the originating one. All other
responses go only to the querying interface. Translated to the target interface's
protocol form if protocols differ.
- id: error_response
type: enum
values:
- code: "(ERR01)CrLf"
meaning: Invalid input number - exceeds maximum inputs or equals zero
- code: "(ERR02)CrLf"
meaning: Invalid output number - exceeds installed outputs or equals zero
- code: "(ERR03)CrLf"
meaning: Invalid value - exceeds maximum allowed value
- code: "(ERR04)CrLf"
meaning: Invalid preset number - exceeds maximum (32)
Macros
- id: upload_edid
label: Upload Full EDID to a Memory Location
description: Explicit 6-step sequence documented in section 7.8.9.
applies_to: memory locations 51..100 only
steps:
- send: "{WL#<loc>}"
await: "(E_L_S)CrLf"
- send: "{WB#<num>•<B1>•<B2>•<B3>•<B4>•<B5>•<B6>•<B7>•<B8>}"
await: "(EL#<num>)CrLf"
repeat: 32 blocks, num 1..32, 8 bytes each, 256 bytes total
- await: "(E_S_C)CrLf"
description: Router signals EDID status changed after the final acknowledgement.
- id: reset_ip_configuration_front_panel
label: Reset IP Configuration via Front Panel
description: Physical button sequence documented in section 4.4.3.
steps:
- Switch router to Take mode (hold Take/Auto 3 seconds until light goes off) if it was in Autotake mode
- Press Control Lock (button shines red continuously)
- Press and hold Output Lock (current protocol indication lights up)
- "Press and release Load Preset for factory default IP (192.168.254.254, port 10001, mask 255.255.0.0, gateway 0.0.0.0), OR Save Preset to enable DHCP"
- Confirmation light sequence runs (Take/Auto, Load Preset, Save Preset light in turn)
- Reconnect LAN cable if it was unplugged
- Wait about 20 seconds before connecting to the matrix
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no electrical safety warnings, interlock procedures, or
# power-on sequencing requirements in the control-protocol sections provided.
# Operational cautions (not safety interlocks) are recorded in Notes.
Notes
Baud rate conflict — unresolved in source. The document states two different values:
- Section 4.4.4 "Serial Port Settings": "57600 Baud, 8 data bit, 1 stop bit, no parity", described as the device's default settings.
- Specifications appendix "RS-232 Control Port": "9600 Baud, 8 bit, 1 stop bit, no parity".
The Transport block carries 57600 because section 4.4.4 explicitly labels it the default. This was not verified against hardware. Try 57600 first, fall back to 9600.
Default IP discrepancy. Sections 4.4.3 and TCP Port Configuration both state 192.168.254.254. The terminal-application walkthrough (7.2) states 192.168.0.100. Spec follows the two agreeing sections.
Protocol framing. Commands are wrapped in { }. Responses come back in ( ) and only when a command executed successfully. Input is uppercased by the device. Responses terminate with CrLf (0x0D 0x0A). • denotes a space character (0x20) in the source's notation and is reproduced literally in the response patterns above.
Batch commands. Multiple { } commands may be concatenated with a single CrLf at the end of the batch. Consecutive switching commands with no other command interleaved are grouped and executed in one step, and the response format changes to the {VC} form. Any non-switch command between them breaks the grouping.
Multi-interface behaviour. Ethernet and serial control can be used simultaneously, and the Ethernet interface accepts multiple connections on the same TCP port. Crosspoint, mute/unmute, lock/unlock and preset responses broadcast to all interfaces to keep controllers in sync; everything else replies only to the querying interface.
IP commands are serial-only. {IP_CONFIG=!} and {IP_CONFIG=D} cannot be executed over the Ethernet connection — serial port only. Use the built-in website or Lightware Device Controller to change IP settings over Ethernet.
Timing. {A:<loc>} (route EDID to all inputs) takes about 10 seconds. Static and dynamic EDID emulation commands are documented with an unspecified "...delay..." before the response. After a front-panel IP reset, wait about 20 seconds before reconnecting.
Preset limits. 32 preset memories on all matrix routers. Presets store crosspoint and mute state but not lock state; loading a preset does not affect locked outputs.
Mute semantics. Muting disables the output without changing the crosspoint, so unmuting restores the prior connection. Switching a muted output does not unmute it.
Coverage: 50 actions, all source rows. Two conflicts flagged not silently resolved. No voltage/current invented. Baud and port both from source text only — port 10001 stated in three places, baud disputed.
## Provenance
```yaml
source_domains:
- archive.lightware.com
- lightware.com
source_urls:
- https://archive.lightware.com/pub/media/lightware/filedownloader/file/User-Manual/MX_DVI-Plus_UsersManual.pdf
- https://lightware.com/our-open-api-environment
retrieved_at: 2026-08-07T18:13:52.708Z
last_checked_at: 2026-08-19T09:31:54.951Z
Verification Summary
verdict: verified
checked_at: 2026-08-19T09:31:54.951Z
matched_actions: 50
action_count: 50
confidence: medium
summary: "All 50 spec actions match literal tokens in source; all source commands (sections7.3-7.9 + quick summary 7.10) are represented; transport values match source. (11 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source documents Protocol #2 exists and is selectable via {P_2}, but does not document any Protocol #2 command syntax. All actions below are LW2 (protocol #1) only."
- "RS-422 variant mentioned (\"can be ordered with either RS-232 or RS-422\"); no RS-422 line settings stated."
- "flow_control not stated. Pins 4/6 (DTR/DSR) and 7/8 (RTS/CTS) are"
- "no protocol command for setting an arbitrary port is documented;"
- "source contains no electrical safety warnings, interlock procedures, or"
- "Protocol #2 command syntax is not documented in the source; only its existence and the {P_2} selector."
- "RS-422 line settings not stated, though the source says the unit can be factory-ordered with RS-422 instead of RS-232."
- "flow control mode not stated. DTR/DSR and RTS/CTS pin pairs are internally looped per the pinout table, but no flow control mode is named."
- "error list <class> values and <e_desc> vocabulary not enumerated in source."
- "no method documented in this protocol for setting an arbitrary static IP address or TCP port; only defaults-reload and DHCP."
- "firmware compatibility range not stated."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0