Перейти к содержимому

Веб-интерфейс

Веб-интерфейс доступен через прямой browser-порт, задаваемый WEB_PORT (по умолчанию 8080 в standalone-режиме), и через HA Ingress для аддона Home Assistant. В addon-режиме ingress-порт назначается динамически Home Assistant Supervisor (в манифесте аддона стоит ingress_port: 0), поэтому WEB_PORT, заданный внутри аддона, игнорируется — UI открывается через сайдбар Home Assistant. Страница обновляется в реальном времени через Server-Sent Events, поэтому ручное обновление почти никогда не нужно.

Страница входа с вкладками Home Assistant, Music Assistant и Password

При включённой аутентификации мост сначала показывает отдельную страницу входа.

МетодКогда появляетсяЧто важно
Home AssistantВсегда в режиме аддона, а в standalone — когда bridge подключён к HA-backed экземпляру Music AssistantИспользует HA login_flow, включая TOTP / MFA
Music AssistantВ standalone-режиме, если bridge уже подключён к MA через встроенный token-flowПроверяет MA credentials на подключённом MA сервере
PasswordВключена standalone-auth и уже существует локальный password hashЛокальный поток PBKDF2-SHA256

Если Home Assistant требует MFA, страница переключается на отдельный шаг с 6-значным кодом. В standalone-режиме параметры сессии и защиты от перебора задаются в Configuration → Security. Login-формы защищены CSRF, а standalone-сессии используют cookie с SameSite=Lax и HttpOnly.

Панель с фильтрами, групповыми действиями, карточками устройств и обновлённой конфигурацией

Верхняя часть страницы объединяет live-dashboard и быстрые действия:

  • Карточки устройств или строки списка для всех настроенных колонок.
  • Состояние в реальном времени для Bluetooth, sink routing, воспроизведения, Music Assistant и синхронизации.
  • Сворачиваемые разделы Configuration, Diagnostics и Logs под live-fleet view.

Шапка с бейджем версии, обновления, быстрыми ссылками, runtime chip и health pills

Шапка состоит из основной строки действий и строки runtime/status.

  • Название и логотип моста.
  • Бейдж версии — ссылка на соответствующий релиз GitHub.
  • Бейдж обновления — показывает check, up to date или целевую версию вроде v2.31.8.
  • Report / Docs / GitHub — быстрые ссылки.
  • Переключатель темы — циклически переключает Auto → Light → Dark; выбор сохраняется в браузере.
  • Область пользователя — текущий пользователь и Sign out, если включена аутентификация.
  • Runtime chip вроде LXC или systemd.
  • Hostname, IP и uptime.
  • Health pills с краткой сводкой по Bluetooth, MA и активному воспроизведению.
  • Переключатель чеклиста, который явно показывает или скрывает onboarding checklist. Health/status pills при этом остаются пассивными индикаторами, а не disclosure-кнопками.
  • Баннер прогресса перезапуска во время Save & Restart.

Onboarding checklist с явным show-hide control, progress summary и guided actions

Шапка и notice stack теперь работают как единая operator-facing поверхность, а не как просто статусная панель.

  • Onboarding checklist проводит через Bluetooth access, audio backend, добавление speakers, MA auth и latency tuning.
  • Show checklist / Hide checklist — отдельный disclosure control. Если скрыть checklist, bridge оставляет компактную summary-card вместо полного исчезновения guidance.
  • Recovery guidance показывает issue groups вроде disconnected speakers, missing sinks или released devices и предлагает прямые действия: reconnect, re-pair, reclaim или переход в нужную конфигурационную вкладку.
  • Deep links из guidance используют те же точки входа, что empty states и dashboard quick actions, поэтому рекомендованные действия сразу открывают правильную строку/вкладку.

Если все настроенные колонки сейчас находятся в состоянии release, onboarding/recovery stack может показать действия Reclaim, чтобы быстро вернуть управление bridge без ручной правки конфига.

Recovery guidance banner с actionable operator recommendations

Фильтры, групповые действия и режимы просмотра

Заголовок раздела «Фильтры, групповые действия и режимы просмотра»

Toolbar с фильтрами, счётчиком выбора, групповым volume и переключателем режимов

