Every ESP32 board reaches Home Assistant through its radio, and the radio is fixed in the silicon. An ESP32-S3 talks over Wi-Fi, an ESP32-C6 or H2 can join Thread or Zigbee instead, and a plain ESP32 on Ethernet makes the best Bluetooth proxy. So we sorted this list of the best ESP32 boards for ESPHome by the path each one takes into Home Assistant, not by clock speed.
Espressif’s own DevKitC boards are out of stock on Amazon US, so we linked the maker’s own Amazon storefront wherever one sells the board. The new ESP32-S31 is in mass production, but Amazon doesn’t list it and ESPHome can’t build it by default. We checked each board against the ESPHome 2026.10.0 docs and Amazon US on October 22, 2026, and compiled the example configs without flashing hardware.
| Board | Best for | Path into Home Assistant | Chip and memory | Price band |
|---|---|---|---|---|
| Waveshare ESP32-S3-DEV-KIT-N8R8 | First ESPHome projects | Wi-Fi, ESPHome API | ESP32-S3, 8 MB PSRAM | about $20 |
| Seeed XIAO ESP32S3 | Small enclosures, battery | Wi-Fi, ESPHome API | ESP32-S3, 8 MB PSRAM | under $20 |
| Seeed XIAO ESP32C6 | Thread or Zigbee sensors | Thread, Zigbee or Wi-Fi 6 | ESP32-C6, no PSRAM | about $12 |
| Waveshare ESP32-H2-DEV-KIT-N4 | Zigbee devices that skip Wi-Fi | Thread or Zigbee only | ESP32-H2, no PSRAM | about $13 |
| M5Stack Atom Lite | One-click Bluetooth proxy | Wi-Fi, ESPHome API | ESP32, no PSRAM | about $15 |
| LILYGO T-ETH-Lite ESP32 | Wired Bluetooth proxy | Ethernet, ESPHome API | ESP32, 8 MB PSRAM | about $16 |
| Waveshare ESP32-S3-ETH with PoE module | One cable for power and data | Ethernet with PoE | ESP32-S3, 8 MB PSRAM | about $32 |
| M5Stack Atom VoiceS3R | Voice satellite | Wi-Fi, ESPHome API | ESP32-S3, 8 MB PSRAM | about $35 |
| Waveshare ESP32-P4-WIFI6-POE-ETH | Displays and cameras | Ethernet, or Wi-Fi 6 via a C6 | ESP32-P4, 32 MB PSRAM | about $35 |
| ESPHome Starter Kit by Apollo | Building without soldering | Wi-Fi or Thread | ESP32-C6 main board | $40 list, about $50 on Amazon |
Prices are bands from October 22, so check the current price before you order. Cheap boards move by a few dollars each week.
Match the radio to the path into Home Assistant
Home Assistant’s ESPHome integration talks to most boards over the ESPHome native API, which listens on TCP port 6053 by default. That covers Wi-Fi boards, Ethernet boards and Thread boards, because a Thread device gets an IPv6 address through the border router and then speaks the same API. Zigbee is the exception: an ESPHome Zigbee device joins your ZHA or Zigbee2MQTT coordinator like any other Zigbee sensor.

