Bluetooth логотип
Bluetooth логотип

У серпні 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)

Від Тетяна

IT-спеціалістка, викладачка, фанатка сучасних технологій. З 2009 року занурена у світ цифрового дизайну, веб-розробки та адміністрування систем. Ділюсь знаннями про веб-технології, IT-інструменти та корисні лайфхаки, викладаю студентам, навчаюсь сама.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *