efferent-ble-simulator
Efferent simuliert Bluetooth-Low-Energy-(BLE)-Peripheriegeräte über eine echte Funkverbindung (Linux BlueZ): FTMS-Smart-Trainer, Fahrrad-Leistungsmesser, Geschwindigkeits-/Trittfrequenzsensoren und Herzfrequenzsensoren. Es stellt einen MCP-Server (stdio oder HTTP) bereit, sodass KI-Agenten – und das mitgelieferte Web-Dashboard – Simulationen starten, konfigurieren und überwachen können, als würden sie einen echten Trainer steuern.
Funktionen
4 Gerätetypen über echte BLE-Funkverbindung: FTMS-Smart-Trainer (0x1826), Leistungsmesser (0x1818), Geschwindigkeit/Trittfrequenz (0x1816), Herzfrequenz (0x180D)
Vollständige FTMS-Steuerpunkt-Unterstützung: Request Control / Start / Stop / Reset / Set Target Power / Set Resistance / Set Indoor Bike Simulation Params
Dynamische Simulation: realistische Leistungs-/Trittfrequenzschwankungen + physikbasierte Geschwindigkeitsberechnung (Gewicht, Steigung, Crr, CdA), 5 Fahrszenarien inklusive des skriptbasierten ride_script
Hot-Parameter-Update: Parameter während des Betriebs ändern – das verbundene Telefon behält die Verbindung und erhält die neuen Werte beim nächsten Notify (kein erneutes Koppeln)
Benannte Konfigurationsprofile: bis zu 20 benannte Konfigurationen speichern / laden / umbenennen / löschen, gemeinsam genutzt von MCP und Dashboard
17 MCP-Tools für Agenten: Steuerung, Konfiguration, Konfigurationsprofile, Interaktionsregeln, Sitzungen, Protokolle, Live-Gerätestatus, Version
Web-Dashboard (React + shadcn/ui): Status, Formulare, Ein-Klick-Fahrprofile, Interaktionsregeln, Sitzungs-/Konfigurationsverwaltung, Live-Protokoll-Seitenleiste
Docker Compose-Bereitstellung mit einem Befehl (MCP + Dashboard + Skill-Datei über HTTP), langlaufend mit Health-Checks
Versioniert: MCP
serverInfo.version+ble_get_versionermöglichen Agenten die Erkennung von Updates
Related MCP server: pyBTMCP
Laufzeitumgebung
Anforderung | Detail |
Betriebssystem | Nur Linux – der Simulator steuert das Host-BlueZ über D-Bus |
BlueZ | ≥ 5.87 (5.86 hat einen Fehler bei der Werberegistrierung) |
Hardware | Ein BLE-fähiger Adapter (integriert oder USB-Dongle) ist für die tatsächliche Ausstrahlung erforderlich |
D-Bus-Richtlinie |
|
Docker | Der Container mountet den Host-D-Bus-Socket; die BLE-Funkverbindung bleibt immer auf dem Host |
Nicht unterstützt | macOS / Windows nativ (würde einen anderen BLE-Stack erfordern); ohne BLE-Adapter läuft der MCP-Dienst, sendet aber nichts |
Architektur
┌──────────────┐ MCP protocol ┌───────────────────────────┐
│ AI Agent / │ ◄───────────────► │ MCP Server (HTTP :3300) │
│ MCP Client │ stdio / :3300 │ Web Dashboard (:3330) │
│ (Claude, │ └────────────┬──────────────┘
│ Codex, pi) │ │ BlueZ D-Bus (system bus)
└──────────────┘ ▼
┌───────────────────────────┐
│ Host Linux BlueZ │
│ bluetoothd + BLE adapter │
│ (D-Bus policy, ≥ 5.87) │
└────────────┬──────────────┘
│ HCI / radio
▼
┌───────────────────────────┐
│ BLE advertisement + GATT │
│ FTMS / Power / CSC / HR │
└────────────┬──────────────┘
│
┌────────────▼──────────────┐
│ Phone / Cycling App │
│ (Zwift, Garmin, Strava...)│
└───────────────────────────┘Gerätetypen
Typ | BLE-Dienst | Eigenschaften |
FTMS-Smart-Trainer | 0x1826 | FM-Feature, Indoor-Bike-Daten (Notify), Steuerpunkt (Write/Indicate), Status, Widerstands-/Leistungsbereiche |
Leistungsmesser | 0x1818 | Leistungs-/Trittfrequenzmessung, Rad- & Kurbeldaten |
Geschwindigkeit/Trittfrequenz (CSC) | 0x1816 | Rad- & Kurbelumdrehungszähler |
Herzfrequenz | 0x180D | Herzfrequenzmessung, Sensorposition am Körper, Batterie |
Schnellstart
Voraussetzungen
Linux mit BlueZ ≥ 5.87 (bluetoothd) und einem BLE-fähigen Adapter
BlueZ 5.86 hat einen Fehler bei der Werberegistrierung; bei Kernels mit strenger MGMT-Validierung schlägt jede
RegisterAdvertisementfehl. Zuerst aktualisieren:sudo pacman -S bluez && sudo systemctl restart bluetooth(Arch) /sudo apt install bluez(Debian).Node.js ≥ 18
1. Native Installation
npm install
npm run setup # sudo — installs D-Bus policy, enables bluetoothd, verifies GATT
npm run build
npm run start:http # HTTP mode on :3300 (or npm start for stdio)npm run setup schreibt /etc/dbus-1/system.d/ble-simulator.conf – erforderlich für GATT-Registrierung ohne Root-Rechte (ohne diese Datei wirbt das Gerät, kann aber nicht verbunden werden).
2. Docker Compose (empfohlen für Server)
bash scripts/docker-up.sh # host prep (sudo, once) + build + startURL | Zweck |
| MCP-Endpunkt |
| Web-Dashboard |
| Operations-Skill (für Agenten) |
| Dashboard-Hilfeseite |
Kompilierungsfreier Build (better-sqlite3 vorkompiliertes Binärpaket); bei eingeschränkten Netzwerken einen Mirror verwenden:
NPM_REGISTRY=https://registry.npmmirror.com \
BETTER_SQLITE3_BINARY_HOST_MIRROR=https://registry.npmmirror.com/-/binary/better-sqlite3 \
bash scripts/docker-up.shVerwaltung: bash scripts/docker-up.sh status|logs|down
MCP-Tools (17)
Tool | Zweck |
| Simulation starten / stoppen / neu starten |
| Controller-Status + aktive Konfiguration + Live-Gerätestatus (Phase/Leistung/Trittfrequenz/Herzfrequenz) |
| Konfiguration aktualisieren – Hot-Update direkt im Betrieb, wenn der Gerätetyp gleich bleibt |
| Aktuelle/letzte Konfiguration als JSON (Formular-Rückbefüllung) |
| Aktuelle Parameter als benanntes Profil speichern (max. 20) |
| Profile auflisten / anzeigen |
| Profil umbenennen / löschen |
| Benutzerdefinierte BLE-Schreib-Antwortregeln |
| Sitzungsverlauf / Details |
| Dauerhafte Kommunikationsprotokolle (Verbinden/Schreiben/Notifizieren/Fehler) |
| MCP- + Skill-Versionen, Änderungsprotokoll, Skill-URL (für Update-Erkennung) |
Beispiel
{
"method": "tools/call",
"params": {
"name": "ble_start",
"arguments": {
"deviceType": "ftms",
"ftms": { "simulation": { "enabled": true, "scenario": { "type": "ride_script" } } }
}
}
}Dynamische Simulation
Aktivieren über simulation bei FTMS / Leistungsmesser / CSC:
"simulation": {
"enabled": true,
"riderWeightKg": 75, "bikeWeightKg": 8, "crr": 0.004, "cdA": 0.35,
"fatigueFactor": 0.0005, "cadenceCoupling": "proportional", "microPauseProbability": 0.008,
"autoStart": true,
"scenario": { "type": "ride_script" }
}Parameter | Standard | Beschreibung |
|
| Hauptschalter |
| 75 / 8 | Geschwindigkeitsphysik (Fahrer- + Radmasse) |
| 0.004 / 0.35 | Rollwiderstand / Luftwiderstandsbeiwert |
| 0 | Leistungsabfall pro Minute (0 = keiner) |
|
|
|
| 0.005 | Rollpausen pro Takt |
|
| Fahrt starten, ohne dass eine App Start sendet |
|
| Fahrszenario (siehe unten) |
Szenarien
steady– nur natürliche Mikroschwankungenfreeride(Standard) – Grundleistung driftet ±20 % alle 60–180 sintervals– Wechsel zwischen hoher und niedriger Leistungwarmup_main_cooldown– Aufwärmen → Hauptteil → Ausfahrenride_script– skriptgesteuerte Fahrt: eine Abfolge von Fahraktionen (start / cruise / climb / sprint / coast / stop), jeweils mit Zielleistung, Steigung und optionaler Trittfrequenz; startet automatisch, wiederholt sich mitrepeat: true,stopsetzt Leistung/Trittfrequenz/Geschwindigkeit auf null.phasesweglassen, um das integrierte Standard-Skript zu verwenden.
Hot-Update & Stabile Seriennummer
Hot-Update:
ble_configurewährend des Betriebs + gleicher Gerätetyp wendet Parameter direkt an – das verbundene Telefon behält die Verbindung und erhält aktualisierte Werte beim nächsten Notify. Ein Wechsel des Gerätetyps startet weiterhin neu (neue Seriennummer erzwingt erneutes Erkennen).Stabile Seriennummer:
SIM_SERIAL_STABLE=1hält die Seriennummer über Sitzungen desselben Typs stabil (SIM001-FTMS), sodass ein Telefon nach Stopp/Start ohne Vergessen des Geräts erneut verbinden kann.
Umgebungsvariablen
Variable | Standard | Beschreibung |
|
|
|
|
| HTTP-Listenadresse |
|
| Präfix des ausgestrahlten Namens |
| — | Instanz-ID-Modus für den Gerätenamen |
| nicht gesetzt |
|
|
| Öffentliche Skill-URL (von |
Quellcode-Struktur
src/
├── index.ts # entry, lifecycle
├── mcp-server.ts # 17 MCP tool definitions & handlers
├── ble-controller.ts # BlueZ D-Bus lifecycle, advertisement, hot-update
├── database.ts # SQLite layer (sessions / saved_configs / logs)
├── config.ts # config merge & defaults
├── version.ts # version single-source
├── simulator.ts # HeartRate / Battery simulators
├── cycling-simulator.ts # power/cadence simulators + physics + ride_script engine
└── devices/ # heart-rate / cycling-power / csc / ftms GATT devicesDer BLE-Peripheriezugriff läuft über den Host-BlueZ-D-Bus (der Container mountet den Host-D-Bus-Socket). Siehe docs/design/*.md für Entwurfsdokumente.
Lizenz
MIT © BLE-Simulator-Mitwirkende
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceBluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.15BSD 2-Clause "Simplified"
- FlicenseNot gradedqualityNot gradedmaintenanceA BLE fitness device simulator that enables AI agents to control simulated heart rate monitors, treadmills, and cycling trainers via the Model Context Protocol. It integrates ESP32 firmware, an MQTT broker, and a FastAPI backend for comprehensive device management and real-time interaction.
- AlicenseAqualityCmaintenanceA stateful Bluetooth Low Energy (BLE) MCP server that enables AI agents to scan, connect, read/write characteristics, and subscribe to notifications on BLE devices.3517MIT
- FlicenseNot gradedqualityBmaintenanceExposes Garmin Connect data and workout management to AI agents, supporting tools, resources, and prompts for health data, workout creation, and coaching workflows.1
Related MCP Connectors
Multi-tenant Telegram gateway for AI agents — HTTP+stdio, 8 tools, MTProto User API
Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.
Build, validate, and deploy multi-agent AI solutions from any AI environment.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dncore/efferent-ble-simulator'
If you have feedback or need assistance with the MCP directory API, please join our Discord server