Problems with Z-Wave inclusion with Zooz ZST39 800 LR and Z-Wave-JS-UI Add-on

I have got a z-wave setup of about 50+ devices that I have successfully setup and used with the VeraSecure controller from VeraControl (currently part of Ezlo). Recently I decided to migrate to Home Assistant with a Z-Wave stick as they have EOLed that controller and no longer support newer devices that I was planning to procure for my home.

I am using a Zooz ZST39 800 LR with the Z-Wave JS UI Add-on on Home Assistant, and my initial experience was pretty good when I was adding my devices one by one. However after approximately 10 or so devices were added, the inclusion process became very flaky and inconsistent. Basically I would go through the steps of (a) start inclusion on zwave-js-ui and (b) do device specific inclusion step on the device I am adding; and wait. The inclusion process would timeout most of the time. Repeated attempts may succeed sometime; and sometimes I would restart the add-on and the device would show up.

I came across the topic from @mike15 regarding his problems with inclusion: Why is Z-wave inclusion so @#$* hard?. I can confirm that I have experienced everything that Mike has noted in his “Method A” process of inclusion. I haven’t used SmartStart - so cannot comment on that. I added several devices going through these flaky inconsistent process and also called on Zooz customer support for help for some devices that I thought were not being added due to a problem with the device.

After some trial and error, I found that if I restarted z-wave-js-ui after every inclusion attempt, the device that I tried to add would show up after the restart. I reviewed the logs and can confirm that the z-wave driver does get the inclusion message when I do the inclusion steps on the device but z-wave-js-ui does not seem to receive it and times out. The zwave-js logs show that it received a message from the device and “handled” it (see below)

2024-11-19T03:23:29.165Z CNTRLR   Starting inclusion process with strategy Default...
2024-11-19T03:23:29.166Z DRIVER   one or more queues busy
2024-11-19T03:23:29.169Z SERIAL » 0x0105004ac12a5b                                                     (7 bytes)
2024-11-19T03:23:29.169Z DRIVER » [REQ] [AddNodeToNetwork]
                                    node type:    Any
                                    high power:   true
                                    network wide: true
                                    callback id:  42
2024-11-19T03:23:29.172Z SERIAL « [ACK]                                                                   (0x06)
2024-11-19T03:23:29.176Z SERIAL « 0x0108004a2a0100000096                                              (10 bytes)
2024-11-19T03:23:29.176Z SERIAL » [ACK]                                                                   (0x06)
2024-11-19T03:23:29.178Z DRIVER « [REQ] [AddNodeToNetwork]
                                    status:      Ready
                                    callback id: 42
2024-11-19T03:23:29.180Z CNTRLR   The controller is now ready to add nodes
2024-11-19T03:23:29.183Z DRIVER   all queues idle
2024-11-19T03:23:31.220Z SERIAL « 0x0108004a2a0200000095                                              (10 bytes)
2024-11-19T03:23:31.221Z SERIAL » [ACK]                                                                   (0x06)
2024-11-19T03:23:31.221Z DRIVER « [REQ] [AddNodeToNetwork]
                                    status:      NodeFound
                                    callback id: 42
2024-11-19T03:23:31.222Z DRIVER   handling request AddNodeToNetwork (74)
2024-11-19T03:23:31.222Z DRIVER     1 handler registered!
2024-11-19T03:23:31.222Z DRIVER     invoking handler #0
2024-11-19T03:23:31.223Z CNTRLR   handling add node request (status = NodeFound)
2024-11-19T03:23:31.400Z SERIAL « 0x011c004a2a030046140410015e2585598672555a735b9f6c702c2b227a6f      (30 bytes)
2024-11-19T03:23:31.401Z SERIAL » [ACK]                                                                   (0x06)
2024-11-19T03:23:31.401Z DRIVER « [REQ] [AddNodeToNetwork]
                                    status:      AddingSlave
                                    callback id: 42
