Получение списка устройство в Home Assistant с помощью nmap

Одна из вещей, которую умеет делать Home Assistant, это штука под названием "device tracking" — отслеживание устройств в домашней WiFi сети.

Home Assistant можно научить смотреть когда устройство появляется в сети и когда пропадает, а дальше делать уже на базе этой информации какую-нибудь автоматизацию. Например, можно сделать автоматизацию для дачи. Если к WiFi сети на даче подключен мой мобильный телефон, плюс солнце зашло, то должен быть включен свет перед входом. Или, например, можно настроить что если мобильного телефона нет в сети и сейчас день, то нужно запустить робот пылесос.

Для того чтобы строить такие автоматизации в Home Assistant нужно в первую очередь научить его отслеживать наличие устройств в WiFi сети.

Есть несколько способов как Home Assistant может узнавать про наличие устройств в сети. Если у вас достаточно современный WiFi роутер, то этот роутер знает что к нему подключено и через специальное API позволяет получить этот список устройств (так умеет, например, роутер Xiaomi Router 4). Если у вас есть роутер, который умеет взаимодействовать с Home Assistant, то лучше всего настроить device tracking с помощью роутера.

Но далеко не все роутеры могут взаимодействовать с Home Assistant. Но, к счастью, есть другой способ как Home Assistant может узнать какие устройства есть в WiFi сети. Этот способ называется "nmap". Вообще "nmap" это такая специальная утилита в Linux. Эта утилита появилась еще в прошлом веке (в конце 1990-x годов) и с тех пор продолжает развиваться. С помощью "nmap" можно определять какие устройства подключены к сети, какие порты на них открыты и какая операционная система работает на этих устройствах. Home Assistant не использует все возможности "nmap", а использует только возможность про нахождению устройств.

Чтобы настроить device tracking в HA нужно отредактировать файл configuration.yaml и добавить в него фрагмент что-то вроде этого:

device_tracker:
  - platform: nmap_tracker
    interval_seconds: 60
    hosts: 192.168.1.0/24
    home_interval: 10

Изначально у меня в конфигурации не было настройки "interval_seconds: 60", но без этой настройки в логах Home Assistant очень часто было предупреждения вида:

2019-12-16 18:11:09 WARNING (MainThread) [homeassistant.components.device_tracker] Updating device list from legacy took longer than the scheduled scan interval 0:00:12
2019-12-16 18:11:22 WARNING (MainThread) [homeassistant.components.device_tracker] Updating device list from legacy took longer than the scheduled scan interval 0:00:12
2019-12-16 18:11:48 WARNING (MainThread) [homeassistant.components.device_tracker] Updating device list from legacy took longer than the scheduled scan interval 0:00:12

Если не указать "interval_seconds", то значение по умолчанию это 12 секунд — каждые 12 секунд HA запускает команду "nmap", не всегда она успевает отработать до момента когда нужно запускать "nmap" в следующий раз и из-за этого предупреждение в логе. На мой взгляд, проверять на устройства 5 раз в минуту — это чересчур. Я переставил на проверку раз в минуту и предупреждения в логе больше не появляются.

После изменения файла configuration.yaml нужно перезапустить Home Assistant. Когда он снова поднимется он начнет раз в минуту опрашивать WiFi сеть. Результат этого опроса — это две вещи.

Во-первых, Home Assistant начнет складывать информацию про все найденные устройства в файл known_devices.yaml. Этот файл лежит там же где и configuration.yaml. Вот фрагмент known_devices.yaml с информацией про одно устройство:

4c_11_ae_0d_7a_ab:
  hide_if_away: false
  icon:
  mac: 4C:11:AE:0D:7A:AB
  name: 4c 11 ae 0d 7a ab
  picture:
  track: true

Home Assistant с помощью "nmap" получает список всех mac адресов устройств, которые прямо сейчас работают в WiFi сети. HA получает только мак адреса про устройства, больше "nmap" ничего не передает HA. И Home Assistant как может создает запись про устройство в файле known_devices.yaml. Ничего кроме мака нет, вот он и записывает этот мак в три поля в чуть-чуть разных форматах.

Нужно помочь Home Assistant, понять что за устройство скрывается за маком и заполнить информацию про устройство. Вот что стало с записью про это устройство, после того как я его отредактировал:

wemos_bath:
  hide_if_away: false
  icon:
  mac: 4C:11:AE:0D:7A:AB
  name: Wemos Bath
  picture: /local/wemos.png
  track: true

Это устройство — это один из тех датчиков температуры что я сделал некоторое время назад. Вместо первой строки "4c_11_ae_0d_7a_ab:" я написал более приличный id: "wemos_bath:", написал "name:" и указал адрес картинки устройства.

Для того чтобы HA узнал про изменения в файле known_devices.yaml HA нужно перезагрузить.

Если HA увидит новый mac адрес, то он допишет его в файл known_devices.yaml и можно будет отредактировать эту запись.

Первая часть чем занимается модуль "nmap" в Home Assistant — это дополнение файла known_devices.yaml. Вторая часть — это собственно и есть отслеживание устройств. HA запускает "nmap", получает из него список мак адресов из файла known_devices.yaml выясняет id этого устройства и записывает в свою базу что это устройство в этот момент времени было включено.

А вот пример yaml с конфигурацией интерфейса, которая отобразит историю нахождения устройства в WiFi сети:

  - title: devices
    path: devices
    icon: 'mdi:devices'
    badges:
      - entity: device_tracker.wemos_bath
    cards:
      - entities:
          - entity: device_tracker.wemos_bath
        hours_to_show: 24
        refresh_interval: 0
        type: history-graph

Вот скриншот как это может выглядеть:

Update

Системе обнаружения устройств с помощью nmap у меня проработала около месяца. Я купил новый WiFi роутер, из которого Home Assistant может забирать данные про устройства. Перенастроил Home Assistant чтобы он использовал данные с роутера и прямо поразился насколько это лучше работает. Вот ссылка на подробности со скриншотом.

Иван Бессарабов
ivan@bessarabov.ru

16 декабря 2019