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
After saving the device, its Setup tab does the output zones and sources for you: a live crosspoint grid (read-only until you turn on Route on click), Create output zones for every output without one, Create routing macro (one macro that routes the selected source to the room on this matrix), a Create source row per input where you pick the device plugged into it, and an AV zone picker per output. See Devices — Setup Tab.
- 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. GEM does not write it to the command log or the device traffic trace, and masks it in the unit's echoed login reply. 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. Replies are read whether the unit ends them with CR-LF (the Protocol 3000 standard), CR or LF, and a refusal (ERR nnn, bare or after the verb) is logged rather than read as state. 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.