Neatly stacked shot glasses inside a rustic wooden cabinet

Lighting 300 Shot-Glass Cubbies: SK6812 12 V Power, WLED and Home Assistant

A wall of shot glasses with four addressable pixels in every cubby is a small, satisfying build. The strip is cheap, the code is short, and the result looks far more expensive than it is. It also hides two problems that are easy to conflate. Power is about feeding enough current safely. Control is about addressing individual pixels and telling each one what to be. Treated separately, both are straightforward.

This version is sized for 300 cubbies with four lights in each – a real jump from the 143 slots the shelf holds today. Here is what that takes, for the three reels already on hand plus one more.

Neatly stacked shot glasses inside a rustic wooden cabinet
The shelf this is all for: a wall of shot glasses, one light per cubby. Photo by Boys in Bristol Photography.

The short answer

  • Power – one 12 V supply rated 350 W (about 29 A), with a 25 A fuse on the main feed and a 5 A fuse on each of the four reel branches.
  • Controllers – two WLED boards, 600 pixels each. 1200 RGBW pixels needs ten E1.31 universes and WLED accepts nine, so the display is driven in halves.
  • Wiring – one shared ground, every reel fed at both ends, and a short level-shifted data line.
  • Home Assistant – WLED is auto-discovered, so the shelf appears as an ordinary light with brightness, colour, effects, scenes and voice control.
  • The XML – a small bridge reads the collection’s own shelf document and pushes a colour to every cubby.

Why this strip is a good fit

SK6812 is a four-in-one pixel: red, green and blue plus a dedicated white channel, each driven by its own chip inside the LED package. The strip you have is the RGBW version – “RGB + Natural White” – and WLED supports SK6812 at both 5 V and 12 V.

The 12 V part matters. Higher voltage needs less current for the same power, so the far end of a 12 V strip sags far less than a 5 V one and you can run a much longer chain before it goes dim and pink. The catch is that the data line is still 5 V logic, which is why a level shifter turns up below.

Working out the power

Strips like this are usually specified at around 12 W per metre at 60 LEDs per metre, which works out to 0.2 W per pixel. That gives a clean worst case – every pixel at full white, which a real shelf rarely reaches:

  • 300 cubbies x 4 pixels = 1200 pixels
  • 1200 x 0.2 W = 240 W, or 20 A at 12 V
  • That is exactly four 5 m reels – 20 m of strip, with nothing left over

A single 12 V, 350 W supply – a Mean Well LRS-350-12 or equivalent, 29 A – covers that at roughly 69% load, which is where you want to sit. Two 200 W supplies would also work if each half of the shelf keeps its own supply; just never join two supplies to the same strip.

Fuse it properly, because a 350 W supply can push far more current than the strip can survive. Put a 25 A fuse on the main feed and a 5 A fuse on each reel, on the positive wire, as close to the supply as the wiring allows. A five-metre reel can only carry about 5 A before it starts to warm up.

Then set WLED’s automatic brightness limiter to roughly 23 A – about 80% of the supply – on both controllers. That way the firmware itself refuses to overdraw, whether the request comes from a scene, an effect or a person.

Controlling individual pixels

Addressable strips work as a chain. Each pixel reads the first chunk of the data stream, sets itself, and forwards the rest to the next pixel. The display is therefore one data wire in at the first pixel and one data wire chaining out of the last – and at 1200 pixels, a second chain to keep the run sane.

Use WLED. It runs on an ESP32, drives these pixels comfortably, and is one of the best-supported devices in Home Assistant, which picks it up automatically.

The one real constraint at this size is how the bridge feeds it. Driving each cubby from the collection’s XML means a realtime protocol rather than WLED’s own effects, and the cleanest one – E1.31 – carries 128 RGBW pixels per universe and accepts nine universes. That is 1152 pixels, just short of the 1200 this shelf needs. So:

  • Recommended: two WLED controllers at 600 pixels each – five universes apiece. Well inside the limit, and it halves the current on any one chain.
  • Alternative: one controller fed as RGB only, where WLED’s “Multiple RGB” mode carries 1200 pixels in eight universes. It works, but the dedicated white channel stays dark and warm white has to be mixed from red, green and blue.

