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
- 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.
- Reserve an IP. Give the unit a static IP or a DHCP reservation so the device row's
ipstays stable. - 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. - Set the password (if security is enabled). The Control Password field is stored as a secure attribute and dispatched via
#LOGINon every reconnect. Leave it blank when security is off — the driver does not assume auth. - Set the matrix shape. Output Count and Input Count bound the status poll loop and the
set_sourceargument 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 — otherwiseset_volumereturns{error: 'not supported'}and no audio commands are attempted. - 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>@. - 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. - (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_sourceand a bare input number.
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
| Attribute | Required | Default | Description |
|---|---|---|---|
ip | yes | — | LAN IP or hostname of the switcher. |
port | no | 5000 | P3K control port. |
password | no | — | P3K control password. Stored as a secure attribute. Leave blank when security is off. |
machine_number | no | 1 | Kramer machine ID; prepended to every command as #<n>@. |
output_count | no | 4 | Number of physical outputs. Bounds the status poll loop. |
input_count | no | 4 | Number of physical inputs. Validates set_source arguments. |
supports_volume | no | false | Set true for matrixes with per-output audio volume. |
status_interval | no | 30000 | Poll interval (ms). |
command_throttle | no | 120 | Minimum gap between outbound commands (ms). |
Zone attributes
| Attribute | Required | Description |
|---|---|---|
address | yes | Output number as a plain integer matching the Kramer front-panel labelling. |
output_index | no | Optional 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 whensupports_volumeis true.zone.mute_state—on/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— acceptsaddress(output) andsource(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'}whensupports_volumeis 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 tooutput_count.get_version— readPROT-VER.get_model— readMODEL.
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_countbounds 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=falseis the safe default. - Legacy VS units. The driver dispatches the
#ROUTEverb (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_toggleis resolved client-side from the cachedzone.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
| Symptom | Check |
|---|---|
every command returns ERR 003 | Security is enabled but the password is missing or wrong. Check the Kramer web UI → Security. |
ERR 002 on a route | source 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 updates | output_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 silence | Unit 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 up | Another controller (K-Touch, Kramer Network) is holding the P3K session and blocking status. Close the peer session and reconnect. |
| connection drops when idle | The driver already emits a # keepalive every 45 s. If a firewall/NAT still idles the socket, lower ping_interval on the device row (ms). |
Related documentation
- 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.