Сервис FastAPI (LAN + BLE)¶
HTTP API для дашбордов, скриптов или мобильных приложений: FastAPI + OpenAPI на /docs и планировщик asyncio (слоты Function по моторам, сессии preset/pattern, GET /tasks). Реализация — lovensepy.services.fastapi (пакет lovensepy.services): в LAN используется Game Mode (AsyncLANClient); в BLE — BleDirectHub с ручным сканом/подключением. Оба бэкенда удовлетворяют LovenseControlBackend, протоколу, согласованному с поверхностью LovenseAsyncControlClient, которую использует планировщик (см. Справочник API — LovenseAsyncControlClient).
Требования¶
LAN-режим (по умолчанию)¶
Окружение¶
export LOVENSE_LAN_IP=192.168.1.100 # хост с Lovense Remote (Game Mode)
export LOVENSE_SERVICE_MODE=lan # по умолчанию; можно опустить
# опционально: LOVENSE_LAN_PORT=20011 LOVENSE_APP_NAME=... LOVENSE_TOY_IDS=id1,id2
# опционально: LOVENSE_SESSION_MAX_SEC=60 # строка /tasks при time=0 у preset/pattern
Запуск сервера¶
Устаревшая обёртка (предупреждение при импорте):
Программная настройка¶
from lovensepy.services import ServiceConfig, create_app
app = create_app(ServiceConfig(mode="lan", lan_ip="192.168.1.100"))
Колбэки BLE-рекламы (только BLE-режим, см. ниже): передайте on_ble_advertisement и/или on_ble_advertisement_async в create_app(...).
BLE-режим¶
Вместо Game Mode — прямой BLE. Игрушки не подключаются автоматически: скан, затем POST /ble/connect (или колбэки для BleDirectHub.add_toy / connect).
export LOVENSE_SERVICE_MODE=ble
# опционально: LOVENSE_BLE_SCAN_TIMEOUT=8 LOVENSE_BLE_SCAN_PREFIX=LVS- (пустой префикс = все имена)
# опционально пассивные обновления RSSI: LOVENSE_BLE_ADVERT_MONITOR=1 LOVENSE_BLE_ADVERT_MONITOR_INTERVAL=2
# опционально пресеты: LOVENSEPY_BLE_PRESET_UART=Pat (как у BleDirectClient по умолчанию; сервис по умолчанию Preset для /command/preset)
# опционально: LOVENSEPY_BLE_PRESET_EMULATE_PATTERN=1 (pulse/wave/… через паттерн, если UART пресеты игнорируются)
uvicorn lovensepy.services.fastapi.app:app --host 0.0.0.0 --port 8000
Дополнительные HTTP-маршруты (только BLE):
POST /ble/scan— скан по запросу; querytimeoutопционально; ответ:address,name,rssiGET /ble/advertisements— последняя карта рекламы при включённом монитореPOST /ble/connect— тело:address, опциональноtoy_id,name,toy_type,replacePOST /ble/disconnect/{toy_id}— отключение GATT (регистрация игрушки остаётся)DELETE /ble/toys/{toy_id}— отключение и снятие регистрации
GET /toys и командные маршруты совпадают с LAN после подключения игрушек.
OpenAPI¶
Откройте http://127.0.0.1:8000/docs и попробуйте GET /toys, POST /command/preset, GET /tasks и эндпоинты стопа (/command/stop/... и пакетные варианты).
Замечания по поведению¶
- BLE: паттерны (и зацикленный
Function) могут удерживать работу, пока :class:~lovensepy.ble_direct.client.BleDirectClientшагает по UART. Пресеты в этом сервисе по умолчанию через UARTPreset:{n};(LOVENSEPY_BLE_PRESET_UART=Pat— как у прямого BLE-клиента по умолчанию). СLOVENSEPY_BLE_PRESET_EMULATE_PATTERN=1четыре имени приложения идут через шаги паттерна (как/command/pattern). Таймированные пресеты приwait_for_completion=Falseоткладывают удержание + stop burst. У прямого :class:~lovensepy.ble_direct.client.BleDirectClientпо умолчаниюwait_for_completion=True. - Повторная отправка того же пресета или паттерна для той же игрушки продлевает сессию и шлёт ещё одну транспортную команду с новым
time(Lovense иначе гасит послеtimeSecкаждой команды). GET /tasksвозвращает строки function (kind: function), function_loop приloop_on_time/loop_off_timeуPOST /command/function, и preset / pattern (kind: preset/pattern). В метках времени естьstarted_at(UTC) иstarted_monotonic_secдля стабильногоremaining_sec.
См. также строку Примеры про HTTP-сервис.