{
  "added_at": "2026-11-02",
  "additional_evidence_urls": [
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/CHANGELOG.md",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/package.json",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/flywheel.js",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/peloton.js",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/ic4.js",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/keiser.js",
    "https://github.com/ptx2/gymnasticon/tree/e142f539c518d6d4ced3abdd587a825b918a9367/src/test",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/.github/workflows/node.js.yml",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/deploy/pi-sdcard/build.sh",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/deploy/pi-sdcard/config",
    "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/LICENSE.txt",
    "https://github.com/ptx2/gymnasticon/releases/tag/v1.4.0",
    "https://ptx2.net/posts/unbricking-a-bike-with-a-raspberry-pi"
  ],
  "category": "reconstruction-cases",
  "description_en": "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.",
  "description_zh": "一个 Node.js 桥接程序：从官方应用或服务已停用或不开放的健身单车读取功率和踏频，再以标准的低功耗蓝牙 Cycling Power、Cycling Speed and Cadence 传感器及 ANT+ 自行车功率配置文件重新广播，使 Zwift、TrainerRoad、码表和运动手表能够使用这辆单车。作者的开发笔记记录了在厂商关停家用服务后，如何在 Flywheel Home Bike 的蓝牙 UART 服务上解析出其统计数据包；Peloton 支持通过 USB 串口适配器读取单车的数据线，Schwinn IC4 和 Keiser M 客户端则分别解析标准的 Fitness Machine Service 和 Keiser 公开文档中的广播数据。单车与应用的兼容性均为项目报告。",
  "entry_url": "https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/gymnasticon-exercise-bike-bridge-case/",
  "evidence_url": "https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/README.md",
  "group": "cases",
  "id": "gymnasticon-exercise-bike-bridge-case",
  "json_url": "https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/record.json",
  "kind": "case-study",
  "markdown_url": "https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/gymnasticon-exercise-bike-bridge-case/index.md",
  "name": "Gymnasticon: bridging proprietary exercise-bike data to standard cycling sensors",
  "name_zh": "Gymnasticon：将专有健身单车数据转为标准骑行传感器信号",
  "record_type": "resource",
  "relationship": "independent-reconstruction",
  "requirements": [
    "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."
  ],
  "requirements_zh": [
    "审阅时 GitHub 上最新的发布版本为 v1.4.0，于 2021-02-21 发布，附带 Raspberry Pi SD 卡镜像；npm 上最新版本为 2021-03-24 发布的 1.4.1，所审阅的 main 分支提交（2021-04-21）为所有支持的单车加入了自动识别，至今仍是 main 上最新的提交。README 列出已测试的单车包括 Flywheel、Peloton（需额外线缆）、Schwinn IC4/IC8（即 Bowflex C6）以及 Keiser M3i、M3i-TBT 和 M3iX，LifeFitness IC5 则标为大概率可用；另有一个模拟单车用于测试。",
    "需要用户自有的受支持单车，运行时不使用厂商应用、固件或账号。推荐 Raspberry Pi Zero W，已测试的宿主包括 Pi Zero W、3B+ 和 4 上的 Raspbian Buster、macOS 10.14+ 以及 x86-64 上的 Debian Buster。BLE 单车需要支持多角色的蓝牙 4.1+ 适配器，或使用两个适配器；ANT+ 输出需要 ANT+ USB 接收器，Peloton 单车则需要 README 链接中说明的额外串口线缆。",
    "SD 卡镜像是项目用 deploy/ 中的 pi-gen 脚本自行构建的 Raspbian Buster 系统，使用默认的 pi/raspberry 账号并关闭 SSH；首次启动时会把根文件系统切换为 overlay 并将 boot 分区设为只读，并从 boot 分区读取 gymnasticon.json。手动安装需通过 npm 使用 Node.js 12.16.1+，Linux 上还需 libudev-dev，并通过 cap_net_raw 权限或 systemd 单元访问蓝牙；依赖 abandonware 维护的 noble 和 bleno 库、gd-ant-plus 及 serialport。",
    "CI 会构建软件包，并在 Node.js 12 和 14 上运行 tape 单元测试；测试以示例数据包覆盖 Flywheel、IC4、Keiser 和 Peloton 解析器、模拟单车和工具函数，不涉及真实单车或训练应用。power-scale 和 power-offset 选项可用来校正功率读数不准的单车。",
    "采用 MIT 许可。单车和应用名称归各自权利人所有。"
  ],
  "targets": [
    "protocol"
  ],
  "url": "https://github.com/ptx2/gymnasticon",
  "verification": "source-reviewed",
  "verified_at": "2026-10-20"
}
