WyreStorm NetworkHD
Drives a WyreStorm NetworkHD AV-over-IP system through the NHD-000-CTL or NHD-CTL-PRO controller. One GEM device represents the controller; each decoder (RX) becomes a zone. Supports matrix routing, video wall and multiview scene recall, display power over CEC, and live endpoint feedback.
The controller is the only thing GEM talks to — encoders and decoders are never addressed directly on the network. Everything is routed by alias, the friendly name assigned in NetworkHD Console.
Prerequisites
- The NHD controller must be commissioned and reachable on the control LAN. The factory default control IP is
192.168.11.243; give it a static IP or a DHCP reservation. - Do not point the driver at the AV LAN address (
169.254.1.1) — that side carries the video fabric, not the API. - All encoders and decoders must already be commissioned in NetworkHD Console and given aliases. Routing by alias is what makes a GEM zone survive a hardware swap.
- Telnet (TCP 23) must be reachable from the GEM server. There is no login on this port.
The controller also exposes Telnet-over-TLS (992) and SSH (10022), both with credentials and both disabled from the factory. This driver uses plain telnet on 23, which is the documented default control path.
Setup steps
- Go to /admin/devices and create a device with driver
wyrestorm_networkhd. - Set Controller IP to the NHD controller's control-LAN address. Leave Telnet Port at
23unless you have remapped it. - Save and enable the device. On connect the driver pins alias mode on, reads the API and system versions, enumerates every endpoint, and reads the routing table.
- Check the device attributes —
endpointsis populated with a JSON list of every encoder/decoder (alias, hostname, IP, online). Use it to confirm commissioning before building zones. - Create one zone per decoder at /admin/zones, setting Address to the decoder alias (e.g.
display1).
Attribute reference
Device
| Attribute | Required | Default | Purpose |
|---|---|---|---|
ip | yes | — | Control-LAN IP or hostname of the NHD controller. |
port | no | 23 | Controller telnet API port. |
status_interval | no | 60000 | How often (ms) the routing table is re-read. Endpoint online/offline arrives unsolicited, so this can be slow. |
The driver also writes back api_version, system_version, and endpoints (JSON) as device attributes.
Zone
Zones need no attributes of their own — only an Address. The driver writes state onto each zone:
| Attribute | Meaning |
|---|---|
input | Alias of the encoder currently routed to this decoder. Empty when unrouted. |
input_video / input_audio | Discrete breakaway assignments, populated by get_matrix_video / get_matrix_audio. |
online | Whether the endpoint is currently on the network. |
signal_state | found or lost, from the controller's unsolicited video notifications (400/500-Series). |
Zone address format
The zone address is the decoder alias exactly as set in NetworkHD Console — display1, boardroom_left, and so on.
The device hostname (NHD-400-RX-E4CE02104E55, i.e. <model>-<MAC>) also works and is accepted by the controller, but it is derived from the hardware MAC and changes when a unit is replaced. Prefer the alias.
An alias that was never set reads back literally as null. If endpoints shows aliases of null, finish commissioning in NetworkHD Console before building zones — otherwise you are addressing hardware by MAC.
Commands
| Command | Arguments | Notes |
|---|---|---|
get_devices | — | Enumerate endpoints into the endpoints attribute. |
get_matrix | — | Read the all-media routing table. |
get_matrix_video / get_matrix_audio | — | Read breakaway routing tables. |
get_version | — | Controller API + system versions. |
set_source | address, source | Route encoder → decoder, all media. The universal verb. |
set_video_source / set_audio_source | address, source | Breakaway routing. Not on base 100/200-Series. |
clear_source | address | Detach a decoder from any encoder. |
on / off | address | Display power via CEC one-touch-play / standby. |
sink_power_on / sink_power_off | address | Power via the sinkpower proxy. Off by default per endpoint. |
volume_up / volume_down | address | Analog audio. 400-Series only. |
mute_on / mute_off | address | Analog audio. 100/200-Series only. |
scene_recall | scene | Recall a video wall scene, e.g. OfficeVW-Combined. |
wscene_recall | scene | Recall a wscene2 layout. |
vw_source | scene, source | Change the encoder feeding a logical screen. |
get_scenes | — | List configured video wall scenes. |
mview_set | address, source, mode | Route to a multiview decoder. mode is tile or overlay. |
mscene_recall | address, layout | Recall a saved multiview layout. |
get_mscenes | address | List multiview layouts — all decoders, or one if address is given. |
cec_raw / ir_raw | address, data | Raw CEC hex / Pronto CCF IR passthrough. |
Known limitations
- Video walls and multiview layouts must already exist. They are built in NetworkHD Console; this driver recalls them by name and cannot create, edit, or enumerate their internal geometry.
notify serialinfois logged, not parsed. That message embeds a CRLF inside its payload and needs its length prefix to reassemble safely. RS-232 passthrough from an endpoint is therefore not surfaced as state. Sending raw serial is not implemented either — usecec_raw/ir_rawfor passthrough control.- No
matrix audio2/audio3. The 600-Series second analog output and the 500-Series ARC return path are not exposed. - Volume is series-split by the hardware, not by us. A 400-Series endpoint answers up/down but not mute; 100/200-Series is the reverse. GEM sends what you ask; an unsupported verb is a no-op on the endpoint.
- Video-wall and multiview layout geometry, endpoint firmware update, and NetworkHD Console configuration are all out of scope.
Troubleshooting
| Symptom | Check |
|---|---|
| Connection refused, or nothing on port 23 | Confirm you are using the control LAN address, not the AV LAN. Close any other control-system telnet session — concurrent sessions behave unpredictably. |
Every command answers unknown command | A terminator problem. The API requires LF as the final byte and rejects CR-only; anything relaying the session must not rewrite line endings. The controller also rejects smart quotes — aliases must use plain ASCII ". |
| Routing a multiview decoder does nothing | NHD-220/250 multiview decoders ignore matrix set. Use mview_set, or mscene_recall for a saved layout. Note 600-Series multiview is the exception and does use matrix set. |
| Display power does nothing | sink_power is disabled per endpoint by default in NetworkHD Console. Use on/off (CEC) instead, and confirm the display has CEC enabled — most TVs ship with it off, often under a vendor brand name (Anynet+, Bravia Sync, SimpLink). |
| Zone shows no source right after a successful route | matrix get reports NULL both for an unrouted decoder and for one carrying discrete breakaway streams. Query get_matrix_video / get_matrix_audio to see the real assignment. |
Endpoints missing from endpoints | Only commissioned devices appear. If an alias reads null, finish commissioning in NetworkHD Console. |