Панель над списком устройств включает:

  • Фильтр по группе Music Assistant.
  • Фильтр по адаптеру.
  • Фильтр по статусу — playing, idle, standby, reconnecting, released, error.
  • Групповые действия — для выбранных устройств доступны volume, mute и pause.
  • Bulk actions dropdown — действия применяются ко всему fleet, независимо от выделения: Reconnect all, Power save all (suspend PulseAudio sink), Standby all (отключить Bluetooth) и Release all (вернуть все колонки хосту, не удаляя их из сохранённого fleet).
  • Переключатель режима сетки/списка.

Новый интерфейс сам выбирает лучший режим по количеству устройств:

  • До 6 устройств → по умолчанию режим сетки.
  • Больше 6 устройств → по умолчанию режим списка.
  • Ручной выбор запоминается в браузере и применяется при следующем открытии.

В режиме списка можно разворачивать строки для transport controls, routing details и device actions. Одновременно развёрнута только одна строка.

Устройства автоматически сортируются по активности: воспроизводящие колонки идут первыми, затем подключённые в idle, затем отключённые или в standby. Внутри каждого уровня участники sync-группы остаются вместе.

Карточка устройства во время воспроизведения с бейджами, треком, прогрессом и transport controls

В режимах сетки и списка устройство показывает один и тот же core-набор данных:

  • Имя плеера и анимацию воспроизведения.

  • Status badge — текущее состояние устройства: Playing, Connecting, Stale stream, No sink, Standby, Disconnected, Stopping, Waking, Sink muted, Applying или Buffering.

  • Трек, исполнитель, прогресс и обложка при наличии. Прогресс-бар управляется напрямую таймлайном демона sendspin (старая ветка fallback через Music Assistant удалена в v2.64). Клик по обложке увеличивает её.

  • Громкость и mute.

  • Sync badgeSync (зелёный) или Re-anchoring (амбер, пульсирует) с текущим дрейфом в миллисекундах и счётчиком re-anchor.

  • Adapter chip — иконка Bluetooth и friendly name адаптера. Чип окрашен по состоянию (success / warning / error / neutral); клик открывает соответствующую строку в Configuration → Bluetooth.

  • Music Assistant chip — иконка MA, с тегом API, когда bridge общается с MA REST/WebSocket API.

  • Battery chip — иконка и процент, если доступны. Тиеры: зелёный (>25 %), амбер (16–25 %), красный (≤15 %); значение читается из org.bluez.Battery1.

  • RSSI chip — индикатор уровня сигнала (4 столбика) и live-значение Δ dB, обновляется раз в 5 с. Это смещение от Golden Receive Power Range (BR/EDR), поэтому 0 — идеал, а всё более отрицательные значения означают деградацию связи. Чип становится серым, если за последние 30 с не пришло свежей выборки. RSSI включён по умолчанию; выключить — в Configuration → Bluetooth → Show live signal-strength badges.

    Строка устройства с тегом API и live RSSI-чипом, показывающим -4 Δ dB

  • Group chip — имя sync-группы Music Assistant. Безымянные группы получают короткий #suffix (последние символы UUID), чтобы несколько безымянных групп всё равно различались. Декорация +N появляется, когда в группе есть внешние (не bridge) участники. Клик открывает страницу настроек группы в MA web UI.

  • Room chip — появляется, если у устройства задано room_name / room_id; синяя расцветка означает, что значение автоматически получено из Home Assistant area.

  • Transfer-readiness chip — появляется во время room handoff и показывает, готова ли следующая колонка к приёму.

  • Бейдж Released / Auto-released — overlay над иконкой колонки, когда устройство сейчас вне управления bridge.

  • Бейдж Standby💤 Standby (Xm) с количеством минут, когда устройство запарковано.

Карточка устройства при наведении с routing details и быстрыми действиями

При наведении появляются дополнительные действия:

  • Reconnect и Re-pair.
  • Release / Reclaim для временной передачи колонки другому источнику.
  • Claim — появляется для AVRCP-multipoint колонок, которые сейчас управляются другим источником (например, телефоном). Нажатие говорит bridge перехватить роль AVRCP.
  • Standby / Wake для энергосберегающего отключения Bluetooth; колонка остаётся в fleet, но соединение ставится на паузу до пробуждения. Wake показывается только когда устройство в standby.
  • Disable — действие danger-стиля, исключающее устройство из активного fleet без удаления сохранённой конфигурации.
  • BT Info modal — данные для копирования. Модалка теперь рендерит полный вывод bluetoothctl info <MAC>, включая список advertised service UUIDs.
  • Шестерёнка settings, которая переводит прямо в соответствующую строку Configuration → Devices.