2024-11-19T03:23:31.402Z DRIVER   handling request AddNodeToNetwork (74)
2024-11-19T03:23:31.402Z DRIVER     1 handler registered!
2024-11-19T03:23:31.402Z DRIVER     invoking handler #0
2024-11-19T03:23:31.402Z CNTRLR   handling add node request (status = AddingSlave)
2024-11-19T03:23:31.405Z DRIVER       the message was handled
2024-11-19T03:23:36.115Z DRIVER   one or more queues busy
2024-11-19T03:23:36.117Z SERIAL » 0x0103003bc7                                                         (5 bytes)
2024-11-19T03:23:36.117Z DRIVER » [REQ] [GetBackgroundRSSI]
2024-11-19T03:23:36.121Z SERIAL « [ACK]                                                                   (0x06)
2024-11-19T03:23:36.122Z SERIAL « 0x0107013b9c919199c7                                                 (9 bytes)
2024-11-19T03:23:36.122Z SERIAL » [ACK]                                                                   (0x06)
2024-11-19T03:23:36.123Z DRIVER « [RES] [GetBackgroundRSSI]
                                    channel 0: -100 dBm
                                    channel 1: -111 dBm
                                    channel 2: -111 dBm
                                    channel 3: -103 dBm
2024-11-19T03:23:36.124Z DRIVER   all queues idle
2024-11-19T03:23:59.166Z CNTRLR   stopping inclusion process...
2024-11-19T03:23:59.167Z DRIVER   one or more queues busy
2024-11-19T03:23:59.169Z SERIAL » 0x0105004ac52b5e                                                     (7 bytes)

But the z-wave-js-ui logs do not seem to register it at all and eventually times out. zwave-js-ui logs are in PST.