You can build around bare ESP32 boards, but I would buy 12 V-ready controllers that already contain the parts people get wrong: a 5 V buck converter so the board runs from the same 12 V rail, a 74AHCT125 level shifter to lift the 3.3 V data pin to the 5 V the strip expects, and fuses on each output.

Two details that catch people out:

  • Level shift the data. An ESP32 speaks 3.3 V. The strip wants a 5 V data signal. Without a shifter it often works on the bench, then flickers the moment the chain gets long.
  • Add a series resistor. A 33-62 ohm resistor in the data line, right at the first pixel, damps the ringing that long wires pick up.
Wiring diagram showing a 120 V outlet feeding a 12 V 350 W power supply, a 25 A main fuse, a plus-12-volt bus with a 5 A fuse per reel, two WLED controllers with level shifters, four stacked SK6812 reels fed at both ends, a shared ground bus, and a data chain running reel to reel
The wiring: one 12 V supply, four fused branches, one shared ground, and a single data chain through all four reels. Diagram by Oddbyte.

Home Assistant

Once the controllers are on the network they are offered to Home Assistant as lights. You get on and off, brightness, colour and WLED’s effects, plus scenes, schedules and voice – with no YAML unless you want it. Because WLED does the driving, the shelf stays a working light even if Home Assistant or the network is having a bad day.

Reading the collection document

The collection site already publishes a shelf document at https://slc.lindahl.us/api/shelf.xml. It is not a generic export – it is written for exactly this display, and it hands you the hard part:

  • lights-per-cubby="4" – the four-lights-per-cubby model, already agreed.
  • Each cubby carries its slot, row, column, the first-pixel index it starts at, and how many pixels it owns.
  • Each category carries a colour and a flag for whether it is currently lit.

The server also sends cache-control: max-age=2, which is a polite way of saying “poll me every couple of seconds”.

One thing has to move first. The document describes the shelf as it stands today: cubbies="143", pixels="572", an 11 by 13 grid. Growing the display to 300 means the grid – and therefore rows, columns and cubbies – has to grow with it, so the cabinet and the site agree before anything is wired.

After that, the slot-to-pixel mapping is already solved in the document. WLED does not read XML, so a small bridge sits between the two: fetch the document, walk the cubby list, work out each cubby’s colour, and push the RGBW values to both controllers. The colour rule simply mirrors the site’s own logic – a cubby is lit when the whole shelf is on or when one of its categories is active, and it takes its category’s colour, or warm white when the shelf is in natural mode.

That bridge is a few dozen lines of Python. It can live anywhere that stays powered on, including as a Home Assistant shell_command, a pyscript app, or a small systemd service on a machine you already run.

Control flow diagram: the shelf XML feed at slc.lindahl.us is read by a Python bridge, which sends E1.31 data to two WLED controllers driving 1200 LEDs, with Home Assistant controlling WLED through its native integration
How it is driven: the collection's XML is the source of truth, WLED does the driving, and Home Assistant is the remote control. Diagram by Oddbyte.

Parts list

  • TF-LIGHTING SK6812 RGBW 12 V strip, 60 LED/m – four reels (you have three; add one)
  • 12 V, 350 W DC power supply (Mean Well LRS-350-12 or similar)
  • Two WLED controllers – 12 V-ready boards with a 5 V buck and 74AHCT125 level shifting
  • Inline blade fuse holders: one 25 A and four 5 A
  • 18 AWG wire for reel feeds and injection; 14-16 AWG from the supply to the fuse block
  • 3-pin JST-SM or screw terminals, plus wire ferrules for stranded ends
  • 1000 uF / 25 V electrolytic capacitor at each reel’s first pixel
  • 33-62 ohm resistor on each data line
  • A ventilated project box to house the supply and controllers

Rules worth following

  1. Fuse every +12 V feed, on the positive wire, close to the supply.
  2. Feed each reel at both ends – a single feed for 1200 pixels will go orange and dim at the far end.
  3. Share one ground between the supply, the controllers and the strips.
  4. Keep the data wire short, level-shifted, and away from the power runs.
  5. Never power the strip while it is still coiled on the reel; it cannot shed the heat.
  6. Keep total draw under about 80% of supply capacity, with firmware limiting as the backstop.

Nothing here is exotic: one supply, two controllers, four fused feeds, and a data chain that runs the length of the shelf. The diagrams above are the whole story – everything after that is configuration.

Similar Posts