Skip to main content

Toro Tempus Air

Driver: toro_tempus_air

Cloud-only smart irrigation control for the Toro Tempus Air controller family (Tempus 4, Tempus 8, Tempus 12, Tempus 16). The Tempus Air gateway phones home to the MyToro cloud; there is no local LAN API, so all commands flow through api.mytoro.com.

Prerequisites

  • A MyToro cloud account that already has the Tempus Air controller paired through the MyToro mobile app.
  • The controller online and reachable from the internet. If the WAN is down, no commands will land.
  • Two-factor authentication disabled on the MyToro account (or a long-lived app password, if Toro adds 2FA in the future).

Setup steps

  1. Open the MyToro mobile app and confirm the Tempus Air controller is paired and reporting status.
  2. In GEM, add a device:
    • Driver: toro_tempus_air
    • username: your MyToro account email
    • password: your MyToro account password (stored encrypted)
  3. If your MyToro account has more than one site / controller, run get_sites from the Script Console and copy the desired site id into the site_id device attribute. Single-controller accounts auto-select.
  4. Run get_zones — you should see a list of zones with numeric ids and labels.
  5. Create one GEM zone per Tempus Air zone. Set the GEM zone address to the Tempus zone id (typically 1 through 16).

Attribute reference

Device attributes

NameRequiredDefaultDescription
usernameyesMyToro account email.
passwordyesMyToro account password (stored encrypted via the secure-attribute pipeline).
api_basenohttps://api.mytoro.comOverride the API base URL. Leave at default unless directed otherwise.
site_idnoSite / controller id. Only required on accounts with more than one site.
status_intervalno60000How often to poll zone state from the cloud. The gateway phones home every 5-10 minutes, so polling faster than that mostly hits cached state.
default_run_secondsno600Default run duration when on is called without a duration argument.

Zone

Address: the Tempus zone id as returned by get_zones (typically a small integer like 1 through 16).

Surfaced zone attributes:

  • stateon (zone is currently watering) or off
  • remaining_seconds — seconds left in the current run, when known

Commands

CommandArgsNotes
onaddress, duration (seconds)Start a manual run on a zone. Duration defaults to default_run_seconds and is capped server-side at 4 h.
offaddressStop a running zone immediately.
stop_allStop irrigation on every zone for this site.
get_zonesList irrigation zones for the configured site.
get_sitesList sites / controllers visible to this account.
get_statusaddressRead the current valve state and remaining run time for one zone.
pause_scheduleTODO — endpoint shape unverified against vendor docs. Returns not yet implemented.
resume_scheduleTODO — endpoint shape unverified against vendor docs. Returns not yet implemented.

Known limitations

  • Cloud only. No local LAN API exists on Tempus Air. WAN outage means no control.
  • Polling latency. Cloud state can lag wire state by several seconds because the gateway batches state updates. The status polling loop catches up at status_interval.
  • Schedule editing is out of scope. Use the MyToro app or web portal for schedule create / modify / delete. This driver only does ad-hoc manual runs and reads.
  • Some command paths marked TODO. pause_schedule and resume_schedule are listed in getCommands() for discoverability but return not yet implemented until the vendor publishes a verified API reference. Honest stub is preferred over fabricated endpoints.

Troubleshooting

  • 401 on every request. Confirm the email / password by signing into the MyToro mobile app. If 2FA is now enabled on the account, this driver will not work until Toro publishes an app-password mechanism.
  • get_zones returns an empty list. site_id may be wrong on multi-controller accounts. Run get_sites and copy the correct id.
  • Manual run lands but never stops. The Tempus controller enforces server-side max run durations; pass duration explicitly on the on command rather than relying on default_run_seconds.
  • Login succeeds, every other call returns not found. Likely an api_base override pointing at a stale endpoint. Reset api_base to the default and retry.