Skip to main content

Kramer Protocol 3000 Matrix / Switcher

Drives Kramer video matrix switchers, presentation switchers, and HDBaseT tie-lines that speak the Kramer Protocol 3000 ASCII API over TCP. Covers the VS-, VP-, KDS-, and MV- families that shipped from roughly 2015 onward — VS-88UT, VS-411X, VP-771, VP-427X1, VS-62H, KDS-EN2T/DEC decoders configured for fixed-map control, and similar. Each matrix output surfaces as a GEM zone, with input routing, output mute, and (on models that support it) output volume written back onto the zone as state.

Not Kramer Network. Kramer's own KNET / K-Touch controller is a separate product that holds a persistent P3K session on TCP/5000. GEM and KNET can't both drive the same unit at once. Point GEM at a switcher that isn't already owned by a KNET room, or use the Kramer "network extension" account model to give GEM its own control channel.

Prerequisites

  • A Kramer switcher on Protocol 3000 firmware (P3K). Older units may ship in the legacy "Protocol 2000" mode — flip them to P3000 in the web UI or via a one-time RS-232 setup command.
  • TCP/5000 reachable from the GEM controller to the device.
  • If Security is enabled on the unit (Settings → Security in the web UI), the P3K control password.

Setup

  1. Confirm Protocol 3000 mode. In the Kramer web UI, open Settings → Communication and confirm the device is on P3000. If you only see P2000, upgrade the firmware or flip the mode.
  2. Reserve an IP. Give the unit a static IP or a DHCP reservation so the device row's ip stays stable.
  3. Add the device. Go to System → Devices → Add Device and pick the Kramer Protocol 3000 Matrix / Switcher driver (key kramer_p3k). Set Switcher IP to the unit's address. Leave P3K TCP Port on 5000.
  4. Set the password (if security is enabled). The Control Password field is stored as a secure attribute and dispatched via #LOGIN on every reconnect. Leave it blank when security is off — the driver does not assume auth.
  5. Set the matrix shape. Output Count and Input Count bound the status poll loop and the set_source argument validator. Set them to the physical count on your model (e.g. 8 / 8 for VS-88UT). If your model has per-output audio volume, toggle Supports Output Volume on — otherwise set_volume returns {error: 'not supported'} and no audio commands are attempted.
  6. Machine Number. Leave on 1 unless the unit is part of a Kramer stack (rare). The value is prepended to every outbound P3K frame as #<n>@.
  7. Create one GEM zone per output. Kramer does not enumerate outputs over the wire — the integrator creates zones by hand and binds each to this device. For each output, add a Zone whose Address is the plain integer output number matching the switcher's front-panel labelling (1, 2, ...). Place them in the AV subsystem.
  8. (Optional) Expose inputs as named sources. For an on-screen source picker, bind the output zones on the AV → AV Zones screen and define one AV Source per matrix input, keyed to the input number. Or skip this and route directly with set_source and a bare input number.
Subsystem placement

Kramer output zones belong in the AV subsystem. The driver hints av, so the New Zone editor pre-selects AV — just confirm it. These are ordinary zones (visible under System → Zones); placing them in AV also surfaces them in the Bind to existing zone picker on the AV → AV Zones screen.

Device attributes

AttributeRequiredDefaultDescription
ipyesLAN IP or hostname of the switcher.
portno5000P3K control port.
passwordnoP3K control password. Stored as a secure attribute. Leave blank when security is off.
machine_numberno1Kramer machine ID; prepended to every command as #<n>@.
output_countno4Number of physical outputs. Bounds the status poll loop.
input_countno4Number of physical inputs. Validates set_source arguments.
supports_volumenofalseSet true for matrixes with per-output audio volume.
status_intervalno30000Poll interval (ms).
command_throttleno120Minimum gap between outbound commands (ms).

Zone attributes

AttributeRequiredDescription
addressyesOutput number as a plain integer matching the Kramer front-panel labelling.
output_indexnoOptional numeric override if a matrix's output labelled "3" answers internally as index 4 (very rare — normally leave blank).

The driver writes these onto each zone as state arrives from the switcher:

  • zone.input — currently routed input number for this output.
  • zone.volume — output level 0–100 (mapped from Kramer's −100 .. 0 dB). Only meaningful when supports_volume is true.
  • zone.mute_stateon / off.

These names are cataloged, so they autocomplete in the Attribute editor's name picker and can drive attribute triggers — for example, alert when a critical display's input changes.

State refreshes two ways. The driver re-polls every output on status_interval (default 30 s), and updates a zone the moment a ROUTE, MUTE, or AUD-LVL echo for that output arrives. So changes GEM makes appear as soon as the switcher acknowledges them, while changes from the web UI or a physical front-panel button surface at the next poll. A # keepalive tap goes out every 45 s to keep the TCP session alive between polls.

Commands

  • on / off — matrix power, where supported.
  • set_source / route — accepts address (output) and source (input number). Wire format is #ROUTE 1,<out>,<in> (layer 1 = video+audio follow).
  • mute_on / mute_off / mute_toggle — per-output mute.
  • set_volume — 0–100 mapped to −100 .. 0 dB. Returns {error: 'not supported'} when supports_volume is false.
  • volume_up / volume_down — Kramer ++ / -- step (single dB).
  • get_zone_status — force a route + mute re-read for one output.
  • get_outputs — re-poll every output up to output_count.
  • get_version — read PROT-VER.
  • get_model — read MODEL.

Zone address format

Plain integer matching the switcher output number:

1, 2, 3, ...

There is no prefix or zero-padding. The driver validates addresses against output_count.

Known limitations

  • No output enumeration. P3K has no "list outputs" query; the integrator declares outputs by creating zones. output_count bounds the status poll but does not fetch metadata.
  • Volume varies by model. Silent tie-line boxes (KDS-EN/DEC in fixed-map mode, most VS-8x8 variants) have no audio. supports_volume=false is the safe default.
  • Legacy VS units. The driver dispatches the #ROUTE verb (P3K 3.x). Older #AV-only firmware still answers correctly for parsing on the response side, but writes may need a firmware upgrade to work reliably.
  • No native mute toggle. mute_toggle is resolved client-side from the cached zone.mute_state — if the cache is stale, the toggle may target the wrong direction once before correcting.
  • Not a K-Touch replacement. GEM controls the switcher directly. For sites that use K-Touch as their room controller, either dedicate this switcher to GEM or plan the coexistence explicitly.

Troubleshooting

SymptomCheck
every command returns ERR 003Security is enabled but the password is missing or wrong. Check the Kramer web UI → Security.
ERR 002 on a routesource or address is out of range for the model. Confirm input_count and output_count match the hardware.
connect succeeds but no output state ever updatesoutput_count is set higher than the physical count — the poller times out on the phantom outputs. Match the setting to the model.
connection accepted, then silenceUnit is running Protocol 2000 firmware. Update to a P3K release or flip the mode in the web UI.
routes made outside GEM don't show upAnother controller (K-Touch, Kramer Network) is holding the P3K session and blocking status. Close the peer session and reconnect.
connection drops when idleThe driver already emits a # keepalive every 45 s. If a firewall/NAT still idles the socket, lower ping_interval on the device row (ms).
  • Zones — create one zone per matrix output.
  • Subsystems — the AV subsystem these output zones belong to.
  • Devices — add and configure the switcher.
  • Commands — command grid and Test runner for set_source, set_volume, mute verbs.
  • AV Zones and AV Sources — bind output zones and name matrix inputs for a touch-panel source picker.