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.