CADEXAREVIEWS
EditorialExplainer

Bluetooth FTMS explained: the protocol that lets an app control your trainer

Every modern smart trainer speaks FTMS. Here is what the Fitness Machine Service actually does, what the control point commands are, and why “supports FTMS” does not guarantee that every app feature works.

Ole BirkelandFounder, Cadexa

Published
30 Oct 2026
3 min read
AI-generated image

Explainer · Editorial content without product testing. How we work.

What FTMS is

The Fitness Machine Service (FTMS) is a Bluetooth Low Energy profile adopted by the Bluetooth SIG. It defines how a piece of fitness equipment publishes its live data and how a client, such as a phone app or a head unit, can control it. For an indoor bike trainer the service appears under the 16-bit UUID 0x1826 and carries a handful of characteristics that matter:

  • Fitness Machine Feature (0x2ACC): two 32-bit bitfields that say what the machine can report and which targets it accepts.
  • Indoor Bike Data (0x2AD2): the notification stream with instantaneous speed, cadence, power and, if the trainer has one, heart rate.
  • Fitness Machine Control Point (0x2AD9): the write-with-indication characteristic through which an app sends commands.
  • Fitness Machine Status (0x2ADA): informational notifications about what the machine is doing.
  • Supported Power Range (0x2AD8): the minimum, maximum and step size for target power.

Before FTMS, every brand had its own control protocol. Wahoo trainers still advertise a proprietary service for legacy clients, but a current app does not need it.

The control point, step by step

Control is a short conversation. The app writes a command to the control point and waits for an indication that echoes the opcode and a result code. The sequence the Cadexa app runs is typical:

  1. Request Control (0x00). The trainer grants control to one client at a time. If another app already holds it, the trainer answers Control Not Permitted (0x05). This is the single most common reason a trainer “ignores” an app: the manufacturer app is still connected in the background.
  2. Start or Resume (0x07). Puts the machine into an active state.
  3. Set Target Power (0x05) for ERG mode, or Set Indoor Bike Simulation Parameters (0x11) for simulation mode. The simulation command carries wind speed, grade, rolling resistance coefficient and wind resistance coefficient in one packet.
  4. Stop or Pause (0x08) at the end.

Each write produces a response: Success (0x01), Not Supported (0x02), Invalid Parameter (0x03), Operation Failed (0x04) or Control Not Permitted (0x05). An app that does not read these indications cannot tell you why resistance did not change.

What “supports FTMS” guarantees, and what it does not

The feature bitfield tells an app which targets exist, but the specification leaves a lot of room:

  • Power range and step size vary. A trainer may accept targets only in 5 W or 10 W steps.
  • Simulation parameter handling differs. Some trainers ignore the wind resistance coefficient; some clamp grade earlier than their marketing figure.
  • Response latency differs. ERG mode on one trainer settles within two or three seconds of a new target; on another it overshoots and hunts.
  • Concurrent connections are a hardware matter. Older trainers allow a single Bluetooth client, so a phone and a watch cannot both connect.
  • Firmware bugs exist. An erratum for FTMS corrected an early mistake in how data fields were laid out; trainers on old firmware can still misreport.

That is why Cadexa Gear Compatibility separates three layers: what the manufacturer declares, what should work on paper, and what has been verified with the app on real hardware. Protocol support is the start of the answer, not the end.

FTMS and the alternatives

ANT+ FE-C is the ANT+ equivalent, used by Garmin and Wahoo head units and by desktop apps with a USB dongle. It carries similar targets (power, resistance, grade with simulation parameters) over a different radio. Phones do not speak ANT+ without an adapter, which is why the Cadexa app is Bluetooth only.

Cycling Power Service (0x1818) is read-only: a power meter or a trainer can broadcast watts and crank cadence, but there is no control. Cadexa uses it as a fallback for reading power when a trainer has no FTMS.

Proprietary protocols (Wahoo, Tacx legacy, Zwift’s own direct-connect scheme) still exist for features FTMS does not define, such as virtual shifting or wired connections.

Practical advice

  • When control fails, close every other app that can talk to the trainer, then reconnect.
  • Update trainer firmware with the manufacturer app before blaming the training app.
  • If a feature matters to you (ERG at low cadence, steep gradients, two simultaneous connections), look for a verification record, not a protocol logo.

The compatibility checker is where those records live.

About the author

Ole BirkelandFounder, Cadexa

Builds the Cadexa indoor-cycling app in Bergen, Norway, which means living inside the Bluetooth FTMS specification and watching how trainers actually respond to it. Writes the technology explainers and runs the compatibility tests.

Related reading

Bluetooth FTMS explained: the protocol that lets an app control your trainer · Cadexa Reviews