Issues with zwave-server-js and ZooZ 800 GPIO Module

I’m trying to get this ZooZ 800 GPIO module working with my Raspberry Pi 4 and Home Assistant (or more specifically Z-Wave JS). I think I set things up right. I disabled Bluetooth and enabled UART in config.txt and uninstalled the Bluetooth userspace stuff, but when I try to fire up the server I get the following:

18:21:33.155 DRIVER   ███████╗ ██╗    ██╗  █████╗  ██╗   ██╗ ███████╗             ██╗ ███████╗
                      ╚══███╔╝ ██║    ██║ ██╔══██╗ ██║   ██║ ██╔════╝             ██║ ██╔════╝
                        ███╔╝  ██║ █╗ ██║ ███████║ ██║   ██║ █████╗   █████╗      ██║ ███████╗
                       ███╔╝   ██║███╗██║ ██╔══██║ ╚██╗ ██╔╝ ██╔══╝   ╚════╝ ██   ██║ ╚════██║
                      ███████╗ ╚███╔███╔╝ ██║  ██║  ╚████╔╝  ███████╗        ╚█████╔╝ ███████║
                      ╚══════╝  ╚══╝╚══╝  ╚═╝  ╚═╝   ╚═══╝   ╚══════╝         ╚════╝  ╚══════╝
18:21:33.162 DRIVER   version 10.3.0
18:21:33.163 DRIVER   
18:21:33.165 DRIVER   starting driver...
18:21:33.191 DRIVER   opening serial port /dev/ttyAMA0
18:21:33.219 DRIVER   serial port opened
18:21:33.221 SERIAL » [NAK]                                                                   (0x15)
18:21:33.230 DRIVER   loading configuration...
18:21:33.237 CONFIG   version 10.3.0
18:21:34.971 DRIVER   beginning interview...
18:21:34.974 DRIVER   added request handler for AddNodeToNetwork (0x4a)...
                      1 registered
18:21:34.976 DRIVER   added request handler for RemoveNodeFromNetwork (0x4b)...
                      1 registered
18:21:34.977 DRIVER   added request handler for ReplaceFailedNode (0x63)...
                      1 registered
18:21:34.979 CNTRLR   querying controller IDs...
18:21:35.085 SERIAL » 0x01030020dc                                                         (5 bytes)
18:21:35.089 DRIVER » [REQ] [GetControllerId]
18:21:36.108 CNTRLR   Failed to execute controller command after 1/3 attempts. Scheduling next try i
                      n 100 ms.
18:21:36.214 SERIAL » 0x01030020dc                                                         (5 bytes)
18:21:36.217 DRIVER » [REQ] [GetControllerId]
18:21:37.226 CNTRLR   Failed to execute controller command after 2/3 attempts. Scheduling next try i
                      n 1100 ms.
18:21:38.332 SERIAL » 0x01030020dc                                                         (5 bytes)
18:21:38.336 DRIVER » [REQ] [GetControllerId]
18:21:39.364 DRIVER   Failed to initialize the driver: ZWaveError: Timeout while waiting for an ACK 
                      from the controller (ZW0200)
                          at Driver.sendMessage (/home/homeassistant/git/zwave-js-server/node_module
                      s/zwave-js/src/lib/driver/Driver.ts:3990:23)
                          at ZWaveController.identify (/home/homeassistant/git/zwave-js-server/node_
                      modules/zwave-js/src/lib/controller/Controller.ts:713:33)
                          at Driver.initializeControllerAndNodes (/home/homeassistant/git/zwave-js-s
                      erver/node_modules/zwave-js/src/lib/driver/Driver.ts:1208:26)
                          at Immediate.<anonymous> (/home/homeassistant/git/zwave-js-server/node_mod
                      ules/zwave-js/src/lib/driver/Driver.ts:1015:16)
Error in driver ZWaveError: Failed to initialize the driver: ZWaveError: Timeout while waiting for an ACK from the controller (ZW0200)
    at Driver.sendMessage (/home/homeassistant/git/zwave-js-server/node_modules/zwave-js/src/lib/driver/Driver.ts:3990:23)
    at ZWaveController.identify (/home/homeassistant/git/zwave-js-server/node_modules/zwave-js/src/lib/controller/Controller.ts:713:33)
    at Driver.initializeControllerAndNodes (/home/homeassistant/git/zwave-js-server/node_modules/zwave-js/src/lib/driver/Driver.ts:1208:26)
    at Immediate.<anonymous> (/home/homeassistant/git/zwave-js-server/node_modules/zwave-js/src/lib/driver/Driver.ts:1015:16) (ZW0100)
    at Immediate.<anonymous> (/home/homeassistant/git/zwave-js-server/node_modules/zwave-js/src/lib/driver/Driver.ts:1032:6)
    at processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 100,
  context: undefined,
  transactionSource: undefined
}
Shutting down
18:21:39.375 DRIVER   destroying driver instance...
18:21:39.378 DRIVER   driver instance destroyed

