3 minute read

ESP32C6 boards are not native supported by ESPHome

The ESPHome project provides a way to use ESP32-based microcontrollers with [Home Assistant]https://www.home-assistant.io/). Recently I have been experimenting with the Seeed Studio Xiao ESP32C6 microcontrollers, which come are packaged as a tiny PCB with a USB-C connector to power or program them. These devices include WiFi and Bluetooth support.

I came across the ESPHome project but unfortunately discovered that ESP32C6 boards are not supported natively. Neverthless, I found that some people had managed to get them to work, although there wasn’t one place with all the instructions.

Building firmware for ESP32C6 using Docker

I have Docker installed and ESPHome supports running its setup software using a Docker container. First, you need to create a skeleton configuration file.

docker run --rm -it -v /home/user:/config ghcr.io/esphome/esphome wizard esp32c6.yaml

This command will create esp32c6.yaml in the /user/home folder. You answer the questions for things like the name of the device and the WiFi network it will connect to.

Next, edit the file to support compiling for ESP32C6 and also add whatever support you want from your controller according to the ESPHome documentation. I wanted to use my device as a Bluetooth repeater. Here is the edited configuration file:

esp32c6.yaml

esphome:
  name: esp32c6
  platformio_options:
    platform: https://github.com/mnowak32/platform-espressif32.git#boards/seeed_xiao_esp32c6

esp32:
  board: seeed_xiao_esp32c6
  flash_size: 4MB
  variant: esp32c6
  framework:
    type: esp-idf
    version: 5.2.1
    sdkconfig_options:
      CONFIG_ESPTOOLPY_FLASHSIZE_4MB: y

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: ""

ota:
  - platform: esphome
    password: ""

wifi:
  ssid: "SSID"
  password: "wifi-password"

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

captive_portal:

bluetooth_proxy:
  active: true

Note 1: change SSID and wifi-password for your network. I also chose to start without passwords.

Note 2: I used v5.2.1 of ESP-IDF just because that was used in a few sample files I found from people who got this to work. I will experiment with the more recent versions v5.2.3 and v5.3.1, which are currently the latest versions.

Build the firmware

Next, you need to build the firmware for the device using the following command:

docker run --rm -v /home/user:/config -it ghcr.io/esphome/esphome compile esp32c6.yaml

This will take a little while to download all the build tools in the Docker container and then compile the code. Eventually, it will complete having built the firmware binary.

You can find the firmware located in /home/user/.esphome/build/esp32wart/.pioenvs/esp32wart/firmware.factory.bin.

Flashing the firmware

I used esptool.py to flash the firmware onto the device, which I already had installed from previously installing the ESP-IDF tools. I think if you have a recent version of Python installed, you can just install this with pip install esptool but I haven’t tried this.

To flash the firmware, I used the following command:

esptool.py -p COM6 --before default_reset --after hard_reset --chip esp32c6 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x0 firmware.factory.bin

This is on Windows (hence the COM6), but I imagine it works with other platforms by changing the port as appropriate. Most of the options are probably not necessary, but I created this command based on the ESP-IDF documentation.

I think the important parts are the port, --chip esp32c6, and using 0x0 as the start address.

This should write the firmware and restart the device, where it will attempt to connect to the network.

Accessing microcontroller from Home Assistant

If you have installed the ESPHome integration in Home Assistant, then the microcontroller should soon be detected as a new device by Home Assistant. If you add the device, then you can start to use it with Home Assistant. I had configure my device as a Bluetooth Repeater, and shortly after adding it to Home Assistant, all the Bluetooth devices it could see were also made available in Home Assistant.

Updated: