В какой-то момент времени, на заре приобщения к Home Assistant, мне понадобился дополнительный признак присутствия дома моего iPhone. Я знал про интеграцию Apple iCloud, но не решился её использовать. Равно как и не решился использовать другие интеграции, работающие с геолокацией.
Если вы задаётесь вопросом «Зачем это нужно?», просто не читайте дальше, оно и правда вам не нужно. :-)
Проведя небольшое исследование, я выяснил, что автоматизации в Apple HomeKit могут выполнять ограниченный набор действий из скриптов, которые создаются прямо в интерфейсе приложения Home
. Одно из таких действий — открыть заданную ссылку с заданными параметрами. Я уже почти приступил к написанию собственного шлюза http2mqtt, но открыл для себя в автоматизациях Home Assistant триггер webhook. Ну а дальше всё пошло как по маслу.
Если вам тоже нужно решить эту задачу, читайте дальше. Я постарался подробно описать весь процесс.
У вас уже должно быть настроено:
- MQTT в Home Assistant
- HomePod, HomePod mini, Apple TV или iPad в качестве домашнего центра в Apple HomeKit
- включена геопозиция для HomeKit в настройках нужных вам смартфонов (обычно она включена по-умолчанию)
Настроили? Тогда идём дальше.
В configuration.yaml
прописываем следующее:
device_tracker:
- platform: mqtt
devices:
homekit_myiphone: 'stat/presence_myiphone/state'
Теперь создаём автоматизацию:
alias: HomeKit Presence
description: ''
trigger:
- platform: webhook
webhook_id: mysecretwebhook
condition:
- condition: template
value_template: >-
{{ trigger.json.state == 'home' or trigger.json.state == 'not_home' }}
- condition: template
value_template: >-
{{ trigger.json.device != '' and trigger.json.key == 'mysecretkey' }}
action:
- data:
payload: '{{ trigger.json.state }}'
retain: true
topic: 'stat/presence_{{ trigger.json.device }}/state'
service: mqtt.publish
mode: single
Ну и, наконец, делаем пару автоматизаций в Apple HomeKit. У меня интерфейс iPhone на английском языке, поэтому скриншоты и пункты меню я буду приводить на английском. Думаю, в русскоязычном интерфейсе элементы будут располагаться на тех же местах.
В приложении Home
выбираем вкладку Automation
, нажимаем на +
в правом верхнем углу и в выпадающем меню выбираем Add Automation
. Дальше выбираем триггер People Arrive
. У меня в HomeKit заведён только один пользователь, поэтому на следующем этапе мне не даётся выбрать пользователя (в поле Action
только одно значение: Anyone Arrives
), просто нажимаю Next
.
После этого откроется экран с выбором сцен или устройств, его надо промотать в самый низ и выбрать пункт Convert To Shortcut
. После этого откроется экран, где нужно добавить следующие элементы (см. ниже). В URL я указал IP-адрес Home Assistant 192.168.1.10
, не забудьте заменить на свой.
Аналогично создаём вторую автоматизацию с триггером People Leave
.
После перезагрузки Home Assistant Core, должна появиться сущность device_tracker.homekit_myiphone
.
Если всё сделано правильно, эта сущность будет изменять своё состояние в зависимости от того, находитесь вы дома или нет. Если мне не изменяет память, домом считается территория в виде круга с радиусом 150 метров, центром которого является ранее сконфигурированный в Apple HomeKit домашний центр.
ВНИМАНИЕ! На случай, если у вас домашняя локальная сеть состоит из нескольких сегментов, Home Assistant должен быть доступен по порту 8123 для домашнего центра Apple HomeKit.
ВНИМАНИЕ! Если ваш Home Assistant доступен извне, используйте с осторожностью, т.к. ссылка в триггере webhook доступна без пароля. Именно для этого я указываю key
, чтобы кто попало не мог выполнить автоматизацию зная только URL. Если вы пользуетесь подпиской Nabu Casa, то можете отключить в настройках облачное использование webhook mysecretwebhook
, т.к. нужное нам взаимодействие происходит локально, без доступа в интернет.
Проверить работу можно записывая вручную значения home
и not_home
в MQTT-топик stat/presence_myiphone/state
. Сделать это можно, например, при помощи MQTT Explorer.
Никого ни к чему не призываю, ничего не навязываю. Просто делюсь тем, как реализовал у себя. Допускаю, что моя реализация не оптимальна, но на данном этапе меня она устраивает. Если есть желание поделиться своими решениями или появились вопросы, заходите обсудить.
Vladimir Turekhanov ・ June 19, 2021