コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home Assistantでホームオートメーション】OKぐーぐる、ベッドルームの電気を点けて

【Home Assistant(Hass.io)】
IFTTTでGoogle AssistantとHome Assistantの連携!

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。
 汎用赤外線リモコンをぐーぐる経由で操作できるようにしましょう。

以前スマートコンセント(につながったクリスマスツリー)をぐーぐるから操作できるようにしました。

maky-ba.hatenablog.com

 今回は、UIとかIntegrationとかのバージョンも上がっているので、寝室の電気を点ける、を題材に連携を設定してゆきましょう。

この記事の前提条件
Home Assistant 0.114.1
HassOS 4.12
Server Raspberry Pi 4(2GB)

1. サービス間連携IFTTT

 「OK、ぐーぐる」とHome Assistantの間を繋ぐのに、サービス間連携の仕組みIFTTT(IF This Then That)を使うことにします。

ifttt.com

 連携の流れは、下記のような感じです。

「OK、ぐーぐる …」 ⇒ Google Assistant(のサービス) ⇒ IFTTT ⇒ Home Assistant(のサービス) ⇒ 汎用赤外線リモコン(から操作される寝室の電灯)

つまり

  • IF Thisパート: もし私が「OK、ぐーぐる、ベッドルームの電気を点けて」と言ったら(とGoogle Assistantが検知したら)
  • Then Thatパート:Home Assistantの外部サービスを呼び出して、汎用赤外線リモコンで寝室の電気(Panasonicのシーリングライト)へ赤外線でオンのコマンドを送信する。

と言った具合です。

2. Home Assistant側での準備

 下記のHome AssistantのIFTTT関連のマニュアルの「Sending events from IFTTT to Home Assistant(IFTTTからのイベントをHome Assistantで受け止める)」の部分を設定する。 www.home-assistant.io

2.1. Configuration.yaml設定・設定確認

 Home Assistantを外から呼べるようにするためには、下記条件が必要です。

  1. httpsでHome Assistantに接続できるようになっていること(下記設定ファイルでssl_ほにゃほにゃが設定されていること)
  2. DNSでサイト名引けるようになっていること
  3. 下記設定ファイルにexternal_urlが設定できていること

 まあ、DuckDNSの設定をAdd-onでしていれば、このあたりはクリアしているはず。 不足があればこのタイミングで書き加えておく。

(前省略)
homeassistant:
  (中略)
  external_url: "https://maky-home.duckdns.org"

  (中略)
http:
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem
(後省略)

 つぎに、外からHome Assistantの機能を呼び出すサービス(webhook)をAutomationを使って設定する (ほぼおまじないと思って設定する)。 Home Assistantの最近の流れはAutomationもUIで設定する方向に。直接configuratin.yamlを編集するときは、automation old:としてしなければならない、となっています。

(前省略)
#****************************************************************
# automation for IFTTT
#****************************************************************
automation old:
  - alias: The optional automation alias
    trigger:
    - event_data:
        action: call_service
      event_type: ifttt_webhook_received
      platform: event
    condition: []
    action:
    - data_template:
        entity_id: '{{ trigger.event.data.entity_id }}'
      service_template: '{{ trigger.event.data.service }}'

(後省略)

 一度再起動しておく。

2.2. Webhook IDの取得

 外からHomeAssistantのサービスを起動するためのインターフェースというか何というかがWebhook(Webサービスをひっかけるとっかかり、という感じかな)という機構なのですが、それを使えるようにする手順です。まずは左側のサイドメニューから「設定」を選んで、右画面の「Integrations」を選び、右下のオレンジの+で新しいIntegrationを追加します(このあたりもアプリのアイコンが追加されて、昔のバージョン(0.95)に比べてわかりやすくなりました)。
 リストから「IFTTT」を選択すると、「Set up the IFTTT Webhook Applet(IFTTTのWebhookアプレットを設定するかい?)」って聞かれるので「送信」を選択。

 すると「Success!」という子画面が表示されます。この画面とっても重要です。3.2で設定する内容がここで生成され表示されるのですが、なんとこの画面「一度」しか表示されないのです!!

 ここで一旦「完了」を押してしまうと、表示されている「Integrations」の中の「IFTTT」パネルのどこにも上記画面で表示された情報はありません。ということで、先ほどの画面が出たら少なくともURLパートはコピペしてどこかにメモっておきましょう。絶対ですよ。

 .../api/webhook/<長い長い文字列>の長い長い文字列が私のHome AssistantのWebhookのIDなのです。 残念なことに、このIFTTT連携用のWebhook IDは一個しか作ってくれません。つまり忘れちゃったら「作り直すしかない」のです。作り直したら以前作ったIDは無効に!!!ということは… 。
 IFTTTのアプレットをすべて修正するという苦行を起こさないためにも、くれぐれも気をつけくださいね。

