A Matter-over-Thread proxy for the Zhiyun FIVERAY M20C RGB LED light, running on a Seeed Studio XIAO ESP32-C6.
The ESP32-C6 exposes a Matter Extended Color Light device over Thread and proxies all commands to the M20C via on-demand BLE.
Note: use your own device, partition name and other parameters value. This is not a complete guide.
- Power on/off
- Brightness control (0–100%)
- CCT color temperature (2500–10000K)
- Hue/Saturation color control
- Battery level reporting (polled periodically via BLE)
- Status LED on GPIO15 — lights up while BLE is connected to M20C
The XIAO ESP32-C6 uses its 802.15.4 radio for Thread (Matter transport) and its BLE radio to talk to the M20C. BLE connections are on-demand: the proxy connects to the M20C only when a Matter attribute changes or when polling battery, then disconnects.
The M20C BLE protocol is documented at kochaika/m20c-ble-api.
Set the M20C BLE MAC address before building:
idf.py menuconfig
# → M20C Thread Proxy Configuration → M20C BLE MAC AddressOther configurable options:
- Battery poll interval (default: 60s)
- BLE connect timeout (default: 5000ms)
- https://github.com/kochaika/m20c-ble-api
- https://wiki.seeedstudio.com/xiao_esp32_matter_env/
- https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/macos-setup.html
- https://docs.espressif.com/projects/esp-matter/en/latest/esp32/developing.html
- https://docs.espressif.com/projects/esp-matter/en/latest/esp32/esp-matter-en-master-esp32.pdf
Clone this repo to the esp-matter directory.
Open IDF Terminal, navigate to esp-matter directory.
source ./export.shexport IDF_CCACHE_ENABLE=1
idf.py fullclean
rm -rf build/
esptool.py --chip esp32c6 --port /dev/cu.usbmodem2101 erase_flashNavigate to this project directory.
idf.py set-target esp32c6idf.py buildidf.py -p /dev/cu.usbmodem2101 flash
Should be enabled before. It was disabled here.
idf.py -p /dev/cu.usbmodem2101 monitoresp-matter-mfg-tool -n 1 \
-v 0xFFF1 -p 0x8001 \
--vendor-name "ChaikaMatter" \
--product-name "M20C_Proxy" \
--hw-ver 1 --hw-ver-str "1.0"esptool.py --chip esp32c6 --port /dev/cu.usbmodem2101 write_flash 0x10000 out/fff1_8001/**/**-partition.binAn external UFL antenna is used for Thread communication. The FM8625H RF switch on the XIAO ESP32-C6 is configured at startup via GPIO3 (enable) and GPIO14 (antenna select).
The built-in LED on GPIO15 indicates active BLE connection to the M20C (cathode on GPIO, active-low).