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

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    C
    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.
    15
    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
    17
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Exposes Garmin Connect data and workout management to AI agents, supporting tools, resources, and prompts for health data, workout creation, and coaching workflows.
    1

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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