A DIY ESP32-based smart light controller with DMX512, addressable LEDs, PWM faders, and full Home Assistant integration — all housed in a 3D-printed enclosure you build yourself.
The TV Light Controller V6 is an open-source, maker-built light controller designed for people who want real control over their lighting. Whether you're running bias lighting behind a TV, stage-style DMX fixtures, or addressable LED strips throughout a room, this controller brings it all together in one tidy, wall-mountable unit. Built on the Adafruit Feather ESP32-S3, it connects to your home WiFi, integrates natively with Home Assistant, and gives you a beautiful web interface to control everything — no cloud subscription required.
- 4 Fader Channels — Dim any 12V LED strip with smooth PWM control
- 4 Pixel Strip Outputs — Drive WS2812B, SK6812, and other addressable LEDs with full effects
- Full DMX512 Universe — Control professional lighting fixtures with up to 512 channels
- 4 Physical Buttons— Programmable copper-contact buttons for instant scene recall
Home Assistant MQTT Auto-Discovery
The controller publishes itself automatically to Home Assistant via MQTT. Every fader, pixel strip, and DMX fixture appears as a properly structured device with full entity hierarchy — no manual YAML configuration required. Just connect and go.
Built-in Web Interface
Access a full control dashboard from any browser on your network. Adjust brightness, change colors, set effects, configure DMX fixtures, and save scenes — all from a responsive web UI served directly from the ESP32. No app to install.
WiFi Manager
On first boot, the controller creates its own access point. Connect to it with any phone or laptop to enter your WiFi credentials — no serial cable or code changes needed.
mDNS / Local Hostname
Find your controller on the network by name (e.g., `lightcontroller.local`) without needing to know its IP address.
4× Fader Channels (PWM Dimmers)
Each fader channel uses a MOSFET driver to provide smooth, flicker-free dimming for standard 12V LED strip lights. Individually controllable from 0–100% via the web UI, physical buttons, or Home Assistant automations. Effects like breathing and strobe are available per channel.
4× Pixel Strip Outputs (Addressable LEDs)
Drive up to four independent addressable LED strips (WS2812B, SK6812, etc.) using FastLED. Each strip supports:
- Full RGB color selection
- Brightness control
- Built-in effects (breathing, color cycle, sparkle, and more)
- Per-strip speed control
- Independent on/off
DMX512 Output
A full DMX512 universe (512 channels) is generated using a pure HardwareSerial implementation — no external DMX library required. Define fixtures with custom start channels, channel counts, and types. Manage everything from the web UI, including:
- Add/remove / duplicate fixtures
- Name fixtures for HA auto-discovery
- Control individual channels as separate HA entities
- Full brightness control per fixture
4 Physical Buttons
Four tactile buttons are mounted directly on the front panel. Each uses a 3D-printed keycap with a 5mm copper tape contact strip for reliable, zero-bounce actuation. Buttons can be mapped to scenes, toggles, brightness presets, or custom MQTT messages.
3D Printed Enclosure
The entire case is 3D printed and designed to be functional and clean. Each component has its own labelled bay — faders, pixel strip outputs, and buttons are all clearly marked. The design is printable on any standard FDM printer with no supports required.
The controller publishes a structured device hierarchy to Home Assistant:
TV Light Controller V6 (parent device)
├── Fader 1–4 (brightness + effects + speed)
├── Pixel Strip 1–4 (color + brightness + effects + speed)
└── DMX Fixture(s)
└── Per-fixture channel entities (brightness, speed)
All entities show "Available" status while the controller is online, and "Unavailable" when it drops off the network — so your automations stay clean and reliable.
What You'll Need
Electronics:
- Adafruit Feather ESP32-S3
- 4× MOSFET driver modules (for fader channels)
- 1× MAXX RS-485 transceiver module (for DMX output)
- Power Supply(s) for lights
3D Printing:
Order print from print services:
Other Materials:
- 5mm copper tape (for button contacts)
- 30 AWG wire
Button Contacts
Each button uses a simple copper tape contact. Cut a 5mm strip of copper tape and press it onto the underside of the keycap. A matching strip on the button plate completes the circuit when the button is pressed. No soldering required for the contacts themselves.
Wiring
Power
- Connect 5V to the Feather's USB port
- Connect 0-32V to the MOSFET driver modules for fader channels based on what the voltage lights require.
- All grounds must be common and shared with ESP ground (ground bars are there to help with this)
Fader Channels (PWM)
- Connect each MOSFET module's PWM input to the designated GPIO pins
- LED strip + connects to your power supply, – connects through the MOSFET to GND
Pixel Strip Outputs
- Data line from designated GPIO pins to each strip's DIN pad
- 5V and GND from your power supply
- Add a 300–500Ω resistor in series with the data line to prevent ringing
DMX Output
- GPIO 18 (TX) → RS-485 module TX input
- RS-485 module A/B → XLR connector pins 2/3 (per DMX standard)
- Add a 120Ω termination resistor at the far end of your DMX cable run for long runs
Buttons
- One terminal of each button to a GPIO pin (with internal pull-up enabled in firmware)
- Other terminal to GND
- Copper tape contacts make this connection when pressed
Use Chrome
Use a data USB cable (not charge-only)
Hold the BOOT button on the ESP32 while connecting. Tap the REST button once while holding the BOOT button.
Try a different USB cable
First Boot:
The controller will create a WiFi AP called `LightController` (or similar). Connect to it from your phone or laptop, then enter your home WiFi SSID and password. The controller will automatically reboot and connect.
1. Ensure your HA instance has the MQTT integration set up with a broker (Mosquitto recommended)
2. In the controller web UI, go to Settings → MQTT
3. Enter your MQTT broker IP, port (default 1883), and credentials if required
4. Set your device name (this becomes the HA device name)
5. Click Save & Reconnect
6. Within 30 seconds, open HA → Settings → Devices & Services → MQTT
7. Your controller and all its entities will appear automatically
No YAML configuration is needed. Every fader, strip, and DMX fixture publishes its own discovery payload automatically.
Navigate to `http://lightcontroller.local` (or the device's IP) in any browser.
- Status tab — WiFi strength, MQTT connection status, firmware version
- Faders tab — Brightness sliders for each PWM channel with effect controls
- Pixel Strips tab — Color picker, brightness, effect selection, and speed per strip
- DMX tab — Add/remove/configure DMX fixtures, control channel levels
- Settings tab— WiFi, MQTT, device name, button mapping
This project is open source. Hardware files are released under CC BY-SA 4.0. Firmware source is MIT licensed. Build it, just keep attribution.