Device Config schema reference
This page is a field-by-field reference for the YAML documents behind entries in the
My Device Configs tab of Settings.
It's aimed at anyone hand-editing or reviewing a Device Config definition rather than just
using the UI. One entry is one
profile, plus at most one associated
gatt block for Bluetooth (BLE) devices. There's no promoted/public-catalog tier -
sharing a config across accounts is manual YAML export/import only.
Top-level document
| Field | Required | Type | Notes |
|---|---|---|---|
label |
Required | string | Display name. |
type |
Required | string | Device kind. The value 'ble' triggers the gatt requirement below.
internal means using a module already bundled with the target environment
(usually the mobile app), and doesn't require gatt. |
version |
Optional | string | Display-only in the YAML body - not the authoritative version. See Versioning model. |
profile |
Required | object | See profile object below. |
gatt |
Conditional | object | Required only if type == 'ble'; see gatt
object below. Omitted entirely for non-BLE types. |
Any key outside this set is flagged as unknown.
profile object
| Field | Required | Type | Notes |
|---|---|---|---|
name |
Required | string | The name of the profile - sole identity of the entry within its scope. |
compatibleActivityTypes |
Optional | list | Activity types the profile can be applied to. If missing or empty, it applies to all activity types. |
profiles |
Optional | list | inMotion profile codes (see Profiles below), restricting which domain(s) of interest the device applies to. |
symbol |
Optional | string (key ref) | External reference into the mobile app's icon set. In current use, always one of the
*Sensor keys, e.g. keyboardSensor, heartSensor,
bluetoothSensor. |
managedAdapter |
Optional | string | Identifier of the adapter implementation that drives this device, e.g.
ble-generic for the shared generic-BLE adapter, or a device-specific id
such as mock-avery-indicator-ble. |
deviceDiscovery |
Optional | object | {adapterType, settings: {name, address}}. Configures how the device is
found/paired; adapterType selects the discovery strategy (e.g.
usc-serial), and settings.name/settings.address
map discovered-device fields to setting keys. |
settings |
Optional | object | User-configurable settings for the device, keyed by setting name. Each entry:
{name, type, default?, required?, isEnumerable?, enums?}, where
enums is a list of {id, title}. |
data |
Optional | object | The data fields this device produces, keyed by field name. Each entry:
{name, units, type, required?, format?}. |
platforms |
Optional | list | Client platforms the profile is available on: ios-handheld,
ios-tablet, android-handheld, android-tablet. |
type |
Optional | enum | Broad device-behavior category: fitness (BLE fitness-machine style, e.g.
heart rate/cycling), geo-vector (location/navigation), manual
(user-entered readings, e.g. rate/area spraying), serial (raw serial
passthrough). |
Profiles
The codes usable in a device config's
profile.profiles list (e.g. [A, T]),
each naming a domain of interest the device applies to.
| Code | Name |
|---|---|
A | Agriculture |
V | Aviation |
B | Boating |
C | Construction |
E | Environmental |
H | Health |
M | Mining |
S | Surveying |
T | Transportation |
W | Weather |
O | Other |
U | Unknown |
gatt object (present only if top-level type == 'ble')
| Field | Required | Type |
|---|---|---|
service | Required | UUID string |
characteristics | Required | non-empty list, see characteristics[] entry below |
characteristics[] entry
| Field | Required | Type | Notes |
|---|---|---|---|
uuid |
Required | string | |
mode |
Required | enum | read, write, notify |
encode |
Conditional | — | Required iff mode == 'write'. |
decode |
Conditional | — | Required iff mode is read or notify. |
fields |
Optional | list | Not independently validated client-side; byte-level field decoding lives within
decode/encode. |
Versioning model (per name, account scope only)
- At most one
development(draft) version per name, plus any number ofpublishedversions retained as history. - Status is exactly one of Draft or Published; an orthogonal Withdrawn flag hides a published version from consumers without deleting it.
semanticVersionon publish must be strictly greater than the name's current published version (server-enforced); the client requires the format\d+.\d+.\d+before allowing publish.- Deleting a name removes all versions of it at once - deletion is not scoped to a single version.
- Global scope has no version history: one row per name, read-only.
Cross-entry rules
- Scope override — an account entry with the same
nameas a Global entry supersedes it for that account (same pattern as Standard Data Types). - Cross-feature reference risk — a
gatt/profileconfig may reference an account-scoped Standard Data Type; such a config cannot safely be exposed to other accounts, which is why cross-account promotion/sharing isn't offered in the UI.
Example
label: Area Spraying type: internal version: 1.0.0 profile: name: area-spraying compatibleActivityTypes: - agriculture/machinery/sprayer - agriculture/machinery/spreader type: manual profiles: - A symbol: keyboardSensor variantSetting: material settings: initialTankVolume: name: Initial Tank Volume (l) type: number
This is an
internal config, so no gatt block is present.