Cloud integration with Rachio Gen 2 / Gen 3 Smart Sprinkler controllers via the public REST API. The driver enumerates the controller and its zones from the account, polls which zone (if any) is currently watering, and surfaces start / stop / rain-delay / standby commands.
Prerequisites
- A Rachio account with at least one paired Smart Sprinkler controller (Gen 2 or Gen 3).
- A Personal API Key generated from the Rachio mobile app:
- Open the Rachio app → Account Settings → Get API Key
- Tap Generate New API Key and copy the value.
- Treat the key as a password — anyone with it can start watering on the account.
Setup steps
- Create a device in GEM with driver
rachio.
- Set the
api_key attribute to the Personal API Key from the Rachio app.
- (Optional) If the Rachio account has more than one controller, set
device_id to the controller UUID. Leave blank to auto-select the first controller returned by the API.
- Save the device. On connect the driver:
- calls
GET /1/public/person/info to resolve the account person id
- calls
GET /1/public/person/{id} to enumerate controllers and zones (cached as deviceCache)
- starts polling
GET /1/public/device/{deviceId}/current_schedule on status_interval (default 30s)
- Run the
get_zones command on the device to list the Rachio zoneId / name pairs.
- Create one GEM zone per Rachio zone. Set zone
address = the Rachio zoneId (UUID).
Attributes
Device — required
| Attribute | Type | Description |
|---|
api_key | string (secure) | Personal API Key from the Rachio app. |
Device — optional
| Attribute | Type | Default | Description |
|---|
device_id | string | (auto) | Rachio controller UUID. Auto-populated to the first controller on the account if blank. |
default_run_duration | int | 600 | Seconds used by the on / start_zone command when the caller omits a duration. Range 60-10800. |
status_interval | int (ms) | 30000 | Polling cadence for current_schedule. Minimum 10000 to stay under Rachio's daily call cap. |
Zone
- Address required: yes.
- Address format: Rachio zoneId (UUID), e.g.
a1b2c3d4-…. Run get_zones to list them.
Commands
| Command | Args | Description |
|---|
get_devices | – | Lists all controllers on the account (id, name, model, serial, status). |
get_zones | – | Lists zones on the active controller (id, zoneNumber, name, enabled). |
on / start_zone | address, duration? | Starts watering the given Rachio zone for duration seconds. Defaults to default_run_duration. |
off / stop_water | – | Stops ALL watering on the controller. The Rachio API has no per-zone stop. |
rain_delay | duration | Applies a rain delay for duration seconds. 0 clears any active delay. |
standby_on | – | Puts the controller into standby (suspends scheduled programs). |
standby_off | – | Takes the controller out of standby. |
get_current_schedule | – | Returns the currently running zone payload (or empty if none). |
Zone state
Zones are reported as on while their zoneId matches the controller's current_schedule.zoneId, and off otherwise. State changes are pushed via srv.setAttribute('zone', id, 'state', …) from the polling loop, so any GEM trigger / macro / UI subscription works as usual.
Known limitations
- The Rachio API does not expose a per-zone stop —
off for any zone calls device/stop_water, which halts all watering on the controller.
- Saved schedules and flex schedules can be started via the API but are not yet wrapped as commands. Use
get_current_schedule to see what's running.
- Multi-zone start (
zone/start_multiple) is not yet exposed; iterate single-zone starts if needed.
- Rain sensor / freeze skip status from the controller is not yet surfaced as device attributes.
Troubleshooting
| Symptom | Check |
|---|
401 Unauthorized | Re-generate the Personal API Key in the Rachio app — keys can be revoked when the account password changes. |
| No zones discovered | Confirm at least one controller is paired in the Rachio app. Run get_devices to see what the API returns; if empty, the account is not the right one. |
429 Too Many Requests | Increase status_interval. Rachio enforces a daily call cap per account (~1700/day at time of writing). |
Zone state never flips to on | Verify the GEM zone address matches the Rachio zoneId exactly (UUID, case-sensitive). Use get_zones to grab it. |