Commit Graph
64 Commits
Author SHA1 Message Date
sirmrak 3cc8bb8aef refactor: update web-client files - replace old HTML/JS/CSS with new droidAssist implementation
- Remove old: assist.html, index.html, script.js, styles.css, AI robot.lottie
- Add new: droidAssist.html, droidAssist.css, droidAssist.js, animation.lottie
- Restructure web-client files into html/ directory
2026-05-28 13:19:00 +03:00
sirmrak 8a4686c800 feat: интеграция Lottie анимации AI robot в assist.html
- Заменена CSS сфера на dotlottie-player
- Анимация реагирует на состояния (idle/listening/speaking)
- Скорость анимации зависит от RMS уровня микрофона
- Добавлена обработка ошибок загрузки
- Сохранены все WebSocket команды и события
2026-05-25 18:04:37 +03:00
sirmrak a31fb3a112 feat: интеграция Lottie анимации AI robot в assist.html 2026-05-25 18:01:35 +03:00
sirmrak 26d09501fb fix: graceful reconnect для event service при ConnectionResetError 2026-05-25 17:58:37 +03:00
sirmrakandQwen-Coder 2b4e6f824b feat: WebSocket команды — раздельная громкость mic/snd + запись аудио + обновлённый web-client
- satellite.py: разделён _runtime_volume на _runtime_mic_volume и _runtime_snd_volume
- satellite.py: добавлены команды start_recording/stop_recording (WAV через base64)
- satellite.py: метод _create_wav_from_buffer() для создания WAV из буфера
- web-client: добавлен слайдер громкости микрофона (MIC+/MIC-)
- web-client: добавлены кнопки записи и воспроизведения аудио
- web-client: улучшенный лог событий и отладочные console.log
- docs: websocket-server-plan.md сокращён с 1205 до ~80 строк

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-25 17:58:37 +03:00
sirmrak 61294485ad Анимация 2026-05-25 17:57:04 +03:00
sirmrak 03748505cd fix: фильтрация логов WebSocket — показывать только важные команды
Проблема:
- audio-level спамит 10 раз в секунду
- Не видно других команд (volume, mute, etc.)

Решение:
- Фильтровать audio-level в _broadcast_to_websocket
- Фильтровать audio-level в handle_websocket
- Показывать только важные команды

Результат:
✅ Видны команды: set_volume, mute, unmute, play_sound, etc.
✅ Не видны: audio-level (спам)
✅ Чистые логи для отладки
2026-05-21 20:03:23 +03:00
sirmrak addc15eecc fix: отключить спам websockets.server в логах
Проблема: websockets библиотека логирует каждое сообщение:
DEBUG:websockets.server:> TEXT '{"type": "audio-level"...'

Решение: Установить уровень логирования websockets.server в WARNING
logging.getLogger('websockets.server').setLevel(logging.WARNING)

Результат:
- ✅ Пропадут DEBUG сообщения о каждом WebSocket сообщении
- ✅ Останутся только важные ошибки (WARNING/ERROR)
- ✅ Чистые логи для отладки других функций
2026-05-21 20:01:21 +03:00
sirmrak 9bfbcfd8a8 feat: Web Client — улучшенное подключение к WebSocket
Изменения:
1. Поле для ввода WebSocket адреса (вместо prompt)
   - wsUrlInput с значением по умолчанию
   - Сохраняется между перезагрузками

2. Кнопка CONNECT/DISCONNECT
   - Меняет текст и цвет при подключении
   - DISCONNECT красная кнопка
   - Работают обе кнопки (в шапке и в карточке)

3. Auto-connect
   - Чекбокс 'Auto-connect on load'
   - Автоматическое подключение при загрузке
   - Можно отключить

4. updateConnectButton()
   - Обновляет обе кнопки синхронно
   - 🔌 CONNECT / 🔌 DISCONNECT
2026-05-21 19:56:51 +03:00
sirmrak c17743d829 fix: Web Client — правильное масштабирование RMS
Проблема:
- При RMS=0 столбики 30% (слишком много)
- При RMS=0.3 столбики 2% (слишком мало)

