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, Admin → Devices → New, pick the PJLink Projector / Display driver.
- Enter the projector IP. Leave the port on
4352unless the projector documents otherwise (a few legacy installs use a non-standard port). - Enter the PJLink password if one is set. Leave blank for no-auth projectors. The driver auto-encrypts this attribute.
- Save the device. The driver immediately runs
POWR ?to confirm the projector is reachable. - The driver polls
POWR,INPT,AVMT,LAMP, andERSTevery 30 seconds (configurable viastatus_interval). - Run the
get_inputscommand once to learn which input codes the projector actually advertises — use the returned 2-digit codes when driving theinput/set_inputcommands.
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.
Known limitations / not yet supported
- PJLink Class 2 extensions (
SVOL,MVOL,FREZ,RESO,RTLM,IFOR,LKUP,SRCH) are not exposed in this version. Most can be added later by sending%2prefixed commands; the wire format is identical. - Class 2 SRCH broadcast autodiscovery on UDP/4352 is not implemented — enter the IP manually.
- Projector clock/scheduling (
SNUM,INNM) commands are not exposed. - The driver speaks the open PJLink protocol only. Models that only expose vendor-specific protocols (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. |