PJLink Projector / Display
PJLink is the JBMIA industry-standard network-control protocol for projectors and large-format displays. A single PJLink driver covers most modern commercial projectors and signage panels — Epson, NEC, Panasonic, Sharp, Sony, Maxell/Hitachi, Christie, BenQ, ViewSonic, Optoma, Ricoh, JVC, LG and many others — without needing a per-brand driver.
GEM's PJLink driver speaks Class 1 commands (which Class 2 projectors also accept) over TCP/4352 and handles the projector's MD5 challenge-response authentication transparently.
Prerequisites
- The projector supports PJLink (Class 1 minimum). Most commercial projectors shipped in the last 10+ years do; consumer "home cinema" projectors often do not — check the model's spec sheet.
- PJLink is enabled in the projector menu. Different menus call it Network Control, Standby Network, Project Control via LAN, or PJLink. The setting is normally on the same page as the IP / DHCP configuration.
- The projector's IP is reachable from the GEM controller on TCP port 4352.
- Standby mode is set to Network On / Standard / Communication On — the Eco standby mode usually disables LAN control, which means PJLink works while the projector is on but you cannot power it on again over the network.
- If a PJLink password is set in the projector menu, you know it. A blank password in the projector menu means "no authentication".
Setup steps
- In the projector network menu, note the IP address (or assign a DHCP reservation so it doesn't move) and the PJLink password if one is set.
- In GEM, go to System → Devices and use the grid's
add (+) action to open Add a Device. Enter a Name (lowercase,
e.g.
lobby_projector) and an optional Label (the friendly display name), then set Driver to PJLink Projector / Display. - In Projector IP, enter the projector's address. Leave PJLink TCP
Port on
4352unless the projector documents otherwise (a few legacy installs use a non-standard port). - Enter the PJLink Password if one is set in the projector menu; leave it blank for no-auth projectors. The field is stored encrypted.
- Click Create Device. The driver immediately sends
POWR ?to confirm the projector is reachable and marks the device connected. If the projector is in a network-disabled standby it may not answer yet — the status loop keeps retrying on its own. - From then on the driver polls power, input, A/V mute, lamp hours, and error status every 30 seconds (adjust with the Status Poll Interval (ms) attribute).
- Run the
get_inputscommand once from the device's command Test runner to learn which input codes this projector actually advertises — use the returned 2-digit codes when driving theinput/set_inputcommands.
Commands
The driver exposes these commands. Build them into macros, source/scene
buttons, or run them ad-hoc from the device's command Test runner. Each
get_* read also refreshes the matching device attribute (see Attribute
reference).
Power
| Command | PJLink | What it does |
|---|---|---|
power_on | POWR 1 | Turn the projector on. |
power_off | POWR 0 | Turn the projector off (it enters cooling). |
get_power | POWR ? | Read power state (off / on / cooling / warming). |
Input select
| Command | PJLink | What it does |
|---|---|---|
input | INPT <code> | Select an input by its 2-digit code (see Input code format). |
set_input | INPT <code> | Alias for input. |
get_input | INPT ? | Read the current input code and type. |
get_inputs | INST ? | List the input codes this projector advertises. |
A/V mute (picture / sound blanking)
| Command | PJLink | What it does |
|---|---|---|
av_mute_on / av_mute_off | AVMT 31 / AVMT 30 | Blank / restore both picture and sound. |
video_mute_on / video_mute_off | AVMT 11 / AVMT 10 | Blank / restore picture only. |
audio_mute_on / audio_mute_off | AVMT 21 / AVMT 20 | Mute / restore sound only. |
mute_toggle | — | Toggle the A/V-mute pair, derived from the last-read mute state (defaults to muting when no state is known yet). |
get_mute | AVMT ? | Read the current mute state. |
Telemetry & identity
| Command | PJLink | What it does |
|---|---|---|
get_lamp | LAMP ? | Lamp hours and on/off state for each lamp. |
get_errors | ERST ? | Fan / lamp / temperature / cover / filter / other status. |
get_info | INFO ? | Projector general-info string. |
get_name | NAME ? | Projector friendly name. |
get_manufacturer | INF1 ? | Manufacturer string. |
get_product | INF2 ? | Product / model string. |
get_class | CLSS ? | The PJLink class the projector reports (1 or 2). |
Attribute reference
Required
| Attribute | Type | Description |
|---|---|---|
ip | string | LAN IP or hostname of the projector. |
Optional
| Attribute | Type | Default | Description |
|---|---|---|---|
port | int | 4352 | JBMIA-standard PJLink port. |
password | string (secure) | empty | PJLink password as configured in the projector menu. Blank = no auth. |
status_interval | int (ms) | 30000 | How often the status loop runs. |
request_timeout | int (ms) | 4000 | Per-command timeout for connect / greeting / response. |
Surfaced by the driver (read-only)
| Attribute | Source | Meaning |
|---|---|---|
power_state | POWR ? | off / on / cooling / warming. |
input | INPT ? | 2-digit PJLink input code. |
input_type | first digit of INPT ? | rgb / video / digital / storage / network / internal. |
av_mute | AVMT ? | av_unmuted / av_muted / video_unmuted / video_muted / audio_unmuted / audio_muted. |
lamp_hours | LAMP ? | Hours on the first (or only) lamp. |
error_status | ERST ? | 6-digit string: fan, lamp, temp, cover, filter, other (0 ok, 1 warn, 2 error). |
has_error | derived | true if any digit of error_status is non-zero. |
Zones
PJLink does not use GEM zones — the projector is controlled at the device level. All telemetry is on the device row.
Input code format
PJLink uses a 2-digit input code where the first digit identifies the type and the second digit identifies the number on that bus:
| First digit | Source type | Common second-digit codes |
|---|---|---|
| 1 | RGB / VGA / Computer | 11 RGB1, 12 RGB2 |
| 2 | Composite / Component Video | 21 Video1 |
| 3 | Digital / HDMI / DisplayPort | 31 HDMI1, 32 HDMI2 |
| 4 | Storage (USB / SD) | 41 USB1 |
| 5 | Network / LAN / Streaming | 51 LAN1 |
| 6 | Internal source (Class 2 ext.) | 61 Internal1 |
Mapping the second digit to the physical port is projector-specific. Run
the get_inputs command to ask the projector for the codes it actually
implements.
When you build an input / set_input command, the argument offers a
drop-down of the common codes for types 1–5 (RGB, Video, Digital/HDMI,
Storage, Network). Internal-source codes (type 6, e.g. 61) are accepted but
not in the drop-down — type them in directly.
Known limitations / not yet supported
- The driver sends Class 1 commands only (the
%1command set, which Class 2 projectors also accept). The Class 2 extension queries are not exposed: speaker and microphone volume (SVOL/MVOL), picture freeze (FREZ), input and recommended resolution (IRES/RRES), filter usage time (FILT), replacement lamp / filter model (RLMP/RFIL), software version (SVER), serial number (SNUM), and per-input terminal names (INNM). They can be added later by sending the equivalent%2-prefixed command; the wire format is otherwise identical. - The Class 2 broadcast search (
SRCH) and status-notification (STAT/LKUP) mechanisms on UDP/4352 are not implemented — enter the projector IP manually rather than autodiscovering it. - The driver speaks the open PJLink protocol only. Models that only expose a vendor-specific protocol (e.g., Epson ESC/VP21, NEC NaviSet) need a different driver.
Troubleshooting
| Symptom | Likely cause |
|---|---|
Every command returns ERRA: authentication failure | Wrong PJLink password, or the projector now requires auth and the password attribute is blank. Re-check the projector PJLink menu. |
Driver connects, reads status, but power_on does nothing | Projector standby mode is Eco — LAN control is disabled while powered off. Change to Network On / Standard. |
power_state stays on cooling or warming for a long time | Projector lamp transition takes 30 – 120 seconds; status polling will update once it settles. |
input command returns ERR2 | The input code is not advertised by this projector. Run get_inputs and pick a value from the returned list. |
| Commands work intermittently | The projector may only allow one PJLink session at a time. Disconnect any other building-management or AV-control system that holds a PJLink session. |
| Connect succeeds at boot but starts timing out hours later | Many projectors close idle TCP sessions; this driver opens a new connection per command, so this is normally not a problem. If you see it, raise request_timeout. |