Pick the path first and the chip follows from it. Each chip sold today carries a fixed set of radios:
| Chip | Wi-Fi | Bluetooth | Thread / Zigbee | Framework in ESPHome |
|---|---|---|---|---|
| ESP32 (plain) | Wi-Fi 4 | Classic + BLE | No | ESP-IDF or Arduino |
| ESP32-S3 | Wi-Fi 4 | BLE 5 | No | ESP-IDF or Arduino |
| ESP32-C6 | Wi-Fi 6, 2.4 GHz | BLE 5 | Yes | ESP-IDF only |
| ESP32-H2 | None | BLE 5 | Yes | ESP-IDF only |
| ESP32-P4 | None on chip (C6 co-processor) | Via the C6 | No | ESP-IDF only |
| ESP32-S31 | Wi-Fi 6, 2.4 GHz | BT 5.4 Classic + LE | Yes | Needs ESP-IDF 6.1, not the default 5.5.6 |
Pay attention to the framework column. ESPHome now builds every ESP32 with ESP-IDF by default, and the ESP32 platform docs say the C6, H2 and P4 are not supported by the Arduino framework at all. An old YAML file that pulls in an Arduino library will build on an S3 and fail on a C6, so check your configs before you buy the newer chip.
Start on Wi-Fi with an ESP32-S3
Most ESPHome projects are a sensor or a relay on your Wi-Fi, and the ESP32-S3 is the chip we’d start with for those. It has two cores, native USB and room for 8 MB of PSRAM, which you’ll want later if the board ever drives a display or runs wake word detection. These three boards cover a bench dev kit, a thumbnail-sized module and a kit that needs no soldering at all.
Waveshare ESP32-S3-DEV-KIT-N8R8: best first board
Waveshare builds this board on the ESP32-S3-WROOM-1-N8R8 module, so you get 8 MB of flash, 8 MB of PSRAM and the standard DevKitC-1 pinout that most ESPHome examples assume. A single USB-C port goes through a CH343 serial bridge and a CH334 hub, and the chip’s native USB is routed out as well. That makes it the easiest replacement for Espressif’s own ESP32-S3-DevKitC-1, which Amazon lists as out of stock.
One setting catches new S3 owners. The ESPHome PSRAM component has no default mode on the S3, and an 8 MB module like this one needs octal mode, so add a psram: block with mode: octal or the extra memory stays switched off. Skip this board if you need Thread, Zigbee or a wired port, because the S3 has none of them.
Seeed XIAO ESP32S3: best for small enclosures
Seeed fits the same chip onto a thumbnail-sized board here: an ESP32-S3R8 with 8 MB of in-package PSRAM, 8 MB of flash and native USB-C. It adds a LiPo charger and a U.FL connector for an external antenna, and Seeed rates deep sleep at 14 uA, so it’s the S3 we’d put in a battery sensor. You give up pins in exchange, because the XIAO breaks out only 11 GPIO.
Buy it when the enclosure decides the board, such as a wall switch box or a printed sensor case. Skip it for a project with many wired sensors, where you’ll run out of pins before you run out of ideas.
ESPHome Starter Kit by Apollo: best if you’d rather not solder

