Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: Integrationを自動で再読み込みする方法

Sympapaです。

ロボット掃除機: Ecovacs Deebot X1 OMNIを購入しカスタムインテグレーション:Deebot-4-Home-Assistantを使ってHome Assistantとの連携をしたのですが、Home Assistantが起動してから数時間経つとDeebotのステータスがHome Assistant上で更新されなくなる問題が起きています。環境依存のようで原因を探っているところですが、現状でもIntegrationの再読み込みをするとまた数時間はステータスを正常に取得し更新してくれます。
なので数時間起きにIntegrationの再読みを自動で行えば一時しのぎの解決策にはなるわけですが、Integrationの再読み込みをするサービスが見つかりません。


しかし、別のことをググっていた時に偶然、こんなブログ記事を見つけました。
Home AssistantのAPIを使ってIntegrationの再読み込みができるようです。
smartlife99.netlify.app


基本的にはこのブログ記事をそのまま真似をさせていただいただけなんですが、Home Assisatantのバージョンの違いのせいか一部そのままの方法では出来なかったので、今回はHome AssistantでIntegrationを自動で再読み込みする方法を書きたいと思います。

■環境

Home Assistant version: core-2022.8.1
Home Assistant installation type: Home Assistant OS (Ver.8.4)

■手順

IntegrationのEntity IDを取得する方法が前述の見つけたブログに書かれた方法では出来なかったのでググって見つけました。

1. Samba shereアドオンのインストール

Samba shereアドオンをインストールして、他のPC等からHome Asssitantサーバ内のディレクトリへアクセスできるようにします。
アドオンストアからインストールできます。
github.com

2. IntegrationのEntity ID 取得

他のPCなどから"\\192.xxx.xx.xx\config\.storage\core.config_entries"を開きます。
("\192.xxx.xx.xx”はHome Assistant"が稼働しているサーバ)
"core.config_entries"ファイルには統合の設定がズラっと書かれているので、対象となるインテグレーションを検索(今回の場合は"deebot"で検索)し、そのEntity IDをメモります。

 {
        "entry_id": "xxxxxxxxxxxxxxxxxxx",
        "version": 3,
        "domain": "deebot",
        "title": "yyyyyyyy",
        "data": {
          "username": "yyyyyyyy",
          "password": "zzzzzzzz",
          "country": "jp",
          "continent": "as",
          "devices": [
            "dddddddddddd"
          ]
        },
        "options": {},
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      },

3. Home Assistant API Token の取得

Home AssistantのAPI経由でIntegrationの再読み込みを実行出来るようです。
まずはAPIへアクセスするためのアクセストークンを生成します。
左サイドバー下にあるユーザーをクリックして、"長期間有効なアクセストークン(Long-Lived Access Tokens)"をクリックし生成されたトークンをコピーします。

4. アクセストークンの追加

secrets.yamlにさっきのアクセストークンを追加します。

secrets.yaml

integration_reroad_token: Bearer さっきの長期間有効なアクセストークン

5. restコマンドの定義

API を使ってIntegration を再読み込みする rest コマンドをconfiguration.yamlに定義します。

configuration.yaml

rest_command:
  reload_deebot:
    url: "http://192.xxx.xx.xx:8123/api/config/config_entries/entry/さっきメモったEntity ID/reload"
    method: POST
    headers:
      authorization: !secret integration_reroad_token
      content-type: "application/json"

6. オートメーション作成

とりあえず1Hrに1回、インテグレーションを再読み込みするrestコマンドを発動するようにしました。

alias: Deebot_auto_reload
description: ""
trigger:
  - platform: time_pattern
    hours: /1
condition: []
action:
  - service: rest_command.reload_deebot
    data: {}
mode: single

■ということで

ということでHome Assistantの小ネタでした。
それでは。