This post originally appeared in my Techish newsletter on LinkedIn.
This year, the LaCour family embarked upon a major home renovation, updating the main bedroom and creating an amazing home theater. While I was happy about the improvements to the bedroom, I'll be honest, the home theater was definitely the most exciting to me.
Fast forward to the end of our renovation, and we have an awesome place for the family to snuggle up and watch movies, or to catch a F1 race (Forza Ferrari!) with thundering sound on a big screen. Yet, the very first time my wife sat down to use the theater on her own, I got an annoyed text message: "Ugh, Jonathan, WHY do we have SO MANY remote controls?!"
Happy Spouse, Happy House
In my experience, there is no greater spark for innovation than an annoyed spouse. To her credit, my wife was absolutely right β we had way too many remote controls. Six, to be precise. Yes, I know, I have a problem.
My first instinct was to find a "universal remote," but the market is filled with ugly, difficult to use, under-featured options that wouldn't really make life any easier. So, I asked my wife: what is the best remote control you've ever used? She didn't hesitate: "our old TiVo remote control."
The Legendary TiVo Peanut Remote
When TiVo was first introduced nearly 25 years ago, it was a revolutionary concept. I remember the delightful experience of creating a "season pass" to my favorite show, LOST, and knowing that every week, I'd be able to sit down and enjoy an episode, zipping through the commercials.
While TiVo has faded into history with the rise of streaming services and pervasive "DVR" capabilities, its remote control, affectionately called "the peanut," is still a thing of legend. With its distinctive shape and smart button layout, it won awards for its ergonomic design.
Now, I was presented with a challenge. How could I replace six modern remotes and replicate my wife's experience with a non-programmable remote that has been out of production for ten years?
Thinking Like an Engineer
My first order of business was acquiring an old TiVo Peanut. Over the years, TiVo produced many different versions, but their "last hurrah" was the TiVo Slide Pro, released back in 2013. The Slide Pro slides open to reveal a full qwerty keyboard for text entry. More importantly, though, the TiVo Slide communicates to TiVo devices via RF (radio frequency), not IR (infrared).
RF is significantly more reliable than IR as it doesn't require a "line of sight" between the transmitter and the receiver. Late-generation TiVos featured built-in RF support, but older versions only supported IR. As a result, TiVo offered a dongle that plugged into the back of old TiVos via USB so they could use the Slide Pro.
Let's Go Down to Dongletown
I was able to score an unopened TiVo Slide Pro remote with a USB dongle for around $40. Once in hand, I made a discovery β in 2012, an enterprising developer added support for the TiVo RF dongle to the Linux kernel! So, I grabbed a spare Raspberry Pi 4, installed the latest version of Raspberry Pi OS, and plugged in the dongle.
After some tinkering, I was able to communicate with the dongle via the HID (Human Interface Device) API, capturing button presses, releases, and even the action of sliding the TiVo Slide Pro open and closed.
Six Devices, One Remote
Next up, I needed to figure out how to communicate with all six devices in the theater:
- Apple TV
- Zidoo Z9X Android Box
- Pioneer Elite Receiver
- AWOL Vision Projector
- Ceiling Fan
- Lutron Caseta Lighting
For the Apple TV, there is an outstanding Apple TV Python library that offers complete control over the network. The Zidoo Z9X, Pioneer receiver, and Lutron lighting are all able to be controlled over the network using Home Assistant. To control the projector and ceiling fan, I purchased a Broadlink RM4 Pro device, which can transmit arbitrary RF/IR signals, and trained it with their existing remote controls.
Introducing PNut
With all of the tools I needed in hand, I set to work writing some code to put it all together into a usable solution, which I call PNut. I made it general purpose so that anyone can use it, but I also included my own PNut configuration for reference.
I've been using PNut now for a few weeks, and it's pretty wonderful to be able to pick up a single remote and use it to dim the lights, turn on my ceiling fan, power up the projector and receiver, and control my Apple TV to watch the latest episode of The Righteous Gemstones.
Oh, and I'm pleased to report that my wife isn't annoyed anymore. Well, at least not about the remote controls...