The ESPHome Starter Kit is official ESPHome hardware built by Apollo Automation around an ESP32-C6-MINI-1. The main board connects to its sensor and button modules through two 14-pin flat cable ports, and you configure it in the ESPHome Device Builder’s visual editor before you ever open a YAML file. It supports Wi-Fi, BLE and Thread, and Apollo calls Zigbee possible at the chip level for advanced users.
Apollo lists it at $40, but the Amazon listing we found was about $50 from a seller named JT Tech LLC, and we could not confirm that it is Apollo’s own storefront. Buy it for a first project or for a teenager learning automations. Skip it if you already own a dev board and a bag of sensors, since you’re paying for the guided start.
Join Thread or Zigbee with an ESP32-C6 or H2
Both of these chips carry an 802.15.4 radio, so an ESPHome device can join Thread or Zigbee instead of your Wi-Fi. Thread needs a border router that Home Assistant can see, and our Thread border router guide covers which ones it can configure. Zigbee needs a coordinator running ZHA or Zigbee2MQTT, which our Zigbee coordinator picks cover.
Seeed XIAO ESP32C6: best for Thread and Zigbee
Seeed’s XIAO ESP32C6 has a 160 MHz RISC-V core plus a 20 MHz low-power core, 4 MB of flash, Wi-Fi 6 on 2.4 GHz, BLE 5 and the 802.15.4 radio, all for about the price of a sandwich. It has no PSRAM, so it’s a sensor board rather than a voice or display board. Its antenna switch is wired to pins: GPIO3 has to be driven low before GPIO14 can choose between the ceramic antenna and the U.FL connector.
We compiled this Thread config for the C6 with the same ESPHome release. It has no wifi: block, because the board reaches Home Assistant over Thread, and thread_tlv is the dataset string you copy from Home Assistant’s Thread integration:
esphome:
name: thread-sensor-hall
esp32:
variant: esp32c6
framework:
type: esp-idf
network:
enable_ipv6: true
openthread:
tlv: !secret thread_tlv
logger:
api:
encryption:
key: !secret api_key
ota:
platform: esphome
Our build finished in about two minutes on a Mac, and the summary shows how much room the board has left for sensors:
RAM: [== ] 24.0% (used 108592 bytes from 452112 bytes)
Flash: [==== ] 41.1% (used 755058 bytes from 1835008 bytes)
INFO Successfully compiled program.
For Zigbee, read the ESPHome Zigbee docs before you commit to the C6. They say the H2 seems to work more reliably, with reports of C6 boards that work only next to the coordinator. On any ESP32, running Wi-Fi alongside a Zigbee router role makes the Zigbee network unstable, so use a C6 with Wi-Fi on as a Thread device or a Zigbee end device, not a router.
Waveshare ESP32-H2-DEV-KIT-N4: best for Zigbee without Wi-Fi
Espressif’s ESP32-H2 drops Wi-Fi entirely and keeps BLE 5 and the 802.15.4 radio, on a 96 MHz RISC-V core with 4 MB of flash. Waveshare’s dev kit uses the ESP32-H2-MINI-1 module with a USB-C port behind a CH343 bridge, and it’s the chip the ESPHome Zigbee page names as the more reliable one. Pick it for a Zigbee sensor or a Thread end device that never needs your Wi-Fi password.
No Wi-Fi also means there’s no Wi-Fi provisioning step and no fallback hotspot. The board reaches Home Assistant only through a border router or a coordinator, so skip it unless one of those already runs in your house.
Wire Bluetooth proxies and PoE boards to the LAN
A Bluetooth proxy listens for BLE sensors, locks and thermometers and forwards them to Home Assistant over the ESPHome API. ESPHome’s docs recommend Ethernet for proxies, because a proxy on Wi-Fi shares one 2.4 GHz radio between both jobs, and they say Ethernet proxies can handle 4 active connection slots reliably. The web installer on esphome.io flashes a ready-made proxy with one click, but its Generic ESP32 option only works on a plain ESP32.
M5Stack Atom Lite: best one-click Bluetooth proxy
M5Stack builds the Atom Lite as a small plastic cube with an ESP32-PICO-D4 inside, 4 MB of flash, Wi-Fi 4 and Bluetooth 4.2 with BLE. Because it’s a plain ESP32, the installer’s Generic ESP32 proxy works on it from the browser, so you can have a proxy running in a room within minutes, with no YAML. It is also cheap enough to scatter one in each room where a BLE sensor sits out of range.
Skip it where the proxy has to hold several active connections at once, such as a row of BLE locks. It runs on Wi-Fi, so the radio splits its time between your network and the scan, and the default is 3 connection slots.
LILYGO T-ETH-Lite ESP32: best wired Bluetooth proxy
LILYGO pairs a plain ESP32-WROVER-E (8 MB PSRAM, 16 MB flash) with an RTL8201 Ethernet PHY, which ESPHome’s Ethernet component supports as type: RTL8201. LILYGO ships an esphome folder in the board’s GitHub repo, so you start from a pin map the maker wrote. For a proxy, that’s the combination ESPHome recommends: Ethernet for the network and a plain ESP32 for the radio.
Two caveats kept it below the Atom. The Amazon listing had a single review when we checked, and LILYGO sells the PoE shield as a separate part, so plan on a USB-C power supply unless you order the shield too. For a board that’s documented by name in the ESPHome proxy docs, the Olimex ESP32-POE-ISO is the usual choice, but it is not sold on Amazon US.
Waveshare ESP32-S3-ETH with PoE module: best PoE board

