express your wrath digitally
angerlights.com is served directly from a beta Rascal Micro single-board web server.
Dyn provides dynamic DNS for angerlights.com, which allows the site to work from my home Internet connection. All port 80 requests to the angerlights.com domain are forwarded directly to the Rascal (this is all configured on my stock wireless router).
There's actually a second server involved: a WiFi webcam with an onboard web interface. It provides the live image of the anger lights you see on the main page. The Rascal grabs the live image (using the urllib.urlretrieve() function from urllib Python library) whenever one of the buttons is pressed on the main page. This way, all outside traffic is kept to just the Rascal and the router, and we don't have to worry about somehow getting HTTP requests from the router to both the Rascal and the webcam.
A constraint I placed on this project was that I didn't want any ethernet cables running from the Rascal (by my router) to where the anger lights sit in the next room. For aesthetics. This means I had to make the anger lights wirelessly commandable. Fortuitously, I had designed a board to control a giant 7-segment countdown clock for New Year's Eve. A leftover of these boards was perfect for controlling the anger lights. It receives serial commands from the Rascal over an XBee 802.15.4 wireless interface. The serial line feeds into an Atmega48 microcontroller, where it is parsed. Depending on how I program the microcontroller, these serial commands can toggle any of 14 relays tied to its digital output channels.
The board is just mounted inside the grey box. In this particular case, the microcontroller is configured to toggle one of 4 appointed relays when it sees any of the strings "sa", "se", "sk", or "sg" come in over the serial line - one command for each of the 4 light bulbs. Of course, I had to preserve the original functionality of the box too. The 4 toggle switches on top are still functional; they are wired in parallel with the relays.
On the Rascal end, I used an Arduino XBee shield, which transparently takes serial commands sent by the Rascal's serial port (e.g., send_serial("sg")) and feeds them into the TX and RX pins of a mating XBee module. This stack of boards resides on top of the Rascal.
The end result: a completely wireless anger lights setup! All it needs is a wall power outlet; it can be put anywhere within range of the XBee and webcam. Sort of a movable interactive art display for any shelf in my house, that happens to be controlled by strangers on the Internet.
engineered with love by Eerik