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

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

My ZAC93 bricked after a firmware update. The home assistant warning that firmware before 7.22 was a big concern. Started the firmware update and then failed.

So poking around it seems I need to connect it up to a USB to TTL converter and try to reflash with my PC and simplicity studio.

I have the converter ordered.

What pins do I connect?

Looking at the home assistant documentation I see the following pins.
+5V
+3.3V
GND
SDA / GPIO2
SCL / GPIO3
TXD / GPIO14
RXD / GPIO15
GPIO4

I can figure out the +5V or maybe +3.3V and ground.
I suspect it is using TXD and RXD, but would love confirmation of this.

Pretty awful mess right now with zwave totally dead after a failed firmware update.

Thanks everyone for your help.

In most cases for a failed update you just simply need to enable “Bootloader only” mode in the Z-wave JS UI Z-Wave settings and try the upgrade again.

Thanks I got a response from Zooz to do just that:

  • Enable boot loader only mode in zwave JS ui
  • Reboot home assistant
  • Go into advanced menu in Zwave JS ui and upload the firmware again.

In the email from Zooz they recommend using simplicity studio to update… But they didn’t give a procedure for the GPIO version (ZAC93). Which I have asked for (possible future need.

Detailed instructions they gave me:
Go to Z-Wave JS UI.
Select Settings tab
Select “Z-Wave” section
Enable “Bootloader only”
I did a home assistant restart; then the controller showed up
Select Z-Wave JS UI
Control Panel tab
Hamburger menu (blue bottom right corner, is three lines until you click it and it turns into an X)
“Advanced actions” (purple wand)
Then under “General actions” selected
“Firmware update OTW” and chose the firmware file that I downloaded from your site.
This will run a long time, then restart Home Assistant.

1 Like