Rower Data (0x2AD1): byte layout
GATT characteristic · org.bluetooth.characteristic.rower_data · read from the Bluetooth SIG’s repository on 2026-10-17 · commit 408f4a0 (2026-10-14)
Rower Data is Bluetooth GATT characteristic 0x2AD1, org.bluetooth.characteristic.rower_data in the Bluetooth SIG's assigned numbers. The SIG's GATT Specification Supplement file lays its value out as 17 fields: Flags, Stroke Rate, Stroke Count, Average Stroke Rate, Total Distance and 12 more. The first, Flags, is a boolean[16]; 16 of the others are present only when a bit of it is set as the field's text states, so after the first of those, a field's offset depends on which bits are set.
- UUID
- 0x2AD1
- Identifier
org.bluetooth.characteristic.rower_data- The SIG’s description
- The Rower Data characteristic is used to represent data related to a rowing device.The structure of this characteristic is defined below.
- Service the SIG’s files tie it to
- None: no file in the repository lists this characteristic under a service.
- Source file
- gss/org.bluetooth.characteristic.rower_data.yaml
Byte layout: 17 fields
In the order the SIG’s structure lists them. Type and size are as published; sizes count octets except where a struct is marked as sized in bits. The offset is printed only where every earlier field has a fixed size; where an earlier field can be absent or vary, the cell names what it depends on. “Present when” is read from the field’s own “Present if” line, shown in full in the field notes below.
| Offset | Field | Type | Size | Present when | Unit |
|---|---|---|---|---|---|
| 0 | Flags | boolean[16] | 2 | Always (fixed size) | — |
| 2 | Stroke Rate | uint8 | 0 or 1 | Bit 0 of Flags is 0 | stroke (per minute)org.bluetooth.unit.stroke_per_minute |
| Depends on Flags (bit 0) | Stroke Count | uint16 | 0 or 2 | Bit 0 of Flags is 0 | unitlessorg.bluetooth.unit.unitless |
| Depends on Flags (bit 0) | Average Stroke Rate | uint8 | 0 or 1 | Bit 1 of Flags is 1 | stroke (per minute)org.bluetooth.unit.stroke_per_minute |
| Depends on Flags (bits 0 and 1) | Total Distance | uint24 | 0 or 3 | Bit 2 of Flags is 1 | length (metre)org.bluetooth.unit.length.metre |
| Depends on Flags (bits 0, 1 and 2) | Instantaneous Pace (Time per 500 meters) | uint16 | 0 or 2 | Bit 3 of Flags is 1 | time (second)org.bluetooth.unit.time.second |
| Depends on Flags (bits 0, 1, 2 and 3) | Average Pace (Time per 500 meters) | uint16 | 0 or 2 | Bit 4 of Flags is 1 | time (second)org.bluetooth.unit.time.second |
| Depends on Flags (bits 0, 1, 2, 3 and 4) | Instantaneous Power | sint16 | 0 or 2 | Bit 5 of Flags is 1 | power (watt)org.bluetooth.unit.power.watt |
| Depends on Flags (bits 0, 1, 2, 3, 4 and 5) | Average Power | sint16 | 0 or 2 | Bit 6 of Flags is 1 | power (watt)org.bluetooth.unit.power.watt |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5 and 6) | Resistance Level | uint8 | 0 or 1 | Bit 7 of Flags is 1 | unitlessorg.bluetooth.unit.unitless |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6 and 7) | Total Energy | uint16 | 0 or 2 | Bit 8 of Flags is 1 | energy (kilogram calorie)org.bluetooth.unit.energy.kilogram_calorie |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6, 7 and 8) | Energy Per Hour | uint16 | 0 or 2 | Bit 8 of Flags is 1 | energy (kilogram calorie)org.bluetooth.unit.energy.kilogram_calorie |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6, 7 and 8) | Energy Per Minute | uint8 | 0 or 1 | Bit 8 of Flags is 1 | energy (kilogram calorie)org.bluetooth.unit.energy.kilogram_calorie |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6, 7 and 8) | Heart Rate | uint8 | 0 or 1 | Bit 9 of Flags is 1 | period (beats per minute)org.bluetooth.unit.period.beats_per_minute |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9) | Metabolic Equivalent | uint8 | 0 or 1 | Bit 10 of Flags is 1 | metabolic equivalentorg.bluetooth.unit.metabolic_equivalent |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 and 10) | Elapsed Time | uint16 | 0 or 2 | Bit 11 of Flags is 1 | time (second)org.bluetooth.unit.time.second |
| Depends on Flags (bits 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 and 11) | Remaining Time | uint16 | 0 or 2 | Bit 12 of Flags is 1 | time (second)org.bluetooth.unit.time.second |
Field notes
Each field’s text in the SIG’s file, line by line.
- Flags boolean[16] · 2
- See Flags
- Stroke Rate uint8 · 0 or 1
- Base Unit: org.bluetooth.unit.stroke_per_minuteRepresented values: M = 1, d = 0, b = -1Unit is 1/2 of a stroke per minuteThe Stroke Rate field represents the instantaneous stroke rate measured by the Server.Present if bit 0 of Flags field is set to 0
- Stroke Count uint16 · 0 or 2
- Unit: org.bluetooth.unit.unitlessThe Stroke Count field represents the total number of strokes since the beginning of the training session.Present if bit 0 of Flags field is set to 0
- Average Stroke Rate uint8 · 0 or 1
- Base Unit: org.bluetooth.unit.stroke_per_minuteRepresented values: M = 1, d = 0, b = -1Unit is 1/2 of a stroke per minuteThe Average Stroke Rate field represents the average speed since the beginning of the training sessionPresent if bit 1 of Flags field is set to 1
- Total Distance uint24 · 0 or 3
- Unit: org.bluetooth.unit.length.metreThe Total Distance field represents the total distance reported by the Server since the beginning of the training session.Present if bit 2 of Flags field is set to 1
- Instantaneous Pace (Time per 500 meters) uint16 · 0 or 2
- Unit: org.bluetooth.unit.time.secondThe Instantaneous Pace field represents the value of the pace (time per 500 meters) of the user while exercising.Present if bit 3 of Flags field is set to 1
- Average Pace (Time per 500 meters) uint16 · 0 or 2
- Unit: org.bluetooth.unit.time.secondThe Average Pace field represents the value of the average pace (time per 500 meters) since the beginning of the training session.Present if bit 4 of Flags field is set to 1
- Instantaneous Power sint16 · 0 or 2
- Unit: org.bluetooth.unit.power.wattThe Instantaneous Power field represents the value of the instantaneous power measured by the Server.Present if bit 5 of Flags field is set to 1
- Average Power sint16 · 0 or 2
- Unit: org.bluetooth.unit.power.wattThe Average Power field represents the value of the average power measured by the Server since the beginning of the training session.Present if bit 6 of Flags field is set to 1
- Resistance Level uint8 · 0 or 1
- Base Unit: org.bluetooth.unit.unitlessRepresented values: M = 1, d = 1, b = 0Unit is 1The Resistance Level field represents the value of the current value of the resistance level of the Server.Present if bit 7 of Flags field is set to 1
- Total Energy uint16 · 0 or 2
- Unit: org.bluetooth.unit.energy.kilogram_calorieThe Total Energy field represents the total expended energy of a user since the training session has started.Present if bit 8 of Flags field is set to 1
- Energy Per Hour uint16 · 0 or 2
- Unit: org.bluetooth.unit.energy.kilogram_calorieThe Energy per Hour field represents the average expended energy of a user during a period of one hour.Present if bit 8 of Flags field is set to 1
- Energy Per Minute uint8 · 0 or 1
- Unit: org.bluetooth.unit.energy.kilogram_calorieThe Energy per Minute field represents the average expended energy of a user during a period of one minute.Present if bit 8 of Flags field is set to 1
- Heart Rate uint8 · 0 or 1
- Unit: org.bluetooth.unit.period.beats_per_minuteThe Heart Rate field represents the current heart rate value of the user (e.g., measured via the contact heart rate or any other means).Present if bit 9 of Flags field is set to 1
- Metabolic Equivalent uint8 · 0 or 1
- Base Unit: org.bluetooth.unit.metabolic_equivalentRepresented values: M = 1, d = -1, b = 0Unit is 1/10 metabolic equivalentThe Metabolic Equivalent field represents the metabolic equivalent of the user.Present if bit 10 of Flags field is set to 1
- Elapsed Time uint16 · 0 or 2
- Unit: org.bluetooth.unit.time.secondThe Elapsed Time field represents the elapsed time of a training session since the training session has started.Present if bit 11 of Flags field is set to 1
- Remaining Time uint16 · 0 or 2
- Unit: org.bluetooth.unit.time.secondThe Remaining Time field represents the remaining time of a selected training session.Present if bit 12 of Flags field is set to 1
Flags and value tables
The definitions the SIG’s file gives for its fields, every row as published. On a flags table the last column lists the fields whose “Present if” line names that bit.
Flags
The bits of this field are defined below.
| Bit | Description | Fields its condition names |
|---|---|---|
| 0 | More Data | Stroke Rate when 0Stroke Count when 0 |
| 1 | Average Stroke rate present | Average Stroke Rate when 1 |
| 2 | Total Distance present | Total Distance when 1 |
| 3 | Instantaneous Pace present | Instantaneous Pace (Time per 500 meters) when 1 |
| 4 | Average Pace present | Average Pace (Time per 500 meters) when 1 |
| 5 | Instantaneous Power present | Instantaneous Power when 1 |
| 6 | Average Power present | Average Power when 1 |
| 7 | Resistance Level present | Resistance Level when 1 |
| 8 | Expended Energy present | Total Energy when 1Energy Per Hour when 1Energy Per Minute when 1 |
| 9 | Heart Rate present | Heart Rate when 1 |
| 10 | Metabolic Equivalent present | Metabolic Equivalent when 1 |
| 11 | Elapsed Time present | Elapsed Time when 1 |
| 12 | Remaining Time present | Remaining Time when 1 |
| 13–15 | Reserved for Future Use | — |
Guides on this site
The connected-device guides that name 0x2AD1:
Questions
- What is the UUID of the Rower Data characteristic?
- 0x2AD1. The Bluetooth SIG's characteristic_uuids.yaml lists Rower Data as 0x2AD1 with the identifier org.bluetooth.characteristic.rower_data. No file in the SIG's repository ties it to a service: the repository lists service and characteristic UUIDs separately.
- Which Rower Data fields are optional?
- 16 of its 17 fields have a published size that can be zero: Stroke Rate (0 or 1; Present if bit 0 of Flags field is set to 0); Stroke Count (0 or 2; Present if bit 0 of Flags field is set to 0); Average Stroke Rate (0 or 1; Present if bit 1 of Flags field is set to 1); Total Distance (0 or 3; Present if bit 2 of Flags field is set to 1); Instantaneous Pace (Time per 500 meters) (0 or 2; Present if bit 3 of Flags field is set to 1); Average Pace (Time per 500 meters) (0 or 2; Present if bit 4 of Flags field is set to 1); Instantaneous Power (0 or 2; Present if bit 5 of Flags field is set to 1); Average Power (0 or 2; Present if bit 6 of Flags field is set to 1); Resistance Level (0 or 1; Present if bit 7 of Flags field is set to 1); Total Energy (0 or 2; Present if bit 8 of Flags field is set to 1); Energy Per Hour (0 or 2; Present if bit 8 of Flags field is set to 1); Energy Per Minute (0 or 1; Present if bit 8 of Flags field is set to 1); Heart Rate (0 or 1; Present if bit 9 of Flags field is set to 1); Metabolic Equivalent (0 or 1; Present if bit 10 of Flags field is set to 1); Elapsed Time (0 or 2; Present if bit 11 of Flags field is set to 1); Remaining Time (0 or 2; Present if bit 12 of Flags field is set to 1). Flags (2) has a fixed size.
- What units does Rower Data use?
- The SIG's text names a unit for 16 of the 17 fields: Stroke Rate: stroke (per minute) (org.bluetooth.unit.stroke_per_minute); Stroke Count: unitless (org.bluetooth.unit.unitless); Average Stroke Rate: stroke (per minute) (org.bluetooth.unit.stroke_per_minute); Total Distance: length (metre) (org.bluetooth.unit.length.metre); Instantaneous Pace (Time per 500 meters): time (second) (org.bluetooth.unit.time.second); Average Pace (Time per 500 meters): time (second) (org.bluetooth.unit.time.second); Instantaneous Power: power (watt) (org.bluetooth.unit.power.watt); Average Power: power (watt) (org.bluetooth.unit.power.watt); Resistance Level: unitless (org.bluetooth.unit.unitless); Total Energy: energy (kilogram calorie) (org.bluetooth.unit.energy.kilogram_calorie); Energy Per Hour: energy (kilogram calorie) (org.bluetooth.unit.energy.kilogram_calorie); Energy Per Minute: energy (kilogram calorie) (org.bluetooth.unit.energy.kilogram_calorie); Heart Rate: period (beats per minute) (org.bluetooth.unit.period.beats_per_minute); Metabolic Equivalent: metabolic equivalent (org.bluetooth.unit.metabolic_equivalent); Elapsed Time: time (second) (org.bluetooth.unit.time.second); Remaining Time: time (second) (org.bluetooth.unit.time.second).
- What do the bits of the Rower Data Flags field mean?
- The SIG defines them as: bit 0, More Data (Stroke Rate when 0, Stroke Count when 0); bit 1, Average Stroke rate present (Average Stroke Rate when 1); bit 2, Total Distance present (Total Distance when 1); bit 3, Instantaneous Pace present (Instantaneous Pace (Time per 500 meters) when 1); bit 4, Average Pace present (Average Pace (Time per 500 meters) when 1); bit 5, Instantaneous Power present (Instantaneous Power when 1); bit 6, Average Power present (Average Power when 1); bit 7, Resistance Level present (Resistance Level when 1); bit 8, Expended Energy present (Total Energy when 1, Energy Per Hour when 1, Energy Per Minute when 1); bit 9, Heart Rate present (Heart Rate when 1); bit 10, Metabolic Equivalent present (Metabolic Equivalent when 1); bit 11, Elapsed Time present (Elapsed Time when 1); bit 12, Remaining Time present (Remaining Time when 1). The remaining bits are reserved for future use.
Source
Read on 2026-10-17 from gss/org.bluetooth.characteristic.rower_data.yaml and assigned_numbers/uuids/characteristic_uuids.yaml in the Bluetooth SIG’s public repository (branch main, commit 408f4a0, committed 2026-10-14), by scripts/fetch-bluetooth-gatt.mjs. The file’s notice says it is proprietary to Bluetooth SIG, that furnishing it grants no licence, and that it is subject to change without notice; it is © Bluetooth SIG, Inc., and its text is quoted here for identification. Generated by AIFitnessAPI, which is not affiliated with Bluetooth SIG; the SIG’s file remains the authority. The full notice and the conventions used on these pages are on the reference hub.