Skip to main content

Lightware LW3

Controls Lightware video matrices, extenders and presentation switchers that speak LW3, the open line-based control protocol Lightware serves on TCP port 6107. Covers the MMX2 family, MMX6x2, UMX-TPS, Taurus UCX, HDMI20-OPTC extender pairs and the VINX / UBEX control planes.

Each matrix destination (output) becomes a GEM zone. The driver subscribes to the crosspoint, so a route changed from the front panel, from Lightware Device Controller, or by another control system shows up in GEM within a few hundred milliseconds — it is not poll-only.

  • Driver name: lightware_lw3
  • Transport: ASCII lines over TCP
  • Default port: 6107
  • Category: AV matrix

Prerequisites

  1. An LW3-capable device. LW3 is standard on everything from roughly the MX2 generation onward. Older MX-series frames speak LW2 on port 10001 and are not supported here — if a GET on 6107 returns nothing, the unit is LW2.
  2. TCP/6107 reachable from the GEM server.
  3. A static IP or DHCP reservation on the device.
  4. Nothing needs to be released first — LW3 permits several concurrent sessions, so Lightware Device Controller can stay open while GEM is connected.
danger

LW3 on port 6107 is unauthenticated. Anything that can open a socket to that port can re-route the matrix, mute outputs, and read the device configuration. That is a property of the protocol, not of this driver. Keep Lightware devices on a closed control VLAN and do not expose 6107 beyond it.

Setup steps

  1. Verify the device answers LW3. From the GEM server:

    telnet <device-ip> 6107
    GET /MEDIA/VIDEO/XP.DestinationConnectionList

    A healthy device replies with a line like pr /MEDIA/VIDEO/XP.DestinationConnectionList=I1;I2;I1;O1.

  2. In GEM go to /admin/devices, add a device, and pick driver Lightware LW3. Enter the device IP; leave the port at 6107.

  3. Save. The driver reads the product name, serial number and firmware version, opens a subscription on the crosspoint, and reads the current routing.

  4. Run the get_outputs command to see the crosspoint size and current routes:

    {
    "input_count": 8,
    "output_count": 4,
    "routes": [
    {"destination": 1, "input": 3},
    {"destination": 2, "input": 1}
    ]
    }
  5. Create one GEM zone per destination. Set zone.address to the destination number as labelled on the device — 1, 2, 3. The LW3 form (O1) is accepted as well.

  6. Optional: define AV Sources keyed to the input numbers so the UI shows "Apple TV" rather than "input 3".

  7. Optional: on a model with a separate audio crosspoint, set audio_breakaway to enable set_audio_input and audio-route reporting.

Attribute reference

Device attributes

AttributeRequiredDefaultWhat it does
ipyesLAN IP or hostname of the Lightware device.
portno6107LW3 control port.
audio_breakawaynofalsePoll and expose /MEDIA/AUDIO/XP. Leave off on video-follows-audio models — the node does not exist and every poll would log an error.
input_countnoread from deviceNumber of sources. Read from SourcePortCount at connect; set manually only to override. Out-of-range routes are rejected against it.
output_countnoread from deviceNumber of destinations, from DestinationPortCount.
status_intervalno15000Backstop crosspoint poll in ms. The subscription does the real work; this catches anything it missed.
command_throttleno80Minimum spacing between outbound LW3 lines, in ms.

The driver also writes model, serial_number, firmware_version and part_number onto the device row from the root node at connect.

Zone attributes written by the driver

AttributeMeaning
inputCrosspoint source currently routed to this destination. 0 means nothing is connected.
audio_inputAudio crosspoint source, when audio_breakaway is enabled.
mute_stateon / off, decoded from DestinationPortStatus.
port_lockedtrue when the destination is locked against route changes.
port_statusThe raw DestinationPortStatus entry for this destination, verbatim.
note

The driver never writes zone.source. That attribute is GEM's foreign key into the av_source table and belongs to the AV routing macros. The matrix's physical input number goes in zone.input.

Zone address format

FormMeaning
1Destination (output) 1
O1The same destination in LW3 notation

