Ronald McCollam
Selected Projects

Dryer Sensor and Notification System

I live in a multifamily house with shared laundry in the basement. This means that the folks up on the third floor have to travel down four flights of stairs to check if their laundry is finished, possibly multiple times if they misjudged the time!

This project is a simple ESP8266-based system with an accelerometer (to detect when the dryer starts and stops) as well as a keypad and display to allow members of the house to choose who should be notified and how (SMS or email). When the dryer changes state or someone presses a button on the keypad, the display is updated and an MQTT message is sent to a server that can then perform the actual notification.

The code for this project is available on my GitHub.


Working for, I needed a way to demonstrate that we can safely update devices that are accessible only remotely. What better way to show this off by having a device that I can carry with me but still never access in any way other than wirelessly? The USB and Ethernet ports are all filled and the SD card is embedded with the device inside a block of solid epoxy, so the only way to access it is remotely -- even when I have it in my hand!

Detailed notes and instructions for building this are available at

Raspberry Pi Alarm Clock

I have been using a Chumby as an alarm clock for many years. Unfortunately, the company has gone out of business so its continued support is unlikely. And when it dies, I'll need a replacement.

I'm currently building a smart alarm clock featuring a touchscreen, multiple applets, hardware buttons (for snooze, returning to the home screen, and several multi-purpose buttons available to individual applets) based on Node.js and Electron on a Raspberry Pi 3.

This will be a platform that can continually evolve as applets are self-contained (though can assign some of the physical buttons to their own purposes) and can be updated remotely via

The code for this project is available on my GitHub.

Home Automation

With the explosion of Internet of Things devices — appliances with IP addresses — it's become a real issue to keep them all working together seamlessly. Each individual vendor wants you to use their application (and only their application) to control your devices. But no vendor makes everything, and no home has only one vendor's equipment.

Fortunately, it's not at all difficult to put together a set of scripts to control multiple devices from one central location. It is, admittedly, much harder to do this in a general way. (I wasted entire weekends trying to set up and configure various home automation tools and never got them working correctly.)

My epiphany came when I realized I didn't need to have a general purpose system. I just wanted to be able to control my lights, my stereo, and my projector. Building "cheap code" for cheap devices makes this much easier!

I've described my system (complete with geeky Star Trek touchscreen controls) and put the reusable bits of my home automation system up on GitHub.

Programmatically Edit eBooks

During my time at Libboo, I created a system to reward readers for sharing their favorite authors' books. The reward was personalized copies of books that could be given away to encourage other people to discover the authors' works. (This system was so successful it was spun out into a top-level project of its own, InstaFreebie!)

As part of the reward system, the ebooks needed to be modified automatically to add the personalization and some watermarking. Unfortunately, I couldn't really find an easy way to add a page to an ebook — all the existing software was geared to creating something new rather than updating an existing work. The only product I found that would allow in-place editing wasn't scriptable.

Fortunately, the epub standard is well documented. So I created a script to modify a book in-place, adding pages at given intervals without causing errors that would prevent the book from being read.

Additional Power Hardware Support for Metal as a Service (MaaS)

MaaS generally requires enterprise-grade hardware to work. But for playing with it at home, I wanted to use something a lot cheaper! So I added support for a new networked power switch to the upstream open-source project.

This project involved shell scripting, Python, and a bit of tinkering with the RESTful interface to the power switch.

The code for this project is available on Launchpad