У серпні 2022 року команда розробників Home Assistant анонсувала новий покращений модуль інтеграції Bluetooth, який теоретично дозволяє підключати пристрої Bluetooth безпосередньо, без використання MQTT брокера. Проте наразі він працює лише з обмеженим списком Bluetooth-адаптерів (ASUS USB-BT400, ASUS USB-BT500, Ugreen CM390 тощо).
Підтримувані адаптери
- ASUS USB-BT400
- ASUS USB-BT500
- Avantree DG45
- Kinivo BTD-400
- Maxuni BT-50
- SUMEE BT501
- UGREEN CM390
- XDO BT802 (Long Range)
- ZEXMTE BT-505 (Long Range)
- ZEXMTE BT-DG54
Непідтримувані адаптери
- TP-Link UB400 — часті збої підключення
- TP-Link UB500 — часті збої підключення
Мій безіменний Bluetooth 4 модуль не розпізнавався Home Assistant, тому було прийнято рішення замінити його на доступний у магазині UGREEN CM390.
Природно, драйвери за замовчуванням не завантажилися, і команда hcitool scan
вперто повідомляла, що пристрої не знайдено.
Отже, потрібно встановити драйвери вручну.
Для початку, підключивши пристрій, виконаємо команду lsusb
та переконаємося, що операційна система бачить USB-пристрій:
Знайдемо драйвер для нашого пристрою https://www.xmpow.com/pages/download
Завантажуємо (В 2024 році вже недоступно, але є запасна копія у форматі ZIP 20201202_LINUX_BT_DRIVER)
wget https://mpow.s3-us-west-1.amazonaws.com/mpow_BH519A_driver+for+Linux.7z
Розпаковуємо архів, заходимо до директорії, куди розпакували, та збираємо драйвер:
sudo make install INTERFACE=all
Підключаємо / перепідключаємо адаптер до USB-порту.
Є обговорення на сайті у русні
Можливі проблеми та помилки
ERROR: Module btusb is not currently loaded
Якщо ви запустили збірку і побачили таку помилку, це означає, що драйвери Bluetooth взагалі не встановлено, але інсталятор намагається видалити їх перед встановленням нових.
make[1]: вход в каталог «/root/20201202_LINUX_BT_DRIVER/usb»
rmmod btusb
rmmod: ERROR: Module btusb is not currently loaded
mv /lib/modules/5.10.83-std-def-alt1/kernel/drivers/bluetooth/btusb.ko /lib/modules/5.10.83-std-def-alt1/kernel/drivers/bluetooth/btusb_bak r
mmod rtk_btusb
rmmod: ERROR: Module rtk_btusb is not currently loaded
У папці з драйверами необхідно перейти до підпапки usb
, відкрити файл Makefile
та закоментувати відповідні рядки після директиви install
. Збережіть файл, поверніться до кореневої папки з драйверами та запустіть збірку знову.
make[3]: *** /lib/modules/4.19.0-22-amd64/build: Нет такого файла или каталога. Останов.
Якщо ви запустили збірку і побачили цю помилку, це означає, що у вас відсутні заголовки для ядра версії 4.19 (або тієї версії, що зазначена у тексті помилки). Установіть заголовки для свого поточного ядра та спробуйте запустити збірку ще раз:
sudo apt install linux-headers-$(uname -r)
Помилка функції hci_uart_init
Ця помилка вказує на несумісність типів у коді драйвера UART.
/20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver/hci_ldisc.o
/20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver/hci_ldisc.c: In function ‘hci_uart_init’:
/20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver/hci_ldisc.c:1149:22: error: assignment to ‘ssize_t (*)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int)’ {aka ‘long int (*)(struct tty_struct *, struct file *, unsigned char *, long unsigned int, void **, long unsigned int)’} from incompatible pointer type ‘ssize_t (*)(struct tty_struct *, struct file *, unsigned char *, size_t)’ {aka ‘long int (*)(struct tty_struct *, struct file *, unsigned char *, long unsigned int)’} [-Werror=incompatible-pointer-types] 1149 | hci_uart_ldisc.read = hci_uart_tty_read;
Як рекомендують у обговореннях аналогічного драйвера, перейдіть у файл hci_ldisc.c
, розташований у папці /20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver
, знайдіть такі рядки:
static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
unsigned char __user *buf, size_t nr)
та змініть їх на:
static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
unsigned char __user *buf, size_t nr,
void **cookie, unsigned long offset)