KS
Killer-Skills

bluetooth-trainer-expert — Categories.community

v1.0.0
GitHub

About this Skill

Perfect for IoT Agents needing seamless Bluetooth connectivity for fitness applications Windows app to control resistance on my Wahoo KIKR to make workouts more fun

JasonRowe JasonRowe
[0]
[0]
Updated: 3/4/2026

Quality Score

Top 5%
24
Excellent
Based on code quality & docs
Installation
SYS Universal Install (Auto-Detect)
Cursor IDE Windsurf IDE VS Code IDE
> npx killer-skills add JasonRowe/Wahoo-KICKR-Randomizer/bluetooth-trainer-expert

Agent Capability Analysis

The bluetooth-trainer-expert MCP Server by JasonRowe is an open-source Categories.community integration for Claude and other AI agents, enabling seamless task automation and capability expansion.

Ideal Agent Persona

Perfect for IoT Agents needing seamless Bluetooth connectivity for fitness applications

Core Value

Empowers agents to control resistance on smart trainers like Wahoo KICKR using a Console First approach, emphasizing protocol logic with C# Console Applications and integrating with UI frameworks like WPF/MAUI, while leveraging Bluetooth protocols for device interaction

Capabilities Granted for bluetooth-trainer-expert MCP Server

Developing biking fitness applications with smart trainer integration
Automating workout resistance control via Bluetooth
Debugging connectivity issues with FTMS devices

! Prerequisites & Limits

  • Requires Windows environment for app development
  • Limited to Bluetooth-enabled smart trainers
  • C# programming knowledge necessary
Project
SKILL.md
5.0 KB
.cursorrules
1.2 KB
package.json
240 B
Ready
UTF-8

# Tags

[No tags]
SKILL.md
Readonly

Bluetooth Trainer Expert

This skill provides a proven workflow for developing biking fitness applications that interact with Smart Trainers (e.g., Wahoo KICKR, FTMS devices). It emphasizes a "Console First" approach to isolate connection and protocol logic before attempting UI integration.

Core Philosophy

  1. Console First: Always prove the protocol logic in a simple C# Console Application (BikeFitnessConsole) before touching the main UI (WPF/MAUI).
  2. Physical Verification: Telemetry (Success/Fail responses) is insufficient for brake logic. You MUST ask the user to "Pedal and verify resistance change" to confirm the device actually engaged the magnet/motor.
  3. Protocol Agnosticism: Support both standard FTMS (0x1826) and legacy Wahoo (0xA026...) protocols.

Phase 1: Diagnostic Console App

Create a lightweight console app to handle scanning, connection, and raw command testing.

Key Features to Implement:

  • Scanner: Filter for 0x1826 (FTMS), 0xA026 (Wahoo), and 0x1818 (Power).
  • Service Explorer: List all available Services and Characteristics to confirm UUIDs.
  • Indication Handler: CRITICAL. You must subscribe to Indicate on the Control Point characteristic before sending any write commands. Failure to do so often results in silent failures or "Attribute Not Found" errors on writes.

Data Format (Endianness)

Bluetooth LE GATT characteristics standardly use Little Endian byte order.

  • Reading: When parsing multi-byte values (e.g., Speed, Power, Time), interpret the least significant byte first.
    • Example: 0xE8 0x03 -> 0x03E8 -> 1000.
  • Writing: When constructing commands (e.g., Target Watts, Grade), ensure you serialize UInt16/Int16 values to Little Endian.
  • Note: While standard FTMS and common Wahoo OpCodes (0x40-0x45) follow Little Endian, always verify proprietary manufacturer-specific characteristics if behavior is unexpected.

Phase 2: Protocol Identification & Control Points

Identify the correct Control Point (CP) for the device.

1. FTMS (Fitness Machine Service) - Preferred

  • Service UUID: 00001826-0000-1000-8000-00805f9b34fb
  • Control Point: 00002ad9-0000-1000-8000-00805f9b34fb (Fitness Machine Control Point)
  • Init Sequence:
    1. Subscribe to CP Indications.
    2. Send 0x00 (Request Control).
    3. Send 0x07 (Start/Resume).

