Build, provision, label, and flash a Full Thread Device (FTD) Thread-only Matter light on ESP32-C6 with one CLI.
Main script: tools/light_pipeline.py
Docs index: docs/README.md
This repo adds reproducible automation around upstream esp-matter for one target flow:
- firmware source:
esp-matter/examples/light - chip target:
esp32c6 - network mode: Thread enabled, Wi-Fi disabled
- flash layout: 8 MB via
tools/light_partitions_8mb.csv - provisioning model: one manifest row per device with unique pairing data
Result:
- build firmware
- generate factory partition
- generate onboarding codes
- generate printable labels
- flash device
Tested on:
- Waveshare ESP32-C6-Zero
- Waveshare product page lists it as based on
ESP32-C6FH8 - 8 MB flash layout used by this repo
Install these first:
- Python 3: https://www.python.org/downloads/
- Git: https://git-scm.com/downloads
- ESP-IDF / EIM: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/ and https://docs.espressif.com/projects/idf-im-cli/en/latest/
git clone <your-repo-url>
cd esp32-c6-matter
git submodule update --init --recursivecd esp-matter
./install.sh
cd ..Recommended: install ESP-IDF with Espressif Installation Manager (eim), then save or export its config as eim_config.toml in repo root.
If you do not want full exported config, minimal file also works:
idf_path = "/Users/<you>/.espressif/v5.5.2/esp-idf"Repo tools read eim_config.toml before IDF_PATH.
Check detection with:
python3 tools/detect_env_paths.pypython3 tools/light_pipeline.py doctorpython3 tools/light_pipeline.py run \
--count 1 \
--vendor-id 0xFFF1 \
--product-id 0x8000 \
--vendor-name "My Vendor" \
--product-name "My Thread Light"python3 tools/light_pipeline.py flash \
--port /dev/ttyUSB0 \
--serial-index 1Use --dry-run first if you want command preview without changing anything.
Check environment:
python3 tools/light_pipeline.py doctorBuild 8 devices:
python3 tools/light_pipeline.py run \
--count 8 \
--vendor-id 0xFFF1 \
--product-id 0x8000 \
--vendor-name "My Vendor" \
--product-name "My Thread Light"Build and flash in one go:
python3 tools/light_pipeline.py run \
--count 1 \
--vendor-id 0xFFF1 \
--product-id 0x8000 \
--vendor-name "My Vendor" \
--product-name "My Thread Light" \
--port /dev/ttyUSB0 \
--serial-index 1List generated devices and detected serial ports:
python3 tools/light_pipeline.py list- setup and first run:
docs/getting-started.md - pipeline behavior:
docs/pipeline.md - vendor ID, product ID, DAC, PAI, PAA, CD:
docs/identity-and-attestation.md - commissioning after flash:
docs/commissioning.md - manifest schema:
docs/manifest.md - CLI options:
docs/cli.md - generated outputs:
docs/outputs.md - helper scripts:
docs/internal-scripts.md - version assumptions:
docs/version-compatibility.md - security and generated secrets:
docs/security-and-generated-secrets.md - maintenance and clean rebuilds:
docs/maintenance.md - upstream submodule and patches:
docs/upstream-and-patches.md - examples:
docs/examples.md - troubleshooting:
docs/troubleshooting.md
tools/device_manifest.csvis reused if it already exists--countdoes not overwrite existing manifest automatically--portonruntriggers flashing automatically--flashis deprecated compatibility flag- repo is configured around 8 MB flash target