Решение:
- Масштаб: RMS 0 → 10%, RMS 0.15 → 100%
- Формула: avg = 10 + (RMS / 0.15) * 90
- Clamp 10-100
- Симуляция тишины: 10 + random*5 (маленькие колебания)

Теперь:
- Тишина (RMS=0) → 10% высоты
- Говор (RMS=0.1) → ~70% высоты
- Крик (RMS=0.15+) → 100% высоты
2026-05-21 19:47:20 +03:00
sirmrak 6b9c7376b9 fix: Web Client — точная копия оригинальной анимации
Реализована точно такая же анимация как была:
- avg = currentRms * 100 (вместо микрофона)
- Сглаживание rmsSmoothed * 0.7 + avg * 0.3
- Симуляция если RMS < 1 (12 + random * 25)
- Усиление при LISTEN/SPEAK (45 + random * 55)
- 42 столбика с синусом
- Случайные колебания 0.5 + random * 0.3
- Увеличение при SPEAK

Теперь 1-в-1 как оригинал, но с данными satellite!
2026-05-21 19:35:31 +03:00
sirmrak e9b6d7bb06 fix: Web Client — вернул оригинальную красивую анимацию canvas
Изменения:
- 42 столбика как в оригинале
- Синусоидальная анимация
- Градиент cyan → blue
- Сглаживание RMS (0.7 old + 0.3 new)
- Случайные колебания для живости

Теперь красиво как было, но с данными satellite RMS!
2026-05-21 19:31:07 +03:00
sirmrak 4a79874807 feat: Web Client — canvas визуализация от satellite RMS
Изменения:
- Удалён локальный микрофон (initMicVisualizer)
- Canvas рисует RMS историю от satellite
- 64 столбика с градиентом (зелёный → красный)
- Меньше логов (только если RMS > 0.05)

Преимущества:
- ✅ Показывает реальную громкость satellite
- ✅ Нет зависимости от микрофона браузера
- ✅ Меньше спама в логах
2026-05-21 19:26:53 +03:00
sirmrak 6913625830 fix: Web Client — null check для RMS meter
Проблема: rmsFill/rmsValue null до загрузки DOM

Решение:
- Проверка if (!rmsFill || !rmsValue) return
- Инициализация после window.load
- Логирование для отладки
2026-05-21 15:54:31 +03:00
sirmrak 023e283d3f feat: Web Client — RMS meter визуализация
Добавлено:
- RMS bar с градиентом (зелёный → жёлтый → красный)
- Цифровое значение RMS (0.00 - 1.00)
- CSS стили для .rms-bar и .rms-fill
- Размещение под audio canvas

Визуализация:
[████████░░] 0.42
2026-05-21 15:52:04 +03:00
sirmrak fafc39511b fix: Web Client — добавлена функция updateRmsMeter
Проблема: updateRmsMeter is not defined

Решение:
- Добавлена функция updateRmsMeter(level)
- Добавлены DOM элементы rmsFill, rmsValue
- Добавлена переменная rmsTimeout

Теперь audio-level события обрабатываются корректно
2026-05-21 15:47:09 +03:00
sirmrak 40382afac5 fix: _send_audio_level — правильное создание Event
Проблема: Event(...).event() не существует

Решение: Event(type=..., data=...) напрямую
2026-05-21 15:19:06 +03:00
sirmrak 3d9ebfbb0a fix: trigger_event — правильное создание Wyoming Event
Проблема: WyomingEvent(event_type, data).event() не работает

Решение: Использовать Event(type=..., data=...) напрямую
2026-05-21 14:55:27 +03:00
sirmrak f9a3731a98 fix: Web Client — Vol+/- и кнопка RMS
Исправления:
- ✅ Vol+/Vol- теперь обновляют currentVolume (работают многократно)
- ✅ Добавлена кнопка REQUEST RMS для запроса обновления audio-level

Изменения:
- currentVolume = newVol в обработчиках VOL+ и VOL-
- requestRmsBtn отправляет trigger_event для запроса RMS
2026-05-21 14:52:54 +03:00
sirmrak 168ec73b7c fix: Unicode syntax error в start_server.py
Проблема: bytes literal с Unicode символами (🔐, ╔, ║ и т.д.)

