Repository navigation
Reference Telemetry
Current state, history, positions, maps, health and reports.
Base path /api/v1/telemetry behind the gateway. Authentication, rate limits and the error format are the same for every service: see Scripting MowDeck. Rendered from apps/web/openapi/telemetry.json (OpenAPI 3.1), which you can also load into any OpenAPI tool.
List Capabilities
Capabilities of every mower of the caller's account that the caller may view and whose gateway has reported them (same bound as the states list).
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerCapabilitiesList
|
List States
Latest state of every mower of the caller's account that the caller may view.
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerStateList
|
Explain Vendor Code
Explain one code of a vendor (the lexicon's key, see GET /error-lexicons), e.g. /error-codes/mammotion/1201?locale=de. An unknown vendor or code answers 200 with known false.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
vendor |
path | string | yes | pattern ^[a-z][a-z0-9_]{0,31}$
|
code |
path | string | yes | min length 1; max length 64 |
locale |
query | string or null | no | Language of the texts (de, en; de-DE works too). Default: the first language of Accept-Language, else en; a language without texts falls back to en. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ErrorExplanation
|
| 422 | Validation Error |
application/json HTTPValidationError
|
List Error Lexicons
The installed error lexicons (vendor key and name, connection kinds, number of codes and of unverified ones, locales); empty while the Device-Gateway does not answer.
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ErrorLexiconList
|
Get Aerial
Whether an aerial photo can be laid under the mower's map, with its credit line, zoom range and the box where tiles are served; enabled: false without a configured source. 404 no-map-yet before the gateway published a map.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json AerialOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Aerial Tile
One aerial photo tile (Web Mercator, XYZ) around the mower's map. Tiles away from the map or outside the zoom range are 404 tile-outside-map, so this is no open proxy; new tiles are rate limited per account (429).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
z |
path | integer | yes | min 0; max 24 |
x |
path | integer | yes | min 0 |
y |
path | integer | yes | min 0 |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
image/jpeg any, image/png any |
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Battery
Battery percentage over time; with step one point per bin (mean, min, max, charging if any). Same ranges and limits as the history.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
from |
query | string (date-time) or null | no | Start of the range (inclusive). |
to |
query | string (date-time) or null | no | End of the range (exclusive). |
step |
query | string or null | no | Bin width such as 5s, 1m, 1h or 1d (date_bin); raw rows without. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json BatterySeries
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Capabilities
What the mower can do over its connection; 404 no-capabilities-yet before the gateway reported it.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerCapabilitiesOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Commands
Status transitions of the mower's commands (accepted, executed, ...), newest first.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
limit |
query | integer | no | min 1; max 1000; default 50
|
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json CommandTimeline
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Mower Error
The mower's current error (MowerState.error_code) in plain words, with the lexicon of its vendor; error is null while it reports none. 404 "no telemetry yet" before the first state.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
locale |
query | string or null | no | Language of the texts (de, en; de-DE works too). Default: the first language of Accept-Language, else en; a language without texts falls back to en. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerErrorOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Explain Mower Codes
Explain codes of this mower (e.g. the error counts of its health page) with the lexicon of its vendor. 404 "no telemetry yet" before the first state.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
code |
query | array of string | yes | Codes as the mower reports them; repeat the parameter for more.; min items 1; max items 20 |
locale |
query | string or null | no | Language of the texts (de, en; de-DE works too). Default: the first language of Accept-Language, else en; a language without texts falls back to en. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ErrorExplanationList
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Browse Mower Lexicon
Browse the error lexicon of this mower's vendor (picked by its cloud provider, else its connection kind): a page of entries in plain words, ordered by code, filtered by text, category, severity and codes, with the counts per category and severity for filter chips. lexicon is null when no lexicon applies or the Device-Gateway does not answer. 404 "no telemetry yet" before the first state.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
q |
query | string | no | Search the code and the texts (every word must match); empty: all.; max length 100; default ""
|
category |
query | MowerErrorCategory or null | no | |
severity |
query | ErrorSeverity or null | no | |
code |
query | array of string or null | no | Only these codes (e.g. the ones this mower reported); repeatable. |
offset |
query | integer | no | min 0; max 100000; default 0
|
limit |
query | integer | no | min 1; max 100; default 50
|
locale |
query | string or null | no | Language of the texts (de, en; de-DE works too). Default: the first language of Accept-Language, else en; a language without texts falls back to en. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ErrorLexiconSearchReply
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Health
Health totals: blade and mowing hours, distance, battery cycles, charge sessions and errors since the first state; 404 no-telemetry-yet when nothing was recorded.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerHealthOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Blade Changes
Recorded blade changes, newest first (at most 100).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json BladeChangeList
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Reset Blade
Record a blade change: the blade hours since the change restart at zero and the threshold reminder is armed again. Works before the first telemetry, too.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
Request body (required): application/json BladeResetIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerHealthOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Set Blade Threshold
Set the mower's blade reminder threshold in hours (can_manage_mowers, like the blade reset); null drops it, so the mower follows its own warning again (device_blade_warn_hours) when it reports one, else the default (MOWDECK_TELEMETRY_BLADE_HOURS_THRESHOLD); blade_hours_threshold_effective names the threshold in effect. The reminder is armed again when the blade hours shown lie below the new effective threshold. Works before the first telemetry, too. The warning stored on the mower itself is not changed.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
Request body (required): application/json BladeThresholdIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerHealthOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Health Daily
Health totals per UTC day (default: the last 30 days, at most 366).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
from |
query | string (date) or null | no | First UTC day (inclusive, YYYY-MM-DD). |
to |
query | string (date) or null | no | Last UTC day (inclusive). |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json HealthDaily
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Heatmap
A raster layer over the mower's map frame for a time range (default: the last 7 days): cut share and missed areas (coverage), share of fixed RTK samples (rtk) or median signal in dBm (wifi, mnet). 404 no-map-yet before the gateway published a map.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
layer |
query | Layer | yes | coverage, rtk, wifi or mnet. |
from |
query | string (date-time) or null | no | Start of the range (inclusive). |
to |
query | string (date-time) or null | no | End of the range (exclusive). |
cell |
query |
0.5 | 1 | 2
|
no | Cell size in metres: 0.5, 1 or 2.; default 1.0
|
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerHeatmap
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get History
State history; with step one point per bin (last activity and RTK fix, battery mean and range, charging if any, last position).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
from |
query | string (date-time) or null | no | Start of the range (inclusive). |
to |
query | string (date-time) or null | no | End of the range (exclusive). |
step |
query | string or null | no | Bin width such as 5s, 1m, 1h or 1d (date_bin); raw rows without. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json StateHistory
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Map
The mower's map as the Device-Gateway last read it; 404 no-map-yet before that.
The ETag is the map revision, so a client can revalidate with If-None-Match.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
if-none-match |
header | string or null | no |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerMapOut
|
| 304 | Not modified (If-None-Match equals the ETag) |
no body |
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Mow Path
The route the mower planned for its running job (local metres of its map) with the progress along it, as the Device-Gateway last published it; 404 no-path without a job or before the route arrived. Clients poll it while the mower works.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowPathOut
|
| 404 |
no-path: no running job whose route is known. |
no body |
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Positions
The newest limit positions of the range, oldest first.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
from |
query | string (date-time) or null | no | Start of the range (inclusive). |
to |
query | string (date-time) or null | no | End of the range (exclusive). |
limit |
query | integer | no | min 1; max 100000; default 1000
|
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json PositionTrack
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get State
Latest state of a mower; 404 "no telemetry yet" before the first state arrived.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json MowerStateSnapshot
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Widget State
A compact state for the iOS widgets and the Live Activity (ADR 0059): activity (offline when stale), battery, rain sensor, error (code, vendor message and, from the error lexicon, title, category and severity, ADR 0067) and the job with progress, area name and remaining time. 404 "no telemetry yet" before the first state.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
locale |
query | string or null | no | Language of error_title (de, en). Default: the first language of Accept-Language, else en. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json WidgetStateOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Widget Map
A PNG of the mower's map for the iOS map widget (ADR 0059): areas, no-go zones, the mowed path (the mow path up to its progress, else the last 3 hours of the track), the dock and the mower. Bounded in size, cached for 30 seconds and drawn at most twice at a time. 404 no-map-yet before the gateway published a map.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
width |
query | integer | no | Pixels (clamped to 700k in all).; min 160; max 1200; default 640
|
height |
query | integer | no | min 96; max 800; default 384
|
theme |
query | string | no | pattern `^(light |
if-none-match |
header | string or null | no |
| Status | Meaning | Body |
|---|---|---|
| 200 | The map picture. |
image/png any |
| 304 | Not modified (If-None-Match equals the ETag) |
no body |
| 422 | Validation Error |
application/json HTTPValidationError
|
| 503 | All drawing slots are taken; retry in a few seconds. | no body |
Get Report Summary
Day totals (UTC days, default the last 30, at most 366) of every mower of the caller's account that the caller may view, in one call: blade and mowing hours, distance, jobs, online hours, battery cycles, charge sessions and errors by code. Mowers without data in the range are absent; Telemetry does not know sites, so clients filter by Fleet's site_id (or pass mower_id).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
from |
query | string (date) or null | no | First UTC day (inclusive, YYYY-MM-DD). |
to |
query | string (date) or null | no | Last UTC day (inclusive). |
mower_id |
query | array of string (uuid) or null | no | Only these mowers (repeatable); invisible ones are left out silently. |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ReportSummary
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Tracking Status
The active tracking session of the mower, else the newest one, with its track and links; after returns only newer positions.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
session_id |
query | string (uuid) or null | no | |
after |
query | string (date-time) or null | no | Only positions after this time (polling). |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json TrackingStatus
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Start Tracking
Start tracking by hand (also the safe way to test the whole chain). Answers 200 with the running session when there is one.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 201 | Successful Response |
application/json TrackingSessionOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
List Tracking Links
The share links of the session (active ones first by recency; tokens are never shown).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
session_id |
query | string (uuid) or null | no |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json array of TrackingLinkOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Create Tracking Link
Issue a secret share link (default 48 h). The token is in this answer only.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
Request body (required): application/json TrackingLinkIn
| Status | Meaning | Body |
|---|---|---|
| 201 | Successful Response |
application/json TrackingLinkCreated
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Revoke Tracking Link
Revoke a share link; it stops working at once.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
link_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 204 | Successful Response | no body |
| 422 | Validation Error |
application/json HTTPValidationError
|
Tracking Map Tile
One base map tile (Web Mercator, XYZ) under the track of the active or newest session. Tiles away from the tracked positions, outside the zoom range or of a layer that is not offered are 404 tile-outside-map; new tiles are rate limited per account (429).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
layer |
path |
"map" | "aerial"
|
yes | |
z |
path | integer | yes | min 0; max 24 |
x |
path | integer | yes | min 0 |
y |
path | integer | yes | min 0 |
session_id |
query | string (uuid) or null | no |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
image/jpeg any, image/png any |
| 422 | Validation Error |
application/json HTTPValidationError
|
Take Tracking Photo
Take one more camera photo for the active session (it goes into the report).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 201 | Successful Response |
application/json TrackingStatus
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Tracking Report
The theft report as a PDF: mower, alarm, track (table and drawing), photos, blank owner fields.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
session_id |
query | string (uuid) or null | no | |
lang |
query |
"de" | "en"
|
no | default "en"
|
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response | no body |
| 422 | Validation Error |
application/json HTTPValidationError
|
List Tracking Sessions
Past and current sessions of the mower, newest first (at most 20).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json array of TrackingSessionOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Delete Tracking Session
Delete an ended session with its links and photos.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
session_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 204 | Successful Response | no body |
| 422 | Validation Error |
application/json HTTPValidationError
|
Stop Tracking
End the active session ("Fehlalarm / Ortung beenden").
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
Request body (required): application/json TrackingStopIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json TrackingSessionOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Public Tracking Tile
One base map tile for the page of a share link, only around the shared track. No login; 404 for any unusable token or a tile away from the track, 429 when asked too often.
Request body (required): application/json PublicTileIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
image/jpeg any, image/png any |
| 422 | Validation Error |
application/json HTTPValidationError
|
Public Tracking View
The live page of a share link: the position, the track since the alarm, the times and the mower's name and model. No login; 404 for any unusable token, 429 when asked too often.
Request body (required): application/json PublicTrackIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json PublicTrackOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
List Zones
The mower's virtual zones, the zone it is in and whether the editor is offered.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ZonesOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Create Zone
Draw a zone (can_control). The current zone is evaluated again at once.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes |
Request body (required): application/json ZoneIn
| Status | Meaning | Body |
|---|---|---|
| 201 | Successful Response |
application/json ZoneOut
|
| 403 | The caller sees the mower but has no can_control. |
no body |
| 404 | The mower (or zone) does not exist or is not visible to the caller. | no body |
| 409 | Zones are not offered for this mower (vendor_map, no_position) or it has the most zones (limit); the error's code says which. |
no body |
| 422 | The ring or the name is not acceptable; the error points at it. | no body |
Zone Stats
Time per zone (in it, of that mowing, entries) over the last days days.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
days |
query | integer | no | Whole UTC days, today included.; min 1; max 92; default 7
|
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ZoneStatsOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Update Zone
Rename, reshape or (un)link a zone (can_control).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
zone_id |
path | string (uuid) | yes |
Request body (required): application/json ZonePatch
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ZoneOut
|
| 403 | The caller sees the mower but has no can_control. |
no body |
| 404 | The mower (or zone) does not exist or is not visible to the caller. | no body |
| 409 | Zones are not offered for this mower (vendor_map, no_position) or it has the most zones (limit); the error's code says which. |
no body |
| 422 | The ring or the name is not acceptable; the error points at it. | no body |
Delete Zone
Delete a zone with its recorded time (can_control).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
mower_id |
path | string (uuid) | yes | |
zone_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 204 | Successful Response | no body |
| 403 | The caller sees the mower but has no can_control. |
no body |
| 404 | The mower (or zone) does not exist or is not visible to the caller. | no body |
| 409 | Zones are not offered for this mower (vendor_map, no_position) or it has the most zones (limit); the error's code says which. |
no body |
| 422 | The ring or the name is not acceptable; the error points at it. | no body |
A box in WGS84 degrees.
| Field | Type | Required | Notes |
|---|---|---|---|
east |
number | yes | |
north |
number | yes | |
south |
number | yes | |
west |
number | yes |
The aerial photo under a mower's map.
| Field | Type | Required | Notes |
|---|---|---|---|
attribution |
string or null | yes | Credit line to show while the photo is on. |
bounds |
AerialBounds or null | yes | Where tiles are served: the map's outline plus a margin. |
enabled |
boolean | yes | False when the installation has no aerial photo source. |
max_zoom |
integer or null | yes | Highest zoom with real detail; scale beyond it. |
min_zoom |
integer or null | yes | |
mower_id |
string (uuid) | yes | |
tile_url |
string or null | yes | URL template of the tiles ({z}, {x}, {y}); needs the bearer token. |
Where to centre a map that has no vendor geometry.
| Field | Type | Required | Notes |
|---|---|---|---|
lat |
number | yes | |
lon |
number | yes |
Where the base station stands (WGS84 degrees), as the mower knows it.
| Field | Type | Required | Notes |
|---|---|---|---|
lat |
number | yes | min -90.0; max 90.0 |
lon |
number | yes | min -180.0; max 180.0 |
The RTK base station of a mower as its connection sees it (MowerState.base_station).
Null on the mower state when the mower is linked to no base station in Fleet.
| Field | Type | Required | Notes |
|---|---|---|---|
base_station_id |
string (uuid) or null | no | Fleet's id of the base station (from the registration). |
correction_link |
RtkCorrectionLink | no | How the corrections reach the mower now; network means the mower does not use its base station at the moment.; default "unknown"
|
details_at |
string (date-time) or null | no | When the details (satellites, rtk_status, wifi_dbm) were last reported; null when never. |
firmware |
string or null | no | The base station's firmware, as reported. |
firmware_info |
FirmwareInfo or null | no | Installed and offered firmware of the base station from the vendor's firmware service, and the update state; null before a check. |
link_up |
boolean or null | no | Whether the mower receives the base station: over LoRa the radio link the mower reports, over the internet whether corrections arrive; null when the mower does not say (or uses network RTK). |
lora_channel |
integer or null | no | The LoRa channel of the pairing, if reported. |
moved |
boolean or null | no | The mower reports that the base station was moved since the map was recorded (positions may be shifted); null when not reported. |
position |
BaseStationPosition or null | no | Where the base station stands; null while not reported. |
rtk_status |
GnssSolution | no | The base station's own position solution.; default "unknown"
|
satellites |
integer or null | no | Satellites the base station's receiver uses. |
wifi_dbm |
integer or null | no | The base station's Wi-Fi signal in dBm; null when not reported. |
One bin (or one row) of the battery series.
| Field | Type | Required | Notes |
|---|---|---|---|
at |
string (date-time) | yes | |
battery_max |
integer | yes | |
battery_min |
integer | yes | |
battery_percent |
integer | yes | |
charging |
boolean | yes |
Battery percentage of a mower in a time range.
| Field | Type | Required | Notes |
|---|---|---|---|
from |
string (date-time) | yes | |
mower_id |
string (uuid) | yes | |
points |
array of BatteryPointOut | yes | |
step_seconds |
number or null | yes | Bin width, null for raw rows. |
to |
string (date-time) | yes | |
truncated |
boolean | yes |
Recorded blade changes of a mower, newest first.
| Field | Type | Required | Notes |
|---|---|---|---|
items |
array of BladeChangeOut | yes | |
mower_id |
string (uuid) | yes |
A recorded blade change.
| Field | Type | Required | Notes |
|---|---|---|---|
changed_at |
string (date-time) | yes | |
changed_by |
string (uuid) or null | yes | Subject of the principal who recorded it. |
id |
string (uuid) | yes | |
note |
string or null | yes |
Body of the blade reset.
| Field | Type | Required | Notes |
|---|---|---|---|
note |
string or null | no | Free text, optional. |
PUT .../health/blade-threshold: the mower's blade reminder threshold.
| Field | Type | Required | Notes |
|---|---|---|---|
hours |
number or null | yes | Blade hours after which MowDeck reminds of a blade change; null drops the mower's own threshold: the mower's own warning applies again when it reports one, else the installation's default. |
How a camera stream can be reached, if there is one.
Type: "none" | "cloud" | "local"
One status transition of a command.
| Field | Type | Required | Notes |
|---|---|---|---|
at |
string (date-time) | yes | |
command_id |
string (uuid) | yes | |
reason |
string or null | yes | |
status |
string | yes |
The newest command transitions of a mower, newest first.
| Field | Type | Required | Notes |
|---|---|---|---|
items |
array of CommandEventOut | yes | |
mower_id |
string (uuid) | yes |
How the Device-Gateway is connected to the mower.
Type: "ble_bridge" | "wifi" | "cloud" | "simulated"
Position and orientation of the charging station in the local frame.
| Field | Type | Required | Notes |
|---|---|---|---|
heading_deg |
number | no | Local frame, counter-clockwise from +x.; min 0.0; less than 360.0; default 0.0
|
x |
number | yes | |
y |
number | yes |
The fitted drive behaviour of one mower, as stored in the drive link's options.
| Field | Type | Required | Notes |
|---|---|---|---|
calibrated_at |
string (date-time) | yes | |
dead_zone |
number | no |
linear below which the mower stands.; min 0.0; max 0.9; default 0.0
|
drive_speed_setting |
number or null | no | The vendor's manual-driving speed setting during the calibration (MowerState.drive_speed_mps); null when the connection has none. |
full_speed_mps |
number | yes | Ground speed at linear = 1.; max 5.0; greater than 0.0 |
full_yaw_rate_dps |
number | yes | Yaw rate at angular = ±1 in degrees per second.; max 720.0; greater than 0.0 |
turn_dead_zone |
number | no |
angular below which the mower does not turn.; min 0.0; max 0.9; default 0.0
|
What a calibration measured and fitted.
| Field | Type | Required | Notes |
|---|---|---|---|
calibration |
DriveCalibration | yes | |
forward_m |
number | no | Ground covered going forward.; min 0.0; default 0.0
|
steps |
array of DriveCalibrationStep | no | max items 32 |
Progress of the drive calibration on this mower (MowerState.drive_calibration).
| Field | Type | Required | Notes |
|---|---|---|---|
reason |
string or null | no | |
result |
DriveCalibrationResult or null | no | The fit, once the calibration is done. |
run_id |
string (uuid) | yes | |
started_at |
string (date-time) or null | no | |
state |
"preparing" | "measuring" | "stopping" | "done" | "aborted" | "failed"
|
yes | |
step_index |
integer | no | The step being driven (0-based).; min 0.0; default 0
|
steps |
array of DriveCalibrationStep | no | The steps measured so far.; max items 32 |
steps_total |
integer | no | min 0.0; default 0
|
One measured step of a calibration.
| Field | Type | Required | Notes |
|---|---|---|---|
command |
number | yes |
linear (forward) or angular (turn).; min -1.0; max 1.0 |
distance_m |
number | no | Ground covered during the step.; min 0.0; default 0.0
|
duration_s |
number | yes | min 0.0; max 60.0 |
kind |
"forward" | "turn"
|
yes | |
measured |
number or null | no | Ground speed in m/s (forward) or yaw rate in degrees per second, left positive (turn); null when too few reports arrived. |
note |
string or null | no | Why the step is not measured. |
outcome |
"measured" | "skipped" | "invalid" | "inconsistent" | "outlier"
|
no |
measured (used by the fit), skipped (not driven), invalid (too few reports in the steady window), inconsistent (the opposite turn disagrees) or outlier (breaks the growth with the stick); the last three are left out of the fit.; default "measured"
|
report_interval_s |
number or null | no | Mean time between those reports. |
reports |
integer | no | Position reports during the step.; min 0.0; default 0
|
skipped |
boolean | no | Not driven: the forward distance budget was used up (room ahead).; default false
|
turned_deg |
number | no | Heading change during the step.; default 0.0
|
window_s |
number or null | no | Length of the steady window the value was measured over (the step without its settling time at the start). |
The vendor's speed setting for manual driving, as far as the connection can change it (MowerCapabilities.drive_speed_setting): the accepted range and step in m/s.
| Field | Type | Required | Notes |
|---|---|---|---|
max_mps |
number | yes | max 5.0; greater than 0.0 |
min_mps |
number | yes | max 5.0; greater than 0.0 |
step_mps |
number | no | max 1.0; greater than 0.0; default 0.1
|
A vendor code in plain words, in one locale.
| Field | Type | Required | Notes |
|---|---|---|---|
category |
MowerErrorCategory | yes | |
cause |
string or null | no | |
code |
string | yes | min length 1; max length 64 |
description |
string | no | max length 2000; default ""
|
known |
boolean | yes | The lexicon knows the code. |
links |
array of ErrorLink | no | |
locale |
string | yes | The locale of the texts (after fallback).; pattern ^[a-z]{2}$
|
severity |
ErrorSeverity | yes | |
steps |
array of string | no | |
title |
string | yes | max length 200 |
user_action |
boolean | yes | |
vendor |
string or null | no | The lexicon that explained the code; null when none applied. |
vendor_name |
string or null | no | |
verified |
boolean | no | False for an entry whose meaning is not verified.; default true
|
Explanations in the order of the requested codes.
| Field | Type | Required | Notes |
|---|---|---|---|
explanations |
array of ErrorExplanation | yes |
Summary of an installed lexicon (no entries).
| Field | Type | Required | Notes |
|---|---|---|---|
cloud_providers |
array of string | no | The cloud providers it serves (empty: vendor). |
connection_kinds |
array of ConnectionKind | no | |
entries |
integer | yes | Number of codes.; min 0.0 |
locales |
array of string | no | |
source |
string or null | no | |
unverified |
integer | yes | Codes whose meaning could not be verified.; min 0.0 |
vendor |
string | yes | pattern ^[a-z][a-z0-9_]{0,31}$
|
vendor_name |
string | yes |
The installed error lexicons, one per vendor.
| Field | Type | Required | Notes |
|---|---|---|---|
lexicons |
array of ErrorLexiconInfo | yes |
A page of a lexicon's entries, ordered by code (numbers numerically).
| Field | Type | Required | Notes |
|---|---|---|---|
categories |
map of integer | no | Entries per category in the whole lexicon (for filter chips). |
entries |
array of ErrorExplanation | no | |
lexicon |
ErrorLexiconInfo or null | no | The lexicon searched; null when none applies (or none answered). |
offset |
integer | no | min 0.0; default 0
|
severities |
map of integer | no | Entries per severity in the whole lexicon. |
total |
integer | no | Entries matching the filters.; min 0.0; default 0
|
Further reading for an entry (the vendor's help page, a manual chapter).
| Field | Type | Required | Notes |
|---|---|---|---|
label |
string | yes | min length 1; max length 120 |
url |
string | yes | max length 500; pattern ^https://
|
How bad an error is for the user, manufacturer neutral.
Type: "info" | "warning" | "error" | "critical"
The firmware state of a mower (MowerState.firmware_info).
| Field | Type | Required | Notes |
|---|---|---|---|
available |
string or null | no | The newest version the vendor offers for this mower; null when none or unknown. |
checked_at |
string (date-time) or null | no | When the vendor was last asked; null when never. |
failure_reason |
string or null | no | Why the last update failed, if known. |
installed |
string or null | no | The version running on the mower. |
progress |
integer or null | no | Percent done while installing, if reported. |
release_notes |
string or null | no | Release notes of available, if given. |
update_state |
"idle" | "available" | "installing" | "failed" | "unknown"
|
no | default "unknown"
|
A WGS84 position.
| Field | Type | Required | Notes |
|---|---|---|---|
alt |
number or null | no | Altitude in metres, if known. |
heading |
number or null | no | Heading in degrees, 0 = north, clockwise. |
lat |
number | yes | Latitude in degrees.; min -90.0; max 90.0 |
lon |
number | yes | Longitude in degrees.; min -180.0; max 180.0 |
Anchors the local frame on the earth.
The local point (0, 0) is at (origin_lat, origin_lon). The local axes are the east and north axes rotated counter-clockwise by rotation_deg: a local point (x, y) lies east = x cos(r) - y sin(r) and north = x sin(r) + y cos(r) metres from the origin.
| Field | Type | Required | Notes |
|---|---|---|---|
origin_lat |
number | yes | min -90.0; max 90.0 |
origin_lon |
number | yes | min -180.0; max 180.0 |
rotation_deg |
number | no | min -360.0; max 360.0; default 0.0
|
The satellite position solution as the receiver reports it (finer than :class:~mowdeck_contracts.v1.RtkFixStatus, which folds single into none).
Type: "none" | "single" | "float" | "fixed" | "unknown"
The mower's satellite positioning (MowerState.gnss).
| Field | Type | Required | Notes |
|---|---|---|---|
correction_age_s |
number or null | no | Age of the last RTK correction data in seconds; null without corrections. |
rtk_status |
GnssSolution | no | The position solution of the receiver.; default "unknown"
|
satellites |
integer or null | no | Satellites the receiver uses. |
Day totals of an inclusive range of UTC days, oldest first (days without data absent).
| Field | Type | Required | Notes |
|---|---|---|---|
days |
array of HealthDayOut | yes | |
from |
string (date) | yes | |
mower_id |
string (uuid) | yes | |
to |
string (date) | yes |
Totals of one UTC day (battery_cycles is MowDeck's own count).
| Field | Type | Required | Notes |
|---|---|---|---|
battery_cycles |
integer | yes | |
blade_hours |
number | yes | |
charge_sessions |
integer | yes | |
day |
string (date) | yes | |
distance_m |
number | yes | |
errors |
map of integer | yes | |
jobs |
integer | no | Jobs started: transitions into mowing (not from paused).; default 0
|
mowing_hours |
number | yes | |
online_hours |
number | no | Time with states arriving and the mower not offline.; default 0.0
|
One cell of a heatmap: integer indexes in the map's local frame (floor(metres / cell_m)), the value and the number of samples in it.
| Field | Type | Required | Notes |
|---|---|---|---|
n |
integer | yes | Samples located in the cell. |
value |
number | yes | Cut share or fixed share (0..1), or median dBm. |
x |
integer | yes | |
y |
integer | yes |
A piece of the map's areas the blades missed (local metres, implicit closing edge).
| Field | Type | Required | Notes |
|---|---|---|---|
area_m2 |
number | yes | |
polygon |
array of array of any | yes |
How to colour the values: ratio and fix span 0..1, dbm the response's range (null without cells).
| Field | Type | Required | Notes |
|---|---|---|---|
kind |
"ratio" | "fix" | "dbm"
|
yes | |
max |
number or null | yes | |
min |
number or null | yes |
One bin (or one row) of the history.
| Field | Type | Required | Notes |
|---|---|---|---|
activity |
string | yes | |
at |
string (date-time) | yes | |
battery_max |
integer | yes | |
battery_min |
integer | yes | |
battery_percent |
integer | yes | |
charging |
boolean | yes | |
error_code |
string or null | yes | |
lat |
number or null | yes | |
lon |
number or null | yes | |
rtk_fix |
string | yes | |
samples |
integer | yes |
| Field | Type | Required | Notes |
|---|---|---|---|
detail |
array of ValidationError | no |
The mowing job the mower runs right now (MowerState.job).
Null on the state when no job runs or the connection reports none. Times have the resolution the vendor reports (Mammotion: whole minutes, given here in seconds).
| Field | Type | Required | Notes |
|---|---|---|---|
area_id |
string or null | no | The map area (MowerMap.areas[].id) the mower works in now; null when it is not one of the mower's map areas or not reported. |
elapsed_s |
integer or null | no | Seconds the job has run so far. |
mowed_m2 |
number or null | no | Area mowed in this job so far, in square metres. |
progress_percent |
integer or null | no | Share of the job done, 0 to 100. |
remaining_s |
integer or null | no | Seconds the mower estimates the job still needs. |
What a heatmap shows.
Type: "coverage" | "rtk" | "wifi" | "mnet"
The state of one additional link as the Device-Gateway reports it in MowerState.links.
| Field | Type | Required | Notes |
|---|---|---|---|
compiled_at |
string or null | no | When the bridge firmware was compiled, as ESPHome reports it (free text). |
connected |
boolean | no | The link is open right now.; default false
|
esphome_version |
string or null | no | Firmware version of the bridge (the ESPHome release it runs). |
outdated |
boolean | no | The bridge firmware is older than what MowDeck expects; see outdated_reason.; default false
|
outdated_reason |
string or null | no | Why the firmware counts as outdated, e.g. esphome_version, project_version or no_project; null when up to date. |
project_version |
string or null | no | Version of the MowDeck bridge template the firmware was built from; null when the firmware carries no esphome.project. |
rssi |
integer or null | no | Signal strength of the mower at the bridge in dBm, if the bridge reports it. |
since |
string (date-time) or null | no | When the link was opened (or lost), if known. |
A mowable area (a "zone" in the Mammotion app).
| Field | Type | Required | Notes |
|---|---|---|---|
boundary |
array of array of any | yes | min items 3 |
id |
string | yes | Stable id, e.g. the vendor's zone hash.; min length 1; max length 128 |
name |
string or null | no |
A base map layer offered under the track: map (street map) or aerial (photo). Tiles come from /mowers/{id}/tracking/map/{layer}/{z}/{x}/{y} (owner) or POST /public/tracking/tile (share link), only around the tracked positions.
| Field | Type | Required | Notes |
|---|---|---|---|
attribution |
string | yes | Credit line to show while the layer is visible. |
coverage |
AerialBounds or null | no | The box the source has data in (null: the whole world). Tiles are served only where it overlaps the tracked positions plus margin_m. |
covers_last |
boolean | no | Whether the source has data at the last known position (false: show another layer; e.g. an aerial photo of one state only).; default true
|
id |
"map" | "aerial"
|
yes | |
margin_m |
number | no | Metres around the tracked positions where tiles are served; the map keeps its view inside that box (0: no limit known).; default 0
|
max_zoom |
integer | yes | Highest zoom with real detail; deeper zooms scale it. |
min_zoom |
integer | yes |
A transfer path between areas (driven with blades off).
| Field | Type | Required | Notes |
|---|---|---|---|
id |
string | yes | min length 1; max length 128 |
name |
string or null | no | |
points |
array of array of any | yes | min items 2 |
A polygon the mower must stay out of: a no-go zone or an obstacle.
| Field | Type | Required | Notes |
|---|---|---|---|
boundary |
array of array of any | yes | min items 3 |
id |
string | yes | min length 1; max length 128 |
name |
string or null | no |
What the mower is doing right now.
Type: "idle" | "mowing" | "paused" | "returning" | "docked" | "charging" | "error" | "offline" | "updating" | "unknown"
Feature flags and limits of one mower behind one connection.
All fields default to "not supported", so an adapter only declares what it really offers.
| Field | Type | Required | Notes |
|---|---|---|---|
base_station_firmware_update |
boolean | no | The connection can ask the manufacturer's firmware service for the linked RTK base station and install its updates (firmware_check with target base_station, base_station_firmware_update; ADR 0047).; default false
|
blade_height_range_mm |
array of any or null | no | Inclusive (min, max) blade height in millimetres, if settable. |
camera |
CameraAccess | no | default "none"
|
connection_kinds |
array of ConnectionKind | no | Connection kinds this mower can use. |
custom_paths |
boolean | no | The mower can follow an arbitrary path or boundary.; default false
|
cutting_width_mm |
integer or null | no | Width of the cut swath in millimetres, if known (coverage heatmaps). |
dock_keeps_job |
boolean | no |
ReturnToDock with end_job: false keeps the running job paused, so a later ResumeMow continues it. Without it a client offers no 'keep the job' choice and the controller refuses end_job: false; the mower ends (or forgets) its job on the way home.; default false
|
drive_reverse |
boolean | no | The drive link that carries the joystick frames can drive backwards (a negative ManualDrive.linear). Without it the web joystick offers no reverse and a spot run's multi_point turns fall back to arc (ADR 0043).; default false
|
drive_speed_setting |
DriveSpeedSetting or null | no | The vendor's speed setting for manual driving can be read (MowerState.drive_speed_mps) and changed (set_drive_speed) within this range; null when the connection cannot (ADR 0042). |
firmware_update |
boolean | no | The connection can ask the manufacturer's firmware service for updates and install them (firmware_check, firmware_update).; default false
|
light |
boolean | no | The mower's light (e.g. the camera's headlamp) can be switched with set_light.; default false
|
links_supported |
array of string | no | Additional link kinds this connection can open next to its primary one (e.g. ble_bridge); empty when the mower has only its primary connection.; max items 8 |
maintenance |
array of "restart_mower" | "sync_map" | "relocate_dock" | "leave_dock" | "resync_rtk"
|
no | Maintenance commands this connection can send (ADR 0048): restart_mower, sync_map, relocate_dock, leave_dock (only together with undock), resync_rtk. Clients offer only these; empty when the connection has none. |
manual_drive |
boolean | no | Joystick driving is supported.; default false
|
manual_drive_blades |
boolean | no | Blades may run during manual driving when a frame explicitly asks for it.; default false
|
max_speed_mps |
number or null | no | Highest settable driving speed while mowing. |
min_speed_mps |
number or null | no | Lowest settable driving speed while mowing, if the model has one. |
model |
string or null | no | Mower model, if known. |
native_patterns |
array of string | no | Mowing pattern names the mower runs natively on its own map areas, for example stripes, diagonal, checkerboard, edge_only. |
path_spacing_range_mm |
array of any or null | no | Inclusive (min, max) distance between neighbouring mowing paths in millimetres (MowPattern.spacing_m), if the model has a settable spacing. |
rtk_sources |
array of RtkSource | no | RTK correction sources the mower can report. |
settings |
array of SettingSpec | no | The mower's own settings this connection can read and change with set_setting (ADR 0046), each with its type and range or options; current values in MowerState.settings. Empty when the connection offers none.; max items 32 |
start_options |
StartOptions | no | Job options a native start may carry besides the pattern (obstacle detection, laps around no-go zones, path order, start progress; ADR 0030). Clients show only what is declared here. |
start_plans |
array of StartPlan | no | Starts the mower offers without map areas (ADR 0066 amendment), in the order a client lists them; each is sent as StartMow.plan_ref. Empty for mowers that start on their map areas.; max items 16 |
undock |
boolean | no | The connection can make the mower leave its charging station by itself (leave_dock), so a spot run may start from the dock (ADR 0041).; default false
|
Stored capabilities of every mower the caller can view (those that reported any).
| Field | Type | Required | Notes |
|---|---|---|---|
items |
array of MowerCapabilitiesOut | yes | |
truncated |
boolean | yes | True when more mowers exist than the configured limit. |
What the mower can do over its current connection (blade height range, speed, ...).
| Field | Type | Required | Notes |
|---|---|---|---|
capabilities |
MowerCapabilities | yes | |
mower_id |
string (uuid) | yes | |
observed_at |
string (date-time) | yes | When the gateway read the capabilities (UTC). |
received_at |
string (date-time) | yes | When Telemetry stored them (UTC). |
What kind of fault MowerState.error_code names, manufacturer neutral.
The same words classify the entries of an error lexicon (ADR 0067), so rules such as the theft alarm can match a category instead of vendor codes.
Type: "trapped" | "obstacle" | "outside" | "wheel_slip" | "lift_tilt" | "collision" | "battery" | "blade_motor" | "rain" | "positioning" | "communication" | "docking" | "firmware" | "other"
GET /mowers/{id}/error: the mower's current error in plain words.
| Field | Type | Required | Notes |
|---|---|---|---|
activity |
string | yes |
MowerActivity of the state. |
error |
ErrorExplanation or null | yes | The current error explained; null while the mower reports none. |
mower_id |
string (uuid) | yes | |
observed_at |
string (date-time) | yes | When the mower reported the state. |
Running health totals of a mower (since the first state Telemetry received).
| Field | Type | Required | Notes |
|---|---|---|---|
battery_cycles |
integer | yes | Battery charge cycles to show: the mower's own lifetime counter when it reports one (battery_cycles_source device), else MowDeck's count (battery_cycles_tracked). |
battery_cycles_source |
"device" | "telemetry"
|
yes | Where battery_cycles comes from: the mower's own counter (device) or MowDeck's count (telemetry, battery_cycles_tracked). |
battery_cycles_tracked |
integer | yes | MowDeck's own count since the first state it received: discharges below 20 % followed by a charge above 80 %. |
blade_changed_at |
string (date-time) or null | yes | The last recorded blade change. |
blade_hours |
number | yes | Hours with running blades (heuristic, see README). |
blade_hours_since_change |
number | yes | |
blade_hours_threshold |
number | yes | MowDeck's threshold: the one set for the mower in MowDeck, else the installation's default. The reminder uses blade_hours_threshold_effective. |
blade_hours_threshold_custom |
boolean | no | The mower has its own threshold (PUT .../health/blade-threshold); false: the mower's own warning or the default applies.; default false
|
blade_hours_threshold_effective |
number | yes | The one threshold in effect, used by the reminder and to show: the threshold set in MowDeck (source custom), else the mower's own warning while it reports its own blade counter (device), else the installation's default (default). |
blade_hours_threshold_source |
"custom" | "device" | "default"
|
yes | Where blade_hours_threshold_effective comes from. |
blade_source |
"device" | "telemetry"
|
yes | Which blade counter to show as hours since the blade change: the mower's own (device) or MowDeck's (telemetry, blade_hours_since_change). |
charge_sessions |
integer | yes | |
device_battery_cycles |
integer or null | yes | The mower's own lifetime battery cycle counter; null when the mower does not report one. |
device_blade_hours |
number or null | yes | The mower's own blade counter in hours (reset in the vendor app), as the vendor app shows it; null when the mower does not report one. |
device_blade_warn_hours |
number or null | yes | The mower's own blade warning threshold in hours; null when not reported. |
device_distance_m |
number or null | no | The mower's own lifetime distance in metres, as the vendor app shows it; null when the mower does not report one. |
device_mowing_hours |
number or null | no | The mower's own lifetime working time in hours, as the vendor app shows it; null when the mower does not report one. |
distance_m |
number | yes | MowDeck's own distance in metres since since. |
errors |
map of integer | yes | Error count per error code (unknown: none). |
mower_id |
string (uuid) | yes | |
mowing_hours |
number | yes | MowDeck's own count of hours with activity mowing since since. |
since |
string (date-time) or null | yes | observed_at of the first state counted; null after a blade reset before any telemetry. |
updated_at |
string (date-time) | yes |
A heatmap layer of a mower over its map's local frame.
| Field | Type | Required | Notes |
|---|---|---|---|
cell_m |
number | yes | Cell size in metres; larger than requested when the cells were coarsened to stay within 20 000. |
cells |
array of HeatmapCellOut | yes | |
from |
string (date-time) | yes | |
gaps |
array of HeatmapGapOut | yes | Missed map areas (coverage only). |
layer |
"coverage" | "rtk" | "wifi" | "mnet"
|
yes | |
legend |
HeatmapLegendOut | yes | |
mower_id |
string (uuid) | yes | |
reference |
GeoReference | yes | Geo reference of the map's local frame. |
samples |
integer | yes | Track rows that contributed to the layer. |
to |
string (date-time) | yes | |
truncated |
boolean | yes | True when the row limit cut off older positions. |
The map of one mower: areas, no-go zones, obstacles, paths and the dock.
| Field | Type | Required | Notes |
|---|---|---|---|
areas |
array of MapArea | no | |
dock |
DockPose or null | no | |
no_go_zones |
array of MapZone | no | |
obstacles |
array of MapZone | no | |
paths |
array of MapPath | no | |
reference |
GeoReference | yes | |
revision |
string or null | no | Map version, e.g. the vendor's map hash. |
The map of a mower as the Device-Gateway last read it (local metres plus reference).
| Field | Type | Required | Notes |
|---|---|---|---|
map |
MowerMap | yes | |
mower_id |
string (uuid) | yes | |
observed_at |
string (date-time) | yes | When the gateway read the map (UTC). |
received_at |
string (date-time) | yes | When Telemetry stored it (UTC). |
revision |
string | yes | Map revision or content hash; also the ETag. |
A telemetry snapshot of one mower, published on telemetry.mower.<id>.
Two times: observed_at is when the mower reported the values, heartbeat_at when the gateway's link to it was last alive. A docked mower reports rarely, so old values do not mean an offline mower (ADR 0040).
| Field | Type | Required | Notes |
|---|---|---|---|
account_id |
string (uuid) | yes | |
activity |
MowerActivity | yes | |
base_station |
BaseStationState or null | no | The RTK base station the mower is linked to in Fleet, as the mower's connection sees it (correction link, satellites, position, firmware; ADR 0047); null for a mower without a linked base station. |
battery_percent |
integer | yes | min 0.0; max 100.0 |
blade_height_mm |
integer or null | no | |
charging |
boolean | no | default false
|
cloud_provider |
string or null | no | With connection cloud: the cloud provider (ADR 0066) of the mower's linked account, so consumers pick the vendor's error lexicon (ADR 0067) when several providers share the kind. Set by the Device-Gateway, never by an adapter; null for other kinds and in states from before the field. |
connected |
boolean | no | False in the state the Device-Gateway publishes right after its connection to the mower ended: the last known values, with heartbeat_at the last time the link was alive. Set by the gateway, never by an adapter.; default true
|
connection |
ConnectionKind | yes | |
drive_calibration |
DriveCalibrationStatus or null | no | The drive calibration MowDeck runs on this mower (DriveCalibrate, ADR 0042), with its final state and result kept until the next one; null when there never was one. |
drive_recoverable |
boolean | no | With activity error: the error is not a safety sensor stop, so manual driving may free the mower (stuck, wheel slip). Lift, tilt and collision stops are never drive recoverable; the controller refuses drive frames for them.; default false
|
drive_speed_mps |
number or null | no | The vendor's speed setting for manual driving (MowerCapabilities.drive_speed_setting); null when the connection has none or has not read it yet. |
error_category |
MowerErrorCategory or null | no | With activity error: the manufacturer-neutral kind of the fault; null otherwise or when the connection cannot tell. |
error_code |
string or null | no | |
error_message |
string or null | no | |
firmware |
string or null | no | |
firmware_info |
FirmwareInfo or null | no | Installed and available firmware and the update state; null when the adapter has not checked (or cannot check) the vendor. |
gnss |
GnssStatus or null | no | Satellite positioning details (satellites, RTK correction age, solution); null when the connection does not report them. |
heartbeat_at |
string (date-time) or null | no | When the Device-Gateway last knew its connection to the mower alive (UTC). The gateway sets it on every publish, never an adapter: it advances with each heartbeat while observed_at stays the time of the mower's last report. Clients judge online and offline by it (ADR 0040); null in states from before the field, then observed_at stands in. |
job |
JobProgress or null | no | The mowing job the mower runs (progress, current area, elapsed and remaining seconds, mowed square metres); null when none runs or the connection does not report it. |
light_on |
boolean or null | no | Whether the mower's light (the camera's headlamp) is on, as the mower reports it; null when not reported (no light, or no answer yet). |
links |
map of LinkStatus | no | State of the mower's additional links by kind (e.g. ble_bridge); empty for a mower with only its primary connection. |
mower_id |
string (uuid) | yes | |
observed_at |
string (date-time) | yes | When the device reported this state (UTC). |
position |
GeoPosition or null | no | |
position_source |
PositionSource | no | Where position comes from; unknown whenever position is null.; default "unknown"
|
rain_detected |
boolean or null | no | The mower's own rain sensor reports rain right now; null when the connection does not report the sensor (ADR 0046). |
raw |
object | no | Adapter specific extras. Consumers must not rely on its structure; the typed fields above replace the keys they cover. |
rtk_fix |
RtkFixStatus | no | default "unknown"
|
rtk_source |
RtkSource | no | default "unknown"
|
self_check |
SelfCheck or null | no | The mower's start self-check (ok or blocked with the reason); null when the connection does not report it. |
settings |
object | no | Current values of the mower's own settings (ADR 0046) by key, as the mower reported them; a declared setting the mower has not reported yet is missing. Types, ranges and options: MowerCapabilities.settings. |
signal |
SignalStatus or null | no | The mower's own Wi-Fi and mobile signal in dBm and its uplink; null when the connection does not report them. |
speed_mps |
number or null | no | |
spot_run |
SpotRunStatus or null | no | The spot run MowDeck drives on this mower right now (SpotMow), with its final state kept until the next run; null when there never was one. |
turn_style |
TurnStyle or null | no | How the mower turns at lane ends in its own jobs, as its connection reports the vendor setting (read only; ADR 0043). A spot run without its own turn_style uses it; null when the connection does not report one. |
Latest states of every mower the caller can view.
| Field | Type | Required | Notes |
|---|---|---|---|
items |
array of MowerStateSnapshot | yes | |
truncated |
boolean | yes | True when more mowers exist than the configured limit. |
The latest state of a mower.
| Field | Type | Required | Notes |
|---|---|---|---|
mower_id |
string (uuid) | yes | |
received_at |
string (date-time) | yes | When Telemetry stored this state (UTC). |
stale |
boolean | yes | True when the mower is offline: the gateway reported its link lost (state.connected false) or the last link heartbeat (state.heartbeat_at, else observed_at) is older than the stale threshold. Old values of a connected mower are not stale (ADR 0040). |
state |
MowerState | yes |
The route a mower planned, in the local metres of its map.
| Field | Type | Required | Notes |
|---|---|---|---|
area_ids |
array of string | no | The map areas the route covers, in order. |
kinds |
array of "mow" | "edge" | "transfer" | "other" or null |
no | The kind of every polyline (same length), when known. |
path_hash |
string | yes | The vendor's id of the planned route.; min length 1; max length 32 |
planned_at |
string (date-time) | yes | When MowDeck received the route (UTC). |
points_total |
integer | yes | Number of points over all polylines.; min 0.0 |
polylines |
array of array of array of any | no | The route as polylines in driving order. |
progress |
MowPathProgress or null | no | Progress of the running job; None for a preview. |
The route the mower planned for its running job, with the progress along it.
| Field | Type | Required | Notes |
|---|---|---|---|
mower_id |
string (uuid) | yes | |
observed_at |
string (date-time) | yes | When the gateway read the path (UTC). |
path |
MowPath | yes | |
received_at |
string (date-time) | yes | When Telemetry stored it (UTC). |
Where the mower is along its path.
| Field | Type | Required | Notes |
|---|---|---|---|
direction |
integer | no | The vendor's traversal direction flag (0 or 1).; min 0.0; max 255.0; default 0
|
index |
integer | yes | Points done so far, counted over all polylines in order: the points with a flat index below this value are mowed.; min 0.0 |
How the mower itself reaches the internet (its own uplink, not MowDeck's connection to it, which is MowerState.connection).
Type: "wifi" | "mobile" | "ble" | "none"
How eagerly the mower avoids obstacles during a native job (MowPattern).
Which modes a mower offers depends on its model and firmware (MowerCapabilities.start_options.obstacle_detection). The names follow the vendor apps: off is the plain bump-and-turn behaviour, standard avoids obstacles it sees ahead, sensitive additionally avoids areas that are not lawn; slow_touch and less_touch exist only on older firmware.
Type: "off" | "slow_touch" | "less_touch" | "standard" | "sensitive"
Whether the border laps run before or after the fill of a native job.
Type: "border_first" | "grid_first"
One point of the position track.
| Field | Type | Required | Notes |
|---|---|---|---|
alt |
number or null | yes | |
heading |
number or null | yes | |
lat |
number | yes | |
lon |
number | yes | |
observed_at |
string (date-time) | yes | |
rtk_fix |
string | yes | |
rtk_source |
string | yes |
Where :attr:MowerState.position comes from, so consumers can judge it.
rtk is the mower's own positioning with an RTK fix (fixed or float), gnss the same positioning without an RTK fix (single point, metres of scatter), dock the known pose of the charging station while the mower stands in it (the adapter reports the dock instead of the scattering raw position), unknown when there is no position or its quality is not known.
Type: "rtk" | "gnss" | "dock" | "unknown"
Position track of a mower in a time range, oldest first.
| Field | Type | Required | Notes |
|---|---|---|---|
from |
string (date-time) | yes | |
mower_id |
string (uuid) | yes | |
positions |
array of PositionOut | yes | |
to |
string (date-time) | yes | |
truncated |
boolean | yes |
Where the mower is: in a zone (zone_id) or in none.
| Field | Type | Required | Notes |
|---|---|---|---|
observed_at |
string (date-time) | yes | The report the evaluation is based on. |
since |
string (date-time) | yes | When it entered this zone (or left the last one). |
zone_id |
string (uuid) or null | yes | The current zone; null outside every zone. |
zone_name |
string or null | no |
Body of a public base map tile: the share token and the tile (in the body, so neither the token nor the place reaches an access log).
| Field | Type | Required | Notes |
|---|---|---|---|
layer |
"map" | "aerial"
|
yes | |
token |
string | yes | min length 1; max length 200 |
x |
integer | yes | min 0.0 |
y |
integer | yes | min 0.0 |
z |
integer | yes | min 0.0; max 24.0 |
Body of the public view.
| Field | Type | Required | Notes |
|---|---|---|---|
token |
string | yes | min length 1; max length 200 |
What a share link shows: nothing else.
| Field | Type | Required | Notes |
|---|---|---|---|
active |
boolean | yes | |
ended_at |
string (date-time) or null | no | |
expires_at |
string (date-time) | yes | |
last |
TrackPointOut or null | no | |
map_layers |
array of MapLayerOut | no | |
mower_model |
string or null | no | |
mower_name |
string | yes | |
server_time |
string (date-time) | yes | |
stale_since |
string (date-time) or null | no | |
started_at |
string (date-time) | yes | |
track |
array of TrackPointOut | yes |
The day totals of one mower in a report (days without data are absent).
| Field | Type | Required | Notes |
|---|---|---|---|
days |
array of HealthDayOut | yes | |
mower_id |
string (uuid) | yes |
GET /reports/summary: day totals of every visible mower with data in the range.
| Field | Type | Required | Notes |
|---|---|---|---|
from |
string (date) | yes | |
items |
array of ReportMowerOut | yes | |
to |
string (date) | yes | |
truncated |
boolean | yes | More rows than one report returns; narrow the range. |
How the RTK corrections reach the mower.
Type: "lora" | "internet" | "network" | "unknown"
Quality of the RTK position fix.
Type: "none" | "float" | "fixed" | "unknown"
Where RTK correction data comes from.
Type: "base_station" | "network" | "unknown"
The mower's start self-check (MowerState.self_check).
| Field | Type | Required | Notes |
|---|---|---|---|
detail |
string or null | no | With blocked: what stops the mower as a lower-case key, e.g. rain, lifted, low_battery, outside_task_area, non_working_hours, rtk_not_ready; the adapter's documentation lists its keys. Null with ok. |
result |
SelfCheckResult | yes |
Outcome of the mower's start self-check.
Type: "ok" | "blocked"
Where a client shows a setting.
Type: "weather" | "battery" | "lights" | "driving" | "mowing" | "safety" | "voice" | "schedule"
One setting a mower has, as its connection declares it (MowerCapabilities.settings).
| Field | Type | Required | Notes |
|---|---|---|---|
group |
SettingGroup | yes | |
key |
string | yes | Manufacturer-neutral key, one of the known keys.; pattern ^[a-z][a-z0-9_]{0,47}$
|
max |
integer or null | no | Largest value of an int setting. |
min |
integer or null | no | Smallest value of an int setting. |
options |
array of string | no | The options of an enum setting, in the order a client offers them.; max items 16 |
step |
integer or null | no | Grid of an int setting, counted from min. |
type |
SettingType | yes | |
unit |
string or null | no | Unit of an int setting, e.g. % or h. |
The type of a setting's value.
Type: "bool" | "int" | "enum" | "time_window"
The mower's own radio signal (MowerState.signal).
| Field | Type | Required | Notes |
|---|---|---|---|
mobile_dbm |
integer or null | no | Mobile network (LTE) signal in dBm; null when not reported. |
network |
NetworkKind or null | no | The uplink the mower uses now; null when not reported. |
wifi_dbm |
integer or null | no | Wi-Fi signal in dBm; null when not reported. |
Progress of the spot run MowDeck drives on this mower (MowerState.spot_run).
| Field | Type | Required | Notes |
|---|---|---|---|
driven_points |
integer | no | Points reached so far.; min 0.0; default 0
|
dry_run |
boolean | no | The blades stayed off for the whole run (the default).; default true
|
planned_points |
integer | no | Points of the plan in total.; min 0.0; default 0
|
progress_percent |
integer | no | min 0.0; max 100.0; default 0
|
reason |
string or null | no | Why the run ended early or paused, if so. |
run_id |
string (uuid) | yes | |
segment_index |
integer | no | The segment being driven (0-based).; min 0.0; default 0
|
segments_total |
integer | no | min 0.0; default 0
|
state |
"preparing" | "undocking" | "waiting_rtk" | "transit" | "spot_mowing" | "paused_rtk" | "returning" | "stopping" | "done" | "aborted" | "failed"
|
yes |
The job options a native start may carry besides the pattern (MowPattern), as one mower declares them (ADR 0030 amendment of 2026-10-24).
Everything defaults to "not offered": a client shows an option only when it is declared here, and the connection refuses a start that sets an option it does not declare. An option a start leaves out (None) is not sent, so the mower keeps its own default.
| Field | Type | Required | Notes |
|---|---|---|---|
obstacle_detection |
array of ObstacleDetection | no | Obstacle detection modes the mower offers, in the order a client shows them (MowPattern.obstacle_detection); empty when it offers no choice.; max items 8 |
obstacle_laps_range |
array of any or null | no | Inclusive (min, max) laps around each no-go zone (MowPattern.obstacle_laps), if settable. |
orders |
array of PathOrder | no | Path orders the mower offers (MowPattern.order); empty when it offers no choice.; max items 2 |
start_progress_range_pct |
array of any or null | no | Inclusive (min, max) progress in percent a job may start at (MowPattern.start_progress_pct), if settable. |
One way to start a mower that has no map areas to choose (ADR 0066 amendment).
A mower whose connection knows no area geometry (its vendor keeps the garden to itself) cannot be started by tapping areas. Its connection declares the starts it offers instead; a client sends StartMow {plan_ref: ref} for the one the user picks and labels it by kind (plus name for a zone).
| Field | Type | Required | Notes |
|---|---|---|---|
kind |
StartPlanKind | yes | |
name |
string or null | no | The mower's own name of a zone, shown as is; null for the other kinds. |
ref |
string | yes | Sent as StartMow.plan_ref to start this.; pattern ^[a-z][a-z0-9_]{0,31}(:[A-Za-z0-9_.-]{1,64})?$
|
What a start plan does, so a client can label it without knowing the vendor.
Type: "now" | "zone" | "edge" | "schedule"
History of a mower in a time range.
| Field | Type | Required | Notes |
|---|---|---|---|
from |
string (date-time) | yes | |
mower_id |
string (uuid) | yes | |
points |
array of HistoryPointOut | yes | |
step_seconds |
number or null | yes | Bin width, null for raw rows. |
to |
string (date-time) | yes | |
truncated |
boolean | yes |
A daily window in the mower's local time, HH:MM on a 24-hour clock. end before start crosses midnight (22:00 to 06:00).
| Field | Type | Required | Notes |
|---|---|---|---|
end |
string | yes | End, HH:MM (24-hour clock).; pattern `^([01]\d |
start |
string | yes | Start, HH:MM (24-hour clock).; pattern `^([01]\d |
A new share link. token is shown only here; the page address is <app>/track#<token>.
| Field | Type | Required | Notes |
|---|---|---|---|
link |
TrackingLinkOut | yes | |
token |
string | yes |
Body of a link request.
| Field | Type | Required | Notes |
|---|---|---|---|
hours |
number or null | no | Lifetime; at most the server's limit (48 h). |
session_id |
string (uuid) or null | no |
A share link (never its token).
| Field | Type | Required | Notes |
|---|---|---|---|
active |
boolean | yes | |
created_at |
string (date-time) | yes | |
expires_at |
string (date-time) | yes | |
id |
string (uuid) | yes | |
last_used_at |
string (date-time) or null | no | |
revoked_at |
string (date-time) or null | no | |
session_id |
string (uuid) | yes | |
uses |
integer | yes |
A theft tracking session.
| Field | Type | Required | Notes |
|---|---|---|---|
active |
boolean | yes | |
end_reason |
"false_alarm" | "stopped" | "max_duration" or null |
no | |
ended_at |
string (date-time) or null | no | |
ends_at |
string (date-time) | yes | The automatic end (maximum duration). |
id |
string (uuid) | yes | |
interval_seconds |
number | yes | |
last |
TrackPointOut or null | no | Newest position seen by the background tick. |
mower_id |
string (uuid) | yes | |
mower_model |
string or null | no | |
mower_name |
string | yes | |
mower_serial |
string or null | no | |
points |
integer | yes | Positions recorded; final once the session ended. |
stale_since |
string (date-time) or null | no | Set while the mower has not reported for a while. |
started_at |
string (date-time) | yes | |
trigger |
"mower_lifted" | "mower_left_dock_unexpectedly" | "geofence_exit" | "manual"
|
yes |
The tracking view of a mower: the session, its track and its links.
| Field | Type | Required | Notes |
|---|---|---|---|
links |
array of TrackingLinkOut | no | |
map_layers |
array of MapLayerOut | no | Base map layers under the track; empty without any. |
photos |
integer | no | default 0
|
server_time |
string (date-time) | yes | |
session |
TrackingSessionOut or null | yes | The active session, else the newest one; null when the mower never had one. |
track |
array of TrackPointOut | no | |
truncated |
boolean | no | default false
|
Body of the stop request.
| Field | Type | Required | Notes |
|---|---|---|---|
reason |
"false_alarm" | "stopped"
|
no | default "stopped"
|
One position of a track.
| Field | Type | Required | Notes |
|---|---|---|---|
at |
string (date-time) | yes | |
lat |
number | yes | |
lon |
number | yes |
How a spot run turns at the end of a lane (ADR 0043).
in_place: the mower rotates on the spot (fast, but an all-wheel-drive mower scuffs the turf). arc: a forward U-turn with a radius of at least half the lane spacing, or a bulb turn over the neighbouring lane when the spacing is narrower than the turning radius. multi_point: a three-point turn (forward arc, reverse arc with the blades off, forward arc); needs a drive link that can reverse (MowerCapabilities.drive_reverse).
Type: "in_place" | "arc" | "multi_point"
| Field | Type | Required | Notes |
|---|---|---|---|
ctx |
object | no | |
input |
any | no | |
loc |
array of string or integer | yes | |
msg |
string | yes | |
type |
string | yes |
The running job as the iOS widgets and the Live Activity show it.
| Field | Type | Required | Notes |
|---|---|---|---|
area_id |
string or null | yes | |
area_name |
string or null | yes | Name of the map area, when the map names it. |
elapsed_s |
integer or null | yes | |
mowed_m2 |
number or null | yes | |
progress_percent |
integer or null | yes | |
remaining_s |
integer or null | yes |
GET /mowers/{id}/widget: a compact state (ADR 0059).
| Field | Type | Required | Notes |
|---|---|---|---|
activity |
string | yes |
MowerActivity; offline replaces the activity while the state is stale. |
battery_percent |
integer | yes | |
charging |
boolean | yes | |
error_category |
string or null | no | With activity error: the manufacturer-neutral MowerErrorCategory. |
error_code |
string or null | yes | |
error_message |
string or null | yes | |
error_severity |
string or null | no | With activity error: info, warning, error or critical. |
error_title |
string or null | no | With activity error: the error in plain words from the vendor's error lexicon in the requested locale (ADR 0067); for a code no lexicon knows the generic title of its category; null when neither is known (show error_message). |
job |
WidgetJobOut or null | yes | |
mower_id |
string (uuid) | yes | |
observed_at |
string (date-time) | yes | |
rain_detected |
boolean or null | yes | |
stale |
boolean | yes | The mower is offline (see MowerStateSnapshot.stale). |
Time in a zone on one UTC day.
| Field | Type | Required | Notes |
|---|---|---|---|
day |
string (date) | yes | |
mowing_seconds |
number | yes | |
seconds |
number | yes |
A new zone.
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string | yes | min length 1; max length 200 |
ring |
array of array of number | yes | Corners as [lat, lon] (WGS84 degrees), open or closed; edges must not cross.; min items 3; max items 65 |
start_plan_ref |
string or null | no |
The validation limits, so a client can check a drawing before it is sent.
| Field | Type | Required | Notes |
|---|---|---|---|
max_anchor_distance_m |
number | no | default 1000.0
|
max_area_m2 |
number | no | default 100000.0
|
max_corners |
integer | no | default 64
|
max_extent_m |
number | no | default 1000.0
|
max_name_length |
integer | no | default 60
|
max_zones |
integer | no | default 32
|
min_area_m2 |
number | no | default 1.0
|
min_corners |
integer | no | default 3
|
One virtual zone.
| Field | Type | Required | Notes |
|---|---|---|---|
area_m2 |
number | yes | |
created_at |
string (date-time) | yes | |
id |
string (uuid) | yes | |
name |
string | yes | |
ring |
array of array of number | yes | Corners as [lat, lon], open ring. |
start_plan_ref |
string or null | no | The vendor zone start (StartPlan of kind zone) this zone is linked to; send it as StartMow.plan_ref to start the mower there. |
updated_at |
string (date-time) | yes |
Changes to a zone; fields left out stay as they are.
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string or null | no | |
ring |
array of array of number or null | no | |
start_plan_ref |
string or null | no | Link the zone to this vendor zone start. |
unlink_start_plan |
boolean | no | Remove the link to a start.; default false
|
A vendor zone start a zone can be linked to.
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string or null | no | |
ref |
string | yes |
The zones of a mower and whether the editor is offered.
| Field | Type | Required | Notes |
|---|---|---|---|
anchor |
AnchorOut or null | no | |
availability |
"available" | "vendor_map" | "no_position"
|
yes |
available: the vendor shares no map areas and the mower reports positions; vendor_map: its vendor's areas are its zones; no_position: it reports no position. |
limits |
ZoneLimits | no | |
presence |
PresenceOut or null | no | The current zone; null before the first evaluation. |
zone_plans |
array of ZonePlanOut | no | Vendor zone starts declared by the mower's connection (ADR 0066); empty when it declares none, then zones cannot be linked to a start. |
zones |
array of ZoneOut | yes |
Time per zone over whole UTC days.
| Field | Type | Required | Notes |
|---|---|---|---|
first_day |
string (date) | yes | |
items |
array of ZoneTotalsOut | yes | |
last_day |
string (date) | yes |
Time in one zone over the period.
| Field | Type | Required | Notes |
|---|---|---|---|
days |
array of ZoneDayOut | yes | |
entries |
integer | yes | How often it entered the zone. |
mowing_seconds |
number | yes | Of that, time it mowed. |
name |
string | yes | |
seconds |
number | yes | Time the mower was in the zone while it reported. |
zone_id |
string (uuid) | yes |
Mirrored from docs/reference/api/telemetry.md at commit ccac8bf3da8a6f86155c29f6cd1aad963968fb68. Edit the file in the repository, not this wiki page.
Mirrored from the docs/ directory at commit ccac8bf3da8a6f86155c29f6cd1aad963968fb68. Edit the files in the repository, not this wiki.
MowDeck documentation
- Home
- Phases
- Architecture
-
Decisions (ADR)
- Architecture decisions
- ADR 0001: OpenFGA instead of self-built authorization
- ADR 0002: Self-built Identity service in FastAPI instead of Keycloak or Zitadel
- ADR 0003: SvelteKit for the web app
- ADR 0004: Monorepo with a uv workspace
- ADR 0005: AGPL-3.0 for services and apps, Apache-2.0 for libraries
- ADR 0006: PostgreSQL for all persistence, no SQLite
- ADR 0007: NATS JetStream as event bus
- ADR 0008: Traefik as gateway
- ADR 0009: Command and event envelopes, subject naming and de-duplication
- ADR 0010: Python 3.13 for all services and libraries
- ADR 0011: Separate GPL-3.0 package for the PyMammotion adapter
- ADR 0012: Mower control interface and safety rules
- ADR 0013: Device-Gateway registry, sharding and per-mower concurrency
- ADR 0014: Authorization model, tuple ownership and the mowdeck-authz client
- ADR 0015: Tokens, sessions and key rotation
- ADR 0016: Fleet commands and authorization per command kind
- ADR 0017: Telemetry storage and retention
- ADR 0018: Realtime WebSocket protocol
- ADR 0019: Mammotion adapter transports, manual drive and secrets
- ADR 0020: Web app architecture
- ADR 0021: Browser authentication flow
- ADR 0022: Notifications: rules, recipients and delivery
- ADR 0023: Map rendering and projection
- ADR 0024: Scheduler: recurrence, rain pause and command issuing
- ADR 0025: Home Assistant integration as a pure API client
- ADR 0026: Manual drive channel over the Realtime WebSocket
- ADR 0027: Health history and theft alarm
- ADR 0028: Entitlements: plans as data and enforcement
- ADR 0029: Helm chart and release pipeline
- ADR 0030: Mowing patterns as plug-ins and the Planner
- ADR 0031: Billing with a Stripe adapter
- ADR 0032: Live camera over Agora, joined directly by the browser
- ADR 0033: Vision-assisted recovery with human approval
- ADR 0034: Linked cloud accounts and device discovery
- ADR 0035: Server-side camera frames and automatic AI analysis on errors
- ADR 0036: Native app shells with Capacitor, loading the web app from the server
- ADR 0037: Camera panorama calibration in the browser, with the AI supplying points only
- ADR 0038: Dual link per mower and firmware updates
- ADR 0039: Spot mowing by MowDeck-driven paths
- ADR 0040: Link heartbeat for online status
- ADR 0041: Spot runs from the dock: undock, transit and return
- ADR 0042: Drive calibration
- ADR 0043: Turn styles
- ADR 0044: Drive view with camera
- ADR 0045: Camera relay
- ADR 0046: Device settings as capabilities
- ADR 0047: The RTK base station as a Fleet device
- ADR 0048: Maintenance commands
- ADR 0049: Manual driving over the Mammotion cloud
- ADR 0050: Passkeys and the app login hand-off
- ADR 0051: Sign in with GitHub
- ADR 0052: Sign in with Apple
- ADR 0053: Retention and downsampling of the position track
- ADR 0054: Aerial photo under the mower map
- ADR 0055: Deploy maintenance window
- ADR 0056: Camera photo in push notifications for errors and theft alarms
- ADR 0057: Step-up re-authentication for critical actions
- ADR 0058: Theft tracking mode
- ADR 0059: iOS widgets and the mowing Live Activity
- ADR 0060: Apple Watch app
- ADR 0061: Mowing angle rotation
- ADR 0062: Setup tour for new users
- ADR 0063: Matter server (mowers in Apple Home and Google Home)
- ADR 0064: Personal access tokens and the public API documentation
- ADR 0065: Security center and new-login alerts
- ADR 0066: Cloud provider plugins and adapters for more vendors
- ADR 0067: Error code lexicon, provider independent
- ADR 0068: Public demo mode
- ADR 0069: Provider conformance kit and provider package template
- ADR 0070: Virtual zones for mowers without a vendor map
- ADR 0071: Capability matrix generated from the adapters
- ADR 0072: API explorer in the web app, for the public demo
- ADR 0073: Guided tour with coach marks
- ADR 0074: NATS authentication and per-service subject permissions
-
Development
- Getting started
- Service template
- Shared libraries
- Cloud providers: adding a vendor
- Adding a provider: template and conformance kit
- Adding an error lexicon for a vendor
- Design: identity and authorization
- Design: fleet, telemetry, realtime
- Design: web app
- Web app
- Home Assistant integration
- Camera source bridge protocol
- Fuzzing and property-based tests
- GitHub wiki mirror
-
Operations
- Operating the Compose stack
- Operating MowDeck on Kubernetes (Helm)
- Building the Bluetooth bridge (ESPHome on a XIAO ESP32-S3)
- Releases
- Vendor library updates
- Billing operations
- Telemetry: retention and position downsampling
- iPhone and Android apps
- Passkeys
- Sign in with GitHub
- Aerial photo under the map
- Sign in with Apple
- Theft tracking mode
- Matter server
- Source code offer (AGPL-3.0 section 13)
- Public demo
- Load testing
- Spikes
-
Guides
- Guides
- ESP32 bridge: purchase and setup
- Signing in with a passkey
- Signing in with GitHub
- Error codes in plain words
- Aerial photo under the map
- Signing in with Apple
- Confirming critical actions
- Your security page
- iPhone widgets and the mowing Live Activity
- Apple Watch
- The setup tour
- Apple Home and Google Home (Matter)
- Worx Landroid, Kress and LandXcape mowers
- Scripting MowDeck
- Capability matrix
- API reference
- Original plan (German)