Just Add Power (AV-over-IP)
Just Add Power (often shortened to "JAP" or "J+P") is an AV-over-IP video distribution
system. Instead of a fixed-size matrix box, every source is plugged into an encoder (a
transmitter, named like TX2) and every display is plugged into a decoder (a receiver, named
like RX4), and all of them live on a managed network switch. "Route source 2 to display 4" means
telling decoder 4 to subscribe to encoder 2's multicast stream — the network is the matrix, so it
grows to as many endpoints as the switch fabric allows.
This GEM driver is a coordinator, not one device per box. You add a single GEM device — it
appears in the driver list as Just Add Power — and point it at the IP of any one JAP unit. On
connect it talks to that unit's directory, discovers every encoder and decoder on the system,
and auto-creates one GEM zone per decoder so each display shows up ready to control. Routing is
done with one command, set_input, which switches a decoder to a chosen encoder by number.
GEM routes streams; it does not configure the JAP boxes or the switch. Provision the encoders and decoders (IP addresses, transmit settings) in Just Add Power's own tooling, and configure the network switch for multicast — IGMP snooping on, an IGMP querier active, and the JAP units on a dedicated multicast-capable VLAN. Without proper multicast handling, decoders show snow or freeze on every route change. Once each box has a reachable IP and the switch passes multicast cleanly, GEM can discover and route between them.
How GEM models Just Add Power
| In the real world | In GEM |
|---|---|
| The whole JAP system (many encoders + decoders) | One coordinator device |
A display's decoder (e.g. RX4) | An auto-created zone, address = the decoder's number (4) |
A source's encoder (e.g. TX2) | An input number (2) you route with set_input |
| "Route this source to this display" | A set_input command on the decoder's zone |
The driver only auto-creates zones for decoders (displays). Encoders are discovered too, but they're not given zones — they're the inputs you route, identified by their number. You point the coordinator at one reachable JAP IP; it does not need to be any particular unit, it's just the anchor GEM queries to read the system directory.
Prerequisites
- Encoders and decoders fully commissioned in Just Add Power's tooling and reachable by IP from the GEM controller.
- A multicast-capable VLAN for the JAP traffic: IGMP snooping configured and an IGMP querier active on the switch. This is the single most common cause of JAP problems — a switch that floods or drops multicast makes decoders freeze or show snow on route changes.
- DHCP reservations (or static IPs) for every JAP unit, so encoder and decoder IPs never move. The coordinator re-reads each unit's IP on every sync, but stable addressing keeps things predictable.
- The JAP units serve control over plain HTTP on port 80 with no authentication — there is no login to set in GEM.
Setup
- Open Devices, add a device, and choose the Just Add Power driver. It suggests the AV subsystem and a controller device type — accept those. This one device stands in for the whole JAP system; you do not add a device per encoder or decoder.
- Set the Coordinator IP Address (
ip) to the IP of any reachable JAP unit. This is the anchor GEM queries to read the system directory. - Save and enable the device. On connect the driver runs a sync automatically — it reads the JAP
directory, then for every decoder it finds it creates a GEM zone in the AV subsystem,
filling in:
- Address = the decoder's number (the digits in its JAP ID, e.g.
RX4→4). - Unit IP (
ip) = that decoder's own IP address. - JAP Mode (
jap_mode) =decoder.
- Address = the decoder's number (the digits in its JAP ID, e.g.
- Open Zones and confirm one zone per display appeared, each named after the device
and decoder number (for example
<device>_4) with the decoder's reported name as its label. Rename the labels to room-friendly names ("Great Room TV", "Bar Left") so they read well on touch panels.
If you add JAP units later, or the first sync didn't see everything, send the sync_devices
command to the coordinator (from the device's Commands tab, a macro, or a button). It re-reads the
directory and creates zones for any new decoders. Discovery only works within the coordinator's own
VLAN — JAP units on other subnets are not found.
Routing AV — set_input
Switching what a display shows is one command: set_input, sent to the decoder's zone, with
the encoder's number.
| Argument | Required | What it is |
|---|---|---|
encoder | yes | The encoder (input) number to route to this decoder — the digits in the encoder's JAP ID (e.g. TX2 → 2). |
address | auto | The decoder number identifying the target zone. GEM fills this in automatically when you send the command to a JAP zone; you only set it by hand when targeting the device directly. |
For example, to show encoder 2 on the decoder that GEM created as zone "Great Room TV", send
set_input to that zone with encoder = 2. GEM tells the JAP system to route transmitter 2 to
that receiver, and — once the decoder has accepted the switch — records the choice as the zone's
input attribute so the UI reflects what's playing. A failed switch leaves input unchanged, and a
zone with no unit IP is refused rather than sent anywhere.
Where you issue the command
- From the device's Commands tab — handy for testing a route during commissioning. Set the
command to
set_input, pick the decoder zone, and enter the encoder number. See Commands. - From a UI button — wire a control to run
set_inputon a fixed decoder zone with a fixed encoder number ("Watch Cable" on the Great Room TV). - In a macro / as an AV source — the standard way to give users a source menu per room. See the next section.
Building source selection with AV Sources and AV Zones
The auto-created entries are plain Zones, not AV Zones. To present each display as a viewing area with a source menu on a touch panel, layer the AV system on top — this is the same matrix pattern GEM uses for any switcher:
-
For each decoder, create an AV Zone (Open AV Zones) linked to that decoder's zone. Set the AV Zone's Address to the decoder number (its matrix output).
-
For each encoder/source, create an AV Source (Open AV Sources). Set the AV Source's Address to the encoder number (its matrix input), and give it an On Macro that routes it.
-
The On Macro is a single Send Command to the JAP coordinator with command
set_input, targeting the AV zone and passing the encoder via the address placeholders, so one macro serves every source:encoder=[@av_source.address]— the selected source's encoder number.address=[@av_zone.address]— the target display's decoder number.
Mark these in the macro step's arg options so GEM substitutes the live source/zone numbers at run time. (
[@av_zone.address]resolves to the matrix output;[@av_source.address]to the matrix input — see AV Sources.)
With that in place, selecting a source in a room runs its On Macro, which fires set_input, and the
display switches. Sources shared across every room (a cable headend, a streaming encoder) are good
candidates for Global AV sources; gear feeding a single display can be a zone-specific source.
Other commands
All of these except sync_devices operate on a decoder zone (GEM resolves the target unit from
the zone's IP), so send them to a zone — address is filled in for you.
| Command | Arguments | Action |
|---|---|---|
sync_devices | (none) | Re-read the JAP directory and auto-create zones for any new decoders. Targets the coordinator, not a zone. |
set_input | encoder (+ address) | Route the encoder to this decoder. |
reboot | (uses address) | Reboot the JAP unit behind the addressed zone. |
get_details | item (+ address) | Read a live status section from the unit (for example video, device, system). Diagnostic. |
get_settings | item (+ address) | Read a settings section from the unit. Diagnostic. |
cli | command (+ address) | Pass a raw Just Add Power CLI command straight through to the addressed unit. For advanced use against JAP's own command set. |
videowall_layout, videowall_bezel | see Video walls | Set this decoder's place in a video wall and its bezel compensation. |
list_units | (none) | Diagnostic: every unit the last sync found, with its number, mode (encoder or decoder), model and IP. Targets the device, not a zone. |
set_wall_input, tiler_* | see Video walls | Device commands for routing a whole wall and controlling an MC-QX tiler. |
Because GEM only auto-creates zones for decoders, the per-unit commands (reboot, get_details,
get_settings, cli) target decoders out of the box. To run one of these against an encoder,
create a zone manually, set its Unit IP (ip) to the encoder's address and JAP Mode
(jap_mode) to encoder, then send the command to that zone.
Video walls and the MC-QX tiler
A MaxColor video wall is a set of decoders, one per display. Each decoder shows its own part of the same picture, and they all follow one encoder. With an MC-QX tiler, that encoder is the tiler: it combines up to four sources into one 4K picture, and the wall shows that picture.
Routing the whole wall at once — set_wall_input
set_wall_input sends one switch request naming every decoder. If you routed nine decoders with
nine set_input steps instead, the wall would change one screen at a time.
| Argument | Example | Meaning |
|---|---|---|
decoders | 1-9 | Decoder numbers: a range, a list (1,2,3) or both (1-3,7). |
encoder | 5 | The encoder they all switch to. For a tiled wall, the tiler's own transmitter number. |
This is a device command, not a zone command. It goes to the first listed decoder that has a zone,
or to the coordinator if none has one. Once the switch succeeds, input is recorded on each listed
decoder's zone.
Placing each display — videowall_layout and videowall_bezel
These are zone commands, sent to one decoder at a time. Each takes effect immediately and is saved on the decoder, so you only run them once, when you commission the wall.
| Command | Arguments | Action |
|---|---|---|
videowall_layout | rows, columns, row, column | The wall's size and this display's position in it. Row and column count from 1, starting top left. A 3×3 wall's centre display is 3 3 2 2. 1 1 1 1 turns the wall off for that decoder, so it shows the whole picture. |
videowall_bezel | outer_width, outer_height, video_width, video_height | Bezel compensation. Give the display's outer size and its picture area in any one unit, and the decoder skips the pixels hidden behind the bezels. |
Leave the displays' own video-wall mode off (for Samsung MDC panels, videowall_off). The
decoders already do the cropping, and a display that crops as well shows a ninth of a ninth.
Tiler layouts — tiler_*
The tiler is a transmitter, so it gets no zone. Its commands are device commands that name it by
encoder number (run list_units to see it). Each one sends an MC-QX control line to the
tiler's command interface.
| Command | Arguments | Sends |
|---|---|---|
tiler_layout | encoder, layout 1–8 | qx layout N. The standard layouts are 2 secondary-right, 3 secondary-bottom, 4 quad, 5 picture-on-picture, 6 duo, 7 trio, 8 three-window PiP. 1 is the last custom layout. |
tiler_position | encoder, window 1–4, x, y, width, height | qx position. Places one window on the 3840×2160 canvas. Send one for each of the four windows (all zeros hides a window), and the result is kept as layout 1. |
tiler_audio | encoder, audio | qx audio. Picks which window's audio the tiler outputs: 1–4, next, previous, mute or unmute. |
tiler_load | encoder, slot 1–5 | qx load. Recalls a layout saved from the tiler's mouse menu. |
tiler_transparency | encoder, window 2–4, transparency 0–100 | qx transparency. Sets how see-through a picture-on-picture window is. |
JAP's tiler command reference does not cover which source plays in each window. That is routing to
the tiler's four inputs. If they appear as decoders in list_units after a sync, route to them with
set_input like any other decoder. If they don't, choose their sources in JAP's own tools.
If sync_devices does not list the tiler, set the device's Tiler IP (tiler_ip). Tiler commands
use it whenever no synced transmitter has the encoder number they name.
A meeting / presentation / announcement preset is then a macro: tiler_layout (or
tiler_load), the set_input routes into the tiler's windows, tiler_audio, and
set_wall_input to the tiler. A full-screen preset is a single set_wall_input to that source's
encoder.
Live status
While connected, the coordinator polls every decoder zone's video status on an interval (default 30 seconds, set by Status Poll Interval below) and writes what it reads back onto the zone as attributes — so the zone reflects the decoder's current signal without you asking. This is also why a freshly switched display updates its state shortly after a route change.
A decoder that stops answering is not polled at full rate forever: after three unanswered polls in a row it is polled less often, backing off to once every 5 minutes, while every other decoder keeps its normal rate. It returns to the normal rate as soon as it answers again. A decoder that answers with an error page (for example a unit in the wrong role) still counts as answering; nothing from an error page is written onto the zone.
If the coordinator itself doesn't answer when the device connects, the device stays offline rather
than claiming a connection, existing zones are still polled, and the directory sync is retried on
its own — after 30 seconds, then backing off to every 5 minutes — until the coordinator answers.
Running sync_devices yourself also works.
Attributes
Device
| Attribute | Type | Required | Description |
|---|---|---|---|
ip | string | yes | Coordinator IP Address — the IP of any reachable JAP unit, used as the sync anchor. |
status_interval | integer | no | Status Poll Interval (ms) — how often decoder video status is polled. Default 30000 (30 s); values under 1000 are treated as 1000, and an unreadable or negative value uses the default. |
request_timeout | integer | no | Request Timeout (ms) — per-request HTTP timeout to a JAP unit. Default 30000; zero, negative or unreadable values use the default. |
tiler_ip | string | no | Tiler IP — an MC-QX tiler the directory sync does not list. Used by the tiler_* commands when no synced transmitter has the encoder number they name. |
Zone (auto-populated during sync)
| Attribute | Type | Description |
|---|---|---|
ip | string | Unit IP — the IP of the encoder or decoder this zone represents. |
jap_mode | string | JAP Mode — decoder or encoder. Set automatically on auto-created decoder zones; set it yourself on a hand-made encoder zone. |
input | integer | The encoder number currently routed to this decoder. Set by set_input; reflects the live route. |
The zone's Address field (not an attribute) holds the JAP decoder number — this is what identifies the unit to route to. It is populated automatically during sync.
Known limitations
- Decoders get zones; encoders don't. Encoders are discovered and used as input numbers, but
GEM doesn't create a zone or list them for you. Identify an encoder by the number in its JAP ID
(
TX3→3), which you can read from the Just Add Power tooling. - Discovery is VLAN-local.
sync_devicesonly finds units the coordinator IP can reach on its own VLAN. JAP units on other subnets won't appear. - GEM does not configure the JAP boxes or the network. Encoder/decoder provisioning, transmit settings, and the switch's multicast configuration are done on the hardware, not through GEM.
- No login. The driver assumes the JAP units' default unauthenticated HTTP control interface.
Troubleshooting
| Symptom | Check |
|---|---|
sync_devices comes back empty / no zones created | Confirm the coordinator IP can reach the JAP units on the same VLAN; units are not discovered across subnets. Check the unit is powered and its web interface is reachable from the GEM host. |
| Decoder image freezes or shows snow on switch | Multicast misconfiguration on the switch — turn on IGMP snooping and ensure an IGMP querier is active, with the JAP units on a dedicated multicast-capable VLAN. This is by far the most common JAP issue and is a network fix, not a GEM one. |
set_input returns 404 (http status 404) | The zone's Unit IP is wrong, or the unit is in the wrong role (an encoder where a decoder is expected). Verify the zone's ip and jap_mode. |
set_input says "invalid encoder or decoder address" | The encoder argument or the zone's Address isn't a number. Both must be the numeric part of the JAP ID. |
A tiler_* command says "tiler not found" | Run sync_devices, then list_units to read the tiler's encoder number. If it isn't listed, set Tiler IP on the device. |
set_wall_input or set_input returns 400 | Both use JAP's switch command, which needs a JADConfig-configured system. The unit's error body says why. |
| A new JAP unit doesn't appear | Run sync_devices again after the unit is on the network; only decoders auto-create zones. |
| A zone's address looks like an IP, not a number | Older auto-created zones used the unit IP as the address; the driver migrates these to the numeric decoder number on the next sync. Run sync_devices once and re-check. |
Related documentation
- Devices — add and configure the coordinator device.
- Zones — the per-decoder zones the driver auto-creates.
- Subsystems — the AV subsystem the coordinator and its zones belong to.
- Commands — the Commands tab and Test runner for
set_input/sync_devices. - AV Sources and AV Zones — build per-room source menus on top of the auto-created zones.
- Macros — the per-source On Macro that issues
set_input. - Crestron NVX — another AV-over-IP coordinator driver, command-driven rather than zone-discovering.