Решение:
- HTML response через .encode('utf-8') вместо bytes literal
- ASCII box drawing вместо Unicode символов
- Убраны emoji из print statements

Тест:
  python3 -m py_compile web-client/start_server.py
2026-05-21 14:09:54 +03:00
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
sirmrak ed6ecc548b fix: start_server.py — исправлено завершение по Ctrl+C
Проблемы:
- signal_handler блокировал shutdown()
- Порт не освобождался после Ctrl+C
- Невозможно было перезапустить сервер

Решения:
- Убран signal_handler — используется KeyboardInterrupt
- shutdown() вызывается в отдельном потоке (avoid deadlock)
- with контекст для автоматического закрытия
- allow_reuse_address = True для быстрого рестарта
- Обработка OSError при занятом порте
2026-05-21 13:19:59 +03:00
sirmrak 0776d839b9 feat: web-client — синхронизация команд с satellite
Изменения:
- Перенесён start_server.py в web-client/
- Обновлены команды в client.html для соответствия satellite
- handle_websocket_command поддерживает:
  - set_volume (level/volume)
  - mute/unmute
  - play_sound
  - set_led_brightness
  - trigger_event
- Обновлён обработчик входящих событий:
  - voice-started/voice-stopped
  - transcript
  - synthesize
  - audio-start/audio-stop/played
  - timer-started/timer-finished
  - streaming-started/streaming-stopped
  - satellite-connected/satellite-disconnected
  - error
  - audio-level (RMS)

Теперь client.html полностью соответствует API satellite
2026-05-21 13:14:22 +03:00
sirmrak c7bf061611 feat: Web Client разработка — план и документация
Исправления:
- fix: баг volume/level — поддерживаются оба названия параметра
- docs: добавлен раздел Web Client в websocket-server-plan.md
- docs: создан web-client/README.md с полной документацией

Функции Web клиента:
- ✅ set_volume (громкость) — работает
- ✅ mute/unmute — работает
- ⏳ audio-level RMS — требует тестирования
- ⏳ LED управление — требует тестирования
- ⏳ Transcript — требует тестирования

Этапы разработки:
- WC-1: Базовая интеграция ✅
- WC-2: Визуализация (в процессе)
- WC-3: Дополнительные функции
- WC-4: UI/UX
2026-05-21 13:02:35 +03:00
sirmrak 4e5b961f7b fix: исправить зависание при Ctrl+C
- signal_handler вызывает shutdown() который блокируется
- Убран sys.exit(0) из signal handler
- serve_forever() завершается через KeyboardInterrupt
- finally закрывает сокет корректно
2026-05-20 22:59:19 +03:00
sirmrak 9d8e78fe2a fix: исправить баги web сервера
- IndexError в log_message — убран неправильный формат
- Ctrl+C не работал — добавлен signal_handler
- Порт не освобождался — добавлен server_close()
- allow_reuse_address=True — для быстрого рестарта
- Добавлен remote URL в баннер
2026-05-20 22:46:53 +03:00
sirmrak d8ab4736de feat: модернизировать WebSocket клиент с UI управлением
Новые возможности client.html:
- 🔊 Управление громкостью (слайдер 0-100%)
- 🔇/🔊 Кнопки Mute/Unmute
- 🔔 Тест звука (play_sound команда)
- 💡 LED управление (цвет, яркость)
- 📊 RMS Audio Level визуализация (реальное время)
- 🎨 Современный UI (карточки, градиенты, анимации)
- 📱 Адаптивный дизайн

start_web_server.py:
- Простой HTTP сервер для тестирования
- Авто-определение WebSocket URL
- Красивый вывод в консоль

Запуск:
  cd examples/websocket-service
  ./start_web_server.py --port 8080

Открыть: http://localhost:8080/client.html
2026-05-20 22:23:34 +03:00
sirmrak b794f4cafb docs: обновить статус плана — готово к тестированию
- Статус: В разработке → 🔄 Тестирование
- Добавлено: WebSocket события работают (synthesize, audio-start/stop, played)
- Добавлено: TEST сервисы созданы
- Добавлено: Критический баг исправлен (detach_kernel_driver)
- Требуется тестирование: Audio level monitoring, WebSocket команды
2026-05-20 22:13:45 +03:00
sirmrak 27703a2f93 fix: убрать detach_kernel_driver() — это отключает audio интерфейсы
Проблема: detach_kernel_driver(0) отключал ядро от интерфейса 0,
который является частью audio function (интерфейсы 0-2).
После этого audio драйвер не мог восстановить устройство.

