Three Small ESP32 Devices, One Home Assistant Source
Markdown source•
1---2title: "Three Small ESP32 Devices, One Home Assistant"3date: "2026-09-12"4published: true5tags: ["home-assistant", "esphome", "esp32", "electronics", "iot", "automation"]6author: "Gavin Jackson"7excerpt: "My first three ESPHome projects turned a LILYGO T-Embed, a Nano ESP32 and a Waveshare reflective display into useful Home Assistant devices."8---910# Three Small ESP32 Devices, One Home Assistant1112I've been playing around with [ESPHome](https://esphome.io/) and have been pretty impressed with how easy it is to turn inexpensive, Wi-Fi-enabled ESP32 boards into proper Home Assistant devices.1314In [Building a Smarter Home With Home Assistant](/post/home-assistant-first-impressions), I wrote about getting Home Assistant running in the homelab and discovering what it could already see around the house. This is the next part of that adventure: making my own devices visible alongside the televisions, air conditioning and solar system.1516There is something satisfying about taking a small board on the workbench, describing what its buttons, lights, sensors and display should do, and then finding all of those controls on the same phone dashboard as the rest of the house.17181920*The Waveshare display on the bench, with the T-Embed and Nano board beside it.*2122## What ESPHome changes2324ESPHome lets me describe a device's features in YAML and builds the firmware around that configuration. I do not have to write the Wi-Fi connection, Home Assistant protocol, over-the-air update service and entity plumbing from scratch every time I want to expose a button or sensor.2526The [Device Builder workflow](https://esphome.io/install/getting-started/) creates the initial configuration, installs the firmware over USB and then handles later updates over Wi-Fi. With the native API enabled, Home Assistant normally discovers the board and offers to add it under **Settings → Devices & services**.2728> **My container setup**29>30> I ran Home Assistant and ESPHome on the same Linux host using this `docker-compose.yml`:31>32> ```yaml33> services:34> homeassistant:35> container_name: homeassistant36> image: "ghcr.io/home-assistant/home-assistant:stable"37> volumes:38> - /opt/home-assistant/config:/config39> - /etc/localtime:/etc/localtime:ro40> - /run/dbus:/run/dbus:ro41> restart: unless-stopped42> stop_grace_period: 60s43> privileged: true44> network_mode: host45> environment:46> TZ: Australia/Sydney47>48> esphome:49> container_name: esphome50> image: ghcr.io/esphome/esphome:stable51> volumes:52> - /opt/home-assistant/esphome-config:/config53> - /etc/localtime:/etc/localtime:ro54> restart: unless-stopped55> network_mode: host56> ```57585960*Compiling the T-Embed configuration in ESPHome Device Builder.*6162The easy part is the common plumbing. The interesting part is working out the hardware: which GPIO drives the backlight, how a rotary encoder is wired, which display driver is required, or how a microphone and speaker share an audio bus. That is where each project became its own little puzzle.6364## Project one: LILYGO T-Embed6566The [LILYGO T-Embed](https://github.com/Xinyuan-LilyGO/T-Embed) is a compact ESP32-S3 device with a 170 × 320 colour display, rotary encoder, push button and a few useful expansion options. It looks more like the beginning of a finished product than a loose development board.6768My first goal was deliberately modest: put a large clock on the screen and expose the useful controls to Home Assistant. The display gets its time from Home Assistant, while separate entities control power and the display backlight. The rotary control and its button are defined internally, ready for the next stage of the project without cluttering the dashboard yet.69707172Once the case came apart, the ESP32-S3 module, display connection and small internal connectors made the device feel much less mysterious. This is one of the things I enjoy about inexpensive development hardware: opening it tends to answer as many questions as reading the product page.73747576*The same device with the back removed. The ESP32-S3 module is visible on the right.*7778The complete, sanitised [LILYGO T-Embed ESPHome configuration](https://github.com/gavinjackson/electronics-lessons/blob/main/projects/esphome-home-assistant/lilygo-t-embed.yaml) is available in my electronics-lessons repository.7980## Project two: Nano ESP328182The Nano ESP32 is the smallest of the three projects and the quickest demonstration of the full control path. It sits neatly on a breadboard and exposes its onboard amber LED as a switch, plus its onboard RGB LED as a colour light.8384Tap the control in Home Assistant and a real light changes on the board. It is a tiny result, but it proves that discovery, state and control are all working before I attach anything more complicated.85868788The RGB LED was the only small trap. Its colour channels are active-low, so each PWM output needs to be inverted in the configuration. Without that detail, the behaviour is the opposite of what the brightness values suggest.8990The [Nano ESP32 ESPHome configuration](https://github.com/gavinjackson/electronics-lessons/blob/main/projects/esphome-home-assistant/nano-esp32.yaml) includes both the amber switch and RGB light.9192## Project three: Waveshare reflective LCD9394The Waveshare ESP32-S3-RLCD-4.2 is the most ambitious and most interesting device of the three. Its 400 × 300 reflective monochrome display looks a little like electronic paper, but it behaves as a reflective LCD. It is clear in ambient light and can update much more readily than the e-paper displays I had been considering for a room dashboard.9596The board also has a temperature and humidity sensor, two microphones, a speaker, two buttons, an RTC, microSD storage and a battery holder. That is an unusual amount of hardware in one inexpensive package.9798My current dashboard shows:99100- time and date from Home Assistant101- room temperature and humidity from the onboard SHTC3 sensor102- a short message that can be edited from Home Assistant103- the current voice-assistant state104- a reminder to say “Hey Jarvis” or press the physical KEY button105106The audio side turns the board into a Home Assistant Assist satellite. It can listen for the wake word, pass speech to Home Assistant, play the response through its speaker and show whether it is listening, thinking, speaking or waiting to reconnect.107108Waveshare's [ESPHome walkthrough for this board](https://docs.waveshare.com/ESP32-ESPHome-Tutorials/Example-RLCD-Voice) gave me the hardware map. The display itself uses a community ST7305 component pinned to a known revision in my configuration, while the microphone, speaker and codecs use ESPHome's audio components.109110The full [Waveshare RLCD ESPHome configuration](https://github.com/gavinjackson/electronics-lessons/blob/main/projects/esphome-home-assistant/waveshare-rlcd.yaml) is the longest of the three, but it is also the best example of how far a YAML configuration can take one small board.111112## One area, three useful experiments113114I assigned all three devices to the Study area. Home Assistant now presents the T-Embed controls, Nano LEDs and Waveshare display, environmental readings and voice features together.115116<p align="center"><img src="/assets/electronics/esphome-home-assistant/home-assistant-study.jpg" alt="Home Assistant Study dashboard showing controls and sensor readings for the LILYGO T-Embed, Nano ESP32 and Waveshare RLCD" width="360" loading="lazy"></p>117118*The three ESPHome projects in the Study area.*119120That screenshot captures why this has been fun. The boards came from different manufacturers, have very different hardware, and started as separate experiments. Home Assistant turns them into a coherent set of devices organised by the room where I use them.121122I have collected all three files, plus a [safe example secrets file](https://github.com/gavinjackson/electronics-lessons/blob/main/projects/esphome-home-assistant/secrets.example.yaml), in the [ESPHome project directory](https://github.com/gavinjackson/electronics-lessons/tree/main/projects/esphome-home-assistant). The published configurations use `!secret` references for Wi-Fi credentials, API encryption keys, OTA passwords and fallback-hotspot passwords. Real credentials do not belong in a public repository.123124> **More on these projects later**125>126> I will do a deeper dive into these three ESPHome projects in a future post, including what I learned about the displays, rotary controls, audio pipeline and voice-assistant behaviour. The source files are available now for anyone who wants to explore them.127128## The next board needs MQTT129130These projects also made me curious about the path underneath ESPHome's convenient integration. The Arduino UNO R4 WiFi has an ESP32-S3 onboard, but the normal Arduino sketch runs on its Renesas RA4M1 processor and uses the ESP32-S3 as a connectivity coprocessor. It is a different architecture from the three ESPHome devices above.131132In [Connecting an Arduino UNO R4 WiFi to Home Assistant with MQTT](/post/arduino-uno-r4-wifi-home-assistant-mqtt), I use ArduinoMqttClient and Home Assistant MQTT discovery to expose the UNO's onboard LED, 12 × 8 matrix, Wi-Fi signal and uptime.133134ESPHome remains the fastest route I have found from a supported ESP32 board to a useful Home Assistant device. More importantly, it makes experimentation cheap: start with a light or a clock, learn one new part of the board, and let the project grow from there.135