Cycling Power Measurement (0x2A63): byte layout
GATT characteristic · org.bluetooth.characteristic.cycling_power_measurement · read from the Bluetooth SIG’s repository on 2026-10-17 · commit 408f4a0 (2026-10-14)
Cycling Power Measurement is Bluetooth GATT characteristic 0x2A63, org.bluetooth.characteristic.cycling_power_measurement in the Bluetooth SIG's assigned numbers. The SIG's GATT Specification Supplement file lays its value out as 12 fields: Flags, Instantaneous Power, Pedal Power Balance, Accumulated Torque, Wheel Revolution Data and 7 more. The first, Flags, is a boolean[16]; 10 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
- 0x2A63
- Identifier
org.bluetooth.characteristic.cycling_power_measurement- The SIG’s description
- The Cycling Power Measurement characteristic is used to represent data related to a cycling power sensor.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.cycling_power_measurement.yaml
Byte layout: 12 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 | Instantaneous Power | sint16 | 2 | Always (fixed size) | power (watt)org.bluetooth.unit.power.watt |
| 4 | Pedal Power Balance | uint8 | 0 or 1 | Bit 0 of Flags is 1 | percentageorg.bluetooth.unit.percentage |
| Depends on Flags (bit 0) | Accumulated Torque | uint16 | 0 or 2 | Bit 2 of Flags is 1 | moment of force (newton metre)org.bluetooth.unit.moment_of_force.newton_metre |
| Depends on Flags (bits 0 and 2) | Wheel Revolution Data | struct | 0 or 6 | Bit 4 of Flags is 1 | — |
| +0 | ↳ Cumulative Wheel Revolutions | uint32 | 4 | Always (fixed size) | unitlessorg.bluetooth.unit.unitless |
| +4 | ↳ Last Wheel Event Time | uint16 | 2 | Always (fixed size) | time (second)org.bluetooth.unit.time.second |
| Depends on Flags (bits 0, 2 and 4) | Crank Revolution Data | struct | 0 or 4 | Bit 5 of Flags is 1 | — |
| +0 | ↳ Cumulative Crank Revolutions | uint16 | 2 | Always (fixed size) | unitlessorg.bluetooth.unit.unitless |
| +2 | ↳ Last Crank Event Time | uint16 | 2 | Always (fixed size) | time (second)org.bluetooth.unit.time.second |
| Depends on Flags (bits 0, 2, 4 and 5) | Extreme Force Magnitudes | struct | 0 or 4 | Bit 6 of Flags is 1 | — |
| +0 | ↳ Maximum Force Magnitude | sint16 | 2 | Always (fixed size) | force (newton)org.bluetooth.unit.force.newton |
| +2 | ↳ Minimum Force Magnitude | sint16 | 2 | Always (fixed size) | force (newton)org.bluetooth.unit.force.newton |
| Depends on Flags (bits 0, 2, 4, 5 and 6) | Extreme Torque Magnitudes | struct | 0 or 4 | Bit 7 of Flags is 1 | — |
| +0 | ↳ Maximum Torque Magnitude | sint16 | 2 | Always (fixed size) | moment of force (newton metre)org.bluetooth.unit.moment_of_force.newton_metre |
| +2 | ↳ Minimum Torque Magnitude | sint16 | 2 | Always (fixed size) | moment of force (newton metre)org.bluetooth.unit.moment_of_force.newton_metre |
| Depends on Flags (bits 0, 2, 4, 5, 6 and 7) | Extreme Angles | struct | 0 or 3 | Bit 8 of Flags is 1 | — |
| +0 bits | ↳ Maximum Angle | uint12 | 12 bits | Always (fixed size) | plane angle (degree)org.bluetooth.unit.plane_angle.degree |
| +12 bits | ↳ Minimum Angle | uint12 | 12 bits | Always (fixed size) | plane angle (degree)org.bluetooth.unit.plane_angle.degree |
| Depends on Flags (bits 0, 2, 4, 5, 6, 7 and 8) | Top Dead Spot Angle | uint16 | 0 or 2 | Bit 9 of Flags is 1 | plane angle (degree)org.bluetooth.unit.plane_angle.degree |
| Depends on Flags (bits 0, 2, 4, 5, 6, 7, 8 and 9) | Bottom Dead Spot Angle | uint16 | 0 or 2 | Bit 10 of Flags is 1 | plane angle (degree)org.bluetooth.unit.plane_angle.degree |
| Depends on Flags (bits 0, 2, 4, 5, 6, 7, 8, 9 and 10) | Accumulated Energy | uint16 | 0 or 2 | Bit 11 of Flags is 1 | energy (joule)org.bluetooth.unit.energy.joule |
Field notes
Each field’s text in the SIG’s file, line by line.
- Flags boolean[16] · 2
- See Flags
- Instantaneous Power sint16 · 2
- Unit: org.bluetooth.unit.power.watt
- Pedal Power Balance uint8 · 0 or 1
- Base Unit: org.bluetooth.unit.percentageRepresented values: M = 1, d = 0, b = -1Unit is 1/2 of a percentPresent if bit 0 of Flags field is set to 1
- Accumulated Torque uint16 · 0 or 2
- Base Unit: org.bluetooth.unit.moment_of_force.newton_metreRepresented values: M = 1, d = 0, b = -5Unit is 1/32 Newton meterPresent if bit 2 of Flags field is set to 1
- Wheel Revolution Data struct · 0 or 6
- See Wheel Revolution DataPresent if bit 4 of Flags field is set to 1
- Crank Revolution Data struct · 0 or 4
- See Crank Revolution DataPresent if bit 5 of Flags field is set to 1
- Extreme Force Magnitudes struct · 0 or 4
- See Extreme Force MagnitudesPresent if bit 6 of Flags field is set to 1
- Extreme Torque Magnitudes struct · 0 or 4
- See Extreme Torque MagnitudesPresent if bit 7 of Flags field is set to 1
- Extreme Angles struct · 0 or 3
- See Extreme AnglesPresent if bit 8 of Flags field is set to 1
- Top Dead Spot Angle uint16 · 0 or 2
- See Top and Bottom Dead Spot AnglesUnit: org.bluetooth.unit.plane_angle.degreePresent if bit 9 of Flags field is set to 1
- Bottom Dead Spot Angle uint16 · 0 or 2
- See Top and Bottom Dead Spot AnglesUnit: org.bluetooth.unit.plane_angle.degreePresent if bit 10 of Flags field is set to 1
- Accumulated Energy uint16 · 0 or 2
- Base Unit: org.bluetooth.unit.energy.jouleRepresented values: M = 1, d = 3, b = 0Unit is kilojoulePresent if bit 11 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 | Pedal Power Balance Present | Pedal Power Balance when 1 |
| 1 | Pedal Power Balance Reference0 = Unknown1 = Left | — |
| 2 | Accumulated Torque Present | Accumulated Torque when 1 |
| 3 | Accumulated Torque Source0 = Wheel based1 = Crank based | — |
| 4 | Wheel Revolution Data Present | Wheel Revolution Data when 1 |
| 5 | Crank Revolution Data Present | Crank Revolution Data when 1 |
| 6 | Extreme Force Magnitudes Present | Extreme Force Magnitudes when 1 |
| 7 | Extreme Torque Magnitudes Present | Extreme Torque Magnitudes when 1 |
| 8 | Extreme Angles Present | Extreme Angles when 1 |
| 9 | Top Dead Spot Angle Present | Top Dead Spot Angle when 1 |
| 10 | Bottom Dead Spot Angle Present | Bottom Dead Spot Angle when 1 |
| 11 | Accumulated Energy Present | Accumulated Energy when 1 |
| 12 | Offset Compensation Indicator0 = False1 = True | — |
| 13–15 | Reserved for Future Use | — |
Wheel Revolution Data
The structure of this field is defined below.
| Field | Data type | Size | Description |
|---|---|---|---|
| Cumulative Wheel Revolutions | uint32 | 4 | Unit: org.bluetooth.unit.unitless |
| Last Wheel Event Time | uint16 | 2 | Base Unit: org.bluetooth.unit.time.secondRepresented values: M = 1, d = 0, b = -11Unit is 1/2048 second |
Crank Revolution Data
The structure of this field is defined below.
| Field | Data type | Size | Description |
|---|---|---|---|
| Cumulative Crank Revolutions | uint16 | 2 | Unit: org.bluetooth.unit.unitless |
| Last Crank Event Time | uint16 | 2 | Base Unit: org.bluetooth.unit.time.secondRepresented values: M = 1, d = 0, b = -10Unit is 1/1024 second |
Extreme Force Magnitudes
The structure of this field is defined below.
| Field | Data type | Size | Description |
|---|---|---|---|
| Maximum Force Magnitude | sint16 | 2 | Unit: org.bluetooth.unit.force.newton |
| Minimum Force Magnitude | sint16 | 2 | Unit: org.bluetooth.unit.force.newton |
Extreme Torque Magnitudes
The structure of this field is defined below.
| Field | Data type | Size | Description |
|---|---|---|---|
| Maximum Torque Magnitude | sint16 | 2 | Base Unit: org.bluetooth.unit.moment_of_force.newton_metreRepresented values: M = 1, d = 0, b = -5Unit is 1/32 Newton meter |
| Minimum Torque Magnitude | sint16 | 2 | Base Unit: org.bluetooth.unit.moment_of_force.newton_metreRepresented values: M = 1, d = 0, b = -5Unit is 1/32 Newton meter |
Extreme Angles(sizes in bits, as the file marks)
When observed with the front wheel to the right of the pedals, a value of 0 degrees represents the angle when the crank is in the 12 o'clock position and a value of 90 degrees represents the angle, measured clockwise, when the crank points towards the front wheel in the 3 o'clock position. The left crank sensor (if fitted) detects 0 degrees when the crank it is attached to is in the 12 o'clock position, and the right sensor (if fitted) detects 0 degrees when the crank it is attached to is in the 12 o'clock position; thus, there is a constant 180-degree difference between the right crank and the left crank position signals.When present, both subfields "Extreme Angles - Minimum Angle" and "Extreme Angles - Maximum Angle" are always present as a pair and are concatenated into a uint24 value (3 octets). As an example, if the Maximum Angle is 0xABC and the Minimum Angle is 0x123, the field value is represented as 0x123ABC.The structure of this field is defined below.
| Field | Data type | Size | Description |
|---|---|---|---|
| Maximum Angle | uint12 | 12 | Unit: org.bluetooth.unit.plane_angle.degree |
| Minimum Angle | uint12 | 12 | Unit: org.bluetooth.unit.plane_angle.degree |
Top and Bottom Dead Spot Angles fields
When observed with the front wheel to the right of the pedals, a value of 0 degrees represents the angle when the crank is in the 12 o'clock position and a value of 90 degrees represents the angle, measured clockwise, when the crank points towards the front wheel in the 3 o'clock position. The left crank sensor (if fitted) detects 0 degrees when the crank it is attached to is in the 12 o'clock position, and the right sensor (if fitted) detects 0 degrees when the crank it is attached to is in the 12 o'clock position; thus, there is a constant 180-degree difference between the right crank and the left crank position signals.
Guides on this site
The metric Cycling Power Measurement carries, on every platform this site covers — each type quoted in its platform's own words:
The connected-device guides that name 0x2A63:
Questions
- What is the UUID of the Cycling Power Measurement characteristic?
- 0x2A63. The Bluetooth SIG's characteristic_uuids.yaml lists Cycling Power Measurement as 0x2A63 with the identifier org.bluetooth.characteristic.cycling_power_measurement. No file in the SIG's repository ties it to a service: the repository lists service and characteristic UUIDs separately.
- Which Cycling Power Measurement fields are optional?
- 10 of its 12 fields have a published size that can be zero: Pedal Power Balance (0 or 1; Present if bit 0 of Flags field is set to 1); Accumulated Torque (0 or 2; Present if bit 2 of Flags field is set to 1); Wheel Revolution Data (0 or 6; Present if bit 4 of Flags field is set to 1); Crank Revolution Data (0 or 4; Present if bit 5 of Flags field is set to 1); Extreme Force Magnitudes (0 or 4; Present if bit 6 of Flags field is set to 1); Extreme Torque Magnitudes (0 or 4; Present if bit 7 of Flags field is set to 1); Extreme Angles (0 or 3; Present if bit 8 of Flags field is set to 1); Top Dead Spot Angle (0 or 2; Present if bit 9 of Flags field is set to 1); Bottom Dead Spot Angle (0 or 2; Present if bit 10 of Flags field is set to 1); Accumulated Energy (0 or 2; Present if bit 11 of Flags field is set to 1). Flags (2) and Instantaneous Power (2) have a fixed size.
- What units does Cycling Power Measurement use?
- The SIG's text names a unit for 6 of the 12 fields: Instantaneous Power: power (watt) (org.bluetooth.unit.power.watt); Pedal Power Balance: percentage (org.bluetooth.unit.percentage); Accumulated Torque: moment of force (newton metre) (org.bluetooth.unit.moment_of_force.newton_metre); Top Dead Spot Angle: plane angle (degree) (org.bluetooth.unit.plane_angle.degree); Bottom Dead Spot Angle: plane angle (degree) (org.bluetooth.unit.plane_angle.degree); Accumulated Energy: energy (joule) (org.bluetooth.unit.energy.joule).
- What do the bits of the Cycling Power Measurement Flags field mean?
- The SIG defines them as: bit 0, Pedal Power Balance Present (Pedal Power Balance when 1); bit 1, Pedal Power Balance Reference; 0 = Unknown; 1 = Left; bit 2, Accumulated Torque Present (Accumulated Torque when 1); bit 3, Accumulated Torque Source; 0 = Wheel based; 1 = Crank based; bit 4, Wheel Revolution Data Present (Wheel Revolution Data when 1); bit 5, Crank Revolution Data Present (Crank Revolution Data when 1); bit 6, Extreme Force Magnitudes Present (Extreme Force Magnitudes when 1); bit 7, Extreme Torque Magnitudes Present (Extreme Torque Magnitudes when 1); bit 8, Extreme Angles Present (Extreme Angles when 1); bit 9, Top Dead Spot Angle Present (Top Dead Spot Angle when 1); bit 10, Bottom Dead Spot Angle Present (Bottom Dead Spot Angle when 1); bit 11, Accumulated Energy Present (Accumulated Energy when 1); bit 12, Offset Compensation Indicator; 0 = False; 1 = True. The remaining bits are reserved for future use.
Source
Read on 2026-10-17 from gss/org.bluetooth.characteristic.cycling_power_measurement.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.