efferent-ble-simulator
Efferent имитирует периферийные устройства Bluetooth Low Energy (BLE) через реальный радиоканал (Linux BlueZ): умные тренажёры FTMS, велосипедные измерители мощности, датчики скорости/каденса и мониторы сердечного ритма. Он предоставляет MCP-сервер (stdio или HTTP), благодаря чему AI-агенты — и встроенная веб-панель — могут запускать, настраивать и контролировать симуляции так, как если бы управляли реальным тренажёром.
Возможности
4 типа устройств через реальный BLE-радиоканал: умный тренажёр FTMS (0x1826), велосипедная мощность (0x1818), скорость/каденс (0x1816), сердечный ритм (0x180D)
Полная поддержка контрольной точки FTMS: Request Control / Start / Stop / Reset / Set Target Power / Set Resistance / Set Indoor Bike Simulation Params
Динамическая симуляция: реалистичный дрейф мощности/каденса + физическая модель скорости (вес, уклон, Crr, CdA), 5 сценариев езды, включая скриптовый ride_script
Горячее обновление параметров: изменение параметров на лету — подключённый телефон сохраняет соединение и получает новые значения при следующем notify (без повторного сопряжения)
Именованные пресеты конфигураций: сохранение / загрузка / переименование / удаление до 20 именованных конфигураций, общих для MCP и панели
17 MCP-инструментов для агентов: управление, настройка, пресеты конфигураций, правила взаимодействия, сессии, логи, живое состояние устройства, версия
Веб-панель (React + shadcn/ui): статус, формы, шаблоны езды в один клик, правила взаимодействия, управление сессиями/конфигурациями, боковая панель живых логов
Docker Compose — развёртывание одной командой (MCP + панель + файл навыка по HTTP), длительная работа с проверками работоспособности
Версионирование: MCP
serverInfo.version+ble_get_versionпозволяют агентам обнаруживать обновления
Related MCP server: pyBTMCP
Среда выполнения
Требование | Подробности |
ОС | Только Linux — симулятор управляет хост-сервисом BlueZ через D-Bus |
BlueZ | ≥ 5.87 (в 5.86 есть ошибка регистрации рекламных объявлений) |
Оборудование | Для фактической трансляции требуется адаптер с поддержкой BLE (встроенный или USB-донгл) |
Политика D-Bus |
|
Docker | Контейнер mcp монтирует сокет D-Bus хоста; BLE-радио всегда остаётся на хосте |
Не поддерживается | macOS / Windows нативно (потребовался бы другой BLE-стек); без BLE-адаптера MCP-сервис работает, но ничего не передаётся |
Архитектура
┌──────────────┐ 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...)│
└───────────────────────────┘Типы устройств
Тип | BLE-сервис | Характеристики |
FTMS умный тренажёр | 0x1826 | FM Feature, Indoor Bike Data (notify), Control Point (write/indicate), Status, диапазоны Resistance/Power |
Велосипедная мощность | 0x1818 | Измерение мощности/каденса, данные колеса и шатунов |
Скорость/каденс (CSC) | 0x1816 | Счётчики оборотов колеса и шатунов |
Сердечный ритм | 0x180D | Измерение ЧСС, расположение датчика на теле, батарея |
Быстрый старт
Предварительные требования
Linux с BlueZ ≥ 5.87 (bluetoothd) и адаптером с поддержкой BLE
В BlueZ 5.86 есть ошибка регистрации рекламных объявлений; на ядрах со строгой проверкой MGMT каждый
RegisterAdvertisementзавершается ошибкой. Обновитесь заранее:sudo pacman -S bluez && sudo systemctl restart bluetooth(Arch) /sudo apt install bluez(Debian).Node.js ≥ 18
1. Нативная установка
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 записывает /etc/dbus-1/system.d/ble-simulator.conf — обязательно для регистрации GATT без прав root (без него устройство транслируется, но к нему нельзя подключиться).
2. Docker Compose (рекомендуется для серверов)
bash scripts/docker-up.sh # host prep (sudo, once) + build + startURL | Назначение |
| Конечная точка MCP |
| Веб-панель |
| Навык работы (для агентов) |
| Справочная страница панели |
Сборка без компиляции (готовый бинарник better-sqlite3); в ограниченных сетях используйте зеркало:
NPM_REGISTRY=https://registry.npmmirror.com \
BETTER_SQLITE3_BINARY_HOST_MIRROR=https://registry.npmmirror.com/-/binary/better-sqlite3 \
bash scripts/docker-up.shУправление: bash scripts/docker-up.sh status|logs|down
MCP-инструменты (17)
Инструмент | Назначение |
| Запуск / остановка / перезапуск симуляции |
| Состояние контроллера + активная конфигурация + живое состояние устройства (фаза/мощность/каденс/ЧСС) |
| Обновление конфигурации — горячее обновление на месте, если запущено с тем же типом устройства |
| Текущая/последняя конфигурация в JSON (для заполнения форм) |
| Сохранение текущих параметров как именованного пресета (макс. 20) |
| Список / просмотр сохранённых пресетов |
| Переименование / удаление пресета |
| Пользовательские правила ответов на BLE-записи |
| История сессий / подробности |
| Постоянные журналы связи (connect/write/notify/error) |
| Версии MCP + навыка, журнал изменений, URL навыка (для обнаружения обновлений) |
Пример
{
"method": "tools/call",
"params": {
"name": "ble_start",
"arguments": {
"deviceType": "ftms",
"ftms": { "simulation": { "enabled": true, "scenario": { "type": "ride_script" } } }
}
}
}Динамическая симуляция
Включается через simulation для 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" }
}Параметр | По умолчанию | Описание |
|
| Главный переключатель |
| 75 / 8 | Физика скорости (масса велосипедиста + велосипеда) |
| 0.004 / 0.35 | Сопротивление качению / площадь лобового сопротивления |
| 0 | Спад мощности в минуту (0 = нет) |
|
|
|
| 0.005 | Паузы-накаты на каждый тик |
|
| Начало езды без команды Start от приложения |
|
| Сценарий езды (ниже) |
Сценарии
steady— только естественная микро-вариацияfreeride(по умолчанию) — базовая мощность дрейфует ±20% каждые 60–180 сintervals— чередование высокой/низкой мощностиwarmup_main_cooldown— разминка → основная часть → заминкаride_script— скриптовая езда: последовательность действий (start / cruise / climb / sprint / coast / stop), каждое с целевой мощностью, уклоном и опциональным каденсом; автозапуск, зацикливание сrepeat: true,stopобнуляет мощность/каденс/скорость. Опуститеphases, чтобы использовать встроенный скрипт по умолчанию.
Горячее обновление и стабильный серийный номер
Горячее обновление:
ble_configureво время работы + тот же тип устройства применяет параметры на месте — подключённый телефон сохраняет соединение и получает обновлённые значения при следующем notify. Смена типа устройства всё равно вызывает перезапуск (новый серийный номер вынуждает повторное обнаружение).Стабильный серийный номер:
SIM_SERIAL_STABLE=1сохраняет серийный номер стабильным между сессиями одного типа (SIM001-FTMS), поэтому телефон может переподключиться после stop/start без удаления устройства.
Переменные окружения
Переменная | По умолчанию | Описание |
|
|
|
|
| Адрес прослушивания HTTP |
|
| Префикс транслируемого имени |
| — | Режим идентификатора экземпляра для имени устройства |
| не задано |
|
|
| Публичный URL навыка (возвращается |
Структура исходного кода
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Доступ к BLE-периферии осуществляется через D-Bus хост-сервиса BlueZ (контейнер монтирует сокет D-Bus хоста). См. docs/design/*.md — записи о проектировании.
Лицензия
MIT © BLE Simulator Contributors
This server cannot be deployed
Maintenance
Related MCP Connectors
- OkareoOAuthcom.okareo
Simulation, evaluation and monitoring for voice agents.
Multi-tenant Telegram gateway for AI agents — HTTP+stdio, 8 tools, MTProto User API
Exposes FEDLIN's public security scanners as agent-callable tools over Streamable HTTP.
Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceBluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.21BSD 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.3518MIT
- AlicenseBqualityBmaintenanceA 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.21Apache 2.0