Автоматизация присутствия в Home Assistant: как определить, что все ушли из дома, и выключить свет
Первоначальная задача состояла в том, чтобы собрать автоматизацию в Home Assistant, которая по IP-адресам Wi-Fi будет проверять наличие устройств «дома». Когда все уходят из дома, система должна проверить, все ли устройства выключены (или те же лампочки), и через какое-то время сама выключить их.
Данную историю можно докрутить: отправлять себе в Telegram-бота сообщение с уточнением «Точно все ушли? Выключить?» и так далее — тут всё зависит от вашей фантазии и желания, как должен работать скрипт.
Но тут возник иной момент: а где гарантия, что устройство корректно передаёт свои данные? Как выяснилось, ping и MAC-адреса отлично отрабатывают на Android, а вот на Apple — нет. При блокировке экрана (в целях экономии заряда) Wi-Fi отключается, и устройство «резко уходит» из дома, хотя физически находится дома. Но оно остаётся ассоциированным с точкой доступа (роутером) на 2-м уровне модели OSI (L2).
Отсюда появилась идея: не пинговать само устройство на наличие сети, а пойти к роутеру и спросить у него напрямую — кто вообще тут находится. И тут помогла интеграция от автора netAlert, которая стучится к роутеру и спрашивает «кто тут?». Главное, она видит частоты 2,4 и 5 ГГц, в то время как тот же ping/MAC зависел от адреса устройства, что нестабильно, если включен режим шифрования (Private Address).
Но и на этом вариативность не закончилась. А в чём проблема попросить сам роутер отдать нам данные в Home Assistant через MQTT? Тут уже можно жёстко прописать, какие устройства мы хотим отдавать: например, только компьютеры, или только телефоны, а может, только одно устройство (тут опять история с различными частотами Wi-Fi). Данный способ позволяет пробрасывать данные быстрее, чем тот же netAlert — разница достигает нескольких минут.
В статье рассмотрим все 4 варианта подключения и их работу на практике.
Содержание статьи
1. Интеграция Ping (ICMP)
Как работает: Вы указываете IP-адрес, и HA проверяет доступность устройства.
Требования: Для корректной работы устройству нужен статический IP в вашей сети (либо резервирование адреса по MAC в настройках роутера).
Как добавить: Настройки → Устройства и службы → Добавить интеграцию → Ping (ICMP).
Настройка опций интеграции:
- Ping count — количество отправляемых запросов (по умолчанию 5)
- Consider home — время в секундах, после которого устройство считается «не дома» (по умолчанию 180 секунд)
Результаты тестирования:
- ✅ Android (Xiaomi HyperOS, Poco C65) — ping отрабатывает хорошо при выключении сети и даже при блокировке экрана
- ❌ iPhone (iOS 12 и новее) — Wi-Fi при выключении экрана уходит в сон, ping перестаёт отвечать
2. Интеграция LAN Diagnostic
Возможности:
- Можно указать только MAC — IP определится автоматически
- Можно указать только IP — MAC определится автоматически
- Можно задать оба параметра
Как установить:
- Скачайте последнюю версию
lan_diagnosticsиз репозитория AlexxIT/LANDiagnostics - Распакуйте папку
lan_diagnosticsв/config/custom_components/ - Полностью перезагрузите Home Assistant
- Добавьте интеграцию: Настройки → Устройства и службы → + Добавить интеграцию → LAN Diagnostics
Результаты тестирования: картина идентична ping — на Android работает, на iPhone нет. Интервал опроса также установлен в 5 секунд.
3. Интеграция NetAlertX (полноценный сканер сети)
Плюсы NetAlertX:
- Отслеживает IP, MAC, имя хоста, время появления в сети
- Отправляет все данные в Home Assistant через MQTT
- Имеет веб-интерфейс для детального просмотра устройств в сети
🔗 Официальный репозиторий: github.com/netalertx/NetAlertX
Шаг 1. Установка NetAlertX через Docker
1 docker run -d \\
2 --name netalertx \\
3 --restart=unless-stopped \\
4 --network=host \\
5 -v /var/lib/docker/volumes/netalertx/data:/data \\
6 -v /etc/localtime:/etc/localtime:ro \\
7 --cap-add=NET_ADMIN \\
8 --cap-add=NET_RAW \\
9 -e PORT=20211 \\
10 -e TZ=Europe/Moscow \\
11 ghcr.io/netalertx/netalertx:latest
http://IP_вашего_сервера:20211Шаг 2. Настройка Mosquitto MQTT и создание пользователя для NetAlertX
Запуск Mosquitto (если ещё не установлен):
1 docker run -d \\
2 --name mosquitto \\
3 --restart=unless-stopped \\
4 -p 1883:1883 \\
5 -v /var/lib/docker/volumes/mosquitto/config:/mosquitto/config \\
6 -v /var/lib/docker/volumes/mosquitto/data:/mosquitto/data \\
7 -v /var/lib/docker/volumes/mosquitto/log:/mosquitto/log \\
8 eclipse-mosquitto:latest
Создание конфигурации Mosquitto:
1 mkdir -p /var/lib/docker/volumes/mosquitto/config
2 cat > /var/lib/docker/volumes/mosquitto/config/mosquitto.conf <
3 persistence true
4 persistence_location /mosquitto/data/
5 log_dest file /mosquitto/log/mosquitto.log
6
7 listener 1883 0.0.0.0
8 allow_anonymous false
9 password_file /mosquitto/config/passwd
10 EOF
Создание пользователя для NetAlertX:
1 docker exec -it mosquitto sh
2 mosquitto_passwd -b /mosquitto/config/passwd netalertx ваш_пароль
3 exit
4 docker restart mosquitto
Шаг 3. Настройка ARP flux на хосте (однократно)
Для корректной работы ARP-сканирования выполните на сервере:
1 sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
2 sudo sysctl -w net.ipv4.conf.all.arp_announce=2
3
4 # Чтобы сохранить после перезагрузки
5 echo "net.ipv4.conf.all.arp_ignore=1" | sudo tee -a /etc/sysctl.conf
6 echo "net.ipv4.conf.all.arp_announce=2" | sudo tee -a /etc/sysctl.conf
Шаг 4. Базовая настройка NetAlertX
- Откройте веб-интерфейс:
http://IP_сервера:20211 - Пройдите первоначальную настройку (создайте пароль администратора)
- Спустя некоторое время устройства подтянутся автоматически
Шаг 5. Подключение к Home Assistant через MQTT
Настройка MQTT в Home Assistant: Если интеграция MQTT ещё не добавлена:
- Настройки → Устройства и службы → + Добавить интеграцию → MQTT
- Введите параметры:
| Поле | Значение |
|---|---|
| Хост | IP вашего сервера (например, 192.168.1.50) |
| Порт | 1883 |
| Имя пользователя | netalertx |
| Пароль | тот, что вы задали |
Настройка MQTT в NetAlertX:
- Перейдите в Settings
- Найдите раздел General
- В поле Loaded plugins впишите дополнительно MQTT
Заполните поля в разделе publishers (разверните появившийся MQTT):
| Параметр | Значение |
|---|---|
| MQTT_BROKER_url | IP вашего сервера |
| MQTT_broker_PORT | 1883 |
| MQTT_USER | netalertx |
| MQTT_PASSWORD | ваш пароль |
| MQTT_RUN | always_after_scan |
| MQTT_SEND_DEVICES | True |
Шаг 6. Настройка основного сканера ARPSCAN
- Перейдите в Settings (Настройки) в веб-интерфейсе NetAlertX
- Найдите ARPSCAN в списке доступных плагинов/сканеров
- Нажмите на значок редактирования (карандаш) рядом с ARPSCAN
- Установите следующие параметры:
| Параметр | Значение |
|---|---|
| When to RUN | schedule (запуск по расписанию) |
| Schedule | */2 * * * * (каждые 2 минуты) |
* * * * * (каждую минуту), на практике сканирование будет происходить всё равно примерно каждые 2 минуты из-за накладных расходов на выполнение.4. MQTT с роутера напрямую (OpenWrt)
iwinfo assoclist (список всех WiFi-устройств) и отправляет JSON через MQTT в Home Assistant.
Почему это надежно? iPhone может не отвечать на ping, но для поддержания соединения с WiFi он обязан периодически (раз в несколько минут) отправлять служебные кадры. Роутер это видит.
1. Установка пакетов на OpenWrt:
1 apk update
2 apk add mosquitto-client-nossl iwinfo
2. Создание скрипта /usr/bin/openwrt_wifi_json_ram.sh:
1 #!/bin/sh
2 # OpenWrt WiFi Device List → JSON → MQTT
3
4 MQTT_HOST="192.168.90.90"
5 MQTT_USER="123"
6 MQTT_PASS="abc"
7 TOPIC="openwrt/wifi/devices"
8 IFACES="phy0-ap0 phy1-ap0"
9
10 MAC_MAP="c6:90:cf:b9:14:8d=iPhone|aa:bb:cc:dd:ee:ff=Айфон_5G|xx:xx:xx:xx:xx:xx=Ноутбук"
11
12 {
13 printf '{"timestamp":%d,"devices":[' "$(date +%s)"
14
15 for IFACE in $IFACES; do
16 iwinfo "$IFACE" assoclist 2>/dev/null | awk -v IFACE="$IFACE" -v MAC_MAP="$MAC_MAP" '
17 BEGIN { ... }
18 /^[0-9a-fA-F:]+/ { ... }
19 ' done
20
21 printf ']}'
22 } | mosquitto_pub -s -i "openwrt_tracker" -h "$MQTT_HOST" -p 1883 -r -q 1 -u "$MQTT_USER" -P "$MQTT_PASS" -t "$TOPIC"
3. Сделайте скрипт исполняемым и добавьте в cron:
1 chmod +x /usr/bin/openwrt_wifi_json_ram.sh
2 echo "* * * * * /usr/bin/openwrt_wifi_json_ram.sh" >> /etc/crontabs/root
3 service cron restart
4. Настройка Home Assistant (configuration.yaml):
1 mqtt:
2 sensor:
3 - name: "OpenWrt WiFi Devices"
4 state_topic: "openwrt/wifi/devices"
5 value_template: "{{ value_json.devices | length }}"
6 json_attributes_topic: "openwrt/wifi/devices"
7 unique_id: openwrt_wifi_json
8
9 template:
10 - binary_sensor:
11 - name: "iPhone WiFi Presence"
12 unique_id: iphone_wifi_presence
13 device_class: presence
14 state: >
15 {% set devs = state_attr('sensor.openwrt_wifi_devices', 'devices') or [] %}
16 {% set known_macs = ['c6:90:cf:b9:14:8d', 'aa:bb:cc:dd:ee:ff'] %}
17 {% set iphone = devs | selectattr('mac', 'in', known_macs) | first | default(None) %}
18 {{ 'on' if iphone and iphone.inactive_ms | default(999999) < 300000 else 'off' }}
known_macs. Чтобы их узнать, посмотрите на вывод JSON из OpenWrt, когда телефон точно подключен.5. Автоматизация в Home Assistant
Как создать автоматизацию для выключения света при отсутствии всех дома:
- Откройте Настройки → Автоматизации и скрипты → Создать автоматизацию
- В разделе «Когда» выберите один из триггеров (любой из описанных выше способов отслеживания присутствия)
- В разделе «И если» выберите тот же объект и укажите состояние, которое должно вызвать процесс (например, состояние «не дома»)
- В разделе «Тогда» выберите ваше освещение и задайте действие «Выключить»