Waveshare’s S3-ETH puts an ESP32-S3R8 (8 MB PSRAM, 16 MB flash) next to a W5500 Ethernet controller on SPI, and this bundle includes the 802.3af PoE module. One cable from a PoE switch powers it and carries its traffic, which is what you want for a proxy in an attic or a garage. It also has a camera connector, though a camera on a 10/100 SPI link is a hobby project rather than a security camera.
The S3 is not a plain ESP32, so the Generic ESP32 installer does not cover it and you write the YAML yourself. We used the W5500 pins from Waveshare’s wiki and asked for 4 connection slots, as the proxy docs suggest for Ethernet. Our first esphome config run accepted the file but printed this warning:
WARNING BLE components require 4 connection slot(s) but only 3 configured. Please set 'max_connections: 4' in the 'esp32_ble' component. Components: bluetooth_proxy, bluetooth_proxy, bluetooth_proxy, bluetooth_proxy
So connection_slots alone is not enough in this release, and the BLE stack needs its own limit raised to match. We also set flash_size: 16MB to match the board, since ESPHome otherwise builds a 4 MB image. This is the config that validated without warnings and compiled:
esphome:
name: ble-proxy-garage
esp32:
variant: esp32s3
flash_size: 16MB
framework:
type: esp-idf
psram:
mode: octal
ethernet:
type: W5500
clk_pin: GPIO13
mosi_pin: GPIO11
miso_pin: GPIO12
cs_pin: GPIO14
interrupt_pin: GPIO10
reset_pin: GPIO9
logger:
api:
encryption:
key: !secret api_key
ota:
platform: esphome
esp32_ble:
max_connections: 4
esp32_ble_tracker:
bluetooth_proxy:
active: true
connection_slots: 4
The build reported RAM at 30.3% and the app partition at 11.0% full, so there’s room left for a few sensors on the same board. Skip this board if you need gigabit or a fast camera stream, because the W5500 tops out at 10/100 over SPI.
Build a voice satellite or a display node
Voice and displays are where PSRAM stops being optional. Wake word detection runs on the device through ESPHome’s micro_wake_word, the ESP32 docs point to the S3’s vector instructions as the reason it suits that job, and display buffers fill memory quickly. Keep voice and the Bluetooth proxy on separate boards, because the voice_assistant docs warn that BLE components cause issues alongside it.
M5Stack Atom VoiceS3R: best voice satellite
M5Stack packs an ESP32-S3-PICO-1-N8R8 with 8 MB of octal PSRAM, an ES8311 codec, one MEMS microphone and a 1 W speaker into the 24 mm square VoiceS3R case. M5Stack publishes a Home Assistant config that you import as a remote package from its esphome-yaml repo, and it answers to the wake word Okay Nabu. It needs a recent ESPHome release, and M5Stack’s page lists the minimum version.
It’s a single microphone without the echo cancellation chip in the Home Assistant Voice Preview Edition, which helps a satellite pick out your voice over music or a TV. The Voice Preview Edition is not sold on Amazon US. The VoiceS3R listing we found comes from a third-party seller rather than M5Stack’s own store, so check the seller name when you order.
Waveshare ESP32-P4-WIFI6-POE-ETH: best for displays and cameras
Espressif built the ESP32-P4 as a multimedia chip, with MIPI display and camera interfaces, and this board has 32 MB of PSRAM in the package, but the chip has no radio of its own. Waveshare adds an ESP32-C6 co-processor for Wi-Fi 6 and BLE over SDIO, plus a 100 Mbps Ethernet port with PoE, so the board can use either path into Home Assistant. In ESPHome, the esp32_hosted component drives that C6 link.
One setting trips people up on this board, besides the SDIO pin block for the C6. Waveshare quotes a 360 MHz clock, and ESPHome’s ESP32 docs say silicon older than revision 3.0 needs engineering_sample: true and is capped at that speed, so check your chip’s revision in the boot log. Skip the P4 for a plain sensor, where it is more board, more setup and more power than the job needs.
Wait on the ESP32-S31 for now

