Technanigans | Holiday Roof Lights


Holiday Roof Lights

Sep 25, 2022

Holiday Roof Lights

Last year I purchased everything I needed to put up some custom individually addressable LEDs on the roof of my new house but I never got around to it. So this year i've decided to dig out the parts bins and see if I can't get this all working.


  • ESP32 - Microcontroller to well, control everything
    • Probably going to install WLED since it integrates well with home-assistant and is super easy to use
  • WS2811 - single pixel style individually addressable LEDs
    • These seemed like they would be easier to put up compared to installing permanent LED light strips (which I may still eventually do)
  • A power supply - 5V 30A
    • Probably overkill for the first run, but I intend to run more than just this one set eventually
  • 18/4 AWG wire to the beginning on the initial strand of pixels (since 18/3 was for some reason more expensive at the time)
  • 18/2 AWG wire for power injection



  • RGB Pixel Spacing = 3 inches

  • Fist run roof length = 40 feet = 480in

  • Pixels needed = Length of run (in) / spacing (in)

  • Pixels needed @ 3in spacing = 160

  • Pixels needed @ 2in spacing = 240

Since the pixel strands come in sets of 50, let's shoot for some spacing between 2-3in

  • Spacing (in) = Length of run (in) / Number of pixels
  • Spacing for 200 pixels = 2.4in
    • Seems good enough to me

Let's go

Time to hook everything up. The most annoying process of running long strands of leds is that you usually need to "power inject" every so often to prevent voltage drop. Why manufacturers don't just include another parallel wire pre ran for this is very frustrating since I feel like it would add to the cost of the led strips all that much but what do i know.

Setting up the microcontroller

I swear every time I have to do something with an arduino based or similar board for some reason the drivers on my computer have to be re-installed in order to interact with it.

I thought it was going to be as simple as:

  • visit the wled website
  • download the firmware
  • flash the firmware
  • done

Instead we hit a stupid road block that for some reason wouldn't allow me to flash the firmware to the esp32 so I gave up for the night

Day 2 I came back and realized there was another option for installing the firmware that didn't require the use of 3rd party tools. You just have to be using google chrome, not firefox lol. Anyways there was literally a single button to install the wled firmware onto the esp32 from the browser, you just have to give it permission to interact with the serial port or whatever.

So it turns out the real steps for this were

  • visit the wled installer website
  • click the install button
  • profit

Connecting the lights together

Alright here is the most painstaking process of the day, now I'm sure this is fun for some people but I don't do it enough to really be that good at it or enjoy it, It's soldering time.

In order to run the power injection wires, well we gotta connect them somehow and that somehow needs to be waterproof. So I decided to solder them and cover them in heat shrink tubing. Oh and hot glue (for waterproofness) lots of hot glue.. that stuff gets everywhere I swear. Maybe my technique is once again very wrong just like soldering. But hey, it works!

Installing the lights on the roof

I bought some of those regular christmas roof light gutter clips. It only took experimenting with about 3 different versions to find ones that actually fit these pixels since they're definitely not a standard christmas light size or anything.

After we got them all clipped on the gutter and hung the main cord off the side of the house in a very "temporary" fashion, we plugged everything in and wouldn't ya know. It just worked.

Now we should just route that final cable in a better more permanent way, but that's a job or another day. Or never. Who knows..


Wiring Diagrams:




Setting up the microcontroller:


My "temporary" soldering exhaust fan:


My "workbench" for the day:


Testing the lights:


End result: