There are two types of interruptions during remote work:
- the important ones
- and the "quick question" that somehow starts exactly when your camera turns on during a meeting
So I decided to build a small smart lamp that sits outside my office and instantly shows whether:
- my camera is active
- my microphone is active
- or I'm free and available
The goal was simple:
before entering the office, my wife can immediately see if I'm:
- on a call
- talking to someone
- recording something
- or finally available for coffee
And honestly... it turned into a surprisingly fun ESPHome + Home Assistant project.
Final Result
The lamp changes colors automatically based on my MacBook state:
| State | Color |
|---|---|
| Camera active | Red |
| Microphone active | Orange |
| Neither active | Green |
Everything is fully local and integrated with Home Assistant.
Demo Video
Technologies Used
- ESP32-S3
- ESPHome
- Home Assistant
- WS2812 RGB LED ring
- Tinkercad
- Bambu Lab 3D printer
Hardware Components
ESP32-S3 Board
I used a tiny ESP32-S3 development board with:
- USB-C
- WiFi
- Bluetooth
- native USB support
- enough power for ESPHome projects
The size is honestly impressive.
WS2812 LED Ring
The LED ring contains 24 individually addressable RGB LEDs.
This means every LED can be controlled independently using a single DATA pin.
Supporting Components
I also used:
- 470Ω resistor
- 470µF capacitor
- prototype PCB
- female headers
Why the Resistor and Capacitor?
The resistor protects the DATA line from signal spikes.
The capacitor stabilizes the power delivery to the LED ring and prevents random flickering or instability when LEDs suddenly change brightness.
Recommended setup:
- 470Ω resistor between ESP GPIO and LED DATA
- 470µF capacitor between 5V and GND
Wiring Diagram
Connections used in the project:
| LED Ring | ESP32-S3 |
|---|---|
| 5V | 5V |
| GND | GND |
| DI | GPIO4 through 470Ω resistor |
Capacitor:
- positive -> 5V
- negative -> GND
Soldering the Hardware
I assembled everything on a small prototype PCB.
The ESP32-S3 is mounted using female headers which makes it removable and easy to replace later.
The LED ring wires are also detachable.
Prototype PCB
Top Side
Bottom Side
Installing ESPHome
I installed ESPHome locally on macOS using pipx.
Install pipx
brew install pipx
pipx ensurepath
Restart terminal after installation.
Install ESPHome
pipx install esphome
Verify installation:
esphome version
Creating the ESPHome Project
Create project directory:
mkdir -p ~/esphome
cd ~/esphome
Create configuration file:
nano led-ring.yaml
ESPHome Configuration
The configuration below creates a WiFi-connected RGB lamp exposed directly to Home Assistant.
esphome:
name: led-ring
friendly_name: LED Ring
esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino
wifi:
ssid: "YOUR_WIFI"
password: "YOUR_PASSWORD"
logger:
api:
ota:
platform: esphome
light:
- platform: esp32_rmt_led_strip
name: "LED Ring"
pin: GPIO4
num_leds: 24
rgb_order: GRB
chipset: WS2812
Flashing the Firmware
Connect ESP32-S3 using USB-C and run:
esphome run led-ring.yaml
ESPHome:
- compiles firmware
- uploads firmware
- connects the device to WiFi
- exposes it to Home Assistant
Home Assistant Integration
Once connected to WiFi, Home Assistant discovered the device automatically.
The LED ring appeared as:
light.led_ring
And that was enough to control it from automations.
Detecting Camera and Microphone Usage
The Home Assistant macOS companion app exposes sensors like:
binary_sensor.areks_macbook_pro_camera_in_use
binary_sensor.areks_macbook_pro_microphone_in_use
That means Home Assistant knows:
- when my camera is active
- when microphone is active
- and can trigger automations instantly
Automation Logic
The logic is intentionally simple:
| Condition | Lamp Color |
|---|---|
| Camera ON | Red |
| Microphone only | Orange |
| Neither | Green |
This is the automation:
alias: Office Call Lamp - Camera and Microphone Indicator
description: Red when camera is in use, orange when only microphone is in use, green when neither is in use.
mode: restart
trigger:
- platform: state
entity_id:
- binary_sensor.areks_macbook_pro_camera_in_use
- binary_sensor.areks_macbook_pro_microphone_in_use
action:
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.areks_macbook_pro_camera_in_use
state: "on"
sequence:
- service: light.turn_on
target:
entity_id: light.led_ring
data:
rgb_color: [255, 0, 0]
brightness: 255
- conditions:
- condition: state
entity_id: binary_sensor.areks_macbook_pro_camera_in_use
state: "off"
- condition: state
entity_id: binary_sensor.areks_macbook_pro_microphone_in_use
state: "on"
sequence:
- service: light.turn_on
target:
entity_id: light.led_ring
data:
rgb_color: [255, 120, 0]
brightness: 255
default:
- service: light.turn_on
target:
entity_id: light.led_ring
data:
rgb_color: [0, 255, 0]
brightness: 120
Designing the Enclosure in Tinkercad
Once the electronics worked, I wanted the project to actually look good on the desk instead of resembling a cyberpunk breadboard experiment.
So I designed a simple two-part enclosure in Tinkercad.
The enclosure consists of:
- top shell with LED ring opening
- bottom shell holding PCB and ESP32-S3
The design keeps:
- USB-C accessible
- LEDs visible
- electronics hidden
- assembly simple
Tinkercad Design
3D Printing
The enclosure was printed on a Bambu Lab printer.
Printed Parts
Final Assembly
What I Like About This Project
What started as:
"please don't walk into the office during calls"
ended up becoming:
- a fun ESPHome project
- a useful Home Assistant automation
- a custom hardware build
The best part is how little code is actually needed.
ESPHome handles:
- firmware
- networking
- Home Assistant integration
- OTA updates
Which means you can focus on the actual idea instead of low-level firmware work.
Final Thoughts
ESPHome + ESP32-S3 is honestly one of the best combinations for DIY smart home projects.
The development experience is fast, modern and surprisingly reliable.
And the result is a genuinely useful device that solves a real everyday problem.
Or at least reduces the probability of:
"Are you on a call right now?"








Top comments (0)