Skip to main content

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.dev and api.amc.husqvarna.dev on port 443.

tip

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

  1. 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.
  2. 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_base and oauth_base should be left on their defaults.
  3. Discover mowers. Script Console → command get_mowers. The response is a JSON-API envelope; each data[] entry has an id (UUID) and an attributes.system.name showing the mower's friendly name.
  4. Create zones. Add one zone per mower with:
    • Address: the mower id UUID from get_mowers
    • Subsystem: typically automower or garden
  5. Sanity check. Open the zone and trigger start with a duration of 5 (minutes). The mower should leave the dock within seconds; the zone state will move parkedleavingmowing as polling catches up.

Attribute reference

AttributeRequiredDefaultNotes
api_keyyesHusqvarna Developer Portal Application Key. Sent as the OAuth client_id and as the X-Api-Key header on every call.
api_secretyesApplication Secret. Used only during the OAuth token exchange. Secure — stored encrypted at rest.
api_basenohttps://api.amc.husqvarna.dev/v1Automower Connect REST endpoint.
oauth_basenohttps://api.authentication.husqvarnagroup.dev/v1OAuth token endpoint.
status_intervalno300000 ms (5 min)Polling cadence. Minimum effective value is 60 000 ms.
request_timeoutno15000 msPer-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

CommandArgsWhat it does
startaddress, 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.
pauseaddressMower stops in place. It will resume on the next schedule event unless you also send park_until_further_notice.
parkaddress, 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_noticeaddressIndefinite park — the mower stays in the dock until you call resume_schedule or start.
resume_scheduleaddressClears any park / pause override and returns the mower to its configured schedule.
get_statusaddressReturns the full JSON-API record for the mower (mower mode, battery percent, error code, planner overrides, last status timestamp).
get_mowersReturns 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 activityGEM state
MOWINGmowing
LEAVINGleaving
GOING_HOMEreturning
CHARGINGcharging
PARKED_IN_CSparked
STOPPED_IN_GARDENstopped
NOT_APPLICABLEunknown
anything elselowercased 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

SymptomWhere to look
401 unauthorized when minting tokensApplication 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 403The 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 movesThe 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 RequestsYou 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 mowingThe mower is reporting NOT_APPLICABLE — usually a transient state during firmware-driven schedule changes. Wait one poll cycle.
  • orbit_bhyve — irrigation controller often paired with mowers in landscape macros (suspend irrigation while mowing, etc.).
  • opensprinkler — the OpenSprinkler equivalent for irrigation pairing.