Home Assistant в Docker не видит Bluetooth-устройства, даже если на хосте всё работает.
Причины:
- ❌ Контейнер не имеет прямого доступа к
/dev/hci0 - ❌ BlueZ внутри контейнера конфликтует с демоном на хосте
- ❌ Пассивное сканирование BLE требует флага
--experimentalв BlueZ
Решение: не запускать Bluetooth-стек внутри контейнера, а пробросить D-Bus с хоста.
✅ Настройка Docker Compose
Минимальная конфигурация
services:
home-assistant:
container_name: home-assistant
image: ghcr.io/home-assistant/home-assistant:stable
volumes:
- config:/config
- /run/dbus:/run/dbus:ro # ← Критично для Bluetooth
cap_add:
- NET_ADMIN
- NET_RAW
- SYS_ADMIN
restart: unless-stopped
networks:
- traefik
- prometheus
volumes:
config:
driver: local
networks:
traefik:
external: true
name: traefik
prometheus:
external: true
name: prometheus
⚠️ Не добавляйте
devices: - /dev/hci0:/dev/hci0- это не нужно при пробросе D-Bus и может вызвать конфликт.
🔧 Настройка BlueZ на хосте
Включение экспериментального режима (для пассивного сканирования)
Home Assistant использует пассивное сканирование BLE, которое требует запуска bluetoothd с флагом --experimental.
# 1. Создайте оверлей для systemd
sudo systemctl edit bluetooth
# 2. Вставьте:
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --experimental
# 3. Примените и перезапустите
sudo systemctl daemon-reload
sudo systemctl restart bluetooth
# 4. Проверьте, что флаг применён
ps aux | grep bluetoothd
# Ожидаемо: /usr/lib/bluetooth/bluetoothd --experimental
💡 Почему это нужно: пассивное сканирование не отправляет активные запросы, что экономит батарею устройств. Но эта функция в BlueZ помечена как «экспериментальная».
🔗 Сопряжение устройств (на хосте!)
Управляйте Bluetooth только на хосте, не внутри контейнера.
# 1. Включите адаптер
sudo bluetoothctl power on
# 2. Запустите сканирование
sudo bluetoothctl scan on
# 3. Когда устройство появится (например, Meshtastic_XXXX):
sudo bluetoothctl pair AA:BB:CC:DD:EE:FF
sudo bluetoothctl trust AA:BB:CC:DD:EE:FF
sudo bluetoothctl connect AA:BB:CC:DD:EE:FF
✅ После сопряжения на хосте, Home Assistant увидит устройство через проброшенный D-Bus.
⚙️ Интеграция в Home Assistant
Установка интеграции
- Установите Meshtastic через HACS (или другую нужную интеграцию)
- Перезапустите HA:
docker compose restart home-assistant - Настройки → Интеграции → Добавить интеграцию → [Название]
- Устройство должно появиться в списке обнаруженных (по имени или адресу)
Если устройство не обнаруживается
# Проверьте на хосте:
- Устройство спарено? `bluetoothctl paired-devices`
- Адаптер не заблокирован? `rfkill list`
- BlueZ запущен с --experimental? `ps aux | grep bluetoothd`
# В Home Assistant:
- Перезагрузите интеграцию: Настройки → Система → Перезагрузить
- Проверьте логи: Настройки → Система → Логи → поиск "bluetooth"
⚠️ Частые проблемы
| Симптом | Причина | Решение |
|---|---|---|
Unable to open mgmt_socket в контейнере | Конфликт демонов | Не запускайте bluetoothctl внутри контейнера |
| Устройство не появляется в скане | Не включено сопряжение на устройстве | В приложении устройства: включить режим сопряжения |
Error.Busy при включении питания | hciattach держит устройство | Убрать флаг -n в сервисе инициализации |
| Пассивное сканирование не работает | BlueZ без --experimental | Добавить флаг в ExecStart и перезапустить |