Make a Z-wave to WiFi bridge with esphome stream server and Zooz ZAC93 GPIO

I use this daily, it works perfectly and has for many months. There are instructions that I followed that allowed me to include the Zooz dongle in as a secondary controller, and ultimately transfer this new dongle to become the primary. It required a bit of work to get it to use the node ID 1 (maybe it was 0?). But has been rock solid.

Can you explain a bit more? This is my first zwave dongle so am not familiar with NVM restore and firmware updates.

I assume since this will be my first z wave device, I don’t really have to worry about restoring from an older dongle?

How do you update the firmware on the module without a Pi? esphome or it can be done with the zwave integration?

The HA Documation for zwave says the 800 series long range is not supported, what does this mean exactly with this esp version.

Did you do this by connecting the ZAC93 with a USB-TTY and your older Zooz USB dongle into the same PC and do the include/exclude controller, controller shift, virtual devices to force node id dance in Simplicity Studio I’ve read about?

zwavejs can upgrade controller fw directly

1 Like

We got a Zooz ZAC93 the other day, and decided to set this up last night to replace the Zooz ZST10. The ZST10 worked fine since we got it ~1.5 years ago, but it had to be connected directly to the Home Assistant device, which limited where that device could live physically in the house.

I flashed ESPHome onto an ESP32, set the configuration as described in the first post, connected the ZAC93 with some dupont cables (making sure to reverse RX/TX), changed the “Serial Port” in Z-Wave JS UI to tcp://<zac93-hostname>:6638, and it connected!

I spent maybe ~30 minutes trying to figure out how to transfer devices from the old controller to the new one. Landed on a YouTube video by @cornellrwilliams that looked promising (and straight-forward) only to find that you can only use the Z-Wave Controller in Simplicity Studio on Windows devices.

In the end I excluded all the devices from the old controller, and included them into the new one. We only have 7 devices. So, it only took 15-20 minutes. A minor improvement is that the old network had phantom nodes we couldn’t get rid of, but the new network doesn’t have those. They were likely from some bad pairing. A nice surprise is that all of the devices included on the first try each time. Another good thing is that all of the devices that support S2 use it with the ZAC93, whereas some of the S2 devices never used it with the ZST10.

So far, it’s been solid. Devices show up in Home Assistant, as expected. Pings work, as expected. We got rid of this need to have a USB dongle hanging off of a USB hub (because of “network interference”). And best of all, we can move the Home Assistant device elsewhere!

tl;dr; This project still works as of January 2024.

1 Like

Also, thanks @peterxian for sharing the original post! This was a simple project to put together and has worked really well so far.

1 Like

Just as an FYI for anyone else that comes across this thread/post, you can connect the ZAC93 to a Windows PC running Simplicity Studio by using a USB-TTL device. I used an Adafruit USB to TTL Serial Cable (but any USB-TTL should work) to complete the steps in the above mentioned video and successfully migrated from a ZST10-700 to a ZAC93 this month.

2 Likes

Thanks to everyone in this thread I was able to migrate my old Zwave Nortek USB Husbzb-1 to the POE Zwave from tubezb using the zooz ZAC93. I did have to migrate using simplicity studio using the video linked above, which was a bit of a pain in order to migrate. Most of my challenge was the old husbzb not allowing me to add virtual devices. I had to add the virtual devices to the ZAC93 up to 231, then add the husbzb back as 232 to then swap the ZAC93 back in a node 1 again.

Once the ZAC93 was node 1 again, the “virtual devices” were no longer seen as virtual devices but just failed nodes. I did not remove the failed virtual devices using Simplicity Stuido since it takes a while to remove each failed node manually. I added it back to ZwavejsUI waited a long while for it to finish starting up (it seemed to try to contact each failed node 3 times) then used the remove failed to automatically remove all of them for me. It probably took longer this way, but was much less manual work.

I used the Adafruit USB to TTL serial cable mentioned by @wwwryan - the wiring was pretty straight forward, it does say 3.3v on the zooz ZAC93 and 5v on the cable, but it worked just fine. The Rx/Tx needed to be swapped for me to be able to see it in simplicity studio, I think that is due to rx in and tx out. Once it was wired correctly Simplicity Studio was able to automatically find and install the drivers.

In Simplicity Studio I initially was not able to see the husbzb usb stick, I had to manually install the drivers as described here: Nortec HUSBZB USB Stick Windows Drivers - #3 by kraig109 - 🛎️ Get Help - Hubitat

1 Like

Are people using the esp based bridge to the zac93 as their main / one and only z wave controller?

I have this setup and it “works” (I’ve been able to upgrade the zac93 to version 1.2). The thing is, I just purchased 2x kwikset home connect 620 door locks and I can’t get them to pair with the controller. The locks are s2 capable and so is the zac93.

Ive tried smart start and also manually adding the node which requires the confirmation pin. Smart start doesn’t seem to work at all and manually adding the locks ends up with “unknown manufacturer and product” which exposes no locking entities, only z wave Info elentities.

I am at a loss. If it were only 1 lock doing it, I could blame a faulty lock but, I don’t think both locks are bad and are failing in the exact same way. The only thing I can think of is it’s the zac93 or the esp bridge but, that makes no sense because I did 2 firmware upgrades using the esp bridge.

Any insight would be great, I have my own post about this issue with more details and some logs at:

Any idea what I am doing wrong. I have installed the firmware using ESPHome and I can ping the ip address issued. But the Z-Wave JS can’t open the port (6638).

