В августе 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 — Frequent connection failures
- tp-link UB500 — Frequent connection failures
Мой безымянный Bluetooth 4 модуль не захотел определяться ассистентом, поэтому было принято решение заменить его на доступный в магазине UGREEN CM390. Естественно, драйвера по умолчанию не подтянулись, и команда hcitool scan упрямо сообщала, что устройств не найдено.
Значит, нужно установить драйвера вручную.
Для начала, при подключённом устройстве, выполним команду lsusb, и убедимся, что операционная система видит USB устройство:
Найдем драйвер для нашего устройства https://www.xmpow.com/pages/download
Скачиваем (Запасная копия в 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)