I’ve been fascinated with E Ink displays since I first used a Kindle. And I’ve been equally interested in smart home devices that display information in subtle ways since the first time I connected a Squeezebox music player to my home weather station and created a clock that also displayed the current temperature. (I use a Lametric Time for that now.)
So when John Gruber wrote about an E Ink status project by classic Mac developer John Calhoun, I was suddenly taken with the idea of building an E Ink status board of my own. It took a few months, but I finally got there.
Like Calhoun, I decided to use this GitHub project by Louis of 13Bytes as the basis for my project. Unlike Calhoun, I didn’t really want to create something that looked like a classic Mac—though I appreciated his creativity and artistry. I actually liked the original project’s embrace of the classic desk calendar look and thought I’d at least start there.
The project works by writing text and graphics to image files (using Python, which I’ve been learning) and then writing the images to the E Ink display.
I made a bunch of customizations to the original script beyond basic font and layout tweaks. The primary task of the display is to show upcoming family calendar events, but the original script used iCal shared calendars, and we use Google Calendar. So I built in Google Calendar integration. I had already built a Python script that accessed Google Calendar for a different project, and was able to re-use that code. Then I added the current day’s weather forecast via Apple’s WeatherKit API.
Along the way, I had to grapple with a bunch of small challenges. Google Calendar doesn’t supply times for all-day events, so I had to invent them, which led to a challenge because all its events are listed in the UTC time zone. (If I defined an all-day event as beginning at midnight UTC, it would be listed as part of the previous day because my local time zone is seven or eight hours behind UTC. I ended up having to convert every event to my time zone, then insert all-day events, then sort them all together!)
Perhaps my favorite feature of the calendar was inspired by Calhoun, whose faux-Mac interface displayed a bulging Trash icon when it was trash-collection day. On our trash collection days, the local refuse company collects a paper bin and a glass-and-plastic-container bin on alternating weeks. To remind ourselves of which is which, we created two every-other-week events in our calendar. If it’s trash night, my script reads the event’s name to determine if it’s paper or containers, omits that event from the calendar listing, and instead displays a large icon to indicate which bins need to go out.
And recently, I added a subroutine that changes the display if it’s a holiday (either one from the official list or from a list of family-specific celebrations like birthdays and anniversaries).
One unfortunate thing about a project like this is that a bare E Ink display and a Raspberry Pi are a loose assortment of electronic parts, not a cohesive unit. Fortunately, the originator of the eInkCalendar project designed and 3-D printed a case—and put the 3-D model files in his open-source project on GitHub. I used the Craftcloud 3-D printing clearinghouse to order one.
The result is a little homely, but it works, and it allowed me to mount the display inside a frame and attach the Raspberry Pi on the back so it won’t fall off.
What I’d really like is for clever people out there to sell kits with everything—display, Raspberry Pi, and 3-D printed case—so I didn’t have to put it all together myself. Or at the very least, for people to build more awesome 3-D printable enclosure designs, like this one.
Am I satisfied with where I’ve ended up with my new kitchen E Ink calendar? Not really. There’s more screen space left over and more data sources to be hooked up. There are also more E Ink displays out there to be explored. I pre-ordered this one. What will I use it for? I have no idea. But I’m pretty confident I’ll figure something out.
- These days, Raspberry Pis are in short supply because of supply chain issues. I suspect it’s because they’re constructed almost entirely out of parts from legacy nodes. ↩