No matter what I do, my fitness device can't find BEStie. The bike connection works.

First verify that BEStie shows up in an nRF Connect app scan (see installation, step 4). If it does and your fitness gear still can't pair, your device most likely lacks support for the BLE FTMS protocol — in plain words, Bluetooth-connected Zwift-compatible smart trainers.

This is a fundamental design choice. The bike sends exact values — power in watts, cadence in RPM, speed in km/h — and FTMS lets BEStie relay them exactly as they come, giving clean recordings with 1:1 sample matching. The older alternative (Cycling Power / Speed & Cadence services) assumes the sensor is a dumb wheel magnet, which forces BEStie to simulate a virtual wheel and extrapolate between samples. No matter how it was tuned, the result was either noisy or laggy and over-smoothed — not good enough for tracking performance.

Everything works at home during a test "ride", but the connection drops outside — or it works with my bike computer but fails with my smartwatch.

If devices connect in a calm environment at close range, your firmware, pairing and setup are all correct — this is a radio-performance problem.

Bluetooth works in the 2.4 GHz band, and the human body is a perfect barrier for it. If the BEStie board sits in your saddle bag or backpack, the signal has to travel through your body — that needs a board with a good antenna. Small boards struggle here; the XIAO BLE in particular lacks the "oomph" to get through, and smartwatches make it worse because their tiny antennas are weaker than a head unit's. Swapping to an Adafruit Feather solves it. See hardware recommendations.

Average power/cadence via BEStie differs from the Kiox display.

Bosch calculates displayed averages in "ignore zero values" mode, while Garmin devices by default include zeros in averages. This is configurable on the fitness device — set it to your preference (MTB riders tend to exclude zeros, roadies tend to include them).

Either way, BEStie does the right thing: it forwards every value exactly as sent by the bike.

I've set zero-exclusion correctly and averages match now, but instantaneous power still differs between Kiox and BEStie.

Different devices post-process displayed data differently. For example, the Garmin Edge 1050 shows matching, quickly-updating values in the numeric "Power" field, but applies smoothing in the "Power Graph" display. When comparing, use a data field that shows truly instantaneous power, speed and cadence without any smoothing.

When I push hard, power and cadence match Kiox with a slight 1–2 s delay. Can it update faster?

No — every bit of latency that could be squeezed out of BEStie already has been. The remaining delay is physics and protocol:

  • Bluetooth works in discrete time windows. BEStie is a peripheral — the bike, head unit and watch decide when data may be sent. Two windows are needed per update (bike → BEStie, then BEStie → your device), roughly 200–400 ms total.
  • Bosch LDI updates are infrequent: speed every 1–2 s, cadence every 2–4 s, power every 1–2 s — controlled by the bike's own software.
  • The Kiox display is wired. It gets fresh data over the bike's internal CAN bus many times per second, so it feels instant by comparison.
  • Garmin records at a fixed 1 Hz. That alone puts the lower bound at about 1.4 s.
Tools like "Compare the watts" or "Quantified Self" show bad correlation between Flow app and BEStie recordings. Why do you claim good data quality?

Those tools assume a single radio hop between sensor and recorder, where samples keep a constant time offset. BEStie adds a second hop (bike → BEStie → recorder), and Bluetooth's discrete radio windows add random per-sample jitter — a sample may "miss the train" on either hop. A static-shift comparison can't handle that and reports ~80% correlation.

Sample order stays intact and curve shapes match exactly within the local jitter; ride averages agree within 1–2 W / RPM. When jitter is accounted for, correlation jumps above 99%. The 1-second timestamp granularity of .fit files further confuses existing tools.

Don't take our word for it — the fit-align scripts let you feed in your own .fit files and inspect matched data, graphs and correlation values.

Can you add battery range, assist mode indicator, or some other feature?

Not today. BEStie is a peer on Bosch's Live Data Interface, and the specification only exposes: speed, battery state of charge, rider power, cadence, odometer, time, light status, ambient brightness, light reserve, system lock, bike-not-driving, charger connected and diagnostic probe connected. If you can pass feature feedback to the relevant Bosch team, the whole community would benefit.

The other constraint is Bluetooth itself: there is no standard BLE profile for ebike-specific data, and we don't control fitness-device firmware — BEStie must stick to standard profiles or the other side won't understand it.