Files
sirmrak fc816ed7b3 feat: Web UI пароль — HTTP Basic Auth защита
Изменения:
- Отменены 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 защищён паролем
- ✅ Достаточно для локальной сети
2026-05-21 13:50:01 +03:00

188 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🛰️ 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)