Whatever form you use, the driver normalises it to O<n> on the wire.

Commands

CommandArgsLW3 sent
set_input / routeaddress, inputCALL /MEDIA/VIDEO/XP:switch(I<in>:O<out>)
set_audio_inputaddress, inputCALL /MEDIA/AUDIO/XP:switch(...) — needs audio_breakaway
mute_onaddressCALL /MEDIA/VIDEO/XP:muteDestination(O<out>)
mute_offaddressCALL /MEDIA/VIDEO/XP:unmuteDestination(O<out>)
mute_toggleaddressResolved from the last reported port status, then mute_on / mute_off
lock_outputaddressCALL /MEDIA/VIDEO/XP:lockDestination(O<out>)
unlock_outputaddressCALL /MEDIA/VIDEO/XP:unlockDestination(O<out>)
get_outputsReads port counts and the connection list
get_statusForces a crosspoint poll
get_device_infoRe-reads the root-node identity properties
recall_presetpresetNot implemented — see limitations
raw_lw3commandSends one raw LW3 line

Every route, mute and lock command is followed by a read-back of the relevant property rather than an optimistic state write, because a locked destination accepts the call and then refuses the switch. GEM shows what the device reports, not what was asked for.

Understanding the protocol responses

Useful when reading the device log or using raw_lw3:

PrefixMeaning
pwWritable property value
prRead-only property value
mOMethod call succeeded
mFMethod call failed
pE / nE / mEProperty / node / method error
n-Node listing entry
o-Subscription opened
CHGUnsolicited change on a subscribed node

CHG and pr are handled identically by the driver, which is exactly why a front-panel route change propagates into GEM.

Known limitations

  • Preset recall is not implemented. The preset node path differs between product families and could not be verified against hardware, so recall_preset returns not yet implemented rather than guessing a path and appearing to work. Use raw_lw3 with the path from your model's LW3 reference until it is wired up properly.
  • DestinationPortStatus is only partly decoded. The first character carries mute and lock state — T neither, M muted, L locked, U both — and the driver decodes that. The remaining characters are model-specific signal bits and are stored verbatim in port_status rather than interpreted. Check them against your model's LW3 reference before building automation on them.
  • No LW3 command signatures. The driver does not use the {signature} bracketing that lets a client correlate a reply to a specific request. Responses are matched by node path instead. The practical effect is that the driver cannot tell "this is the answer to my GET" from "someone else just changed this" — and it treats both as truth, which is the desired behaviour here.
  • Audio is off by default. With audio_breakaway disabled, the audio crosspoint is never touched. That is correct for a switcher where audio follows video.
  • LW2 devices are out of scope. Older MX frames on port 10001 need a separate driver.
  • No EDID management, no signal analysis, no test-pattern generation. Those live under other LW3 node trees and are reachable through raw_lw3 if needed.

Troubleshooting

Device connects but no routes ever appear The unit is probably LW2. Confirm with a manual GET /MEDIA/VIDEO/XP.DestinationConnectionList on port 6107 — silence or a closed socket means LW2 on 10001.

set_input returns ok but the route does not change The destination is locked. Check the zone's port_locked attribute and send unlock_output. This is exactly why the driver reads back instead of writing state optimistically.

Route changes work, mute state never updates The model's DestinationPortStatus string starts with a character outside T/M/L/U. The raw value is still recorded in port_status — read it and open a note so the decode table can be extended.

nE errors in the log mentioning /MEDIA/AUDIO/XP audio_breakaway is enabled on a model with no separate audio crosspoint. Turn it off.

Errors on GET /.ProductName at connect Harmless. Not every product exposes all four root identity properties; the driver probes them and ignores the ones that are missing. The device stays connected.

Connection drops and reconnects repeatedly Something else is resetting the session, or the device is being rebooted by a PoE/power schedule. LW3 permits concurrent sessions, so another controller connecting is not the cause. Check for a power or network interruption on the device.

  • AV Zones — binding matrix destinations to AV zones.
  • AV Sources — naming inputs so the UI shows sources, not numbers.
  • Devices — adding and configuring device rows.