2024-11-12T23:13:05.415Z DRIVER   version 13.10.3
2024-11-12T23:13:05.415Z DRIVER   
2024-11-12T23:13:05.415Z DRIVER   starting driver...
2024-11-12T23:13:05.415Z DRIVER   opening serial port tcp://192.168.123.190:6638
2024-11-12T23:13:15.906Z DRIVER   Failed to open the serial port: connect ECONNREFUSED 192.168.123.190:6638
2024-11-12T23:13:15.907Z DRIVER   destroying driver instance...
2024-11-12 18:13:15.908 INFO STORE: Restarting client in 15 seconds, retry 17
2024-11-12T23:13:15.908Z DRIVER   driver instance destroyed
2024-11-12 18:13:30.911 INFO STORE: Client closed
2024-11-12 18:13:30.916 INFO STORE: Connecting to tcp://192.168.123.190:6638
2024-11-12 18:13:30.916 INFO STORE: Setting user callbacks
****************************************************************
This is the jac93lr32.yaml:

esphome:
  name: jac93lr32
  friendly_name: jac93lr32

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:
  hardware_uart: UART1

uart:
  id: uart_zwave
  tx_pin: GPIO1
  rx_pin: GPIO3
  baud_rate: 115200

external_components:
  - source: github://oxan/esphome-stream-server

stream_server:
  id: zac93
  uart_id: uart_zwave
  port: 6638

binary_sensor:
  - platform: stream_server
    connected:
      name: Connected

# Enable Home Assistant API
api:
  encryption:
    key: "removed"

ota:
  - platform: esphome
    password: "removed"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Jac93Lr32 Fallback Hotspot"
    password: "28SmTUn2ImxN"

captive_portal:

Any help would be appreciated. Thanks

Are you using an esp as the z wave controller host?

Connection refused is usually an unopen port.

Yes ESP32 Wroom-32
Used ESPHome to set up.
Open port on ESP32 device? I assume not router…
Never had to do that.
I can ping from network so know it’s connected to WiFi.

So you have a TCP serial2net server setup on the esp32 right?

Please explain how you’re setup. Do you have a zooz zac93 connected to an esp32 over UART?

It should work, although I am using esp-idf framework instead of arduino but it should be fine. Presumably you are using Z-Wave JS UI to enter the tcp:// location of the Z-wave adapter.

Assuming you’ve discovered the device in HA, maybe add these sensors to your esphome config so you can check that you have sufficient signal and are trying to connect to the right IP address:

sensor:
  - platform: wifi_signal
    name: WiFi Signal
    update_interval: 60s

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "IP Address"

[Baudneo]
Yes, Sorry should have stated that. I have a Zooz Zac93LR connected exactly like the instructions above. Tx-Rx reversed. 3.3vdc. I have even programmed a second ESP32-WROOM-32 with the same results.
I can see the router has issued an Ip address and can ping it. But the device does not show up in Z-Wave-JS.

[peterxian] I did add the wifi lines above, saved and installed. Installation when well without errors.

Getting this error when opening Z-Wave-JS:
Driver: Failed to open the serial port: connect ECONNREFUSED 192.168.123.190:6638 (ZW0100)

Note: I had to generate to 6 security keys in Z-Wave-JS. Should they show up from the device is it correct to generate them?

Are the ips on the same lan? No inter-vlan traffic or anything special about your network? This seems to me to be a network error.

I’m guessing from the IP that there is some VLAN stuff, check your firewall logs for reject/deny to your esp IP. If using pfsense or opnsense, make sure your logging is turned on in your firewall rules.

IIRC, it is correct to generate keys, if you dont, zwave js will at some point.

Thanks for all the replies. I have been able to get this connected but for short periods then it disconnects. I decided to program Tasmota32 on it and all went well. It is detected quickly, assigned the same ip address of course. I can remove power and repower with not issues. Rock solid. So the device and my network (ubiquiti-unifi) does not seem to be the issue. Something I am doing with the .Yaml I assume or other setup I am doing wrong.
The .yaml verifies without errors. But not sure how much is really verified except formatting.

Clean the build files for that device in esphome dash and try again is all I can think of, it’s been rock solid for me using an esp32-c3 super mini.

If youve changed frameworks from arduino to esp-idf, you will want to flash using cable to rule out any other issues.

Thanks. I have done that several time on both of these ESP32 Wroom-32. So I don’t have the ESP32-C3 mini but just ordered some. I have just programmed an ESP32-S3-Wroom-1. I am not getting the WIFI issues so have a solid connection now. But still have the " Not connecting to z-wave driver" issue.
Getting MQTT data and this is an error reported for the z-wave driver…
ERROR:
{“data”:[{“message”:“Failed to initialize the driver: ZWaveError: Timeout while waiting for an ACK from the controller (ZW0200)\n at Driver.sendMessage (/opt/node_modules/zwave-js/src/lib/driver/Driver.ts:5907:23)\n at ZWaveController.queryCapabilities (/opt/node_modules/zwave-js/src/lib/controller/Controller.ts:1144:37)\n at Driver.initializeControllerAndNodes (/opt/node_modules/zwave-js/src/lib/driver/Driver.ts:1537:46)\n at Immediate. (/opt/node_modules/zwave-js/src/lib/driver/Driver.ts:1338:16) (ZW0100)”,“code”:100}]}

Don’t see what I am doing wrong so may have a bad Zooz jak93 board.

I haven’t tried this, but I would hook the zooz UART up to a usb to TTL converter and open a serial terminal like minicom or Picocom on your computer and see if it sends any data on boot.

So

Computer ↔ USB to TTL ↔ zooz zac93