2. Wahoo Legacy (KICKR / SNAP)

  • Service UUID: a026ee01-0a7d-4ab3-97fa-f1500f9feb8b
  • Control Point: a026e005-0a7d-4ab3-97fa-f1500f9feb8b (Often hidden inside the Power Service 0x1818 on some firmware).
  • Init Sequence:
    1. Subscribe to CP Indications.
    2. Send 0x00 (Init/Unlock).

Phase 3: OpCode Discovery Strategy

Different devices support different modes. Use the Console App to "Scan" OpCodes 0x40 through 0x45 by sending [OpCode, 0x00] and observing the Indication response.

  • Response Format: 01-OpCode-Result (Where Result 01 = Success, 04 = Not Supported, 40 = Fail).
  • Common OpCodes:
    • 0x40 Level Mode: 0-9 discrete levels. Basic.
    • 0x41 Resistance Mode: 0-100% brake force. Most reliable.
    • 0x42 Sim Mode Enable: Activates physics engine (Grade/Wind/Weight). Warning: Many older or lower-end devices (e.g., KICKR SNAP) return "Success" for params but FAIL (0x40) when trying to Enable this mode.
    • 0x43 Sim Parameters: Sets Grade, Weight, Crr, Cw.

Phase 4: "Fake" Simulation Mode (Grade Mapping)

If the device fails to support Native Sim Mode (0x42), you must implement Grade-to-Resistance Mapping in software to support "Hilly" or "Mountain" workouts.

Recommended Mapping (User Calibrated): Map the visual "Grade %" to the device's "Resistance %" (OpCode 0x41).

Grade InputResistance OutputFeel
-10%0.0%Coasting / Free spin.
0%1.0%Flat road friction (light).
20%40.0%Steep climb. (Cap at 40% to avoid "brick wall").

Logic: Use a piecewise linear function:

  1. Downhill (-10 to 0): Interpolate 0.0 -> 0.01.
  2. Uphill (0 to 20): Interpolate 0.01 -> 0.40.

Phase 5: Telemetry

  • Power: Standard 0x2A63 (Cycling Power Measurement).
  • Speed/Distance: Often missing from FTMS on older devices. Calculate locally using Wheel Revolutions from the Power Measurement characteristic (Data bytes flags & 0x10).
    • Distance = WheelRevs * TireCircumference
    • Speed = DeltaDistance / DeltaTime
  • Cadence: Check 0x1816 (Speed & Cadence) or Crank Data in Power (0x1818).

Checklist for Implementation

  1. Console Test: Can you connect and receive Indications?
  2. OpCode Scan: Which modes return 01 (Success)?
  3. Physical Test: Does sending 0x41 0x32 (50% res) make it hard to pedal?
  4. Mapping: Does -10% Grade feel like zero resistance?
  5. UI: Does the UI display Grade (not raw resistance) to the user?

Related Skills

Looking for an alternative to bluetooth-trainer-expert or building a Categories.community AI Agent? Explore these related open-source MCP Servers.

View All

widget-generator

Logo of f
f

widget-generator is an open-source AI agent skill for creating widget plugins that are injected into prompt feeds on prompts.chat. It supports two rendering modes: standard prompt widgets using default PromptCard styling and custom render widgets built as full React components.

149.6k
0
Design

chat-sdk

Logo of lobehub
lobehub

chat-sdk is a unified TypeScript SDK for building chat bots across multiple platforms, providing a single interface for deploying bot logic.

73.0k
0
Communication

zustand

Logo of lobehub
lobehub

The ultimate space for work and life — to find, build, and collaborate with agent teammates that grow with you. We are taking agent harness to the next level — enabling multi-agent collaboration, effortless agent team design, and introducing agents as the unit of work interaction.

72.8k
0
Communication

data-fetching

Logo of lobehub
lobehub

The ultimate space for work and life — to find, build, and collaborate with agent teammates that grow with you. We are taking agent harness to the next level — enabling multi-agent collaboration, effortless agent team design, and introducing agents as the unit of work interaction.

72.8k
0
Communication