feat: Multi-event server support + USB LED controller

New features:
- wyoming_satellite/xvf_usb.py — прямой USB доступ к XVF3800 без subprocess
- docs/development/multi-event-server-plan.md — план разработки event server
- examples/respeaker_usb_mic_array.py — исходный файл с LED анимациями

Documentation updates:
- DEPLOY.md — добавлена секция про LED управление и event server план
- docs/integration/mqtt-led.md — обновлена документация по USB и event server
- docs/deployment/systemd-services.md — добавлен event server раздел

Refactoring:
- examples/wyoming-led.py — замена subprocess на XVF3800Controller
- install_service.sh — удалён (устарел, используется install_systemd_services.sh)

Bug fixes:
- wyoming-led.py — яркость DoA эффекта через масштабирование цвета
- systemd сервис — добавлена поддержка wyoming_satellite.xvf_usb модуля
This commit is contained in:
2026-05-20 13:50:16 +03:00
parent 75ba5481b6
commit c62203b220
9 changed files with 2267 additions and 152 deletions
+86
View File
@@ -16,6 +16,9 @@ source ~/.venv_satellite/bin/activate
# Установка зависимостей
pip install -r requirements.txt
# Установка пакета в режиме разработки (для доступа к wyoming_satellite.xvf_usb)
pip install -e .
```
### 2. Установка systemd сервисов
@@ -24,6 +27,14 @@ pip install -r requirements.txt
sudo ./install_systemd_services.sh
```
**Важно:** После установки пакета в режиме editable (`pip install -e .`), новый модуль `wyoming_satellite.xvf_usb` будет автоматически доступен. Если вы добавляете новые модули в `wyoming_satellite/`, убедитесь, что они видны:
```bash
# Проверка доступности модуля
source ~/.venv_satellite/bin/activate
python3 -c "from wyoming_satellite.xvf_usb import XVF3800Controller; print('OK')"
```
### 3. Запуск сервисов
```bash
@@ -84,6 +95,81 @@ journalctl -u wyoming-satelite-vosk.service -f
---
## LED управление (ReSpeaker XVF3800)
Сервис `wyoming-event.service` использует прямой USB доступ к XVF3800 через модуль `wyoming_satellite.xvf_usb`.
### Требования
- **ReSpeaker XVF3800 USB 4-MIC Array** (VID=0x2886, PID=0x0018 или 0x001A)
- **udev правила** для доступа к USB:
```bash
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2886", ATTR{idProduct}=="0018", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-respeaker.rules
sudo udevadm trigger
```
### Проверка подключения
```bash
# Проверка USB устройства
lsusb | grep -i 2886
# Тест контроллера
source ~/.venv_satellite/bin/activate
python3 -c "from wyoming_satellite.xvf_usb import XVF3800Controller; c = XVF3800Controller(); print('OK' if c.is_connected() else 'Not found')"
```
### Настройка яркости
Яркость для каждого состояния настраивается в `examples/led_brightness_config.json`:
```json
{
"idle": 80,
"listening": 120,
"wake": 200,
"thinking": 150,
"speaking": 140,
"paused": 40,
"error": 255,
"global_multiplier": 1.0
}
```
Файл создаётся автоматически при первом запуске. Исключите его из git tracking:
```bash
git update-index --assume-unchanged examples/led_brightness_config.json
```
### Диагностика LED сервиса
```bash
# Статус сервиса
sudo systemctl status wyoming-event.service
# Логи
journalctl -u wyoming-event.service -f
# Тест вручную
source ~/.venv_satellite/bin/activate
cd ~/projects/Satellite/examples
python3 wyoming-led.py --debug
```
### Преимущества прямого USB доступа
Начиная с версии 2026.05, `wyoming-led.py` использует прямой USB доступ вместо subprocess вызовов:
- ✅ **Быстрее:** ~1ms на команду (нет накладных расходов subprocess)
- ✅ **Надёжнее:** контроль USB подключения с авто-переподключением
- ✅ **Чище:** нет процессов subprocess и временных файлов
Подробности в [документации MQTT LED](docs/integration/mqtt-led.md).
---
## Конфигурация
Файлы сервисов используют плейсхолдеры, которые автоматически заменяются при установке: