DigitaLinx AV over IP
The digitalinx driver controls a DigitaLinx (Intelix) AV-over-IP system — the encoders
(transmitters) and decoders (receivers) that carry HDMI video, audio, USB, IR and serial over a
network switch instead of a hard-wired HDMI matrix. Every source (cable box, media server, PC,
game console) plugs into an encoder, every display plugs into a decoder, and all of them
live on a managed switch. In GEM, one device is the DigitaLinx "Linx" controller, and you
route any source to any display by telling a decoder to join an encoder's stream.
DigitaLinx is a virtual matrix: unlike a fixed HDMI matrix with numbered OUT/IN ports, video, audio, USB, IR and serial each route independently, endpoint-to-endpoint. "Show source 2 on display 4" means telling decoder 4 to join encoder 2 — the network is the matrix, so it grows to as many endpoints as the switch fabric allows.
GEM adds one device, and points it at the Linx controller (the DigitaLinx control unit), not at an individual encoder or decoder. Every command is an HTTP request to that controller, which relays it to the endpoints. You still name a source encoder and a destination decoder in each route — GEM just sends those through the one controller.
GEM routes streams; it does not configure the endpoints or the switch. Provision the encoders and decoders (IP addresses, endpoint names, stream settings) in DigitaLinx's own tooling, and set the network switch up for multicast — IGMP snooping on, an IGMP querier active, and the DigitaLinx units on a multicast-capable VLAN. Without proper multicast handling, decoders show snow or freeze on route changes. Once each box has a reachable name on the controller and the switch passes multicast cleanly, GEM can route between them.
Prerequisites
- The DigitaLinx (Linx) controller reachable on the same LAN as GEM, with a static IP or a DHCP reservation.
- API access enabled on the Linx controller, and its security key copied. Every command GEM sends carries this key; if it is wrong or rotated, all commands fail.
- Every encoder and decoder already bound to the controller, and a note of each endpoint's
name — that name is what you enter as the zone Address in GEM. Run
get_devices(below) to list them. - A note of which encoder feeds each source and which decoder drives each display, so you can match names to rooms.
Setup
-
Enable the API on the Linx controller. From the controller's web UI, turn on API access and copy the security key.
-
System → Devices → Add Device — choose driver DigitaLinx AV over IP (
digitalinx). Set:- Controller IP (
ip) — the LAN address of the Linx controller (not an individual encoder or decoder). - API Security Key (
security_key) — the key you copied from the controller. This is stored encrypted. - Status Poll Interval (ms) (
status_interval) — optional, default 30000 (30 s). How often GEM reads each endpoint's status. On large systems (50+ endpoints) raise this — polling walks every zone with a 2-second gap between endpoints, so a big system can otherwise overlap its own polls.
Set Enabled to Yes and save. GEM connects over plain HTTP (port 80) and POSTs each command to
/api/commandwith the security key in the request body. - Controller IP (
-
List the endpoint names. Run the
get_devicescommand against the DigitaLinx device with target set toall(orall_txfor encoders only,all_rxfor decoders only). The quickest way: System → Commands, pick the DigitaLinx device as the test device, findget_devices, and run it. The response lists the encoder and decoder names the controller knows about — those exact names are what you enter as zone Addresses next. -
Create one zone per endpoint. Under System → Zones, add a zone in the AV subsystem for each encoder and each decoder you will control. Set the zone Address to the endpoint's DigitaLinx name exactly as it appears in
get_devices— the Address is the identifier GEM routes on and polls status for. Give each a room-friendly Label (the Label is cosmetic; the Address is the key).No auto-discovery — zones are added by handUnlike some AV-over-IP drivers, DigitaLinx does not create zones for you. There is no "sync" or "discover" command; you add one zone per endpoint yourself, using the names from
get_devicesas the Addresses. A typo in the Address looks identical to a disconnected endpoint — the zone's status will simply never update. -
Route a source to a display. Run a
join_*command with the encoder set to the source endpoint and the decoder set to the display endpoint (both are zone pickers listing your endpoint zones). Start withjoin_fastfor most rooms. See Routing below.
Routing
A DigitaLinx route names a source encoder and a destination decoder, and picks a join mode for how the stream is switched. The encoder and decoder arguments both show a picker that lists your endpoint zones and sends each zone's Address (the DigitaLinx name).
| Command | Mode | When to use |
|---|---|---|
join_fast | Fast switch | The everyday "switch this display to that source". Lowest-latency switch; small blink on change. |
join_sync | Genlocked | Switches with the decoders genlocked — cleaner on tiled/side-by-side displays. |
join_sync_scale | Genlocked + scaled | Genlocked and scaled to a forced width/height (e.g. 1920×1080 or 3840×2160). |
join_adv | Advanced | Fast/sync with explicit aspect (keep / crop / stretch) and flags. |
join_audio_analog | Analog audio only | Route just the analog audio path (audio_a) to a decoder. |
join_audio_digital | Digital audio only | Route just the digital audio path (audio_d) to a decoder. |
join_ir | IR only | Pass IR between the two endpoints. |
join_serial | Serial (RS-232) | Route serial, optionally bidirectional. |
join_usb | USB / KM | Route USB from the decoder side to the encoder side. |
join_multi | Multiview | Add an encoder to a decoder's multiview layout (subscription, scaled, layout). |
join_wall | Video wall | Place an encoder onto a wall decoder at a display position within a wall type grid. |
join | Any | The general form: pick the mode yourself from a dropdown, plus encoder and decoder. |
Route flags (booleans)
The join commands expose several on/off flags. These matter most when you build a Send Command step in a macro, because DigitaLinx encodes a flag by presence — turning it on adds the keyword to the command, turning it off leaves it out entirely:
| Flag | Effect when on |
|---|---|
av | Route audio together with video in one join, instead of video only. |
exclusive | Make the join exclusive — the decoder drops its other subscriptions of that type first. |
lock | Genlock the decoder to the source. |
auto | Auto-scale the output to the display. |
aspect (keep / crop / stretch), width, height and fps (30 / 60) further tune how
the stream fills the display where the mode supports it.
Un-routing (leave)
To blank a display or drop one path without routing a new source, send a leave_* command
against the decoder. Most take a decoder picker that also offers all to clear every decoder
at once.
| Command | Clears |
|---|---|
leave_all | Every stream on the decoder (or all decoders). |
leave_av | The combined audio+video subscription. |
leave_video | The video subscription only. |
leave_audio_analog | The analog audio path (audio_a). |
leave_audio_digital | The digital audio path (audio_d). |
leave_subscription | A named subscription on the decoder. |
Because paths route independently, a "watch this source here" button is usually a macro. Most
rooms need only one join_fast (or join_av on join_fast with the av flag) so audio follows
video; add join_audio_digital / join_audio_analog only where a room takes audio on a separate
path. Automation → Macros → Add a macro per route, add a Send Command step
that targets the DigitaLinx device and sends the join with the source encoder and destination
decoder selected, and bind that macro to the touchpanel button or source tile that should trigger
it.
Streaming (encoders)
An encoder must be streaming for decoders to join it. On most systems the encoders stream continuously once commissioned, but GEM can start and stop a stream and set its multicast address:
| Command | Args | Notes |
|---|---|---|
start_av | encoder, audio_multicast_address, video_multicast_address | Start the combined AV stream. |
start_video | encoder, multicast_address | Start the video stream. |
start_audio_analog | encoder, multicast_address | Start the analog audio stream. |
start_audio_digital | encoder, multicast_address | Start the digital audio stream. |
start_sub | encoder, multicast_address | Start the secondary (sub) stream. |
stop_av / stop_video / stop_audio_analog / stop_audio_digital / stop_sub | encoder, free_mode | Stop the stream. free_mode = free or free_all releases the multicast group. |
stop_ir / stop_serial / stop_usb | encoder | Stop the IR / serial / USB pass-through on the encoder. |
Live state
DigitaLinx zones do report status. On the Status Poll Interval, GEM walks each zone in
turn, asks the controller for that endpoint's status, and writes it onto the zone as the state
attribute. If the controller returns an error for an endpoint, GEM records the message on the zone's
error attribute and sets state to error. You can also read status on demand with
get_status (per endpoint) or the other get_* commands below.
Practically:
- A zone tile reflects the endpoint's last polled
state; it is not instantaneous — a change made at the DigitaLinx web UI is seen on the next poll (default 30 s). - Large systems poll slowly by design (a 2-second gap per endpoint). Raise Status Poll Interval rather than lowering it if polls start to overlap on a big system.
- DigitaLinx zones do not carry the generic on/off/volume/mute controls — they are routing endpoints, not volume zones. Route with the join/leave commands above; handle room volume at the display or AVR.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | LAN IP of the DigitaLinx Linx controller. |
security_key | string (secure) | API security key from the Linx controller. Stored encrypted; sent in the body of every command. |
Device — optional
| Attribute | Type | Default | Description |
|---|---|---|---|
status_interval | int (ms) | 30000 | How often GEM polls each endpoint's status. Raise on large systems. |
Zone (encoder / decoder endpoint)
- Address required: yes — the endpoint's DigitaLinx name exactly as
get_devicesreports it. This is the identifier GEM routes on and polls. state— cataloged; GEM fills it from status polling. It is read-only feedback, not something you set. (No other DigitaLinx-specific attributes are pre-cataloged, so the Attribute editor's name picker won't auto-suggest endpoint attributes beyondstate.)
Commands
Run any of these from System → Commands (select the DigitaLinx device as the
test device), from a macro Send Command step, or from the AI assistant. Any argument shown as a
zone picker (encoder, decoder) offers your endpoint zones and sends the zone's Address.
Read / status
get_status, get_devices, get_api, get_version, get_temperature, get_bandwidth,
get_display_status, get_preferred_resolution, get_edid, get_video, get_video_mode,
get_video_mute, get_video_source, get_video_status, get_video_compress,
get_audio_io, get_audio_out, get_audio_source, get_encoder_subscription,
get_frame_converter, get_variable — each queries the named endpoint (or, for
get_devices/get_api/get_variable, the controller) and returns the current value.
Set (encoder)
| Command | Args | Notes |
|---|---|---|
set_video_source | encoder, value | Choose the encoder's input: auto, hdmi, or dp. |
set_video_compress | encoder, state | Turn video compression on/off (true / false). |
set_audio_io | encoder, value | Set the encoder audio direction: in or out. |
set_frame_converter | encoder, stream, state | Frame converter on the sub or main stream. |
set_edid | encoder, data | Push an EDID to the encoder. |
set_security | encoder, key | Set the security key on an encoder. |
Set (decoder)
| Command | Args | Notes |
|---|---|---|
set_video_mode | decoder, display_mode, aspect, width, height, fps | Force the decoder's output: display_mode = sync / sync_scale / fast; aspect = keep / stretch / crop; res/fps optional. Use when a display goes blank on an unsupported native resolution. |
set_video_mute | decoder, state, color | Mute (blank) the decoder video (true / false), optionally to a color. |
set_audio_out | decoder, value | Decoder audio output: hdmi_2 or analog. |
set_audio_source | decoder, value | Decoder audio source: hdmi, hdmi_2, hdmi_sync, or analog. |
Maintenance
| Command | Args | Notes |
|---|---|---|
reboot | device | Reboot one endpoint, or all / all_rx / all_tx. |
set_variable / get_variable | name, value | Read or write a controller variable by name. |
default | width, height, fps | Apply a default resolution. |
Known limitations
- No auto-discovery. DigitaLinx has no sync/discover command. Add one zone per endpoint by hand,
using the names from
get_devicesas the zone Addresses. - No per-zone volume/mute. DigitaLinx zones are routing endpoints; the generic on/off/volume/mute verbs are not implemented. Room volume belongs to the display or AVR.
- Independent paths. A video-only join leaves audio/USB/IR wherever they were last routed — send
each path you need, or use the
avflag to carry audio with the video. - Security-key coupling. The security key is sent with every command. Rotating it on the controller breaks every device until you update the API Security Key attribute to match.
Troubleshooting
| Symptom | Check |
|---|---|
| All commands fail / return 401/403 | The security key is wrong or was rotated. Re-copy it from the Linx controller and update the device's API Security Key (security_key) attribute. |
| A zone's status never updates | The zone Address doesn't match a real endpoint name — a typo looks identical to a disconnected endpoint. Run get_devices and confirm the exact name. |
| Device never connects | Confirm Controller IP is the Linx controller (not an encoder/decoder) and that API access is enabled on it. GEM connects over plain HTTP on port 80 to /api/command. |
| A route switches video but not audio | Audio routes on a separate path. Use the av flag on the join, or send join_audio_digital / join_audio_analog in the same macro. |
| A display goes blank after a route change | The source may be outputting a resolution the display can't take. Force a known mode with set_video_mode, or reboot the decoder. |
| Status polls overlap on a large system | Each poll walks every endpoint with a 2-second gap. Raise Status Poll Interval (status_interval) so a full sweep finishes before the next one starts. |
Related documentation
- Just Add Power and AVPro Edge MXNet — sibling AV-over-IP encoder/decoder systems, for comparison of routing models.
- Devices — add and configure the DigitaLinx controller.
- Zones — create the encoder/decoder endpoint zones.
- Commands — run
get_devicesand the join/leave commands from the Test runner. - Macros — build per-route or per-button switch actions.
- AV Sources and AV Zones — model sources and rooms for touchpanel source selection.