The Background

My parents' house has a sprinkler system with a Hunter Pro-C irrigation controller. While it dutifully waters the lawn every other spring and summer morning, come winter it becomes a major hassle when I need to flush the pipes with compressed air. Due to the layout of the property, I found myself repeatedly scrambling between the basement and the front yard, turning on and off each zone multiple times. This got old, fast.

If only there was a way to add remote control capability… then I could enable the zones from the front of the house.

It turns out that Hunter sells a dedicated remote add-on, but I found its $250 MSRP hard to stomach for something I would use only once per year.

Also, this is the 2020’s. If there is something in your home which can be controlled remotely, there is going to exist a smartphone app for it. Having to use a dedicated sprinkler remote feels decidedly last-millennia.

While I could replace the entire PRO-C unit with a new smart controller (e.g. Rachio), there was nothing wrong with the old one. It already contained all the hardware needed for driving the sprinkler valves. All I needed to do was piggyback on the interface used by the official remote control accessory.

The Protocol

Having not shelled out for the official Hunter ROAM-KIT remote, I was left wondering what sort of communication protocol it was using between the receiver and the controller. Since there is only one signal pin (labeled REM), I was suspecting UART, but had no way of probing it to find out.

Fortunately, some internet searching quickly led me to this page by Scott Shumate, who had already gone through the effort of reverse-engineering the protocol for his Esquilo Air project. He even went as far as to write a library and design an adapter shield for it, which you can read about in the aforementioned writeup. While it appears that the Esquilo and accompanying shield are no longer available, the source code can still be found buried in GitHub.

The libraries for the Esquilo board were written in the Squirrel scripting language (Esquilo is Squirrel in Spanish). Therefore, it took a bit of massaging to understand what the code was doing. One comment in the original post included a helpful Arduino sketch which translated the functions to C.

In short, the Hunter remote protocol is a custom interface akin to the Dallas 1-Wire bus. By messing with the baud rate, the Esquilo library uses the microcontroller’s UART to achieve the necessary bit timings. Based on the library code, the protocol itself appears quite “robust” with rather large (and sparse) data packets. It is possible these unused bytes actually do have some function, but as far as I’m aware it hasn’t been documented anywhere.

- to be continued -