Skip to main content
Glama
dncore

efferent-ble-simulator

by dncore

Efferent simula dispositivos periféricos Bluetooth Low Energy (BLE) a través de una radio real (Linux BlueZ): rodillos inteligentes FTMS, potenciómetros de ciclismo, sensores de velocidad/cadencia y pulsómetros de frecuencia cardíaca. Expone un servidor MCP (stdio o HTTP) para que los agentes de IA — y el panel web incluido — puedan iniciar, configurar y supervisar simulaciones como si controlaran un rodillo real.


Características

  • 4 tipos de dispositivo sobre radio BLE real: rodillo inteligente FTMS (0x1826), potencia de ciclismo (0x1818), velocidad/cadencia (0x1816), frecuencia cardíaca (0x180D)

  • Soporte completo del punto de control FTMS: Request Control / Start / Stop / Reset / Set Target Power / Set Resistance / Set Indoor Bike Simulation Params

  • Simulación dinámica: deriva de potencia/cadencia realista + modelo de velocidad basado en física (peso, pendiente, Crr, CdA), 5 escenarios de rodaje, incluido el ride_script con guion

  • Actualización de parámetros en caliente: cambia los parámetros mientras se ejecuta — el teléfono conectado mantiene su enlace y recibe los nuevos valores en la siguiente notificación (sin re-vinculación)

  • Presets de configuración con nombre: guardar / cargar / renombrar / eliminar hasta 20 configuraciones con nombre, compartidas entre MCP y el panel

  • 17 herramientas MCP para agentes: control, configuración, presets de configuración, reglas de interacción, sesiones, registros, estado del dispositivo en vivo, versión

  • Panel web (React + shadcn/ui): estado, formularios, plantillas de rodaje con un clic, reglas de interacción, gestión de sesiones/configuraciones, panel lateral de registros en vivo

  • Docker Compose de despliegue con un solo comando (MCP + Panel + archivo de Skill por HTTP), de larga duración con comprobaciones de salud

  • Versionado: serverInfo.version de MCP + ble_get_version permiten a los agentes detectar actualizaciones


Related MCP server: pyBTMCP

Entorno de ejecución

Requisito

Detalle

SO

Solo Linux — el simulador controla el BlueZ del host a través de D-Bus

BlueZ

≥ 5.87 (5.86 tiene un error de registro de anuncios)

Hardware

Se requiere un adaptador compatible con BLE (integrado o dongle USB) para transmitir realmente

Política D-Bus

/etc/dbus-1/system.d/ble-simulator.conf (instalado por npm run setup) — necesaria para el registro GATT sin root

Docker

El contenedor mcp monta el socket D-Bus del host; la radio BLE siempre permanece en el host

No compatible

macOS / Windows de forma nativa (requeriría una pila BLE diferente); sin ningún adaptador BLE, el servicio MCP se ejecuta pero no se transmite nada

Arquitectura

┌──────────────┐   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...)│
                                     └───────────────────────────┘

Tipos de dispositivo

Tipo

Servicio BLE

Características

Rodillo inteligente FTMS

0x1826

FM Feature, Indoor Bike Data (notify), Control Point (write/indicate), Status, rangos de Resistencia/Potencia

Potencia de ciclismo

0x1818

Medición de potencia/cadencia, datos de rueda y biela

Velocidad/Cadencia (CSC)

0x1816

Contadores de revoluciones de rueda y biela

Frecuencia cardíaca

0x180D

Medición de FC, ubicación del sensor corporal, batería


Inicio rápido

Requisitos previos

  • Linux con BlueZ ≥ 5.87 (bluetoothd) y un adaptador compatible con BLE

    BlueZ 5.86 tiene un error de registro de anuncios; en kernels con validación MGMT estricta, cada RegisterAdvertisement falla. Actualiza primero: sudo pacman -S bluez && sudo systemctl restart bluetooth (Arch) / sudo apt install bluez (Debian).

  • Node.js ≥ 18

1. Instalación nativa

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 escribe /etc/dbus-1/system.d/ble-simulator.confnecesario para el registro GATT sin root (sin él, el dispositivo anuncia pero no se puede conectar).

2. Docker Compose (recomendado para servidores)

bash scripts/docker-up.sh     # host prep (sudo, once) + build + start

URL

Propósito

http://<host>:3300/mcp

Endpoint MCP

http://<host>:3330/

Panel web

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

Skill de operación (para agentes)

http://<host>:3330/help

Página de ayuda del panel

Compilación sin compilar (binario precompilado de better-sqlite3); en redes restringidas usa un espejo:

