Skip to main content

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

  1. 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.
  2. 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.
  3. In Projector IP, enter the projector's address. Leave PJLink TCP Port on 4352 unless the projector documents otherwise (a few legacy installs use a non-standard port).
  4. Enter the PJLink Password if one is set in the projector menu; leave it blank for no-auth projectors. The field is stored encrypted.
  5. 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.
  6. 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).
  7. Run the get_inputs command 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 the input / set_input commands.

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

CommandPJLinkWhat it does
power_onPOWR 1Turn the projector on.
power_offPOWR 0Turn the projector off (it enters cooling).
get_powerPOWR ?Read power state (off / on / cooling / warming).

Input select

CommandPJLinkWhat it does
inputINPT <code>Select an input by its 2-digit code (see Input code format).
set_inputINPT <code>Alias for input.
get_inputINPT ?Read the current input code and type.
get_inputsINST ?List the input codes this projector advertises.

A/V mute (picture / sound blanking)

CommandPJLinkWhat it does
av_mute_on / av_mute_offAVMT 31 / AVMT 30Blank / restore both picture and sound.
video_mute_on / video_mute_offAVMT 11 / AVMT 10Blank / restore picture only.
audio_mute_on / audio_mute_offAVMT 21 / AVMT 20Mute / restore sound only.
mute_toggleToggle the A/V-mute pair, derived from the last-read mute state (defaults to muting when no state is known yet).
get_muteAVMT ?Read the current mute state.

Telemetry & identity

CommandPJLinkWhat it does
get_lampLAMP ?Lamp hours and on/off state for each lamp.
get_errorsERST ?Fan / lamp / temperature / cover / filter / other status.
get_infoINFO ?Projector general-info string.
get_nameNAME ?Projector friendly name.
get_manufacturerINF1 ?Manufacturer string.
get_productINF2 ?Product / model string.
get_classCLSS ?The PJLink class the projector reports (1 or 2).

Attribute reference

Required

AttributeTypeDescription
ipstringLAN IP or hostname of the projector.

Optional

AttributeTypeDefaultDescription
portint4352JBMIA-standard PJLink port.
passwordstring (secure)emptyPJLink password as configured in the projector menu. Blank = no auth.
status_intervalint (ms)30000How often the status loop runs.
request_timeoutint (ms)4000Per-command timeout for connect / greeting / response.

Surfaced by the driver (read-only)

AttributeSourceMeaning
power_statePOWR ?off / on / cooling / warming.
inputINPT ?2-digit PJLink input code.
input_typefirst digit of INPT ?rgb / video / digital / storage / network / internal.
av_muteAVMT ?av_unmuted / av_muted / video_unmuted / video_muted / audio_unmuted / audio_muted.
lamp_hoursLAMP ?Hours on the first (or only) lamp.
error_statusERST ?6-digit string: fan, lamp, temp, cover, filter, other (0 ok, 1 warn, 2 error).
has_errorderivedtrue 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 digitSource typeCommon second-digit codes
1RGB / VGA / Computer11 RGB1, 12 RGB2
2Composite / Component Video21 Video1
3Digital / HDMI / DisplayPort31 HDMI1, 32 HDMI2
4Storage (USB / SD)41 USB1
5Network / LAN / Streaming51 LAN1
6Internal 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 %1 command 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

SymptomLikely cause
Every command returns ERRA: authentication failureWrong 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 nothingProjector 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 timeProjector lamp transition takes 30 – 120 seconds; status polling will update once it settles.
input command returns ERR2The input code is not advertised by this projector. Run get_inputs and pick a value from the returned list.
Commands work intermittentlyThe 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 laterMany 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.
  • Devices — add and configure the projector.
  • Commands — the command grid and the Test runner for power_on, input, the A/V-mute verbs, and the get_* reads.