JVC Projector Integration for NZ-Series (and other 2024+ models)

New Integration: JVC Projector HA for NZ-Series (and other 2024+ models)

I just released a new Home Assistant integration for JVC projectors, specifically designed for the newer NZ-series and other models using the 2024 External Command Communication Specification.

Why Another JVC Integration?

I recently got a JVC DLA-NZ500 and found that existing JVC integrations weren’t working correctly with it. In my case, I could setup the projector and turn it on, but it would become unavailable due the integration sending unsupported commands after it was powered on. The newer NZ-series projectors use an updated API spec, so I built this integration using the update spec.

Supported Models

  • NZ-series: DLA-NZ500, NZ700, NZ800, NZ900

  • RS-series: DLA-RS1200, RS2200, RS3200, RS4200

  • N-series: DLA-N788, N799, N888, N899, N988, N700, N800, N1188

  • V-series: DLA-V800R, V900R

  • Z-series: DLA-Z5, Z7

Tested with DLA-NZ500, other models should work but I have no way to test

Features

  • Power control (on/off)

  • Picture mode selection (Cinema, Natural, HDR, Frame Adapt HDR, etc.)

  • Lamp power and dynamic control

  • Sensors: power state, light source hours, resolution, HDR format, colorimetry

  • Fast polling (~2.3s for full state refresh)

  • Config flow setup for easy installation

Installation

Available via HACS or manual installation.

HACS Repository

GitHub: GitHub - mjmcg/jvc_projector_ha: Home Assistant custom integration for JVC NZ-series projectors.

Feedback Welcome!

This is my first Home Assistant integration, and a v0.1.0 is the initial release. If you have one of these projectors, I’d love to hear your feedback or bug reports!

Acknowledgments

I want to thank the developer iloveicedgreentea for their JVC integration, which inspired me to create this one for the newer models. Here is a link to their repository: GitHub - iloveicedgreentea/jvc_homeassistant: JVC Integration for Home Assistant

2 Likes

Hello Matt!
Thank you for this integration!
I have the same NZ500 but cannot get it work. Sw version on pj 1.02.
Pulled your latest version, HASS is in docker container.
I have direct cable to switch, pj gets IP address via dhcp, ping works fine, but pj refuses connection, like I would have wrong password or something. I set simple “12345678”, padded with JVCKWPJ, using hash string for password. Did not work with or without SDDP enabled.
PJ and HASS in the same subnet.

Logs from HA:

hass  | 2026-01-10 20:44:43.983 WARNING (MainThread) [custom_components.jvc_projector_ha.jvcprojector.device] Retrying refused connection
hass  | 2026-01-10 20:44:53.000 ERROR (MainThread) [custom_components.jvc_projector_ha.config_flow] Error getting MAC address from jvcpj.b41:20554 - Retries exceeded
hass  | Traceback (most recent call last):
hass  |   File "/config/custom_components/jvc_projector_ha/config_flow.py", line 177, in get_mac_address
hass  |     await asyncio.wait_for(device.connect(True), timeout=CONNECTION_TIMEOUT)
hass  |   File "/usr/local/lib/python3.13/asyncio/tasks.py", line 507, in wait_for
hass  |     return await fut
hass  |            ^^^^^^^^^
hass  |   File "/config/custom_components/jvc_projector_ha/jvcprojector/projector.py", line 90, in connect
hass  |     if not await self.test():
hass  |            ^^^^^^^^^^^^^^^^^
hass  |   File "/config/custom_components/jvc_projector_ha/jvcprojector/projector.py", line 152, in test
hass  |     await self._send([cmd])
hass  |   File "/config/custom_components/jvc_projector_ha/jvcprojector/projector.py", line 190, in _send
hass  |     await self._device.send(cmds)
hass  |   File "/config/custom_components/jvc_projector_ha/jvcprojector/device.py", line 81, in send
hass  |     await self._connect()
hass  |   File "/config/custom_components/jvc_projector_ha/jvcprojector/device.py", line 146, in _connect
hass  |     raise JvcProjectorConnectError("Retries exceeded")
hass  | custom_components.jvc_projector_ha.jvcprojector.error.JvcProjectorConnectError: Retries exceeded
hass  | 2026-01-10 20:44:53.002 ERROR (MainThread) [custom_components.jvc_projector_ha.config_flow] Failed to connect to jvcpj.b41:20554 - Retries exceeded

Tried with hostname and IP address, same thing.
Seems I’m missing something. May be some idea?

Thanks!
Reggie

Thanks for giving it a try! Sorry you’re having trouble. Happy to try and help. Based on the error, it looks it’s not the password causing this, but the projector never getting the authentication request. I ran a test on mine to see what the logs would show with a wrong password. This is what I got:


This error originated from a custom integration.

Logger: custom_components.jvc_projector_ha.config_flow
Source: custom_components/jvc_projector_ha/config_flow.py:60
integration: JVC Projector (documentation, issues)
First occurred: 3:16:16 PM (1 occurrence)
Last logged: 3:16:16 PM

Authentication failed for 192.168.1.193:20554

You got a ping response so the projector is connected to your network. That leads me to think the docker container running HASS doesn’t have a network path to your projector.

Try installing the Ping integration and see if you get a Connected sensor to your projector’s IP address. That should tell you if Home Assistant has a network path to your projector. Let me know what you find…

What the… As you advised, I added ping integration for both ip address and hostname, it was showing success as I thought and suspected it should, but after that also JVC integration started to work. Total mystery!
I was even trying before to ping pj from container itself, by attaching to it, ping from inside of container. It worked fine before. But not pj integration. Now all good.
But ping integration kinda blew hole from container to pj.
Huge thanks for idea!

