Husqvarna Automower
Cloud driver for Husqvarna's robotic lawn mowers (Automower 305 / 315 / 415X / 430X / 450X / 520 / 535 / 550 and the Gardena Sileno line, which shares the same cloud back-end). GEM uses the official Automower Connect API on the Husqvarna Developer Portal — there is no LAN protocol on these mowers, and the unofficial protocols from older models are not supported.
Useful for landscape macros that want to suspend mowing while irrigation runs, or scenes that send the mower home before a security perimeter arms for the night. Not suitable for real-time control during a mowing pass — the cloud's view of the mower lags by 10s–60s depending on how the mower is reporting in.
Prerequisites
-
A Husqvarna Group account that owns one or more Automower / Gardena Sileno mowers. The mowers must already be paired and reachable from the official Automower Connect mobile app.
-
A Developer Portal application at https://developer.husqvarnagroup.cloud/. After creating the application, add both:
- the Authentication API, and
- the Automower Connect API
to the application's allow-list. A missing API in that list is the single most common cause of "token mints but every call returns 403."
-
Outbound HTTPS reachability from GEM to
api.authentication.husqvarnagroup.devandapi.amc.husqvarna.devon port 443.
The free developer-portal tier is generous (about 10 000 calls / month per application) but per application, not per mower. One application that polls four mowers every five minutes uses ~34 000 calls / month — bump the poll interval to 10 minutes if you exceed the quota, or split mowers across two applications.
Setup steps
- Create the developer application. Sign in at https://developer.husqvarnagroup.cloud/, click New application, name it something memorable, then on the Connected APIs tab add the Authentication API and Automower Connect API. Copy the Application Key and Application Secret from the application page.
- Add the device. Admin → Devices → Add.
- Driver:
husqvarna_automower - Name: e.g. Automower Fleet
- Subsystem:
automower(or whatever you have configured for landscape devices) - Paste the application key into Application Key and the secret into Application Secret. Both
api_baseandoauth_baseshould be left on their defaults.
- Driver:
- Discover mowers. Script Console →
command get_mowers. The response is a JSON-API envelope; eachdata[]entry has anid(UUID) and anattributes.system.nameshowing the mower's friendly name. - Create zones. Add one zone per mower with:
- Address: the mower
idUUID fromget_mowers - Subsystem: typically
automowerorgarden
- Address: the mower
- Sanity check. Open the zone and trigger
startwith adurationof 5 (minutes). The mower should leave the dock within seconds; the zone state will moveparked→leaving→mowingas polling catches up.
Attribute reference
| Attribute | Required | Default | Notes |
|---|---|---|---|
api_key | yes | — | Husqvarna Developer Portal Application Key. Sent as the OAuth client_id and as the X-Api-Key header on every call. |
api_secret | yes | — | Application Secret. Used only during the OAuth token exchange. Secure — stored encrypted at rest. |
api_base | no | https://api.amc.husqvarna.dev/v1 | Automower Connect REST endpoint. |
oauth_base | no | https://api.authentication.husqvarnagroup.dev/v1 | OAuth token endpoint. |
status_interval | no | 300000 ms (5 min) | Polling cadence. Minimum effective value is 60 000 ms. |
request_timeout | no | 15000 ms | Per-request HTTP timeout. |
Zone address format
Each zone's address is the mower id UUID returned by get_mowers:
zone.address = "c7233734-b219-4287-a173-08e3643f89f0"
Mower IDs are stable across reboots and firmware updates but change if the mower is unpaired and re-paired in the mobile app. Re-discover with get_mowers if zones go silent after a re-pair.
Commands
| Command | Args | What it does |
|---|---|---|
start | address, duration (minutes, default 180) | Posts a Start action — the mower leaves the dock immediately and mows until duration minutes elapse or it returns to charge. |
pause | address | Mower stops in place. It will resume on the next schedule event unless you also send park_until_further_notice. |
park | address, duration (minutes, optional) | If duration > 0, parks for that many minutes and then resumes the schedule. With no duration, parks until the next schedule event. |
park_until_further_notice | address | Indefinite park — the mower stays in the dock until you call resume_schedule or start. |
resume_schedule | address | Clears any park / pause override and returns the mower to its configured schedule. |
get_status | address | Returns the full JSON-API record for the mower (mower mode, battery percent, error code, planner overrides, last status timestamp). |
get_mowers | — | Returns the full list of mowers visible to the application. Use this whenever you need to confirm an address. |
Activity state mapping
The Automower Connect API reports a mower's activity as a string; the driver normalises it onto the zone state attribute:
Husqvarna activity | GEM state |
|---|---|
MOWING | mowing |
LEAVING | leaving |
GOING_HOME | returning |
CHARGING | charging |
PARKED_IN_CS | parked |
STOPPED_IN_GARDEN | stopped |
NOT_APPLICABLE | unknown |
| anything else | lowercased raw value |
The driver also surfaces battery_level (0-100), online_state (online / offline) and error_code (integer) onto the zone whenever the cloud reports them. Error code 0 means no error; any non-zero value matches the table in Husqvarna's mobile-app error documentation.
Known limitations
- No realtime push. The Automower Connect API offers a WebSocket, but it is gated behind a separate per-application approval — the driver uses polling only. This is fine for landscape automation but unsuitable for "follow the mower live" telemetry.
- No schedule editing. The current driver exposes start / pause / park / resume actions but does not modify the mower's stored mowing schedule. Edit the schedule in the official app.
- No headlight / cutting-height control. Both are exposed by some mower models in the cloud API but not yet wired into commands.
- No Gardena-specific extensions. Although Gardena Sileno mowers share the Automower Connect API and work fine with this driver, the Gardena-branded extensions (e.g. mower-with-irrigation linkage) are reached through a different API and are out of scope.
Troubleshooting
| Symptom | Where to look |
|---|---|
401 unauthorized when minting tokens | Application key or secret is wrong, or the application does not have both Authentication API and Automower Connect API added on the developer portal. Add the missing API and try again. |
Tokens mint but every API call returns 403 | The Husqvarna account that owns the application has no mowers linked, or has not accepted the Automower Connect license. Sign in to the Automower Connect mobile app at least once with that account. |
get_mowers returns an empty data: [] | The account has no mowers paired. Pair the mower in the Automower Connect mobile app — the developer-portal API reads from the same account graph. |
start / pause / park returns success but the mower never moves | The mower is out of cellular / Bluetooth coverage. The cloud accepts the command and returns 202 Accepted but never delivers it. Confirm in the mobile app that the mower is showing live state. |
429 Too Many Requests | You are exceeding the per-application monthly quota (~10 000 calls). Raise status_interval, or split mowers across two developer-portal applications. |
Zone state shows unknown even though the mower is mowing | The mower is reporting NOT_APPLICABLE — usually a transient state during firmware-driven schedule changes. Wait one poll cycle. |
Related
orbit_bhyve— irrigation controller often paired with mowers in landscape macros (suspend irrigation while mowing, etc.).opensprinkler— the OpenSprinkler equivalent for irrigation pairing.