Если контрол отключён, на карточке появляются до двух blocked-action hints со ссылками Why disabled? — сразу видно, почему конкретная кнопка сейчас не нажимается.

Бейдж группы Music Assistant тоже кликабелен — он открывает настройки этой sync group в MA.

Release здесь намеренно временный: bridge перестаёт активно перехватывать колонку, чтобы ею мог воспользоваться телефон или ПК. Disable исключает устройство из bridge startup, а Unpair меняет Bluetooth trust state на уровне хоста.

Bridge регистрирует per-device MPRIS-плеер на системной D-Bus и отдаёт его BlueZ через Media1.RegisterPlayer. Получается двусторонняя связь между физическими кнопками колонки и Music Assistant:

  • Колонка → bridge → MA — нажатие Play / Pause / Next / Previous или поворот ручки громкости отправляется как AVRCP keypress и преобразуется в соответствующую команду очереди Music Assistant для sync-группы устройства.
  • MA → bridge → колонка — когда MA сообщает о смене трека, паузе или изменении громкости, bridge возвращает новый playback state, метаданные title/artist и громкость через MPRIS, чтобы экран и индикаторы колонки отражали реально играющее.

Если на одном Bluetooth-адаптере подключено больше одной колонки, bridge использует HCI source monitor, чтобы определить, какая именно колонка сгенерировала AVRCP-нажатие — нажатие Next на колонке A не переключит трек, играющий на колонке B. Для multi-speaker correlation требуется capability CAP_NET_RAW внутри контейнера; без неё bridge fallback’ом маршрутизирует все нажатия на последнюю активную колонку этого адаптера.

Отдельного UI-переключателя для MPRIS нет — он всегда включён для подключённых колонок, заявляющих поддержку AVRCP target.

Общий вид раздела Configuration с карточками и footer actions

Обновлённый раздел Configuration теперь разбит на шесть вкладок:

ВкладкаДля чего нужна
GeneralИмя bridge, timezone, прямой web-порт, base listener port, smooth restart, update policy, видимость guidance и переключатель advanced compatibility tools
AudioPulseAudio latency, предпочтения кодеков, управление PA rescue-streams
DevicesТаблица колонок и сценарии discovery/import
BluetoothАдаптеры, управление paired devices, scan modal, reconnect policy
Music AssistantConnection status, token flows, monitor и routing toggles
SecurityLocal auth, session timeout, brute-force settings

Поведение кнопок внизу различается специально:

  • Save сохраняет конфиг без принудительного перезапуска.
  • Save & Restart сразу применяет restart-sensitive изменения и показывает прогресс в шапке.
  • Cancel возвращает последние сохранённые значения формы.
  • Download экспортирует share-safe config.json без чувствительных значений.
  • Upload импортирует config-файл, сохраняя текущие password hash, secret key и MA token на сервере.

Несохранённые изменения включают Cancel, помечают раздел как dirty и вызывают browser warning при попытке уйти со страницы.

Помимо основных полей на вкладке General есть переключатель Advanced compatibility tools. Эта UI-only настройка хранится в браузере и открывает узконаправленные recovery- и pairing-обходы. Стабильные функции — имена адаптеров из HA areas, room labels, RSSI, временное отключение соседних колонок и микрофонная калибровка — видны без него.

Для compatibility-настроек UI показывает необходимость рестарта и поддержку текущей платформой. Недоступный PulseAudio- или adapter-recovery-механизм блокируется с конкретной причиной.

Вкладка Audio объединяет настройки задержки и кодеков, влияющие на все колонки:

  • PulseAudio latency (по умолчанию 600 мс, диапазон 50–2000 мс) — задаёт буфер между bridge и PulseAudio/PipeWire backend.
  • Prefer SBC codec — выбирает менее ресурсоёмкий Bluetooth-кодек; полезно на Raspberry Pi и аналогичных платах.
  • Disable PA rescue-streams — предотвращает перемещение аудио на неправильный sink модулем module-rescue-streams PulseAudio после переподключения Bluetooth.

Вкладка Devices с основной таблицей speaker fleet и карточкой Discovery and import