2024-11-18 19:22:38.689 INFO STORE: ^[[0mGET /health/zwave ^[[36m301^[[0m 0.461 ms - 162^[[0m
2024-11-18 19:23:01.632 INFO STORE: [Node 039] Value notification: 91-0-scene-001 0
2024-11-18 19:23:01.952 INFO STORE: [Node 038] Value updated: 37-0-currentValue true => false
2024-11-18 19:23:02.017 INFO STORE: [Node 038] Value notification: 91-0-scene-002 0
2024-11-18 19:23:02.553 INFO STORE: [Node 039] Value updated: 38-0-currentValue 0 => 99
2024-11-18 19:23:02.625 INFO STORE: [Node 039] Value updated: 38-0-currentValue 99 => 99
2024-11-18 19:23:02.705 INFO STORE: [Node 039] Value updated: 38-0-currentValue 99 => 99
2024-11-18 19:23:05.597 INFO STORE: [Node 039] Value updated: 38-0-currentValue 99 => 99
2024-11-18 19:23:08.728 INFO STORE: ^[[0mGET /health/zwave ^[[36m301^[[0m 0.414 ms - 162^[[0m
2024-11-18 19:23:17.504 INFO STORE: [Node 039] Value updated: 38-0-currentValue 99 => 99
2024-11-18 19:23:17.567 INFO STORE: [Node 039] Value notification: 91-0-scene-001 0
2024-11-18 19:23:19.360 INFO STORE: [Node 023] Value updated: 38-0-currentValue 1 => 1
2024-11-18 19:23:19.381 INFO STORE: [Node 025] Value notification: 91-0-scene-001 0
2024-11-18 19:23:19.421 INFO STORE: [Node 025] Value updated: 38-0-currentValue 0 => 1
2024-11-18 19:23:19.457 INFO STORE: [Node 023] Value notification: 91-0-scene-001 0
2024-11-18 19:23:21.366 INFO STORE: [Node 023] Value notification: 91-0-scene-001 2
2024-11-18 19:23:22.828 INFO STORE: ^[[0mGET /assets/MissingKeysAlert-Br5ZG6FO.js ^[[36m304^[[0m 0.573 ms - -^[[0m
2024-11-18 19:23:22.956 INFO STORE: [Node 023] Value updated: 38-0-currentValue 1 => 53
2024-11-18 19:23:22.974 INFO STORE: [Node 023] Value notification: 91-0-scene-001 1
2024-11-18 19:23:29.161 DEBUG STORE: Event ZWAVE_API emitted to 3AAmOr-y8iDSEeSOAAAD
2024-11-18 19:23:29.163 INFO STORE: Calling api startInclusion with args: [ 0, { forceSecurity: true, name: '', location: '' }, [length]: 2 ]
2024-11-18 19:23:29.181 INFO STORE: Controller status: Secure inclusion started
2024-11-18 19:23:29.182 INFO STORE: Success zwave api call startInclusion true
2024-11-18 19:23:38.760 INFO STORE: ^[[0mGET /health/zwave ^[[36m301^[[0m 0.531 ms - 162^[[0m
2024-11-18 19:23:59.178 INFO STORE: Controller status: Inclusion stopped
2024-11-18 19:24:08.790 INFO STORE: ^[[0mGET /health/zwave ^[[36m301^[[0m 0.363 ms - 162^[[0m

So it seems to me that there is some issue with the communication from the zwave-js driver to the zwave-js-ui frontend. Not sure if that is a problem with the Zooz stick or with the software. But I am wondering if this is something that others have experienced as well and are there ways to fix it? Is there a way to confirm this is a bug, and how to report it?

Below are some additional details and context of my system.

  • I am running HAOS 13.2 with Z-Wave JS UI add-on 3.17.0 (zui: 9.26.0, zwave-js 13.10.3)
  • System runs on a VM on a Proxmox VE server. PVE server is on an old Intel i7 laptop.
  • I have upgraded firmware on the ZST39 to v1.50.
  • I increased the inclusion timeout to 120 seconds and have added several devices after that. It helped with some of the devices, but most still ended up with a timeout requiring me to restart the add-on.
  • Adding all of my 50+ devices to VeraSecure controller has worked seamlessly in the past. So I don’t suspect that the Z-Wave protocol itself is a problem here. It seems the issue is with the zwave hardware or software or combination.
  • When I started facing the inclusion issues on ZST39 and HA, I tried adding those same devices to my old VeraSecure controller and they worked fine - effectively confirming the devices themselves are not faulty.
  • My zwave-js logs do not show any noisy or faulty node that may be clogging up the queues.
  • The zwave network appears to be stable after a few days after the devices have been included and almost all nodes appear to operate well. So the problem appears to only be related to Inclusion.
  • I am using a 9 ft USB 3.0 extension cord for the stick to keep it away from the cabinet where all my wifi and av equipment are located. I had used a 3ft cable previously with the stick located within the cabinet, but I faced several connectivity issues and lot more dead nodes than with the 9 ft cable. So it seems like the cable is not necessarily the problem.
  • The devices added are various switches and dimmers, outdoor plugs, motorized shades, open-close and tilt sensors from manufacturers such as GE (Jasco), Minoston, Zooz, Somfy, Inovelli, Leviton and Aeotec. I initially thought that some of the older devices may be flaky and causing the problem but testing again with my VeraSecure controller seems to exonerate them.

I still have a series of new devices that I have to add to my network. While the restart-after-every-inclusion-attempt workaround seems to work, I would really like to know if there is a solution for this, or an understanding that this is a bug and would eventually get fixed. Does this look like an issue with z-wave-js or z-wave-js-ui; or maybe the ZST39 z-wave stick? Should I be looking at procuring a different stick? Any feedback would help.

I’ve been using ZUI for years now (since before the name change) with an older Zooz stick (zst10) and have had minimal problems with inclusion. Once in a while a device adds but stays “unknown” which is probably an interview vs sleep race condition and happens maybe 10% of the time on battery devices, and I find excluding / re-including the easiest fix.

I try to include devices in the location where they will be used so they get proper route information to begin with, rather than moving them and having to wait or rebuild routes. Also I always use ZUI’s inclusion workflow, never the HA integration.

I suspect the main driver of my success is that I never add devices with security unless they explicitly require it (e.g. locks or alarm panels) by selecting “no security” during the inclusion process. It speeds up the process and — in my opinion — security has very little value-add to most devices. If you must use security, remember to never, ever use S0. It’s not “next best” security, it actually makes things worse and is only there for legacy compatibility.