Curious if anyone has any ideas?

My /boot/firmware/config.txt has the following:

# Disable Bluetooth
dtoverlay=disable-bt
enable_uart=1

This is on a Raspberry Pi 4 running Ubuntu 22.04 (standalone Home Assistant) with zwave-js-server built from git.

Can you try the following:

sudo systemctl disable hciuart

That should disable the service that tries to call the Bluetooth module of the Pi.
Can you verify your device is actually showing up?

ls -l /dev/serial/by-id/

Thanks Rick!

Sure can!

tim@auto:~$ sudo systemctl disable hciuart
Failed to disable unit: Unit file hciuart.service does not exist.
tim@auto:~$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 Jan  9 21:45 usb-0658_0200-if00 -> ../../ttyACM0
lrwxrwxrwx 1 root root 13 Nov  7 09:59 usb-FTDI_FT231X_USB_UART_DN01DU7F-if00-port0 -> ../../ttyUSB0
tim@auto:~$ 

The service not existing makes sense as I followed instructions here to try and completely disable BT.

The other USB devices are my current Aeotec Z-Wave stick and a software radio (for picking up our 433MHz Acurite data) but the tests I did previous were without either of these connected. I looked at /dev/serial/by-id/ before while troubleshooting and have never been able to get the Zooz board to show up here (it’s connected to the first 10 pins).

The GPIO is always /dev/ttyAMA0, the recommendations for the /dev/serial/by-id paths are only applicable to USB devices.

Is the user running the application part of the dialout group or root, and have permission to access the device?

Running zwave-js-server yourself is discouraged and a rarity, you won’t get much help with that. I’d suggest running the Docker or package (single binary, arm64 or amd64 only for now) version of ZWave-JS UI to eliminate your installation method as a possible problem.

You could try contacting Zooz for help. They say they won’t help you troubleshoot the home automation software, but maybe they can provide some advice with the Pi install itself. Maybe they have a way of confirming if it’s working properly.

https://www.support.getzooz.com/kb/article/1215-zac93-800-gpio-module-installation-guide/

Whoa you can run a single binary of zwave-js-server now!? That sounds excellent!

Currently I run it as a service as the homeassistant user (and yep they are a member of dialout) via this systemctl:

[Unit]
Description=ZWave-JS
Wants=network-online.target
After=network-online.target

[Service]
User=homeassistant
Group=homeassistant
WorkingDirectory=/home/homeassistant/git/zwave-js-server
ExecStart=ts-node src/bin/server.ts /dev/ttyUSB.ZWave
#ExecStart=ts-node src/bin/server.ts /dev/ttyAMA0


[Install]
WantedBy=multi-user.target

Anyways the test I shared earlier was just so I could more easily see the output since journalctl was covering some of that up it seemed. I run into the same issue running it as homeassistant or root directly. /dev/ttyAMA0 exists though it seems to always exist whether or not I have the module attached. My rough conclusion is that the board might be bad.

Just in case I tried to see if I could pair it as a secondary controller since Zooz says you can do that and I also wasn’t able to pair it. I don’t think that would require Pi integration since it would just be talking over Z-Wave which kinda makes me think it might be busted.

Z-Wave JS UI has always had amd64 binaries, arm64 are new. I’m suggesting you try that software instead, to exclude your custom environment from being a factor. Probably not the issue, but worth trying. Running zwave-js-server directly like you are is not recommended.

Z-Wave JS doesn’t support secondary controllers, were you trying something else? The controller won’t function without host software controlling it.

Ah gotcha. I’ll look into that. ZWJS works really well so quite surprised it’s not recommended. I’ve been using HA since Open-ZWave or whatever it was so I’ve been through the migration gauntlet several times. ZWJS is definitely the best of them all so far and once I was able to get it setup (if memory serves I think you might have actually helped me with that!) it’s been quite good! I can even get switch states from switches (so if I turn a light on by hand, HA knows it). That wasn’t always the case and has been pretty fantastic.

Either way I’ll check out ZWUI to see. Indeed I don’t expect it will work though good not about the controllers. I was indeed trying to pair it as a second controller. Now that I know that doesn’t work, that’s one less thing to worry about for troubleshooting.

