Терминальный TUI-менеджер Bluetooth для Linux. Работает поверх BlueZ через системный D-Bus, без sudo.
┌─ Адаптер: hci0 ⏻ ON ⌕ Скан OFF ◉ Видимость OFF ─┐
│ │
│ ● Подключено (1) │
│ ● 🎧 Sony WH-1000XM4 AC:80:0A:… bat 80%│
│ │
│ ★ Сопряжено (2) │
│ ○ 📺 Smart TV (Зал) 9C:8E:CD:… ★ │
│ ○ ⌨ Keychron K3 DC:2C:26:… │
│ │
│ ⌕ Поблизости (3) │
│ · ♪ JBL Flip 5 ▂▄▆█ -54dBm │
│ · ☏ Pixel 7 ▂▄ -78dBm │
└─────────────────────────────────────────────────────────┘
Подключ./Отключ. Сопрячь Забыть Инфо Медиа Пульт ТВ
- Список устройств с группировкой по статусу (подключено / сопряжено / поблизости), уровнем сигнала (RSSI) и зарядом батареи
- Управление адаптером: питание, видимость, запуск / остановка сканирования
- Сопряжение и подключение с диалогами PIN / passkey / подтверждения paskey (агент
org.bluez.Agent1сKeyboardDisplay) - AVRCP-плеер для подключённых аудиоустройств: play / pause / stop / next / prev / volume±
- Авто-роутинг звука на BT-наушники/колонки через
pactl(работает и на PulseAudio, и на PipeWire) - Bluetooth HID-пульт для Smart TV — приложение регистрирует Profile1 с HID-дескриптором (Consumer Control + Keyboard), открывает L2CAP Control + Interrupt и шлёт HID-репорты. Проверено на TCL Android TV; должно работать на Samsung/LG/Sony, поддерживающих BT HID.
- Без sudo — все операции идут через системный D-Bus, права даёт PolicyKit
| Клавиша | Действие |
|---|---|
↑ / ↓ или j / k |
Перемещение по списку |
Enter |
Подключить / отключить выделенное устройство |
p |
Сопрячь |
f |
Забыть (удалить сопряжение) |
i |
Информация об устройстве |
m |
AVRCP-медиаконтрол |
r |
Открыть экран Bluetooth-пульта (для ТВ) |
s |
Включить / выключить сканирование |
o |
Питание адаптера on/off |
t |
Доверять / не доверять |
b |
Заблокировать |
? |
Справка |
q |
Выход |
- Linux с BlueZ ≥ 5.50 (Debian 11+, Ubuntu 20.04+, Arch — должно работать «из коробки»)
- Python ≥ 3.9
- Системный сервис
bluetoothdзапущен:systemctl status bluetooth - Для авто-роутинга звука:
pulseaudioилиpipewire-pulse+pactl - Для эмодзи-иконок: моноширинный шрифт с поддержкой
📺 🎧 ⌨(например JetBrains Mono, Fira Code Nerd, DejaVu Sans Mono)
Python-зависимости (requirements.txt):
textual>=2.0
dbus-next>=0.2.3
git clone https://github.com/HelpFreedom/bluetui.git
cd bluetui
pip3 install --user -r requirements.txt
./bluetui.shОпционально — короткий алиас в PATH:
ln -s "$(realpath ./bluetui.sh)" ~/.local/bin/bt
# теперь:
bt(Убедись что ~/.local/bin есть в $PATH.)
В отличие от ИК-пультов или Android TV Remote v2 (по WiFi), bluetui реализует настоящий Bluetooth-пульт: компьютер представляется ТВ как HID-устройство (как фирменный пульт от того же ТВ).
Как пользоваться:
- На ТВ включи режим обнаружения Bluetooth (обычно: Настройки → Пульты → Добавить устройство).
- В bluetui нажми
sдля сканирования. Когда ТВ появится в списке «Поблизости» — выдели его и нажмиr. - Откроется экран пульта. JustWorks-сопряжение пройдёт автоматически (агент переключается на
NoInputNoOutput). - Используй стрелки, Enter, Esc, цифры, кнопки громкости — всё транслируется в HID-репорты.
Технические детали: регистрируется org.bluez.Profile1 с UUID 0x1124 (HID), разворачивается SDP-запись с дескриптором (Consumer Control Report ID 1 + Keyboard Report ID 2), открываются raw L2CAP-сокеты на PSM 17 (Control) и PSM 19 (Interrupt) через socket.AF_BLUETOOTH + BTPROTO_L2CAP. После подключения профили A2DP/AVRCP/HSP принудительно отключаются, чтобы звук с ТВ не уходил в колонки ПК.
bluetui/
├── __main__.py # python -m bluetui → main()
├── app.py # BluetuiApp — основное Textual-приложение
├── bluez.py # BluezManager — обёртка над D-Bus / BlueZ ObjectManager
├── agent.py # org.bluez.Agent1 для PIN/passkey-диалогов
├── widgets.py # AdapterBar, DeviceList
├── modals.py # ConfirmModal, PinModal, InfoModal, HelpModal, MediaControlModal
├── icons.py # Маппинг BlueZ Icon → Unicode-глиф
├── audio.py # Авто-роутинг звука через pactl
├── classic_hid.py # Classic-BT HID Device profile (пульт для ТВ)
├── hid_remote.py # BLE HID over GATT (legacy, сохранён для тестов)
├── remote_screen.py # UI-экран виртуального пульта
└── style.tcss # Глобальные стили (Textual CSS)
Главные сторонние зависимости:
- HID-пульт работает только с ТВ, поддерживающими BT HID-host профиль. Большинство Android TV / Tizen / WebOS поддерживают, но не все.
- Авто-роутинг звука иногда требует двух попыток подключения — это известная гонка между BlueZ и PulseAudio. Приложение делает retry автоматически.
- Громкость на наушниках регулируется не через AVRCP-абсолютную громкость, а через системный микшер. Это удобнее в большинстве случаев.
Логи пишутся в ~/.cache/bluetui.log (truncate при каждом запуске). Туда уходят все ошибки D-Bus, события подключения, диагностика звукового роутинга и HID-канала.
GNU General Public License v3.0 — см. LICENSE.