Espressif announced the ESP32-S31 as in mass production and on sale in July. It is a dual-core RISC-V chip that runs at up to 320 MHz. Espressif lists Wi-Fi 6, Bluetooth 5.4 with Classic and LE Audio, an 802.15.4 radio for Thread and Zigbee, and a gigabit Ethernet MAC. On paper it’s one chip that does the jobs of the S3, the C6 and a wired board. The first dev kit, the ESP32-S31-Function-CoreBoard-1, ships with 16 MB of flash, 16 MB of PSRAM and a gigabit RJ45 port.
ESPHome added an esp32s31 variant over the summer, and its docs say the chip needs a newer ESP-IDF branch than the one ESPHome uses by default, and the config validator does not catch the mismatch. A minimal S31 config passed esphome config, then the compile stopped while it set up the default framework:
INFO Installing ESP-IDF 5.5.6 framework ...
ERROR ESP-IDF tool download list - failed (returncode=1). Tail:
WARNING: Targets: "esp32s31" are not supported. Only allowed options are: esp32, esp32c2, esp32c3, esp32c5, esp32c6, esp32c61, esp32h2, esp32h21, esp32h4, esp32p4, esp32s2, esp32s3.
WARNING Could not determine ESP-IDF tool downloads: WARNING: Targets: "esp32s31" are not supported. Only allowed options are: esp32, esp32c2, esp32c3, esp32c5, esp32c6, esp32c61, esp32h2, esp32h21, esp32h4, esp32p4, esp32s2, esp32s3.
WARNING: Targets: "esp32s31" are not supported. Only allowed options are: esp32, esp32c2, esp32c3, esp32c5, esp32c6, esp32c61, esp32h2, esp32h21, esp32h4, esp32p4, esp32s2, esp32s3.
ERROR ESP-IDF 5.5.6 framework installation - failed (returncode=1)
Pinning the framework gets past that. With a version line under framework:, ESPHome warns that the selected framework version is not the recommended one, and the same minimal config then compiled to an ESP32-S31 image:
esp32:
variant: esp32s31
framework:
type: esp-idf
version: 6.1.0
That build held only a logger, so it proves the toolchain path and says nothing about Wi-Fi, Thread or the gigabit port on real silicon, and we had no board to flash it to. Add the missing Amazon listing, and the S31 is a board to watch for now rather than one to fill a house with sensors.
Keep these off the shortlist
Several boards you’ll see recommended in forum threads didn’t make the list for a reason you can check before you buy:
| Board | Why we left it out |
|---|---|
| Espressif ESP32-S3-DevKitC-1 and C6-DevKitC-1 | Out of stock on Amazon US; the in-stock listings with the Espressif name are resellers |
| Espressif ESP32-S3-BOX-3 | Still on esphome.io’s voice projects page, but out of stock on Amazon US |
| Olimex ESP32-POE-ISO | The proxy board ESPHome names, but sold only from Olimex’s store |
| Home Assistant Voice Preview Edition | The reference voice device, $69 list, not sold on Amazon US |
| Seeed reSpeaker XVF3800 with XIAO ESP32S3 | Far-field microphones, but it needs a community external component because ESPHome cannot generate its audio clock |
| WT32-ETH01 | Generic resellers only, and esphome.io flags extra work to flash it |
| Seeed XIAO W5500 Ethernet adapter | Only version 1.2 works as an active proxy, and the Amazon listing was a third party at a high markup |
| Third Reality voice dev kit | Runs Linux on an ARM chip, not an ESP32 |
Check these before you order
Most ESPHome trouble starts with a board that does not match the YAML you planned to run on it. Run through this order before you add a board to the cart:
- Pick the path into Home Assistant: Wi-Fi, Ethernet, Thread, Zigbee or a Bluetooth proxy. That rules chips in or out.
- Check the framework. If your config uses an Arduino-only library, stay on a plain ESP32, S2, S3 or C3.
- Count the memory. Voice, displays and cameras need PSRAM, and on the S3 you must set its mode in YAML.
- Look at the USB port. Native USB and CH343 bridge boards show up as
/dev/ttyACM0on Linux, while CP210x, FTDI and CH340 bridges show up as/dev/ttyUSB0. - Read the Sold by line on Amazon. Prefer the maker’s storefront (waveshare, Seeed Studio Official, M5Stack Official Store or Lily GO), and treat any other seller using the maker’s name with care, as we note on two picks.
Your Home Assistant host matters too, because the Device Builder runs as an app on it. Every compile runs on that host, so a faster box from our mini PCs for Home Assistant list shortens each build you start from the dashboard. If you’d rather buy finished sensors than build them, our mmWave presence sensor picks include ESPHome devices that ship ready to adopt.
Fix the first flash and the adoption
Your first install always goes over a USB cable, and every update after that can go over the network. Most problems show up in that first step or when Home Assistant tries to adopt the board, so these are the ones we’d check in order.
The serial port doesn’t appear
On Linux, ESPHome can open the port only when your user is in the dialout group, and native USB and CH343 boards appear as /dev/ttyACM* rather than /dev/ttyUSB*. Boards without auto-reset need boot mode by hand, in this order:
- Hold the BOOT button down.
- Tap RESET once while BOOT is still held.
- Release BOOT, then start the install from the Device Builder or the CLI.
The S3-based Atoms (the VoiceS3R and AtomS3 Lite) enter download mode differently: hold the reset button for about two seconds until the green LED lights. M5Stack’s Atom Lite docs list no such step for the plain ESP32 model, and instead note that some systems need an FTDI driver before its port appears.
PSRAM isn’t detected on an ESP32-S3
The S3 has no default PSRAM mode in ESPHome, and the wrong mode leaves the PSRAM switched off. Modules with 8 MB or 16 MB of PSRAM, like every S3 pick in this guide, need mode: octal in the psram: block, so check the module’s datasheet if you bought a different board.
An Arduino config won’t build on a C6, H2 or P4
Those chips are ESP-IDF only in ESPHome, so a framework: type: arduino line or an Arduino library will fail on them. Switch the framework to esp-idf and replace the library with a native ESPHome component, or move the project to an S3 if the library is the reason you’re using it.
A Thread device stops taking OTA updates
A sleepy (MTD) Thread device with poll_period above zero cannot receive an OTA update, according to the OpenThread component docs. Set the poll period to zero with the openthread.set_poll_period action before the update, then put it back afterwards.
Zigbee entities stop matching after a config change
ESPHome’s Zigbee docs say to remove and re-add the device after you change its config, and to re-interview it in Zigbee2MQTT. Names with spaces need a recent Zigbee2MQTT release, which our ZHA and Zigbee2MQTT comparison covers alongside the other differences between the two.







