コモノポリタン

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

【Home Assistant(Hass.io)でホームオートメーション】OKぐーぐる、クリスマスツリーを点けて

IFTTTでGoogle AssistantとHome Assistantの連携!

ああ、いつまでたっても「汎用赤外線リモコン」に到達しない…
しかしながら、クリスマスまでにツリーを音声コマンドで操作できるように設定したい、のです。この手続きは「汎用赤外線リモコン」でも活用しますし(言い訳)。

1. まえがき

Home AssistantのWebページ(やAndroid/iOSアプリ)からクリスマスツリーを点灯・消灯できるようになりました(この記事)。しかし折角Google Home/Home mini/Nest Hubがあるのですから、「OK、ぐーぐる」で点灯できると家人へのインパクトも大!でしょう。まるで魔法のよう!

2. サービス間連携IFTTT

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

ifttt.com

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

「OK、ぐーぐる …」 ⇒ Google Assistant(のサービス) ⇒ IFTTT ⇒ Home Assistant(のサービス) ⇒ tp-link HS-105 (に繋がっているクリスマスツリー)

つまり

  • IF Thisパート: もし私が「OK、ぐーぐる、クリスマスツリーを点けて」と言ったら(とGoogle Assistantが検知したら)
  • Then Thatパート:Home Assistantの外部サービスを呼び出して、ip-link HS-105をオンにする。

と言った具合です。

3. Home Assistant側での準備

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

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

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

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

まあ、DuckDNSの設定をAdd-onでしていれば、このあたりはクリアしているはず。

(前省略)
# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
http:
  base_url: !secret my_url
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem
(後省略)

つぎに、外からHome Assistantの機能を呼び出すサービス(webhook)をAutomationを使って設定する (ほぼおまじないと思って設定する)。

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

(後省略)

3.2. Webhook IDの取得

外からHomeAssistantのサービスを起動するためのインターフェースというか何というかがWebhook(Webサービスをひっかけるとっかかり、という感じかな)という機構なのですが、それを使えるようにする手順です。まずは左のパネルの「設定」を選んで、右画面の「Integrations」を選び、右下のオレンジの+で新しいIntegrationを追加します。リストから「IFTTT」を選択すると、「Set up the IFTTT Webhook Applet(IFTTTのWebhookアプレットを設定するかい?)」って聞かれるので「送信」を選択。
f:id:maky_Ba:20191221021338j:plain:w350 f:id:maky_Ba:20191221021352j:plain:w200

すると「Success!」という子画面が表示されます。この画面とっても重要です。4.2で設定する内容がここで生成され表示されるのですが、なんとこの画面「一度」しか表示されないのです!!
f:id:maky_Ba:20191221021438j:plain:w350
一旦「完了」を押してしまうと「Integrations」の中の「IFTTT」を押しても下記の様に冷たいメッセージしか表示されません。ということで、先ほどの画面が出たら少なくともURLパートはコピペしてどこかにメモっておきましょう。絶対ですよ。
f:id:maky_Ba:20191221021459j:plain:w400
.../api/webhook/<長い長い文字列>の長い長い文字列が私のHome AssistantのWebhookのIDなのです。 残念なことに、このIFTTT連携用のWebhook IDは一個しか作ってくれません。つまり忘れちゃったら「作り直すしかない」のです。作り直したら以前作ったIDは無効に!!!ということは…
(この記事を書くために2回ほど作り直して、その都度既に作ってあったIFTTTのほぼすべてのAppletのURLを設定しなおすことに…)

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

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

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

4.1. IF Thisパートの設定。

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

「もし」の部分=起動条件(トリガー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

f:id:maky_Ba:20191221002007j:plain:w275:left f:id:maky_Ba:20191221002033j:plain:w275

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

「Create Trigger」すると次のパートに進めます
f:id:maky_Ba:20191221004327j:plain:w500

4.2. Then Thatパートの設定

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

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

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

おお、これでやっと終わりです。
f:id:maky_Ba:20191221024851j:plain:w350

これでGoogle Home/Home mini/Nest Hubに向かって「ねぇ、ぐーぐる、クリスマスツリーをつけて」と言えば、バチンというHS-150のリレー音が響き渡ってクリスマスツリーのライトが点灯します。ふう、結構長かったねぇ、設定。でもこれでWebhookは使い放題なので、次からは楽になるはずです。

5. おわりに

よおし、クリスマスに間に合った…
さてと、次は、本当の本当にほんとうに(?)汎用赤外線リモコンか!?乞うご期待。

Home Assistant(Hass.io)でホームオートメーション目次

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編
    3. 環境センサー(Omron)を接続 - 後編
  4. スマートコンセントでクリスマスツリー点灯!
  5. スマートディスプレイ
  6. OK、ぐーぐる、クリスマスツリーを点けて(IFTTT連携)《今回》
  7. 汎用赤外線リモコンを接続《次回》
  8. UIを改善