NPM_REGISTRY=https://registry.npmmirror.com \
BETTER_SQLITE3_BINARY_HOST_MIRROR=https://registry.npmmirror.com/-/binary/better-sqlite3 \
bash scripts/docker-up.sh

Gestión: bash scripts/docker-up.sh status|logs|down


Herramientas MCP (17)

Herramienta

Propósito

ble_start / ble_stop / ble_restart

Iniciar / detener / reiniciar una simulación

ble_status

Estado del controlador + configuración activa + estado del dispositivo en vivo (fase/potencia/cadencia/FC)

ble_configure

Actualizar configuración — se aplica en caliente si se ejecuta con el mismo tipo de dispositivo

ble_get_config

Configuración actual/última como JSON (para rellenar formularios)

ble_save_config

Guardar los parámetros actuales como preset con nombre (máx. 20)

ble_list_configs / ble_get_config_detail

Listar / ver presets guardados

ble_rename_config / ble_delete_config

Renombrar / eliminar un preset

ble_set_interaction / ble_clear_interactions

Reglas personalizadas de respuesta a escrituras BLE

ble_list_sessions / ble_get_session

Historial de sesiones / detalle

ble_get_logs

Registros de comunicación persistentes (conexión/escritura/notificación/error)

ble_get_version

Versiones de MCP + Skill, registro de cambios, URL del Skill (para detección de actualizaciones)

Ejemplo

{
  "method": "tools/call",
  "params": {
    "name": "ble_start",
    "arguments": {
      "deviceType": "ftms",
      "ftms": { "simulation": { "enabled": true, "scenario": { "type": "ride_script" } } }
    }
  }
}

Simulación dinámica

Actívala mediante simulation en FTMS / CyclingPower / 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" }
}

Parámetro

Valor predeterminado

Descripción

enabled

false

Interruptor principal

riderWeightKg / bikeWeightKg

75 / 8

Física de velocidad (masa ciclista+bici)

crr / cdA

0.004 / 0.35

Resistencia a la rodadura / área de arrastre

fatigueFactor

0

Decaimiento de potencia por minuto (0 = ninguno)

cadenceCoupling

proportional

proportional / inverse / independent

microPauseProbability

0.005

Pausas de inercia por tick

autoStart

false (ride_script activado por defecto)

Empezar a rodar sin que una app envíe Start

scenario

freeride

Escenario de rodaje (abajo)

Escenarios

  • steady — solo micro-variación natural

  • freeride (predeterminado) — la potencia base varía ±20 % cada 60–180 s

  • intervals — alternancia de potencia alta/baja

  • warmup_main_cooldown — calentamiento → parte principal → enfriamiento

  • ride_script — rodaje con guion: una secuencia de acciones de rodaje (start / cruise / climb / sprint / coast / stop), cada una con potencia objetivo, pendiente y cadencia opcional; se autoinicia, se repite con repeat: true, stop pone potencia/cadencia/velocidad a cero. Omite phases para usar el guion predeterminado integrado.


Actualización en caliente y serial estable

  • Actualización en caliente: ble_configure mientras se ejecuta + mismo tipo de dispositivo aplica los parámetros en el lugar — el teléfono conectado mantiene su enlace y recibe los valores actualizados en la siguiente notificación. Los cambios de tipo de dispositivo siguen reiniciando (un serial nuevo obliga a redescubrir).

  • Serial estable: SIM_SERIAL_STABLE=1 mantiene el serial estable entre sesiones del mismo tipo (SIM001-FTMS), de modo que un teléfono puede reconectarse tras detener/iniciar sin olvidar el dispositivo.


Variables de entorno

Var

Predeterminado

Descripción

MCP_TRANSPORT

stdio

stdio o http

MCP_PORT / MCP_HOST

3300 / 0.0.0.0

Dirección de escucha HTTP

SIM_DEVICE_PREFIX

OPEN_RIDE

Prefijo del nombre anunciado

SIM_INSTANCE_ID_MODE

Modo de ID de instancia para el nombre del dispositivo

SIM_SERIAL_STABLE

sin definir

1 = serial estable para sesiones del mismo tipo

SKILL_PUBLIC_URL

/skill/SKILL.md

URL pública del Skill (devuelta por ble_get_version)


Estructura del código fuente

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

El acceso al periférico BLE se realiza a través del D-Bus de BlueZ del host (el contenedor monta el socket D-Bus del host). Consulta docs/design/*.md para los registros de diseño.


Licencia

MIT © BLE Simulator Contributors

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