Решение: Убрать detach_kernel_driver() вообще.
Control transfer с CTRL_TYPE_VENDOR работает без claim interface.
Так работает xvf_host.py — там тоже нет detach_kernel_driver().

Исправленные файлы:
- wyoming_satellite/xvf_usb.py (уже было исправлено)
- examples/example_led.py
2026-05-20 20:43:01 +03:00
sirmrak b1f7185a4f refactor: вернуть управление яркостью без масштабирования цветов
DoA эффект:
- base_color: 0x303030 (серый, без масштабирования)
- doa_color: 0xD4BC00 (бирюзовый, без масштабирования)
- brightness: управляется отдельно через set_led_brightness()

Это как в оригинале до изменений яркости.
2026-05-20 20:20:36 +03:00
sirmrak 99fa55e15e fix: добавить задержку 500ms после подключения USB устройства
Проблема: устройство может быть не готово к командам сразу после
подключения, что вызывает USB reset.

Решение: time.sleep(0.5) после нахождения устройства.
2026-05-20 20:19:44 +03:00
sirmrak 5a5cac90b1 fix: НЕ делать detach_kernel_driver() — это отключает audio интерфейсы!
Проблема: detach_kernel_driver(0) отключает ядро от интерфейса 0,
который является частью audio function (интерфейсы 0-2).

Решение: Убрать detach_kernel_driver() вообще.
Control transfer с CTRL_TYPE_VENDOR работает без claim interface
и не требует отключения ядра.

Это как в xvf_host.py — там тоже нет detach_kernel_driver().
2026-05-20 20:16:41 +03:00
sirmrak ba006c506b fix: добавить set_led_brightness() для DoA эффекта
Проблема: после перехода на set_led_doa_color() яркость
не устанавливалась отдельно, поэтому LED не работали.

Решение:
- led_controller.set_led_brightness(brightness) после set_led_doa_color()

Восстановлено поведение как в оригинале:
LED_EFFECT [4] → LED_DOA_COLOR → LED_BRIGHTNESS
2026-05-20 20:09:56 +03:00
sirmrak 12d5d14d40 fix: install_test_services.sh — использовать .venv из satellite-dev (не production .venv_satellite)
Изменён порядок поиска venv:
1. ${SCRIPT_DIR}/.venv (satellite-dev)
2. ${SCRIPT_DIR}/.venv_satellite
3. ${HOME_DIR}/projects/.venv_satellite (production)
4. ${HOME_DIR}/.venv_satellite (production)

Теперь test сервисы используют правильное окружение.
2026-05-20 18:11:59 +03:00
sirmrak d9868a0c5b fix: websockets 16.0 API — убрать аргумент 'path' из handle_websocket()
В websockets 16.0 изменилась сигнатура handler:
- Было: async def handler(websocket, path)
- Стало: async def handler(websocket)

Fix для satellite.py:
- handle_websocket(websocket) без path
- Добавлен комментарий про websockets 16.0+
2026-05-20 18:10:33 +03:00
sirmrak b394a2fe74 fix: использовать порт 10702 для test satellite (10701 занят старым wyoming-led)
- services/test/wyoming-satelite-vosk-test.service: порт 10702
- services/test/start_test.sh: порт 10702
- install_test_services.sh: обновлена документация
- docs/deployment/systemd-services.md: обновлена таблица портов

