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

FieldRequiredTypeNotes
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

FieldRequiredTypeNotes
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.
CodeName
AAgriculture
VAviation
BBoating
CConstruction
EEnvironmental
HHealth
MMining
SSurveying
TTransportation
WWeather
OOther
UUnknown

gatt object (present only if top-level type == 'ble')

FieldRequiredType
serviceRequiredUUID string
characteristicsRequirednon-empty list, see characteristics[] entry below

characteristics[] entry

FieldRequiredTypeNotes
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 of published versions retained as history.
  • Status is exactly one of Draft or Published; an orthogonal Withdrawn flag hides a published version from consumers without deleting it.
  • semanticVersion on 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 name as a Global entry supersedes it for that account (same pattern as Standard Data Types).
  • Cross-feature reference risk — a gatt/profile config 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.