Een Matter lamp bouwen met de M5Stack NanoC6 en koppelen aan Google Home
Een eigen slimme lamp maken die net zo werkt als die dure commerciele lampen: aan/uit, dimmen, kleur. En dan ook nog in de Google Home app verschijnen als een echt Matter device, bestuurd over Thread in plaats van over een wifiverbinding. Dat was het doel.
Het resultaat: een M5Stack NanoC6 — een bordje ter grootte van een stukje kauwgum met een ESP32-C6 erop — die zich nu keurig laat aan- en uitzetten en dimmen via Google Home, met de Nest Hub als Thread border router.
Waarom Matter en Thread?
Google Home spreekt steeds meer Matter — een open standaard voor smarthome-apparaten die niet aan een enkel ecosysteem vasthoudt. Het bijzondere van dit project: geen wifi, maar Thread. Thread is een low-power meshnetwerk waarin apparaten zelf een mesh vormen. De Nest Hub doet dienst als border router: hij koppelt Thread en wifi aan elkaar, zodat Google Home de lamp kan bereiken zonder dat de lamp zelf op het wifinetwerk hoeft te zitten.
De ESP32-C6 is een van de weinige goedkope chips met een native IEEE 802.15.4-radio — de radio die Thread gebruikt. De NanoC6 van M5Stack is daar een compact bordje omheen. Officieel “Matter supported”, maar er staat niets op; je bouwt de firmware helemaal zelf.
De bouwroute: ESP-Matter in plaats van PlatformIO
Het originele project van de NanoC6 draaide op PlatformIO met de Arduino framework — prima voor losse LED-programma’s, maar niet de kant die Espressif aanbeveelt voor Matter. Voor Matter gebruik je de officiele ESP-Matter SDK, gebouwd bovenop ESP-IDF.
Dat bracht meteen de eerste hindernis:
- Een volledige clone van esp-matter met alle submodules is ruim 15 GB.
De oplossing: een shallow clone (
--depth 1) plus alleen de essentiële submodules uitchecken. Dat bracht het terug naar 1.4 GB. - De laatste installatiestap van
install.shstruikelde over Homebrew Python 3.14 (PEP 668 weigert pip-installaties buiten een venv). De oplossing: de requirements handmatig installeren in de bestaande ESP-IDF-venv. Daarna bouwde alles.
Als startpunt kozen we het light-voorbeeld uit esp-matter. De NanoC6
ondersteunt zowel wifi als Thread, dus we moesten Thread expliciet
forceren via een aparte sdkconfig (c6_thread): OpenThread aan, wifi
uit, BLE alleen voor de commissioning.
De eerste verrassing: de pins kloppen niet
Het light-voorbeeld is geschreven voor het Espressif devkit-bord. Dat gebruikt andere pins dan de NanoC6. Met de standaard firmware deed Google Home trouw aan/uit, maar op de module zelf gebeurde niks — de LED zat namelijk op de verkeerde GPIO.
De pinout van de NanoC6:
| Functie | Pin |
|---|---|
| RGB-LED (WS2812) | GPIO20 |
| RGB-voeding (moet HIGH) | GPIO19 |
| Knop | GPIO9 |
| Grove (I2C) | GPIO1/2 |
Espressif heeft daar een nette uitbreidroute voor: een project-lokale
device_hal via ESP_MATTER_DEVICE_PATH. Zo konden we de juiste pins
definiëren zonder de SDK zelf aan te passen. Belangrijk detail van de
NanoC6: de RGB-LED heeft een aparte voedingspin (GPIO19) die je eerst hoog
moet trekken, anders doet de LED helemaal niks.
Een console die niks zegt
Een tweede struikelblok was de seriële console. De NanoC6 heeft geen externe UART-bridge; de USB-C-poort praat direct via de USB-Serial-JTAG van de chip. De standaard firmware stuurt zijn log echter naar UART0 — dus keek je tegen een doodstille console aan. De fix was één regel in de sdkconfig:
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
Daarna verscheen de bootlog gewoon op /dev/cu.usbmodem21101.
Koppelen met Google Home
Na het flashen is het device zichtbaar via BLE en kun je het koppelen. De koppelcode wordt door de firmware gegenereerd en is op te vragen via de Chip Shell op de seriele console:
matter onboardingcodes ble
QRCode: MT:Y.K9042C00KA0648G00
ManualPairingCode: 34970112332
In de Google Home app: apparaat toevoegen, de code invoeren (of QR scannen), en de Nest Hub regelt de rest. Het apparaat wordt dan op het Thread-netwerk gezet.
Eén valkuil: als je het device eerder hebt gekoppeld en daarna in de app verwijdert, is het niet direct weer vindbaar — de oude fabric staat nog in het geheugen. Het pairing-venster moet dan opnieuw openstaan (factory reset of opnieuw commissionen) voordat de app het apparaat weer ziet.
Hoe goed werkt het?
Heel goed, is het korte antwoord. Wat ons opviel:
- Reactietijd: aan/uit en dimmen reageren vrijwel direct. Thread loopt daar echt niet op achter vergeleken met wifi-apparaten.
- Geen wifiverbinding nodig: het apparaat draait puur op Thread. Geen SSID, geen wachtwoord, geen provisioning.
- Echt Matter: Google Home ziet het als een gewone dimbare lamp, met kleur en kleurtemperatuur — niet als een of andere “custom integration”.
- Lokale knop: de GPIO9-knop schakelt de lamp ook fysiek om, los van de app.
De RGB-LED op GPIO20 reageert nu op aan/uit, dimmen, kleur en kleurtemperatuur, precies zoals je van een Matter-lamp mag verwachten.
Meer willen bouwen?
De volledige configuratie staat in onze
git-repository:
een project-lokale device_hal met de juiste pins, de c6_thread
sdkconfig en de console-fix. Zelf een Matter-apparaat maken is goed
toegankelijk geworden; het grootste werk zit in de setup van de SDK, en
daar hebben wij de kuilen nu voor je ingevuld.