Skip to main content

Rachio Smart Sprinkler

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

  1. Create a device in GEM with driver rachio.
  2. Set the api_key attribute to the Personal API Key from the Rachio app.
  3. (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.
  4. 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)
  5. Run the get_zones command on the device to list the Rachio zoneId / name pairs.
  6. Create one GEM zone per Rachio zone. Set zone address = the Rachio zoneId (UUID).

Attributes

Device — required

AttributeTypeDescription
api_keystring (secure)Personal API Key from the Rachio app.

Device — optional

AttributeTypeDefaultDescription
device_idstring(auto)Rachio controller UUID. Auto-populated to the first controller on the account if blank.
default_run_durationint600Seconds used by the on / start_zone command when the caller omits a duration. Range 60-10800.
status_intervalint (ms)30000Polling 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

CommandArgsDescription
get_devicesLists all controllers on the account (id, name, model, serial, status).
get_zonesLists zones on the active controller (id, zoneNumber, name, enabled).
on / start_zoneaddress, duration?Starts watering the given Rachio zone for duration seconds. Defaults to default_run_duration.
off / stop_waterStops ALL watering on the controller. The Rachio API has no per-zone stop.
rain_delaydurationApplies a rain delay for duration seconds. 0 clears any active delay.
standby_onPuts the controller into standby (suspends scheduled programs).
standby_offTakes the controller out of standby.
get_current_scheduleReturns 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

SymptomCheck
401 UnauthorizedRe-generate the Personal API Key in the Rachio app — keys can be revoked when the account password changes.
No zones discoveredConfirm 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 RequestsIncrease status_interval. Rachio enforces a daily call cap per account (~1700/day at time of writing).
Zone state never flips to onVerify the GEM zone address matches the Rachio zoneId exactly (UUID, case-sensitive). Use get_zones to grab it.