Получение списка устройство в 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» — это настройка говорит HA что нужно запускать сканирование сети один раз в минуту
- «hosts: 192.168.1.0/24» — это означает что будут проверяться включено ли устройство для всех ip адресов 192.168.1.*
- «home_interval: 10» — это означает что HA будет считать что устройство больше не дома через 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 чтобы он использовал данные с роутера и прямо поразился насколько это лучше работает. Вот ссылка на подробности со скриншотом.
Home Assistant, статья 3 (добавляем устройства)
Сегодня мы разберемся как добавлять новые устройства в Home Asisstant (далее HA) на базе того, что есть у меня. Для добавления нового устройства определенной группы необходимо в нашем конфиге внести соответствующий раздел. При этом практически никогда вам не надо будет добавлять плагины для этого! В редких случаях, при использовании кастом компонентов необходимо скачать нужные файлы для их работы и поместить в соответствующие папки, но об этом чуть позже. Расскажу про добавление базовых вещей. По сути тут собраны все плагины устройств и сервисов, которые поддерживаются HA, можно поискать свой конкретный случай и посмотреть, есть ли поддержка девайса.
Xiaomi шлюз и Zigbee девайсы, подключенные к нему.
Если вы по моей предыдущей статье оставили раздел discovery: в конфиге, то все поддерживаемые устройства у вас автоматически появились и в HA:
Как видно на картинке, у нас появились: датчик движения, датчик температуры и влажности, розетка, управление подсветкой шлюза, круглая кнопка. Но по правильному, для использования сенсоров, необходимо добавить шлюз в конфиг.
Так как мы приступили к серьезной правке конфига, необходимо помнить, что HA очень чувствителен к лишним пробелам, следите за ними!
Что надо сделать для этого? Открываем наш конфиг на малинке:
После этого прописываем в конце нашего конфига следующее:
Ключ (он же пароль, не токен, не перепутайте) для гейтвея получаем например как тут . После сохранения конфига, можно проверить его на правильность в веб интерфейсе и перезагрузить HA. При желании можно отредактировать названия датчиков или кнопок нажатием на них, а после в новом окошке на шестеренку:
Samsung smart TV (Tizen)
У меня телевизор самсунг 2017го года на тайзоне, для его добавления необходимо добавить в конфиг следующее:
Причем не важно как подключен телевизор, по кабелю или wifi к роутеру — команды на вкл и выкл будут отрабатывать в любом случае. Если у вас телевизор 2015го года или ранее, параметры port и mac можно не указывать, должно работать и так.
Опять таки покажу на примере своих лампочек. Список поддерживаемых устройств можно найти на странице плагина. В процессе нам потребуется токен устройства, как его получить можно узнать тут . После его получения добавляем в конфиг следующее:
light:
— platform: xiaomi_miio
name: living_room
host: 192.168.1.x
token: your_token
model: philips.light.bulb
Если необходимо добавить несколько устройств, делаем так:
light:
— platform: xiaomi_miio
name: living_room
host: 192.168.1.x
token: your_token_1
model: philips.light.bulb
— platform: xiaomi_miio
name: bathroom
host: 192.168.1.y
token: your_token_2
model: philips.light.bulb
Broadlink on/off устройства
Если у нас есть устройства, которые можно включить или выключить через ИК пульт и Broadlink rm mini или pro, их так же можно добавить. Для начала запустим сам плагин, для этого нужно знать IP адрес броадлинка и его мак адрес. Добавляем в конфиг следующие строчки:
После этого проверяем конфиг на правильность и перезагружаем HA. Теперь можно добавлять наши устройства исправляемые по ИК. Коды сканированные ранее через плагин для Homebridge не подойдут, но их можно переделать в нужный формат используя конвертер HEX in base64 (говорим спасибо @samsonovs). Если же ИК кодов у вас нет, можно их получить используя HA. Как это сделать? Открываем веб морду HA и переходим по первой кнопке в разделе «Инструменты разработчика», в первом поле выбираем службу switch.broadlink_learn_command_*** и жмем кнопку «Call service»:
После этого направляем пульт на broadlink и жмем на кнопку, код которой нам надо считать. Если затем перейти на главную страницу веб морды HA — там появится новое окошко со считанным кодом. Копируем его и сохраняем куда нибудь. Для считывания следующего кода процедуру необходимо повторить. Как только все необходимые коды будут прочитаны, возвращаемся к редактированию конфига и добавляем наш девайс. Должно получиться так:
switch:
— platform: broadlink
host: 192.168.1.28
mac: ’78:0f:77:28:00:9e’
timeout: 15
switches:
name_your_device:
friendly_name: «Ресивер»
command_on: ‘code1’
command_off: ‘code2’
Сохраняем конфиг, проверяем его в последний раз на правильность и перезапускаем. На всякий случай приведу полностью свой файл конфигурации, что бы вы могли оценить картину в целом:
homeassistant:
# Name of the location where Home Assistant is running
name: Home
# Location required to calculate the time the sun rises and sets
latitude: 0
longitude: 0
# Impacts weather/sunrise data (altitude above sea level in meters)
elevation: 0
# metric for Metric, imperial for Imperial
unit_system: metric
# Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: Europe/Volgograd
# Customization file
customize: !include customize.yaml
# Show links to resources in log and frontend
#introduction:
# Enables the frontend
frontend:
# Enables configuration UI
config:
http:
# Secrets are defined in the file secrets.yaml
api_password: your_key
# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
# base_url: example.duckdns.org:8123
# Checks for available updates
# Note: This component will send some information about your system to
# the developers to assist with development of Home Assistant.
# For more information, please see:
# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
updater:
# Optional, allows Home Assistant developers to focus on popular components.
# include_used_components: true
# Discover some devices automatically
discovery:
# Allows you to issue voice commands from the frontend in enabled browsers
conversation:
# Enables support for tracking state changes over time
history:
# View all events in a logbook
logbook:
# Enables a map showing the location of tracked devices
map:
# Weather prediction
sensor:
— platform: yr
# Text to speech
tts:
— platform: google
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
media_player:
— platform: samsungtv
host: 192.168.1.x
port: 8001
mac: tv_mac
name: SamsungTV
xiaomi_aqara:
discovery_retry: 5
gateways:
— key: your_key
light:
— platform: xiaomi_miio
name: living_room
host: 192.168.1.x
token: your_token1
model: philips.light.bulb
— platform: xiaomi_miio
name: bathroom
host: 192.168.1.y
token: your_token2
model: philips.light.bulb
switch:
— platform: broadlink
host: 192.168.1.x
mac: ‘mac_your_broadlink’
timeout: 15
switches:
marantz_receiver:
friendly_name: «Ресивер»
command_on: ‘code_1’
command_off: ‘code_2’
Переходим на главную страницу и видим наши устройства:
Вуаля! Вы молодцы и можете гордиться собой! В принципе для каждого плагина тут есть подробная инструкция с примерами, кое что я не показал, кое что можно найти там. К сожалению у меня не такой богатый зоопарк устройств. В следующей части рассмотрим пробросать наших девайсов в HomeKit, а так же их фильтрацию