Epson Projector Network Control: ESC/VP.net on TCP Port 3629
Sending ESC/VP21 to an Epson projector over the LAN is not "open a socket and type PWR ON". Epson's network layer, ESC/VP.net, listens on TCP port 3629 and expects a 16-byte binary CONNECT request first. Only after the projector answers with status byte 0x20 can you send ordinary ESC/VP21 commands on that connection, and the session drops after 10 minutes of silence unless you send a null command. If your controller cannot perform that handshake, use PJLink on TCP 4352 instead.
The command strings themselves do not change. Epson's ESC/VP21 guide describes the protocol as independent of the transport (serial, USB or TCP/IP), but for the network case it adds a precondition: "After establishing a TCP session, ESC/VP21 commands can be sent to projectors", and it points to the separate ESC/VP.net manual for how that session is established. That session step is what this page covers. For the command list itself, see the Epson ESC/VP21 command reference.
Step 1: Open TCP port 3629
Epson's own support FAQ walks through the procedure with a generic TCP client: enter the projector's IP address, enter 3629 as the port, connect. Epson's ESC/VP.net developer manual gives the same number from the other side: in session mode the projector "stands by" on TCP 3629. The developer manual calls 3629 a default that can be changed if both client and server are changed together; where that setting lives on a given projector is not described in Epson's official documentation, so assume 3629.
Two documented behaviours matter before any byte is sent:
- A session is always started by the client. The projector never opens a connection to your controller.
- When the projector is busy, the developer manual says it may simply reject the TCP connection. A refused connect is therefore not proof of a wrong IP address.
Step 2: Send the 16-byte CONNECT request
The FAQ tells you to send the following bytes in hex mode:
45 53 43 2F 56 50 2E 6E 65 74 10 03 00 00 00 00The developer manual defines a fixed 16-byte common part shared by every request and every response. Mapped onto the FAQ string, the fields read as follows:
| Byte position | Hex in the request | Field | Meaning in this request |
|---|---|---|---|
| 1–10 | 45 53 43 2F 56 50 2E 6E 65 74 | Protocol identifier | The ASCII text ESC/VP.net |
| 11 | 10 | Version identifier | High 4 bits = major, low 4 bits = minor, so version 1.0 |
| 12 | 03 | Type identifier | 3 = CONNECT (1 = HELLO, 2 = PASSWORD, 0 = reserved) |
| 13–14 | 00 00 | Reserved | Reserved for a sequence number; always 0 |
| 15 | 00 | Status code | Always 0x00 in a request |
| 16 | 00 | Header count | 0 = no headers follow |
Verification: from-vendor-doc — handshake bytes from Epson's official ESC/VP.net FAQ, field layout from Epson's ESC/VP.net developer manual; not tested against real hardware in this repo.
Anything after byte 16 is optional headers. Each header is a fixed 18 bytes. The developer manual's example of a password-carrying CONNECT sets the header count to 1 and adds one header made of a 1-byte identifier (1 = Password), a 1-byte attribute (1 = Plain) and a 16-byte password string. The manual defines this string type as fixed length: a shorter value is stored from the start of the field and the rest is filled with 00 bytes.
Note the version byte. The FAQ string is a version 1.0 request. Epson's user guides say that with Command Communication set to Protected you connect with version 2.0 and the Web Control Password, while Compatible allows version 2.0 or 1.0 (version 1.0 uses the Monitor Password). The EB-PU2220B/EB-PU2120W guide's troubleshooting advice for failed ESC/VP.net monitoring and control is to switch to Compatible. The format of the version 2.0 digest authentication is not described in Epson's official documentation.
Step 3: Read the reply byte by byte
The reply uses the same 16-byte layout. The developer manual gives four CONNECT outcomes, and the status code sits in byte 15:
| Status byte | Name | What happens next |
|---|---|---|
| 0x20 | OK | TCP stays open; ESC/VP21 commands now pass directly to the projector |
| 0x41 | Unauthorized | A password is required; the projector closes the connection, and the client may retry with a password |
| 0x43 | Forbidden | The password is wrong; the connection is closed |
| 0x53 | Service Unavailable | The projector is busy or cannot start a new ESC/VP21 session; the connection is closed |
A successful reply looks like this:
45 53 43 2F 56 50 2E 6E 65 74 10 03 00 00 20 00Verification: from-vendor-doc — status codes from Epson's ESC/VP.net developer manual (CONNECT examples); not tested against real hardware in this repo.
The FAQ describes the reply as the projector responding with "ESC/VP.net". That text is only the first 10 bytes. Every one of the four replies starts with the same identifier, including the three that end with a closed connection. A commissioning tool that only checks for the text would report success on a busy or password-protected projector. Check byte 15.
Step 4: Send ESC/VP21 inside the session
Once status 0x20 arrives, the connection carries plain ESC/VP21 with no further wrapping. The FAQ says commands can be typed as ASCII or sent as hex; in hex, add 0d (carriage return) at the end. The usual ESC/VP21 rules still apply on this connection: a set command returns a colon (0x3A) when done, a get command (command name plus ?) returns a parameter, an invalid command returns ERR, and a bare carriage return (the null command) returns a colon.
| Command | Bytes on the wire |
|---|---|
| PWR ON | 50 57 52 20 4F 4E 0D |
| PWR OFF | 50 57 52 20 4F 46 46 0D |
| PWR? | 50 57 52 3F 0D |
| LAMP? | 4C 41 4D 50 3F 0D |
| ERR? | 45 52 52 3F 0D |
| Null command | 0D |
Verification: from-vendor-doc — command names from Epson's ESC/VP21 guide; the PWR? and LAMP? byte strings match Epson's ESC/VP.net FAQ; not tested against real hardware in this repo.
Wait for the colon between commands. Epson's ESC/VP21 guide says that in the power-on state a command should be sent only after the colon for the previous one has arrived.
Keeping the session open
The developer manual sets a no-communication timeout for the bidirectional session: after more than 10 minutes with no traffic, the connection is treated as cut and the TCP connection is closed. The value is described as changeable, but where to change it is not described in Epson's official documentation.
The manual also defines the keepalive. When half the timeout has passed since the last data was sent or received, the client sends an ESC/VP21 null command and the projector answers with a colon. If no colon comes back, the client treats the projector as busy and sends another null command one minute later, repeating until the full timeout has passed. At that point the session is considered lost. Either the client or the projector may close the TCP connection.
The consequence for a control system: a connection opened at boot and then left idle is not a permanent channel. Either send null commands on that schedule, or be ready to reconnect and repeat the CONNECT handshake before the next command.
Projector settings that decide whether it works
These menu items come from the EB-PU2220B/EB-PU2120W user's guide and Epson's online user guide; menu names on other models may differ, so check that model's manual.
- Network → Network Configuration → Others → Command Communication. Protected or Compatible, as described above. Compatible is the documented choice when monitoring with a switcher and a system controller, or when using Epson Projector Management ver.5.30 or earlier.
- A password must exist. Epson's online guide says the Web Control Password or the Monitor Password must be set before ESC/VP.net commands can be used. The Monitor Password (plain text, up to 16 alphanumeric characters) can be set in Epson Web Control.
- Extended → Standby Mode. Set to Communication On to monitor and control the projector over a network. On the EB-PU2220B guide this has preconditions: A/V Output set to While Projecting, Auto Power On set to Off or Computer, and USB Power set to On While Projecting.
- Extended → HDBaseT → Control Communications. Setting this to On enables the Ethernet and serial ports on the HDBaseT transmitter or switcher and disables the projector's own LAN, RS-232C and Remote ports.
When the projector does not answer: check in this order
- TCP connect to 3629 fails. Confirm the IP address, then check HDBaseT Control Communications: when it is On, the projector's own LAN port is disabled and control has to go through the HDBaseT transmitter or switcher. If the projector is in standby, check that Standby Mode is Communication On. A busy projector may also refuse the TCP connection.
- Connected, but commands sent as text do nothing. Look at whether the CONNECT request was sent at all. Epson's documented order is handshake first, then ESC/VP21. How the projector treats ESC/VP21 text that arrives before a CONNECT is not described in Epson's official documentation.
- The reply starts with ESC/VP.net but the connection closes. Read byte 15: 0x41 means a password is required, 0x43 means the password is wrong, 0x53 means busy.
- Handshake completes but monitoring and control still fail. The EB-PU2220B troubleshooting section gives one fix for exactly this: set Command Communication to Compatible.
- It worked for a while, then stopped after a quiet period. That is the 10-minute idle timeout. Add null-command keepalives or reconnect on demand.
- Commands return ERR inside a working session. This is no longer a network problem. The standby-state command subset, malformed commands and warm-up timing all apply exactly as on a serial link; see Epson projector RS232 not working for that fault check.
One more limit worth knowing before designing a remote-site system: the developer manual states that "This protocol does not assume use beyond the firewall" and that it does not consider security for connections to the Internet. Keep ESC/VP.net on the local control network.
Discovery without a device list
ESC/VP.net also has a session-less mode on UDP. A HELLO request is sent to the broadcast address on UDP port 3629, and each projector answers the sender. The developer manual requires the reply to include three headers (projector name, IM type and projector command type) and forbids the projector from demanding a password for HELLO. This is useful for building an inventory; it does not open a control session.
ESC/VP.net or PJLink?
Epson's user guides for the EB-PU2220B/EB-PU2120W and the EB-L690/L695/L790/L890/L895 series state PJLink Class 2 support; on the EB-PU2220B it is switched on under Network → Network Configuration → Others → PJLink. The documented differences:
| ESC/VP.net | PJLink | |
|---|---|---|
| Port | TCP 3629 | TCP 4352 |
| Opening | Client sends a 16-byte binary CONNECT and waits for status 0x20 | Projector sends a text greeting first |
| Authentication | Version 2.0 with Web Control Password (Protected), or, under Compatible, version 2.0 or version 1.0 (version 1.0 uses the Monitor Password) | MD5 of the projector's random number plus the password, prefixed to the first command |
| Idle limit | 10 minutes, kept alive with null commands | The projector times out 30 seconds after its last response |
| What you can send | The full ESC/VP21 set for that model | PJLink commands; the Epson guides list AVMT 11 and AVMT 21 as not supported |
| Discovery | HELLO on UDP 3629 | Search on UDP 4352 |
Verification: from-vendor-doc — from Epson's user guides, Epson's ESC/VP.net developer manual and the JBMIA PJLink specification; not tested against real hardware in this repo.
A workable split, based on those differences: PJLink when a text protocol with a standard port is enough (power, mute, input), ESC/VP.net or serial when you need an Epson command that PJLink does not define. The Epson-specific PJLink details, including the input numbering, are in Epson projector PJLink commands.
SoftControl import snippet
SoftControl does not support ESC/VP.net. Its tcp protocol opens a connection, writes the command once, optionally reads one reply and closes. It never sends the CONNECT request or waits for status 0x20, so a tcp command aimed at port 3629 does not follow Epson's documented sequence. Do not try to squeeze the handshake and a command into one hex payload either: nothing in Epson's documentation says the projector accepts that, and it has not been tested.
For network control of an Epson projector in SoftControl, use the pjlink protocol. The command text carries the %1 prefix and no carriage return; the driver appends the CR itself. If the projector has a PJLink password, put it in the device's auth.password and the driver reads the projector's greeting and prepends the MD5 digest. SoftControl's PJLink driver implements Class 1 only.
name: Epson power on (PJLink)
protocol: pjlink
targetIpOrCom: 192.168.1.50
portOrBaud: 4352
commandText: %1POWR 1
name: Epson power off (PJLink)
protocol: pjlink
targetIpOrCom: 192.168.1.50
portOrBaud: 4352
commandText: %1POWR 0
name: Epson picture and sound mute on (PJLink)
protocol: pjlink
targetIpOrCom: 192.168.1.50
portOrBaud: 4352
commandText: %1AVMT 31Verification: from-vendor-doc — PJLink commands from the JBMIA specification; AVMT 31 is used because Epson lists AVMT 11 and AVMT 21 as unsupported; not tested against a real Epson projector in this repo.
For Epson-only commands, use the RS-232C port with the serial protocol. SoftControl's serial port is fixed at 8 data bits, no parity, 1 stop bit, and it does not add a carriage return, so write it as \r in text mode or 0D in hex mode:
name: Epson power on (serial)
protocol: serial
targetIpOrCom: COM1
portOrBaud: 9600
payloadFormat: text
commandText: PWR ON\rVerification: from-vendor-doc — 9600 bps and the command string from Epson's ESC/VP21 guide; not tested against a real Epson projector in this repo.
SoftControl's serial driver does not wait for the ESC/VP21 colon; it pauses 50 ms after writing and moves on. When a sequence sends a second command after power-on, put the gap in the delayMs field of the second command, and take the value from the execution-time table in Epson's ESC/VP21 guide for your model rather than guessing a number.