Google Home から IFTTT でマルチアクションを実現する方法 まとめ

Hue やスマートプラグを amazon.com から買って、スマートホームデバイスを試してみた。Nature Remo も買った。便利に使うには複数デバイスをまたがった操作が欲しくなるが、IFTTT は基本的にアクションを一つしか選択できません。

マルチアクションを行うにはどうしたらいいのか色々調べてみたのでまとめてみた。

# Google Assistant を複数設定する

<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/986eedd0-e025-65b3-83f9-b3cd9f74747a.png" width="30%">

上記のようなトリガーで、アクションごとにアプレットを複数用意するだけ。

#### 特徴

* <font color="Red">__起動文言と返事は同一にしておく必要がある__</font>
* マルチアクションを使いまわすことができない

# IFTTT Platform でアプレットを作成する

https://platform.ifttt.com/maker/ でアプレットを作れる。

### 1. New Applet を押す

<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/bd2fb0dc-a3ea-1879-dfda-237bd8163c46.png" width="30%">

### 2. トリガーに Google Assistant を設定

<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/85fcb7c5-124b-9c21-7cf3-03b83a49da72.png" width="30%">　<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/8792974f-8ec9-950f-05de-a110e23c2f72.png" width="40%">

日本語しか使わないので、Language フィールドは日本語で固定。

### 3. アクションを設定

<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/93bad94b-4210-ba23-bc50-0330f661244a.png" width="40%">

### 4. 適当な名前をつけて保存

<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/89f83577-03e3-38bf-1671-25e3da37317a.png" width="40%">

### 5. 作ったアプレットを使う

下図のリンクから、作ったアプレットを利用できる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/a0f6bcce-af10-4777-26d6-cfc5190959b5.png" width="40%">

#### 特徴

* フィルターに Javascript を書けるので、洒落たことができるかも[^1]しれない
* アクションごとにアプレットを作っておく必要がある
    * 上記のアプレット作成手順では、「3. アクションを設定」で Hue の `Turn on lights` を設定しているが、全消灯させたい場合に Hue の `Turn off lights` を設定した別アプレットを作成する必要がある
* 同一アクションが指定できない
    * 下図では、一つ目のアクションに Nature Remo の`Control home appliances`を指定しているが、二つ目のアクションでは同一の`Control home appliances`が選択できないことが確認できる。
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/1815/80aec7ba-34e6-52b3-2a8f-7266e97addcf.png" width="50%">

[^1]: 詳しく調べていません

# Webhooks を使う

### 1. Webhooks サービスを検索
<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/1ed14eee-e010-bf6c-de5c-3d433e30db3c.png" width="40%">

### 2. Webhooks のドキュメント開く
<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/fc1fcd63-1529-cfc1-db3c-b25216c957c9.png" width="40%">

### 3. Webhooks の URL を確認
__`{event}`__ にイベント名を入れたのが URL になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/62a1e08a-61f0-77df-a878-75d29052eeb6.png" width="70%">

### 4. Webhooks をアクションにしたアプレットを作成
トリガーはご自由に。
[3. Webhooks の URL を確認](#3-webhooks-%E3%81%AE-url-%E3%82%92%E7%A2%BA%E8%AA%8D)の URL を設定する。
赤線で示しているイベント名は適当に決めて埋める[^2]。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/620c89d7-a18e-b8d6-706b-f7f5f85ba279.png" width="40%">

[^2]: 実行したいマルチアクションを表す名前を付けるのがいいでしょう

### 5. Webhooks をトリガーとしたアプレットを作成
[4. Webhooks をアクションにしたアプレットを作成](#4-webhooks-%E3%82%92%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%97%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90)で決めたイベント名をトリガーにし、実行したいアクション分アプレットを作成する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1815/2be173ff-3e08-5594-ae1a-1e77ae91e943.png" width="40%">

#### 特徴

* アクションがどういう順番で実行されるか不明[^3]
* トリガーとアクションを切り離せるので便利
    * 別のトリガーを追加したりできる
    * アクションのみ編集できる
* アクション複数、場合によってはトリガーも複数のアプレットになるので、アプレット一覧がアプレットが散らばってしまう

[^3]: IFTTT の内部的にはアプレット作成順とかあるかもしれないが、一貫した動作が期待できるか不明

# IFTTT Platform と Webhooks を併せて使う

前述した二つの応用。

* アクション側
    * [IFTTT Platform でアプレットを作成する](#ifttt-platform-%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) の [2. トリガーに Google Assistant を設定](#2-%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%81%AB-google-assistant-%E3%82%92%E8%A8%AD%E5%AE%9A) で、Google Assistant ではなく Webhooks を指定する。
* トリガー側
    * [Webhooks を使う](#webhooks-%E3%82%92%E4%BD%BF%E3%81%86)と同じ

#### 特徴

* 一応アクションの実行順は保証されそう
    * とはいえ同一アクションが指定できないし、ほとんど遅延はないと思われるのであまり意味ないかも
* IFTTT Platform で同一アクションが指定できない点が問題にならないのであれば、一番使い勝手が良いと思う

# 外部サービスを使う

外部サービスを経由することで、マルチアクションに対応することもできる。
IFTTT が持たない機能を持つサービスも多いので、拡張性はかなり高い。
問題点としては、経由するサービスが増えることにより可用性が低くなることが考えられる。

以下は試してみたサービスの感想。

### [Stringify](https://www.stringify.com/)

* 遅延は意外と気にならなかった
* Stringify 自体が IFTTT 連携に対応しているので、設定しやすい
* スマートホーム向けの `Things`[^4] も用意されており、
* なんなら Google Assistant にも対応している
* <font color="Red">__Timer を使うことでマクロ操作をエミュレートできる__</font>
* Web 版は見るだけで編集不可、日本の AppStore では未配信なので Android 必須[^5]

### [Integromat](https://www.integromat.com/)

* IFTTT との連携は URL 直指定の HTTP リクエストで行う
* Free 版は月間 1000 Operations の制限があるが、十分足りそう
* スマートホーム向けの module はあまりない
* アプリだけでなく Web 版で設定できる
    * Web UI もリッチで設定しやすい
* Stringfy 同様、<font color="Red">__Tools の Delay を使うことでマクロ操作をエミュレートできる__</font>
* 変数を扱ったり、if、switch 分岐やループ処理などを入れることができるので、高度なフローを構築可能

### [Microsoft flow](https://japan.flow.microsoft.com/)

* IFTTT との連携は URL 直指定の HTTP リクエストで行う
* "待ち時間" というアクションがあって Delay を入れることができるが、5秒以上30日以内でないとだめ
    * 毎ステップで5秒 Delay が入るのはマクロ操作としては時間かかりすぎて微妙
* 変数を扱ったり、if、switch 分岐やループ処理などを入れることができるので、高度なフローを構築可能

# 以上

その他の方法があればぜひ教えて下さい。
それでは、スマートホーム環境を楽しんで下さい。