Home Assistant: перезагрузка интеграции через REST

4 февраля, 2021

В свое время мне потребовалось автоматизировать перезагрузку одной из установленных интеграций после определенных действий. Поиск по документации на REST API ничего толкового не дал, но на офф. формуме нашлась пара тем с решениями похожих задач. Здесь я опишу свой опыт решения этой проблемы.

Для понимания того, как работать с REST API HA стоит обратится к официальной документации, там это достаточно понятно изложено.

Приведу пример – получение текущего состояния объекта.

C помощью curl:

curl -X GET \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <Long-lived access token>" \
    <HA_URL>/api/states/sensor.time

С помощью PowerShell:

$headers = @{
    "Content-Type"="application/json"
    "Authorization"="Bearer <Long-lived access token>"
}
Invoke-RestMethod -Method Get -Headers $headers -Uri <HA_URL>/api/states/sensor.time

<HA_URL> – адрес веб-интерфейса HA
<Long-lived access token> – токен, который вы можете создать в профиле своего пользователя HA (/profile), в самом низу страницы:

! Помните, что <Long-lived access token> это крайне чувствительная информация, полный аналог вашей пары логин-пароль, относитесь к нему соответствующим образом. В частности, не вставляйте в конфиги напрямую, используйте secrets.yaml

Ответ на этот запрос придет в виде json’a со всеми атрибутами запрашиваемого объекта:

{
  "entity_id": "sensor.time",
  "state": "09:39",
  "attributes": {
    "friendly_name": "Time",
    "icon": "mdi:clock"
  },
  "last_changed": "2021-02-04T06:39:00.005515+00:00",
  "last_updated": "2021-02-04T06:39:00.005515+00:00",
  "context": {
    "id": "80d077c0fced0fe879225b3ab6652466",
    "parent_id": null,
    "user_id": null
  }
}

– ~ –

У меня же, напомню, была задача в автоматической перезагрузке одной из интеграций, а именно – Xiaomi Gateway 3.
После изучения офф. форума был найдет URL API при обращении к которому методом POST произойдет перезапуск интеграции:

<HA_URL>/api/config/config_entries/entry/<Integration_ID>/reload

Где <HA_URL> это адрес веб-интерфейса Home Assistant’а, а <Integration_ID> – внутренний ID интеграции.

Для получения ID интеграции придется воспользоватся панелью разработчика браузера (developer tools), обычно она вызывается клавишей F12.
Находясь в интерфейсе HA, откройте панель разработчика, выберите в ней закладку Network и перейдите на страницу настроек интеграций (/config/integrations/), после этого в панели вы увидите длинный список загрузившихся файлов, ресурсов и т.д.
Вам необходимо найти файл с именем entry, выбрав его, вы сможете увидеть список установленных у вас интеграций.
Найдите в этом списке нужную вам интеграцию ориентируясь по полям domain и title, искомый ID содержится в поле entry_id.

Таким образом, URL для перезагрузки показанной на скриншоте интеграции будет выглядеть так:

<HA_URL>/api/config/config_entries/entry/2eb6dcc3fdd42e63a01f7db162e7d7fb/reload

Пример с использованием curl:

curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <Long-lived access token>" \
    <HA_URL>/api/config/config_entries/entry/2eb6dcc3fdd42e63a01f7db162e7d7fb/reload

Не стоит забывать, что эту возможность можно использовать и внутри самого HA. Например, создав автоматизацию, перезагружающую проблемную интеграцию если какие-либо объекты из нее стали недоступны.

При этом, для обращения к нужному URL можно использовать как curl через Shell Command так и специальную интеграцию RESTful Command.

shell_command:
  reload_integration_gw3: >-
    curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer <Long-lived access token>" \
      <HA_URL>/api/config/config_entries/entry/<Integration_ID>/reload

rest_command:
  reload_integration_gw3:
    url: "<HA_URL>/api/config/config_entries/entry/<Integration_ID>/reload"
    content_type: "application/json"
    headers:
      authorization: "Bearer <Long-lived access token>"
    method: post