I let the internet control my lights during video calls

by andyp | Jun 3, 2026 | Projects | 0 comments

A few weeks ago I wired up a strip of WS2811 LEDs on a shelf behind me, flashed an Arduino Uno R4 WiFi, and published a web page that lets anyone on a call with me change my room lighting in real time.
It’s completely unnecessary. I love it.

How it works

The Arduino connects to WiFi and subscribes to an MQTT topic on HiveMQ’s public broker. The web interface, hosted publicly,  publishes messages to the same topic whenever someone picks a colour or hits a pattern button.

That’s it. There’s no backend. No auth. No database. The broker is the glue.

The Arduino handles the rest: FastLED drives the strip, and depending on the incoming message it switches between solid colour, rainbow cycle, pulse, crossfade, strobe, fire, or a three-dot chase effect. The colour picker sends solid:R,G,B — everything else is just a keyword.

The web UI has a colour picker, eight quick-colour buttons, and six pattern buttons. It shows a “Connected” indicator via MQTT.js in the browser. When you press anything, the lights in my office change within about half a second.

Why MQTT

I’ve used WebSockets for stuff like this before, but MQTT over a public broker is genuinely less hassle for a toy project. HiveMQ’s public broker requires zero setup on my end. The Arduino library handles reconnects reasonably well. The browser client is four lines of MQTT.js.
The tradeoff: it’s completely public. Anyone who knows the topic string can publish to it. For a “make Andy’s lights weird during calls” project, that’s a feature, not a bug.

The hardware

WS2811 LED strip, 60 LEDs
Arduino Uno R4 WiFi – This is probably overkill, but its what I had to hand.
Powered separately from the Arduino, always do this with LED strips or you’ll have a bad time
Single data line on pin 6

Total BOM is maybe £30 if you’re starting from scratch. I had most of it already.

What I’d do differently

The public broker works fine for a demo but I’d run Mosquitto locally or on a VPS for anything I actually wanted reliable. The MQTT topic is also trivially guessable, adding even a basic token check in handleMessage() would stop random interference (though, again, for this project, interference is the point).

I’d also add a brightness: command so the web UI can dial it down without switching pattern. Right now brightness is hardcoded per pattern.

The actual point

This took maybe three hours including soldering. The result is a thing that makes video calls noticeably more interesting, gives people a tactile way to interact with my physical space, and occasionally makes my office look like a nightclub at 10am.

Not everything has to be a product. Sometimes you just build something because it’s a funny idea and you want to see if it works.

Want to try for yourself? visit https://p0wel.ly/lights/ to change the mood in my workshop.