Case study

Gymnasticon: bridging proprietary exercise-bike data to standard cycling sensors

Node.js bridge that reads power and cadence from exercise bikes whose own apps or services are gone or closed, and re-broadcasts them as standard Bluetooth LE Cycling Power and Cycling Speed and Cadence sensors and as an ANT+ bike power profile, so that Zwift, TrainerRoad, bike computers and watches can use the bike. The author's development notes describe working out the Flywheel Home Bike's stats packets on its Bluetooth UART service after the vendor shut its home service down; Peloton support reads the bike's data cable through a USB serial adapter, while the Schwinn IC4 and Keiser M clients parse the standard Fitness Machine Service and Keiser's documented broadcasts. Bike and app compatibility is project-reported.

Targets
Protocol
Category
Independent reconstruction cases
Relationship
Independent reconstruction project
Sources reviewed

Requirements & limits

  • Latest GitHub release at review: v1.4.0, published 2021-02-21 with a Raspberry Pi SD card image; npm's latest is 1.4.1 from 2021-03-24, and the reviewed main commit of 2021-04-21, which adds autodetection for all supported bikes, is still the newest on main. The README lists the Flywheel, Peloton (with an additional cable), Schwinn IC4/IC8 aka Bowflex C6 and Keiser M3i, M3i-TBT and M3iX bikes as tested and the LifeFitness IC5 as probably working; a simulated bot bike serves testing.
  • Needs the user's own supported bike; no vendor app, firmware or account is used. A Raspberry Pi Zero W is recommended, and the tested hosts are Raspbian Buster on Pi Zero W, 3B+ and 4, macOS 10.14+ and Debian Buster on x86-64. BLE bikes need a Bluetooth 4.1+ adapter with multi-role support, or two adapters; ANT+ output needs an ANT+ USB stick, and Peloton bikes need the extra serial cable linked from the README.
  • The SD card image is the project's own Raspbian Buster build made with pi-gen scripts in deploy/, with the default pi/raspberry account and SSH disabled; on first boot it switches the root filesystem to an overlay with a read-only boot partition and reads gymnasticon.json from the boot partition. Manual installs use Node.js 12.16.1+ from npm, with libudev-dev on Linux and cap_net_raw or a systemd unit for Bluetooth access, and depend on the abandonware noble and bleno libraries, gd-ant-plus and serialport.
  • CI builds the package and runs tape unit tests on Node.js 12 and 14; they cover the Flywheel, IC4, Keiser and Peloton parsers on sample packets, the simulated bike and utilities, not live bikes or training apps. power-scale and power-offset options let riders correct bikes that report inaccurate power.
  • MIT. Bike and app names belong to their owners. Nothing was installed or run, and the reviewed sources establish no AI or REA use.

About this entry

The description was reviewed against primary sources. This does not establish runtime testing, security auditing or verified compatibility.

Report an outdated entry Suggest a translation fix

Primary sources

  1. README.md GitHub · ptx2/gymnasticon · Revision e142f53
  2. CHANGELOG.md GitHub · ptx2/gymnasticon · Revision e142f53
  3. package.json GitHub · ptx2/gymnasticon · Revision e142f53
  4. src/bikes/flywheel.js GitHub · ptx2/gymnasticon · Revision e142f53
  5. src/bikes/peloton.js GitHub · ptx2/gymnasticon · Revision e142f53
  6. src/bikes/ic4.js GitHub · ptx2/gymnasticon · Revision e142f53
  7. src/bikes/keiser.js GitHub · ptx2/gymnasticon · Revision e142f53
  8. src/test GitHub · ptx2/gymnasticon · Revision e142f53
  9. .github/workflows/node.js.yml GitHub · ptx2/gymnasticon · Revision e142f53
  10. deploy/pi-sdcard/build.sh GitHub · ptx2/gymnasticon · Revision e142f53
  11. deploy/pi-sdcard/config GitHub · ptx2/gymnasticon · Revision e142f53
  12. LICENSE.txt GitHub · ptx2/gymnasticon · Revision e142f53
  13. https://github.com/ptx2/gymnasticon/releases/tag/v1.4.0
  14. https://ptx2.net/posts/unbricking-a-bike-with-a-raspberry-pi

More in Protocols

All 39 entries in ProtocolsProtocols case studies (15)