1 Like

Ha! That’s great. Glad it’s working!

Hello Matt!

I think LD power switch values are way around for med and high - med sets it to 100 and high to 46. Not that I’m actively using it, just noticed.

Reggie

Thanks Reggie! Good catch. The valid parameters for the LD Power command are 0,1,2 so I just assumed it was low, med, high. I actually did notice that when I tested it, but forgot to fix it before I did the last release. I pushed 0.1.3 to fix it.

I mostly use it for just power on/off and to see the resolution and HDR settings of the source content. If there’s any commands you use let me know. I’d be interested in expanding it, but no clue what people would actually need.

Thank you Matt!
Same for me - on/off is the main reason to integrate into workflow for setting up scene.

Hi Matt,

I’m having a similar problem with my NZ500 not connecting. The error message is “Authentication failed.” I tried the ping suggestion and found and added the IP address and hostname. Unfortunately, the error persists. I also created the password using a hash, as per the instructions.

Oh, the projector is connected to my switch via LAN.

Regards, Manu

Hi Manu,

That looks like a connection error not a password/auth error. Meaning the integration is trying to establish a connection to your projector and timing out. When you setup the ping sensor, did it show it as connected?

Here’s what mine looks like:

Hi Matt, thanks for the quick reply.

Yes, the connection was established via ping and is currently integrated as a device and is showing as connected. in German… :slight_smile:

Regards, Manu

Hmm, OK that rules out connectivity. The projector is rejecting the password. Are you sure you have the right password? I messed up generating the hash on my first try by leaving a trailing space after the JVCKWPJ

If you can enable debugging and send the raw logs that will give me more info to help troubleshoot.

Hi Matt,

I’ve now removed the JVC from my router and tried everything again. I’ve also changed the password several times and tried again each time, but I keep getting the same error. I made sure there were no spaces in the password.

The ping also established a connection. I was also able to ping the JVC from a Windows PC.

Unfortunately, I can’t find a way to debug this because the integration hasn’t been completed yet. I’m also a newbie with Home Assistant and don’t know much about it yet.

:thinking:

Now things get weird… :sweat_smile:

I tried adding the projector using the built-in Home Assistant integration, with the password stored on the projector, and it worked. :thinking:

So I tried the same thing with your HACS integration, and… it worked! And without a hash password. :heart_eyes:

I was finally able to integrate and control the NZ500 as a device. I’m so glad it finally worked after countless attempts.

And you might also find it interesting that, at least for me, it only worked without a hash password.


Because this thread was about which other control options are used.

I use the “HIDE” button on the remote when guests are in my home theater until I’ve set everything up.

It would be great if you could integrate this function.

Regards, Manu

That’s great it’s working! Thanks for sharing the info about the non-hashed password. I’ll try that on my side and see if it works. Funny that it worked with the hashed password for me but not for you. I know the earlier version of the python library required a pre-hashed password. Upon looking closer it seems the updated library tries both. If that’s the case, I remove the pre-hash requirement and let the library hash it before logging in. Much simpler.

I should be able to add the hide function to the next release. Looks like it’s just sending the IR code for the hide button. Thanks for the suggestion!

Hi Manu - I pushed an update that adds the IR remote buttons including Hide. It also lets you set the laser power between 1-100 instead of high, med, low.

Here’s some yaml you can drop into a dashboard that creates a virtual remote. Not very pretty, but shows the functionality.

# Example Lovelace card for JVC Projector virtual remote
# Copy this to your dashboard configuration
#
# Requires: button-card from HACS (optional, for better styling)
# Basic version uses standard HA buttons

type: vertical-stack
cards:
  # Power row
  - type: horizontal-stack
    cards:
      - type: button
        name: "On"
        icon: mdi:power
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: "on"
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "Standby"
        icon: mdi:power-standby
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: standby
          target:
            entity_id: remote.jvc_projector

  # Navigation pad
  - type: grid
    columns: 3
    square: true
    cards:
      - type: button
        name: ""
        icon: mdi:menu
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: menu
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:chevron-up
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: up
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:information-outline
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: info
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:chevron-left
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: left
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "OK"
        icon: mdi:checkbox-blank-circle-outline
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: ok
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:chevron-right
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: right
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:keyboard-backspace
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: back
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:chevron-down
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: down
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: ""
        icon: mdi:eye-off-outline
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: hide
          target:
            entity_id: remote.jvc_projector

  # Quick access row
  - type: horizontal-stack
    cards:
      - type: button
        name: "Input"
        icon: mdi:import
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: input
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "Picture"
        icon: mdi:image-filter-hdr
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: picture_mode
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "Lens"
        icon: mdi:camera-iris
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: lens_control
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "MPC"
        icon: mdi:tune
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: mpc
          target:
            entity_id: remote.jvc_projector

  # Input selection row
  - type: horizontal-stack
    cards:
      - type: button
        name: "HDMI 1"
        icon: mdi:video-input-hdmi
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: hdmi_1
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "HDMI 2"
        icon: mdi:video-input-hdmi
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: hdmi_2
          target:
            entity_id: remote.jvc_projector

  # Memory presets
  - type: horizontal-stack
    cards:
      - type: button
        name: "Mode 1"
        icon: mdi:numeric-1-box
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: mode_1
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "Mode 2"
        icon: mdi:numeric-2-box
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: mode_2
          target:
            entity_id: remote.jvc_projector
      - type: button
        name: "Mode 3"
        icon: mdi:numeric-3-box
        tap_action:
          action: call-service
          service: remote.send_command
          data:
            command: mode_3
          target:
            entity_id: remote.jvc_projector