3. IFTTTのアプレットを定義する

 まずIFTTT(https://ifttt.com/)のサイトに行き、Google Assistant(Google Home/Home mini/Nest Hub)で使っているGoogleのアカウントでログインします。こうしておくとGoogle Assistant連携がスムーズに行く(と思う)。

画面右上のユーザアイコンの中で「Create」を選択するとIFTTTのアプレット生成画面がスタートします。

3.1. IF Thisパートの設定。

 上の画面のどこを押して進めたら良いか、イマイチ分かりづらいデザイン…
「+This」の部分が正解。
100種類以上のIF Thisに使えるサービスがタイルで列挙される(下図左)ので、ちょっと探し辛い。今回はGoogle Assistantを使いたいので、まずはGoogleと入れて絞り込むのが楽です。UI(タイル)で選択しやすいようにしているつもりで、結局テキスト入力が不可避、皮肉ですね。

 「もし」の部分=起動条件(トリガーTrigger)を設定します。Google Assistantのサービスのトリガーは4つ。今回は、一番シンプルな「Say a simple phrase(単純な文を言う)」を使います。「単純な」というのは、数字やキーワードなど変数的なものを含まない固定的な(?)文章の事を指します。 下記の様に設定しました。

  • What do you want to say?(何て言う?): ベッドルームの電気をつけて
  • What's another way to say it? (それ、他の言い方では?):(なし)
  • And another way?(他の言い方、もう一丁):(なし)
  • What do you want the Assistant to say in response?(Google Assistantに何て応えさせる?):ベッドルームの電気をつけます
  • Language: Japanese

 ちなみに、気が付く人は気が付いているかもしれませんが、「Google Assistantに何て応えさせる」は後段の成功失敗にかかわらず「応え」てくれます。たとえHome Assistantのサービス呼び出しに失敗しても気にしません。
 だってまあ「IF This」パートの設定画面にあるんですよ、したがって、まあ「条件うけたまわり!」ぐらいの感じの応答にするのが良いでしょう。「電気をつけました」ではなく「電気をつけます」とか。

「Create Trigger」すると次のパートに進めます

3.2. Then Thatパートの設定

 さあIFTTTの流儀が見えてきましたか?「+That」を押すと実行パートのサービス設定ができます。
Home Assistantの外部からの呼び出しサービスを利用するのにWebhooksという機構を使いたいのですが、またしても山の様なThen Thatに使えるサービスが列挙されてうんざり…さっさとあきらめて検索窓に「Web」と入れて絞り込みます。

 このサービスには「Make a web request」しかありませんのでそれを選択して、「Complete action fields(アクションの設定項目を埋める)」に従って下記の様に埋めていきます。

  • URL: https://xxxxx.duckdns.org/api/webhook/長い長いwebhook_id
    (これが2.2で取得したURLです。ちゃんとメモってありますよね)
  • Method: POST
  • Content-Type: application/json
  • Body: { "action": "call_service", "service": "switch.turn_on", "entity_id": "switch.bedroom_light_pana_ch3_rm31" } で、「Create action」を押すと、「Review & Finish(確認と終了)」が出ますが確認しようがないのでここは「Finish」で終了!

おお、これでやっと終わりです。

 これでGoogle Home/Home mini/Nest Hubに向かって「ねぇ、ぐーぐる、ベッドルームの電気をつけて」と言えば、「はい、ベッドルームの電気をつけます」とスマートスピーカーがお答えしつつ、(うまくいけば)シーリングライトがが点灯します。

4. おわりに

 さあこれからはWebhookは使い放題なので設定楽なはず。なので、どんどん音声コマンドを設定してゆきましょう。

maky-ba.hatenablog.com