How to Hack Christmas Lights for Custom Holiday Lighting Patterns
General Electric isn't known for their Christmas lights, but maybe they should be, because their GE Color Effects are pretty awesome. Especially the LED Color Effects G-35 String sets. And especially when someone named Darco hacks them.
Darco, whose real name is Robert Sun Quattlebaum, reverse-engineered (i.e. hacked) his set of 50 lights to show his own lighting pattern. And for all of you planning to decorate your house with holiday lighting, this is the only true way to have a unique display.
Here's what Darco has to say about his hacked Christmas lights:
This string contains fifty "bulbs". Each bulb contains a red, green, and blue LED—allowing for any color to be produced. The biggest drawback is how you control them: there are 14 pre-set "programs" that you can select, and they are all pretty lame. However, with a little reverse engineering and an Arduino (or any other microcontroller) they can be made into the coolest Christmas lights on the block. If you buy several strings, you could easily make a large 2D LED array. The possibilities are endless. At $59.99USD for a string (A tad over $1 per node), these things are a steal for what you can do with them.
I wanted to share my efforts so that other people can give this a try. At the end of the post I have a link to the code I'm now using to drive my Christmas lights. Feel free to use it for your own hacking endeavors.
So far I've reverse engineered both the radio protocol and the protocol used on the LED data bus. Of the two, the LED data bus protocol is by far the most interesting. So, that's where I'll start…
There are three wires connecting all of the "bulbs" in the string: +5V, Data, and Ground, respectively. The wire isn't really marked for polarity, but the order I mention is from looking at the wire going into the first bulb from the controller box with the bulb facing up. I've labeled the wires in the following photo:
Each bulb has an address numbering from zero to fourty-nine, with bulb zero being the bulb closest to the control box.
The protocol on the data line is simple and self-clocked. Here are the low-level details:
- Idle bus state: Low
- Start Bit: High for 10µSeconds
- 0 Bit: Low for 10µSeconds, High for 20µSeconds
- 1 Bit: Low for 20µSeconds, High for 10µSeconds
- Minimum quiet-time between frames: 30µSeconds
Each frame is 26 bits long and has the following format:
- Start bit
- 6-Bit Bulb Address, MSB first
- 8-Bit Brightness, MSB first
- 4-Bit Blue, MSB first
- 4-Bit Green, MSB first
- 4-Bit Red, MSB first
From this we can see that we have a color depth of 12 bits. Not terribly great, but this should still be plenty for our purposes. What is interesting is the Brightness field. This field acts a bit like a multiplier and enables smooth fade-ins and fade-outs.
Bulb address 63 can be thought of as the "broadcast" bulb, except that it only changes the brightness level—the color fields are ignored. Bulb addresses 50-62 are ignored under normal circumstances.
Each frame takes 820 µSeconds to transmit. Since there are 50 bulbs, that means that takes a minimum of 41 milliseconds to individually update every bulb. This gives us a maximum refresh rate of slightly more than 24Hz. Not bad.
It turns out that the data line is not a continuous wire of copper thru the whole string. Each bulb contains a microcontroller with two data lines: one is an input, and one is an output.
When the string first powers up, all bulbs are in the "enumerate" state. When in this state, the first command received is used to tell the bulb what its address is. Once the address is set, all subsequent commands are forwarded to the next bulb. This process continues until all bulbs are enumerated and have an address.
Normally, you would want to perform some sort of power-on enumeration which would give each lamp it's own address—but this isn't the only option. The enumeration step allows you to assign any address to any bulb you want—including giving several bulbs the same address. By giving several bulbs the same address, you can control several bulbs with a single command.
There may possibly be a way to force all bulbs back into the enumeration state without power cycling. If this turns out to be possible I'll update this page with the details.
Go to Darco's original post, which has details on bus snooping observations, bugs in the bulbs, notes about voltage, opening the control unit, remote control and software needed.