Мониторинг BLE устройств с Home Assistant, часть 1

У старшего сына пока нет смартфона и он постоянно любит забывать свои ключи в разных местах. Попробуем решить эту проблему, а заодно сделать более точным контроль присутствия дома через Home Assistant. Будем использовать Bluetooth Low Energy метку, которая выглядит как небольшой брелок для ключей, позволяет менять батарейку, а также регистрировать своё присуствие с помощью приёмника Bluetooth.

img

Метка называется nut-mini, имеет небольшой размер и время работы до полугода.

Выбор компонента

Я проверил несколько решений для трекинга bluetooth в Home Assistant. Встроенный официальный компонент отмел сразу, так как много нареканий на его работу, даже на страничке с документацией сверху висит предупреждение о проблемах. Вторым было решение от одного из членов коммьюнити home assistant. Софтина достаточно легко установилась на Raspberry Pi Zero W, но наотрез отказалась видеть BLE устройства, хотя с обычным Bluetooth всё работало хорошо.

Наконец, поиски привели к ещё одному стороннему решению, которое показало себя в работе на удивление хорошо. Это автономная ruby программа, которая сообщает в Home Assistant о появлении BLE устройств в зоне действия приёмника и регистрирует их как новые устройства компонента Device Tracker. К сожалению, у данного проекта тоже непростая судьба, автор забросил своё творение и данный репозиторий является форком, поддерживаемым другим человеком.

Так как ruby славится своими проблемами с зависимостями при установке нескольких проектов, требующих разные версии библиотек, будем устанавливать в docker контейнер. Это также позволит в будущем перенести проект на другой сервер с минимальными затратами времени и сил. Например, на полноценный Linux сервер с bluetooth свистком.

Установка Docker на Raspberry Pi Zero W

Home Assistant у меня работает на выделенном Linux сервере, но в хозяйстве завалялась плата Raspberry Pi Zero W со встроенным bluetooth адаптером, поэтому будем использовать её. Почему-то многие владельцы home-assistant опасаются испольовать docker в своей конфигурации, а между тем контейнеризация даёт много преимуществ по сравнению с запуском софта в Linux напрямую.

Есть два официальных способа установить docker на Raspbian Stretch.

  1. Скачивание deb пакета и установка его вручную
  2. Использование специального скрипта, получаемого с официального сайта, который автоматизирует установку.

Второй способ имеет преимущество: после установки обновление на новые версии может выполняться с помощью стандартного менеджера пакетов apt.

На самом деле, установка докера предельно проста. Скачиваем установочный скрипт и запустим его:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

Через несколько минут скрипт завершится сообщением об успешной установке. Система предупредит на всякий случай, что возможность запускать docker контейнеры от имени обычного пользователя может дать злоумышленнику возможность получить root права. Если raspberry pi планируется использовать только во внутренней сети, имеет смысл добавить пользователя pi в группу docker, иначе каждый раз при обращении к докеру придётся использовать команду sudo.

$ sudo usermod -aG docker pi

После того, как команда молча выполнится, нужно выйти из текущей сессии (logout) и зайти снова, чтобы изменения вступили в силу.

x86 vs ARMv6

Большинство готовых docker контейнеров не будут запускаться на raspberry pi, включая официальный helloworld контейнер. Просто потому, что данные контейнеры собраны под x86 архитектуру процессоров, в то время как у нас ARM. Узнать архитектуру Raspberry Pi можно с помощью команды:

$ cat /proc/cpuinfo 
processor       : 0
model name      : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 697.95
Features        : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Откуда становится понятно, что нам нужны контейнеры под ARMv6. Найдём какой-нибудь контейнер для архитектуры ARMv6 и попробуем его запустить:

$ docker run resin/rpi-raspbian uname -a

Процесс может занять довольно длительное время, но по окончанию будет запущен контейнер с командой, отображающий версию ОС, который тут же будет остановлен.

Убедимся, что докер появился в списке приложений менеджера apt:

$ sudo apt list --installed | grep docker

docker-ce/stretch,now 18.06.1~ce~3-0~raspbian armhf [installed]

В следующей статье попробуем создать собственный контейнер.