Изменения: - Отменены WebSocket security настройки (websocket_allowed_ips, websocket_token) - Добавлена HTTP Basic Auth в start_server.py - Пароль по умолчанию: admin - Опция --password для установки своего пароля - Обновлён README с документацией Использование: python3 start_server.py --port 8080 --password mypassword Безопасность: - ✅ WebSocket только локально (127.0.0.1) - ✅ Web UI защищён паролем - ✅ Достаточно для локальной сети
188 lines
5.3 KiB
Markdown
188 lines
5.3 KiB
Markdown
# 🛰️ 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
|
||
|
||
# С паролем по умолчанию (admin)
|
||
python3 start_server.py --port 8080
|
||
|
||
# Или со своим паролем
|
||
python3 start_server.py --port 8080 --password mysecretpassword
|
||
```
|
||
|
||
### 3. Открыть в браузере
|
||
|
||
```
|
||
http://localhost:8080/client.html
|
||
или
|
||
http://192.168.200.111:8080/client.html
|
||
```
|
||
|
||
**🔐 Ввести пароль** (по умолчанию: `admin`)
|
||
|
||
---
|
||
|
||
## 📋 Функции
|
||
|
||
| Функция | Статус | Описание |
|
||
|---------|--------|----------|
|
||
| 🔊 Громкость | ✅ | Установка громкости 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)
|