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.
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!
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 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!
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.
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.
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?
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.
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.
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.
Great work. Changing the lens memory slots would also be a good feature. The integration works fine with the NZ500, but there seems to be a delay in the data transfer. For example, in the Home Assistant script below, changing the picture mode takes a few seconds before the NZ500 executes the IR remote control command. Unfortunately, the Logitech Harmony Elite does not have IR commands for SDR1 and SDR2 picture modes.
Hi @mjmcg and thank you for creating this integration! I have a NZ500 and so far the integration has been working well for me. I have three issues / questions that I would appreciate your insight on:
When adding the projector via the integration, all of of the diagnostic entities besides “light time” are disabled by default, as are most of the controls (all except power state, light power, and input). Please see the attached screenshot. When I try to enable them all, it seems to break the integration: all statuses become “unknown” and control of the projector via the integration stops working. Why is that? Is there something I am doing wrong, or perhaps a bug in the integration? I am running the latest JVC firmware (1.02).
I love that you added the ability to emulate remote commands. A command of particular interest to me is “hide” (aka “lens shutter”), which I would like to use in my automations as a means of putting the larger system into “standby” once turned on so that can I avoid having to wait for the long boot time of the NZ500 when starting an activity, without leaving the laser on (and consuming its finite life) when not needed. However, since the remote command merely toggles the hide state, I cannot reliably control it without knowing the present status of the hide state in the JVC. Do you know of any way to query the hide state, or some way to explicitly enable / disable hide, rather than just toggle it? I saw nothing like that in the JVC protocol docs.
Adding to the complexity of using hide in automations: when hide is enabled, all other control actions I attempt with the NZ500 via the integration result in an error. This creates both a risk of breaking automations (due to unpredictable errors), as well as a potential opportunity to infer the hide state from the rejection of other control commands. Absent some other approach, do you think that it would be possible to modify the integration to infer hide state using this method?