The two sprinkler zones nobody knew existed
Full local control of an OpenSprinkler controller — written against the official API, verified against real hardware, and decoding the program schedules the previous plugin got wrong.
Not in the HomeSeer store yet — running here daily, and heading for the store as a beta.
OpenSprinkler is open hardware with a genuinely documented local API, which after several reverse-engineering projects in a row feels like a holiday.
It replaces an abandoned plugin that had not been touched in years, and deliberately does not touch that plugin's devices — migrating somebody's irrigation automation without asking is not a decision a plugin gets to make on its own.
What "better" means, concretely
Vague claims about improvement are worthless, so the list is specific:
- The device password lives in the encrypted secret store, not in a cleartext ini file.
- Every station the controller has — including two the old plugin never created at all, which is the sort of thing you discover when a zone you have been watering by hand for a year turns out to have been addressable the whole time.
- Program schedules decoded correctly. Interval programs are not "Runs: Sat". The old plugin read the schedule bitfield as weekdays regardless of program type, so an every-third-day program displayed as a weekly one, confidently and wrongly.
- Watering history, water level, weather visibility, rain delay with an end time, pause, and stop-all — the whole documented capability surface rather than the convenient third of it.
- Outcomes in the log, and health checks that name both the problem and the remedy.
Written against the spec, verified against the hardware
The parsing was written from the official firmware 2.2.1(5) API reference and then verified against the real controller. Where the documentation and the live behaviour disagreed, the live behaviour won and the disagreement is noted in the code.
The parsing layer deliberately contains no HomeSeer SDK references at all, so the test suite links it directly and runs with no HomeSeer instance and no controller on the network. Tests that require the hardware to be present are tests that stop being run.
The write side, documented before it was needed
Reading a device is easy; writing to it safely is where the care goes. So the write endpoints got their own document before any restore feature existed — station names and attributes, per-board bitfields, the special-station markers that deliberately are not restored yet.
The single most important line in it: omitted fields stay unchanged. Which makes a partial write safe, and also means a restore that forgets a field will silently leave the old value in place and look like it worked. Precisely the kind of thing to establish before finding out.
Why local matters here more than elsewhere
Irrigation is the one place in a house where a cloud outage has physical consequences. Either the garden does not get watered, or it gets watered enthusiastically during the rainstorm you were trying to skip.