Flash ZHAC

ZHAC is a Zigbee hub that runs entirely on an ESP32: coordinator, device library, rules, Lua, MQTT and the web UI. Plug your board in over USB, press a button, done. This needs Chrome or Edge on a desktop computer.

Espressif ESP32-S31 Function-CoreBoard

ESP32-S31 Function-CoreBoard: the USB-UART port is the upper USB-C on the left edge, above USB-DBG

checking for a release…

One board, about $25, nothing to solder or wire: Ethernet, the Zigbee radio, a status LED and USB-C are all on it. It talks to your network over Ethernet only (the firmware does not use the chip's Wi-Fi). One flash and it is done.

  1. Connect the USB-C port labelled USB-UART on the board (the upper one in the photo, not USB-DBG) to this computer.
  2. Press Install, pick the serial port, wait about two minutes.
  3. Plug in Ethernet and open http://zhac.local. The first visit asks you to set a password.

Leave the erase box unticked and your devices, rules and settings stay: only the firmware regions are written. Updating later happens from the web UI (Settings → Update). The status LED blinks green while the join window is open and flashes blue on Zigbee traffic.

Guition JC-ESP32P4-M3-DEV (ESP32-P4 + C6)

checking for a release…

ESP32-P4 with 32 MB PSRAM and an on-module ESP32-C6 for the Zigbee radio, about $25 delivered. Also runs on other ESP32-P4 boards with an Ethernet jack. Two steps for a fresh board: install the Zigbee radio once, then install the hub itself.

Check the chip first. This build runs on ESP32-P4 silicon v0.x–v1.x only. Run esptool --port <PORT> flash-id and look for ESP32-P4 (revision v1.3). A v3.x chip will not boot it.

Use the board's CH340 USB-C port (labelled USB-TTL/UART, not the OTG ports) for both steps below.

1. Install the Zigbee radio (one time)

A fresh board's ESP32-C6 does not yet run the Zigbee firmware. This writes it over the link already wired inside the module, so there is nothing else to connect. It takes about a minute; once it has run, this board does not need it again — go straight to step 2 from now on.

2. Install the hub

Afterwards: plug in Ethernet and open http://zhac.local.

Advanced: flashing the C6 radio by wire (JP1), or updating it later

Step 1 above only works once — afterwards the C6 no longer runs the firmware it needs, so a later radio update, or recovering a board where step 1 does not work, means wiring the C6's own serial header directly instead of using the board's USB port:

  1. Hold the board's BOOT button, tap RESET, release BOOT. The P4 now waits in download mode and stops resetting the C6.
  2. Connect a 3.3 V USB-serial adapter to the C6 pins on the JP1 header: adapter TX → C6_U0RXD (JP1-20), RX → C6_U0TXD (JP1-22), GND → GND (JP1-6). Leave 3.3 V/5 V unconnected — a 5 V adapter will damage the C6.
  3. Hold C6_IO9 (JP1-24) to GND while you pulse C6_CHIP_PU (JP1-26, reset), then press the button below and pick the adapter's port.

Header labels are from the M3-DEV's own schematic; check yours before wiring. An ESP-Prog adapter (it drives the reset/boot pins itself) is more likely to work cleanly here than a plain USB-serial adapter.

Dual-chip hub — ESP32-S3 + ESP32-P4

checking for a release…

Two boards joined over SPI, with a CC2652P stick as the radio. Wiring is in the hardware guide. Flash each board separately.

ESP32-S3 (network, web UI, MQTT):

ESP32-P4 (Zigbee, rules, Lua) — silicon v0.x–v1.x only, as above:

Right after the S3 install, the installer asks for your Wi-Fi name and password and hands them to the hub over the USB cable, then links you to its web UI. This needs the board's UART port; on a board with two USB sockets, use the one marked UART. Reopen this page and press the S3 button again later to change Wi-Fi or find the hub.

If you skip that step, the S3 opens a Wi-Fi network called ZHAC-XXXX; its password is printed on the S3's serial console at boot. Join it and pick your home network.