Devices разделяет повседневное управление и discovery:

  • Device fleet — основная таблица с enabled, именем, MAC, адаптером, портом, компактной live-панелью delay и live badge.
  • В деталях строки доступны preferred format, listen_host, keepalive_interval, а также необязательные room name / room ID. Они могут быть получены из HA area или заданы как локальные метки и сами по себе не включают room-handoff Music Assistant.

Если listen_port не задан, runtime использует BASE_LISTEN_PORT + индекс устройства. Положительные значения keepalive_interval включают keepalive-тишину, всё меньше 30 секунд поднимается до 30, а отдельного current-web-UI-переключателя для старого флага keepalive_silence больше нет. Клик по шестерёнке устройства на dashboard прокручивает страницу сюда, подсвечивает нужную строку и ставит фокус на соответствующее поле.

Вкладка Bluetooth с inventory адаптеров, reconnect policy и codec preference

Bluetooth отвечает за управление адаптерами:

  • Friendly names для адаптеров.
  • Ручные adapter rows, если автоопределения недостаточно.
  • Refresh inventory.
  • Кнопка ↻ Reboot — перезагрузка одного адаптера (off → 3 с пауза → on) без перезапуска bridge.
  • Paired devices — inventory, import и repair/reset действия. Каждая строка имеет кнопку ℹ️ Info, открывающую BT device info modal с данными для копирования.
  • Show live signal-strength badges (RSSI_BADGE) — управляет тем, показывают ли карточки устройств live RSSI chip, описанный выше. По умолчанию включено.
  • Настройки BT check interval, auto-disable threshold и пороги rapid-reconnect churn-isolation (BT_CHURN_THRESHOLD, BT_CHURN_WINDOW), используемые для авто-отключения устройства, застрявшего в reconnect-loop.
  • Карточка Advanced recovery workarounds (видна только при включённом Advanced compatibility tools) — таблица ниже.

Глубокие ссылки из dashboard и empty state теперь попадают сразу в эту вкладку и подсвечивают нужную строку адаптера.

Scan modal улучшает first-run discovery и troubleshooting:

  • выбор конкретного адаптера для сканирования (первый обнаруженный уже выбран);
  • Audio devices only оставьте включённым в обычном режиме, отключите при отладке non-audio кандидатов;
  • live countdown / прогресс-бар на время сканирования;
  • основная кнопка Pair and Add для типового случая или Add to fleet через выпадающий список, когда колонка уже сопряжена с хостом;
  • Rescan после кулдауна без выхода из модалки.

Список Already paired devices — более быстрый путь, когда хост уже знает колонку и нужно только импортировать или починить запись.

Каждая строка результата сканирования несёт собственные context chips: тег Audio device / Other, адаптер, который видел устройство, RSSI chip и предупреждение ⚠ Another bridge, когда устройство выглядит уже управляемым другим bridge.

Результаты сканирования со split-кнопкой Pair and Add на найденной audio-колонке

Видны только при включённом Advanced compatibility tools:

