Проброс признака присутствия из HomeKit в Home Assistant

В какой-то момент времени, на заре приобщения к 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

вернуться