Running zwave-js-server itself is not recommended (esp. with how you’re using it with ts-node). It’s really for developers to package in their own application. You can to it, it’s just not supported.

Z-Wave JS UI is one of those applications that embeds zwave-js-server, and is meant for end users. They all use Z-Wave JS (the driver) under the hood. There’s no difference from the HA perspective.

oh AHA! Ok, thanks for the info! That makes tons of sense. Yep I’ll look at switching over to the correct way then ASAP, thank you again!

Even though I had done most of these steps before, after talking with Zooz support, they recommended the following:

Disable bluetooth by adding dtoverlay=disable-bt to your /boot/firmware/config.txt

Remove bluetooth (and wpasupplicant):

    sudo systemctl disable hciuart
    sudo systemctl disable [email protected]
    sudo systemctl mask [email protected]
    sudo apt purge bluez bluez-firmware wpasupplicant
    sudo apt-get autoremove

I had already removed bluzed and hciuart so I suspect the systemctl mask and/or removing wpasupplicant is what caused it to start working. After these changes, reboot.

I connect my HA Pi directly to wired ethernet but I’m not sure if removing wpasupplicant would break wifi or not.

Anyways, now zwave-js-server happily talks to the controller and it shows up in HA. From what I understand, I cannot migrate my device config from my Aeotec stick to the Zooz so I haven’t tried any Z-wave devices yet since I’ll have to repair lots of devices and need to have a plan of attack before I do that, but otherwise the controller works!

You can transfer the z-wave network from the Aeotec Gen5 to the Zooz 700 using Z-Wave JS UI (NVM backup and store), as long as the Gen5 is on version 1.2 (1.02). There is a firmware upgrade for certain Gen5s on the Aeotec support site.

I read that, but I don’t think it is Gen 5? Or hmm maybe it is but I’d be wildly surprised if it’s the latest firmware but this is also an 800 series (not 700) and I didn’t see any 800-specific info. I knew going in I might have to hard migrate. I was actually going to try to run both (multiple z-wave servers on different ports) and just move things over that way.

Turns out, when I fired up ZWJS with the 800 series and then switched back to the stick, something changed which caused HA to loose all of my named overrides, whoops. Devices and Entities are these but they have generic names now. No idea what caused that. I’m taking it as a sign. Some of my telemetry from my devices was funky anyway. Doing a refresh seems to have fixed it but this lets me make sure every device is properly reporting watts and things.

Fairly tedious but I’ve only had to do this once before so maybe it was time. The hidden in-wall switches won’t be super fun but I only have a few of those (I prefer those to the wall switches, many which, like the GE’s, that have the incredibly bright blue LED you can’t turn off).

Sorry, I forgot where I was for a second. Restore to 800 is not supported yet.

No problem! This ended up being a good thing since I also switched over to Z-Wave JS UI and it’s quite fantastic! I missed Open Z-Wave Control Panel but this is better in every way. It’s great!

I’m having some performance issues with the ZAC93 controller I need to dig into but I think as far as the original problem, it’s solved (with upgrades!)

Updating this so maybe other folks see it, though I don’t have a good solution. The Zooz 800 GPIO module, at least mine, seems to have the same issues folks reporting with the 700-series where Z-Wave nodes would just instantaneously disappear from ZWJSUI when sending a command. Pinging the node brings it back but that can be annoying.

Though the Z-Wave 800 USB stick can be updated (on Windows), I know of no option to update the GPIO. Backup/restore also still doesn’t work.

Just a big heads up for folks using the GPIO option. I bought the 800 USB stick in hopes it might be better, but haven’t had time to do the controller ID hack trick or just re-assign everything to the USB stick yet (in part because I like hidden switches - great for making wall switches look like “normal” switches, but not great when you need to rebind devices).

FYI, you can update the controller firmware in HA (2023.3 or later) or Z-Wave JS UI (8.8.2 or later). The type of serial interface does not matter.

That assumes there is even an update for the ZAC93 yet (support site doesn’t list anything at least).

Hmm I thought I did see one for ZAC93 USB (but not the GPIO). Such a shame the product, at least for me (seems like not everyone is having the issues I am), is so hobbled. I haven’t switched back to my Gen5 stick yet because it was such an arduous process to convert my network over but having to deal with it working ~75% of the time is definitely worse than the issues I had with the Gen5 stick.

Update to this, backups still do not work with ZAC93 as far as I can tell but my Z-Wave network is now much more stable. It’s pretty rare a device disappears on use. That now happens maybe once a month vs several times a day. Not quite sure what changed there between ZWJSUI versions or if it was something else, but it’s now much much better and at this point more stable than when I was using the Gen5 stick.