ПереключательЧто делает
EXPERIMENTAL_A2DP_SINK_RECOVERY_DANCEДобавляет profile-disconnect / reconnect dance, если BlueZ пропустил A2DP sink при connect. Обход dual-role регрессии BlueZ 5.86 (bluez/bluez#1922).
EXPERIMENTAL_PA_MODULE_RELOADПерезагружает PulseAudio-модуль module-bluez5-discover, если BT-карта не появилась. На PipeWire недоступен и затрагивает все Bluetooth-устройства classic PulseAudio.
EXPERIMENTAL_ADAPTER_AUTO_RECOVERYНа пороге reconnect failures проверяет rfkill, выполняет MGMT/HCI power-cycle и при неудаче может сбросить USB-адаптер. Нужны Linux capabilities NET_ADMIN + NET_RAW; для USB reset нужен writable-доступ к USB devices. UI показывает доступный уровень.

Три экспериментальных recovery-переключателя в Bluetooth tab, каждый помечен EXPERIMENTAL chip

В модалке Scan nearby также есть настройки конкретной попытки сопряжения:

ПереключательЧто делает
Temporarily disconnect other speakers (peer-quiesce)Стабильная pairing-помощь: отключает соседние колонки на выбранном адаптере; после попытки их восстанавливает обычный reconnect-механизм.
NoInputNoOutput pair agentОдноразовый Just-Works для колонок без SSP confirmation. Убирает authenticated numeric comparison, скрыт за compatibility toggle, сбрасывается после запроса, а BlueZ-агент отклоняет обращения от любого MAC кроме выбранного.
Authorize HFP/HSP for this pairОдноразовая авторизация сервисов для multi-profile устройств, отказывающихся завершать pairing. Воспроизведение остаётся A2DP-only; HFP backend эта опция не устанавливает.

Модалка Scan nearby с видимыми экспериментальными тогглами peer-quiesce и NoInputNoOutput pair-agent

Вкладка Music Assistant со статусом соединения, token flows и bridge integration toggles

Music Assistant объединяет статус подключения и инструменты авторизации:

  • Карточка Connection status.
  • Действие Reconfigure прямо в карточке статуса соединения. Используйте его, когда нужно сменить MA server, обновить токен или осознанно вернуть auth-flow после первичной настройки.
  • Discover находит или подтверждает URL MA.
  • Get token входит через MA credentials, сохраняет long-lived MA_API_TOKEN и не сохраняет пароль.
  • Если прямой MA login получает auth-ошибку на HA-backed экземпляре MA, UI может продолжить через Home Assistant OAuth / MFA.
  • Get token automatically показывается только в addon/Ingress-flow, где silent bootstrap токена Home Assistant действительно возможен. Под HA Ingress сначала пробуется silent auth через browser HA token, а при неудаче используется popup-flow.
  • Ручное поле MA API token.
  • Переключатели WebSocket monitor, Route volume through MA, Route mute through MA.

Если guidance-banner или onboarding action отправляет вас исправлять MA auth, эта вкладка открывается сразу в режиме reconfigure, чтобы auth-секция была видна без лишних кликов.

Empty state без настроенных Bluetooth-устройств с кнопкой Scan for devices

Empty-state действия были приведены в соответствие с новым layout:

  • No Bluetooth devices configuredScan for devices открывает Scan modal, выбирает конкретный адаптер и подсвечивает Start Scan, но не запускает радиообмен без подтверждения пользователя.
  • No Bluetooth adapter detectedAdd adapter открывает Configuration → Bluetooth, добавляет пустую строку адаптера и ставит фокус в первое поле.

В standalone-режиме есть отдельная вкладка Security:

  • Enable web UI authentication.
  • Session timeout в часах.
  • Brute-force protection и связанные лимиты.
  • Set password с подтверждением пароля.

Когда auth отключён, интерфейс показывает жёлтый warning-banner со ссылкой прямо в Configuration → Security.

В режиме HA addon доступ всегда контролирует сам Home Assistant, поэтому локальная вкладка безопасности скрыта и auth всегда включена. После изменений auth, session или портов используйте Save & Restart, потому что эти параметры применяются на старте.

Раздел Diagnostics с health summary, routing, bridge devices и advanced runtime данными

Diagnostics — это живой troubleshooting surface, а не просто статический dump. Он показывает:

  • summary по bridge devices и sink routing,
  • состояние Music Assistant и sync groups,
  • адаптеры и активные sinks,
  • runtime-состояние каждого устройства,
  • subprocess и platform details,
  • действия Download diagnostics, Submit bug report и Refresh.

Раздел Logs с фильтрами, runtime log-level controls и downloadable output

В Logs доступны и просмотр, и runtime-управление:

  • фильтр All / Errors / Warnings / Info+ / Debug,
  • Auto-refresh,
  • переключение backend log level между INFO и DEBUG без перезапуска,
  • скачивание текущего лога.

Модалка обновления с текущей версией, целевой версией, release notes и действиями

Клик по update badge открывает модалку, где видны:

  • текущая и целевая версия,
  • короткий фрагмент release notes,
  • runtime-specific действия вроде Update Now, Release Notes или manual update hint.

Ссылка Report в шапке и действие в Diagnostics открывают flow bug-report, который добавляет diagnostics и помогает подготовить GitHub issue.

Теперь bug-report dialog также заранее заполняет редактируемое suggested description на основе замаскированной диагностики. В нём кратко собираются recent issue-worthy logs, состояние Bluetooth/устройств, здоровье daemon/subprocess и статус Music Assistant, чтобы issue не начинался с пустого поля.

Bug report dialog с diagnostics-driven suggested description и auto-attached preview