Skip to main content
Glama
dncore

efferent-ble-simulator

by dncore

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_version ermö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

/etc/dbus-1/system.d/ble-simulator.conf (installiert durch npm run setup) – erforderlich für GATT-Registrierung ohne Root-Rechte

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 RegisterAdvertisement fehl. 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 + start

URL

Zweck

http://<host>:3300/mcp

MCP-Endpunkt

http://<host>:3330/

Web-Dashboard

http://<host>:3330/skill/SKILL.md

Operations-Skill (für Agenten)

http://<host>:3330/help

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.sh

Verwaltung: bash scripts/docker-up.sh status|logs|down


MCP-Tools (17)

Tool

Zweck

ble_start / ble_stop / ble_restart

Simulation starten / stoppen / neu starten

ble_status

Controller-Status + aktive Konfiguration + Live-Gerätestatus (Phase/Leistung/Trittfrequenz/Herzfrequenz)

ble_configure

Konfiguration aktualisieren – Hot-Update direkt im Betrieb, wenn der Gerätetyp gleich bleibt

ble_get_config

Aktuelle/letzte Konfiguration als JSON (Formular-Rückbefüllung)

ble_save_config

Aktuelle Parameter als benanntes Profil speichern (max. 20)

ble_list_configs / ble_get_config_detail

Profile auflisten / anzeigen

ble_rename_config / ble_delete_config

Profil umbenennen / löschen

ble_set_interaction / ble_clear_interactions

Benutzerdefinierte BLE-Schreib-Antwortregeln

ble_list_sessions / ble_get_session

Sitzungsverlauf / Details

ble_get_logs

Dauerhafte Kommunikationsprotokolle (Verbinden/Schreiben/Notifizieren/Fehler)

ble_get_version

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

enabled

false

Hauptschalter

riderWeightKg / bikeWeightKg

75 / 8

Geschwindigkeitsphysik (Fahrer- + Radmasse)

crr / cdA

0.004 / 0.35

Rollwiderstand / Luftwiderstandsbeiwert

fatigueFactor

0

Leistungsabfall pro Minute (0 = keiner)

cadenceCoupling

proportional

proportional / inverse / independent

microPauseProbability

0.005

Rollpausen pro Takt

autoStart

false (ride_script standardmäßig aktiviert)

Fahrt starten, ohne dass eine App Start sendet

scenario

freeride

Fahrszenario (siehe unten)

Szenarien

  • steady – nur natürliche Mikroschwankungen

  • freeride (Standard) – Grundleistung driftet ±20 % alle 60–180 s

  • intervals – Wechsel zwischen hoher und niedriger Leistung

  • warmup_main_cooldown – Aufwärmen → Hauptteil → Ausfahren

  • ride_script – skriptgesteuerte Fahrt: eine Abfolge von Fahraktionen (start / cruise / climb / sprint / coast / stop), jeweils mit Zielleistung, Steigung und optionaler Trittfrequenz; startet automatisch, wiederholt sich mit repeat: true, stop setzt Leistung/Trittfrequenz/Geschwindigkeit auf null. phases weglassen, um das integrierte Standard-Skript zu verwenden.


Hot-Update & Stabile Seriennummer

  • Hot-Update: ble_configure wä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=1 hä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

MCP_TRANSPORT

stdio

stdio oder http

MCP_PORT / MCP_HOST

3300 / 0.0.0.0

HTTP-Listenadresse

SIM_DEVICE_PREFIX

OPEN_RIDE

Präfix des ausgestrahlten Namens

SIM_INSTANCE_ID_MODE

—

Instanz-ID-Modus für den Gerätenamen

SIM_SERIAL_STABLE

nicht gesetzt

1 = stabile Seriennummer für Sitzungen desselben Typs

SKILL_PUBLIC_URL

/skill/SKILL.md

Öffentliche Skill-URL (von ble_get_version zurückgegeben)


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 devices

Der 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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Bluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.
    21
    BSD 2-Clause "Simplified"
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A 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.
    -
  • A
    license
    A
    quality
    C
    maintenance
    A stateful Bluetooth Low Energy (BLE) MCP server that enables AI agents to scan, connect, read/write characteristics, and subscribe to notifications on BLE devices.
    35
    18
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    A lightweight Bluetooth Low Energy debug MCP server for AI agents. It provides 21 tools for BLE scanning, connection, GATT read/write, descriptor access, MTU query, notification subscription, device recon, and engine diagnostics.
    21
    Apache 2.0