Порты:
- 10700: production satellite
- 10701: старый wyoming-led (production)
- 10702: test satellite (новый)
2026-05-20 18:01:08 +03:00
sirmrak b27d633f06 refactor: упростить test сервисы — только satellite (wake word и event production)
- services/test/*.service — удалены wake word и event test сервисы
- services/test/wyoming-satelite-vosk-test.service — использует production порты
- install_test_services.sh — обновлён для одного сервиса
- services/test/start_test.sh — запуск только satellite
- docs/deployment/systemd-services.md — обновлена документация

Test satellite использует:
- Production wake word (:10400)
- Production event (:10500)
- Те же порты что и production (:10700)
- WebSocket :8675 + Audio Level (новые функции)
2026-05-20 17:50:16 +03:00
sirmrakandQwen-Coder e5914b23b3 feat: добавить TEST сервисы для разработки
- services/test/*.service — 3 test сервиса (порты +1)
- install_test_services.sh — установка test сервисов
- services/test/start_test.sh — быстрый запуск в tmux
- docs/deployment/systemd-services.md — документация

TEST сервисы:
- wyoming-satelite-vosk-test.service :10701 + WebSocket :8675
- wyoming-wakeword-vosk-test.service :10401
- wyoming-event-test.service :10501

Использование:
1. sudo ./install_test_services.sh — установка
2. sudo systemctl start wyoming-*-test.service — запуск
3. ./services/test/start_test.sh — запуск в tmux

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 17:29:36 +03:00
sirmrak 26932097a5 docs: обновить план — Этап WS-6 Audio level выполнен 2026-05-20 17:18:38 +03:00
sirmrak b28052e93e feat: добавить Audio Level monitoring — RMS громкости микрофона в WebSocket
- settings.py: audio_level_enabled, audio_level_interval_ms
- satellite.py: _calculate_rms() — вычисление RMS (0.0-1.0)
- satellite.py: _send_audio_level() — фоновая задача отправки
- satellite.py: _last_mic_level, _audio_level_task атрибуты
- satellite.py: интеграция в _start() / _stop()
- satellite.py: вычисление RMS в event_from_mic() для всех классов
- __main__.py: CLI --audio-level-enabled, --audio-level-interval-ms

Событие в WebSocket (10 раз в секунду):
{type: audio-level, data: {level: 0.42}}
2026-05-20 17:17:18 +03:00
sirmrakandQwen-Coder 5c92eed55b docs: обновить чеклист в плане — этапы WS-1, WS-2, WS-2A, WS-3 выполнены
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 16:57:37 +03:00
sirmrakandQwen-Coder 6398dc6a41 feat: добавить WebSocket сервер для приёма событий и команд
- settings.py: websocket_enabled, websocket_host, websocket_port
- satellite.py: WebSocket сервер + runtime атрибуты (_runtime_volume, _runtime_led_brightness)
- satellite.py: handle_websocket_command() для обработки команд
- satellite.py: _broadcast_to_websocket() для рассылки событий
- satellite.py: интеграция в _start() / _stop()
- __main__.py: CLI аргументы --websocket-enabled/host/port

Поддерживаемые команды:
- set_volume: изменить громкость
- mute/unmute: микрофон
- play_sound: воспроизвести WAV
- set_led_brightness: яркость LED
- trigger_event: отправить событие в HA

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 16:51:27 +03:00
sirmrakandQwen-Coder b1c6ef3385 docs: добавлен протокол WebSocket команд (set_volume, mute, play_sound, etc.)
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 16:04:33 +03:00
sirmrakandQwen-Coder 6e06120b55 docs: переименовать план в websocket-server-plan.md
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 15:58:42 +03:00
sirmrakandQwen-Coder 5d59246902 docs: полный пересмотр плана - WebSocket вместо event server
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 15:56:26 +03:00
sirmrakandQwen-Coder f62b0163d0 docs: обновить план multi-event-server с чеклистом выполнения
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 15:33:37 +03:00
sirmrakandQwen-Coder 235fcbece7 feat: добавить setup_dev.sh для быстрой настройки окружения
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 14:59:45 +03:00
sirmrakandQwen-Coder c027567725 refactor: использовать .venv/ в корне проекта для Python окружения
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 14:24:50 +03:00
sirmrakandQwen-Coder 0f66ba1b54 chore: удалить Docker файлы (Dockerfile, docker-compose.yml, .dockerignore, скрипты)
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 14:17:43 +03:00
sirmrakandQwen-Coder c259a8c512 chore: удалить лишние файлы из корня проекта (test.wav, start.sh, start-dev.sh, .projectile)
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-05-20 14:12:38 +03:00