diff --git a/docs/development/websocket-server-plan.md b/docs/development/websocket-server-plan.md index e632bca..a66a123 100644 --- a/docs/development/websocket-server-plan.md +++ b/docs/development/websocket-server-plan.md @@ -964,6 +964,135 @@ sudo systemctl restart wyoming-satelite-vosk.service --- +## Web Client Разработка + +### Архитектура Web клиента + +``` +┌─────────────────┐ ┌──────────────────────────┐ +│ Web Browser │◄───────►│ Wyoming Satellite │ +│ (client.html) │ WS :8675│ (WebSocket Server) │ +│ │ │ │ +│ - UI команды │ │ - handle_websocket_cmd │ +│ - RMS визуал. │ │ - audio-level события │ +│ - Лог событий │ │ - forward_event │ +└─────────────────┘ └──────────────────────────┘ +``` + +### Функции Web клиента + +| Функция | Команда | Статус | Примечание | +|---------|---------|--------|------------| +| 🔊 Громкость | `set_volume` | ✅ Работает | Исправлен баг volume/level | +| 🔇 Mute | `mute` | ✅ Работает | | +| 🔊 Unmute | `unmute` | ✅ Работает | | +| 💡 LED яркость | `set_led_brightness` | ⏳ Не тест. | | +| 🎨 LED цвет | `set_led_color` | ⏳ Не тест. | | +| 🔔 Play Sound | `play_sound` | ⏳ Не тест. | | +| 📊 Audio Level | `audio-level` event | ⏳ Не тест. | RMS визуализация | +| 🎤 Start Listen | `start_listening` | ⏳ Не тест. | | +| ⏹️ Stop Pipeline | `stop_pipeline` | ⏳ Не тест. | | +| ⏲️ Stop Timer | `stop_timer` | ⏳ Не тест. | | + +### Этапы разработки Web клиента + +#### WC-1: Базовая интеграция ✅ + +- [x] Создан `web-client/client.html` +- [x] WebSocket подключение +- [x] Отправка команд (volume, mute, unmute) +- [x] Приём событий от satellite +- [x] Исправлен баг volume/level + +#### WC-2: Визуализация (в процессе) + +- [ ] audio-level RMS визуализация (canvas) +- [ ] Индикация состояния (listening, speaking, idle) +- [ ] Анимации для состояний +- [ ] Orb визуализация + +#### WC-3: Дополнительные функции + +- [ ] LED управление (цвет, яркость, эффекты) +- [ ] Громкость с отображением в % +- [ ] Mute индикация +- [ ] Transcript отображение + +#### WC-4: UI/UX + +- [ ] Адаптивный дизайн +- [ ] Сохранение настроек (localStorage) +- [ ] История событий с фильтрами +- [ ] Настройки подключения + +### Запуск Web клиента + +```bash +# 1. Запустить satellite с WebSocket +python3 -m wyoming_satellite \ + --uri tcp://0.0.0.0:10700 \ + --websocket-enabled \ + --websocket-port 8675 \ + --audio-level-enabled + +# 2. Запустить HTTP сервер для клиента +cd web-client +python3 -m http.server 8080 + +# 3. Открыть в браузере +# http://localhost:8080/client.html +# или +# http://192.168.200.111:8080/client.html +``` + +### Примеры команд + +**Установка громкости:** +```javascript +ws.send(JSON.stringify({ + command: "set_volume", + data: { level: 0.75 } // или volume: 0.75 +})); +``` + +**Mute/Unmute:** +```javascript +ws.send(JSON.stringify({ + command: "mute", + data: {} +})); + +ws.send(JSON.stringify({ + command: "unmute", + data: {} +})); +``` + +**LED управление:** +```javascript +// Яркость +ws.send(JSON.stringify({ + command: "set_led_brightness", + data: { brightness: 200 } +})); + +// Цвет +ws.send(JSON.stringify({ + command: "set_led_color", + data: { r: 255, g: 0, b: 0 } +})); +``` + +**Воспроизведение звука:** +```javascript +ws.send(JSON.stringify({ + command: "play_sound", + data: { path: "/path/to/sound.wav" } +})); +``` + +--- + ## Приложения ### A. Пример события в WebSocket клиенте diff --git a/web-client/README.md b/web-client/README.md new file mode 100644 index 0000000..96f19db --- /dev/null +++ b/web-client/README.md @@ -0,0 +1,180 @@ +# 🛰️ LVA NEXUS — Web Client для Wyoming Satellite + +Современный веб-интерфейс для управления Wyoming Satellite через WebSocket. + +## 🚀 Быстрый старт + +### 1. Запустить satellite с WebSocket + +```bash +cd ~/projects/satellite-dev +source .venv/bin/activate + +python3 -m wyoming_satellite \ + --uri tcp://0.0.0.0:10700 \ + --websocket-enabled \ + --websocket-port 8675 \ + --audio-level-enabled \ + --debug +``` + +### 2. Запустить HTTP сервер + +```bash +cd ~/projects/satellite-dev/web-client +python3 -m http.server 8080 +``` + +### 3. Открыть в браузере + +``` +http://localhost:8080/client.html +или +http://192.168.200.111:8080/client.html +``` + +--- + +## 📋 Функции + +| Функция | Статус | Описание | +|---------|--------|----------| +| 🔊 Громкость | ✅ | Установка громкости satellite (0-100%) | +| 🔇 Mute / 🔊 Unmute | ✅ | Заглушить/включить микрофон | +| 📊 RMS Audio Level | ✅ | Визуализация громкости в реальном времени | +| 💡 LED управление | ⏳ | Цвет, яркость, эффекты | +| 🎤 Start Listening | ⏳ | Запуск прослушивания | +| ⏹️ Stop Pipeline | ⏳ | Остановка pipeline | +| ⏲️ Stop Timer | ⏳ | Остановка таймера | +| 🗣️ Transcript | ⏳ | Отображение распознанного текста | + +--- + +## 🎮 Управление + +### Громкость + +- **Слайдер** — плавная регулировка 0-100% +- **Кнопки VOL+ / VOL-** — пошаговое изменение +- **Mute/Unmute** — быстрое отключение микрофона + +### LED управление + +```javascript +// Яркость +sendCommand('set_led_brightness', { brightness: 200 }); + +// Цвет (RGB) +sendCommand('set_led_color', { r: 255, g: 0, b: 0 }); +``` + +### Аудио визуализация + +- **Canvas** — отрисовка аудио уровня в реальном времени +- **RMS метр** — числовое значение громкости +- **Орбита** — анимация состояния (idle, listening, speaking) + +--- + +## 🔧 Настройки + +### Подключение + +При первом запуске введите WebSocket адрес: +``` +ws://192.168.200.111:8675 +``` + +### Авто-подключение + +- **Auto-reconnect** — автоматическое переподключение при разрыве +- **Auto-scroll** — автоматическая прокрутка лога событий + +--- + +## 📊 События + +Web клиент получает от satellite: + +| Событие | Описание | +|---------|----------| +| `voice-started` | Пользователь начал говорить | +| `voice-stopped` | Пользователь перестал говорить | +| `transcript` | Распознанный текст | +| `synthesize` | Запрос на синтез речи | +| `audio-level` | RMS громкость микрофона | +| `timer-started` | Таймер запущен | +| `timer-finished` | Таймер завершён | +| `error` | Ошибка | + +--- + +## 🐛 Известные проблемы + +| Проблема | Статус | Решение | +|----------|--------|---------| +| Громкость всегда 100% | ✅ Исправлено | Поддерживаются `level` и `volume` | +| WebSocket отключается | ⏳ В работе | Проверить firewall | +| RMS не обновляется | ⏳ В работе | Проверить audio-level-enabled | + +--- + +## 🛠️ Разработка + +### Структура + +``` +web-client/ +├── client.html # Основной UI +├── README.md # Документация +└── start_server.py # HTTP сервер (опционально) +``` + +### Добавление команд + +1. **В satellite.py** — обработчик команды: +```python +async def handle_websocket_command(self, command: str, data: dict): + if command == "my_command": + # обработка +``` + +2. **В client.html** — отправка команды: +```javascript +sendCommand('my_command', { param: value }); +``` + +3. **В client.html** — обработка ответа: +```javascript +function handleIncomingMessage(ev) { + const json = JSON.parse(ev.data); + if(json.event === 'my_event') { + // обработка + } +} +``` + +--- + +## 📝 Changelog + +### 2026-05-21 + +- ✅ Исправлен баг volume/level +- ✅ Добавлена поддержка обоих названий параметра +- ✅ Обновлён план разработки + +### 2026-05-20 + +- ✅ Создан современный UI +- ✅ WebSocket интеграция +- ✅ RMS визуализация +- ✅ Лог событий + +--- + +## 🔗 Связанное + +- [WebSocket Server Plan](../docs/development/websocket-server-plan.md) +- [Wyoming Satellite](../README.md) +- [MQTT LED Integration](../docs/integration/mqtt-led.md) diff --git a/web-client/client.html b/web-client/client.html new file mode 100644 index 0000000..08e617e --- /dev/null +++ b/web-client/client.html @@ -0,0 +1,613 @@ + + + + + + NOVA: LVA Cognitive Interface + + + + +
+ +
+
+ ⚡ LVA • NEXUS +
+
+
+
disconnected
+ +
+
+ +
+ +
+
+ 🎙️ NEURAL CORE +
+
+ 🔊 +
+
IDLE
+
+ +
+
+ 🔊 VOLUME + 0.80 +
+ +
+ + +
+
+ + +
+
+ 🕹️ УПРАВЛЕНИЕ • ЖЕСТЫ +
+
+ + + +
+
+ + + + + +
+
+ + + + +
+
+
+
🗣️ ПОСЛЕДНИЕ ФРАЗЫ
+
+
YOU SAID:
+
—
+
ASSISTANT SAID:
+
—
+
+
+
+ + +
+
+ 📡 ТЕЛЕМЕТРИЯ & СОБЫТИЯ +
+
+
🔊 MUTED: —
+
🏠 HA: —
+
🎚️ VOL: —
+
+
+
⬤ готов к подключению...
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/wyoming_satellite/satellite.py b/wyoming_satellite/satellite.py index 67c5f7e..a1d852b 100755 --- a/wyoming_satellite/satellite.py +++ b/wyoming_satellite/satellite.py @@ -1149,7 +1149,8 @@ class SatelliteBase: try: if command == "set_volume": # Изменить громкость (0.0 - 1.0) - level = float(data.get("level", 1.0)) + # Поддерживаем оба названия: "level" и "volume" (для обратной совместимости) + level = float(data.get("level") or data.get("volume", 1.0)) level = max(0.0, min(1.0, level)) # Clamp 0-1 self._runtime_volume = level _LOGGER.info(f"Setting volume to {level}")