IFTTT から Raspberry Pi に指示を出す


# IFTTT から Raspberry Pi に指示を出す
以下の記事では、Google Home から IFTTT に連携する方法を記載しました。
[Google Home で独自のコマンドを利用する（IFTTT）](https://qiita.com/minatomirai21/items/3fffec8b32ba25d0aa00)

本記事では、IFTTT から Raspberry Pi へ指示を出す方法を記載します。
つまり、Google Home から IFTTT を経由し、Raspberry Pi を操作します。

## 方針
本記事では、MQTTを使用して Raspberry Pi に指示を出すこととします。
MQTTについては、以下の記事等をご参照ください。
[MQTTってどんなもの？ ｜ さきブログ](https://sakiot.com/what-is-mqtt/)

今回は、Beebotte を Broker として利用します。
Beebotte では、Rest API でメッセージを Publish することができます。
そこで、IFTTT の that として Webhook を指定し、Beebotte に Publish します。

Raspberry Pi では、Node-RED の mqtt inノード でメッセージを Subscribe します。
Subscribe した後は、受信したメッセージをjson形式に変換し、dataの内容に応じて処理を実行することができます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/235420/72b33736-e7b9-107a-9c60-2fbf70b877a0.png)


## Beebotte（MQTT Broker）の設定
まず、Broker である Beebotte を設定します。
[Beebotte](https://beebotte.com/f)
![101.png](https://qiita-image-store.s3.amazonaws.com/0/235420/a712c43c-3b22-095e-0fa1-e05146be31f6.png)

### Channel の作成
［Create new］を選択します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/235420/28b91065-5e8f-3a76-854b-5088877a116e.png)


赤枠内の必須入力項目を入力します。
以下は入力例です。

| 項目 | 入力値 |
|:--|:--|
|Channel Name   | raspberrypi  |
|Channel Description   | Raspberry Pi  |
|Resource name   | action |
|Resource Description|action|

入力が完了したら［Create channel］を選択します。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/578c213d-7f08-d74c-97c0-9b9002193f06.jpeg)



### Channel Token の確認
作成した Channel を選択します
![3.png](https://qiita-image-store.s3.amazonaws.com/0/235420/a7621fe7-82ec-208a-4aed-da3783cdffdb.png)

Channel Token に表示されている文字列（赤文字）を控えます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/235420/040becbe-ceaf-df83-8e79-611c53494284.png)


## IFTTT の設定
Google Home と Beebotte を連携させるアプレットを作成します。

### this の設定
this の作成方法詳細は、以下の記事を参照ください。
[Google Home で独自のコマンドを利用する（IFTTT）](https://qiita.com/minatomirai21/items/3fffec8b32ba25d0aa00)
![102.png](https://qiita-image-store.s3.amazonaws.com/0/235420/bf91638a-67ef-a496-9bc8-a98e211929be.png)



本記事では、以下の値を入力します。

| 項目 | 入力値 |
|:--|:--|
| trigger | Say a phrase with a text ingredient |
|What do you want to say?   | ラズパイに $ と送信  |
|What do you want the Assistant to say in response?   | ラズパイに $ と送信します|

### that の設定
![103.png](https://qiita-image-store.s3.amazonaws.com/0/235420/b21365d8-1f82-86d3-2357-0b0e1f179054.png)

［Webhooks］を選択し、［Make a web request］を選択します。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/4733ebb4-464c-865f-cfdb-6f4e6ac81dab.jpeg)


各項目を入力します。
URL の＜Channel Token＞の部分には、Beebotteで確認した Channel Token （赤色の文字列）を入力します。

| 項目 | 入力値 |
|:--|:--|
|URL  | https://api.beebotte.com/v1/data/publish/raspberrypi/action?token=＜Channel Token＞ |
|Method   | POST |
|Content Type (optional) | application/json|
|Body (optional)  |  {"data" : " {{TextField}}"} |

各項目を入力の入力が完了したら［Create action］、［Finish］を選択し、アプレットを完成させます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/235420/b00ad16b-82eb-d4e6-f7cb-d3a10d762cb9.png)


## Raspberry Pi（Node-RED）の設定
指示を受ける Raspberry Pi を設定します。
Raspberry Pi では、MQTTメッセージのSubscriberとして Node-REDを使用します。
![105.png](https://qiita-image-store.s3.amazonaws.com/0/235420/8e64f498-d90a-58fd-3d48-d2686a9e735c.png)



### Node-RED の起動
Node-RED の管理画面へアクセスします。
詳細は以下の記事を参照ください。
[Raspberry Pi での Node-Red 利用](https://qiita.com/minatomirai21/items/184e04bab76bee70470e)

### mqtt inノードの設定
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/9856f2be-efca-db97-d467-2e3a05b840a9.jpeg)

mqtt inノードを配置し、以下の通り設定します。

- mqtt inノード

| 項目 | 入力値 |
|:--|:--|
|サーバ   |新規に mqtt-broker を追加<br />→ ペンのアイコンを選択して編集画面へ   |
|トピック   |raspberrypi/action   |
|その他   |デフォルト値   |
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/49d0594c-7db6-8d18-f77d-1988dd0a0f0e.jpeg)


- mqtt-broker

\<Channel Token>の部分には、Beebotteで確認した Channel Token （赤色の文字列）を入力します。

| 項目 | 入力値 |
|:--|:--|
|[接続タブ] サーバ   |mqtt.beebotte.com   |
|[接続タブ] ポート   |8883   |
|[接続タブ] SST/TLS接続を使用   |有効   |
|[セキュリティタブ] ユーザ名   |token:\<Channel Token>   |
| その他  |デフォルト値   |
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/e94a5966-e71b-b6b3-cd4f-a541c66df5fe.jpeg)

![12.png](https://qiita-image-store.s3.amazonaws.com/0/235420/d9a71674-f5c4-5e42-97e9-66deb0f44e57.png)


### jsonノードの配置
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/5272ffac-3c3f-0adb-0e31-f1eff0878cbc.jpeg)

メッセージは string として受信されるため、扱いやすいように JSON 形式に変換します。
mqtt inノード の後ろに jsonノード を接続します。

### debugノードの配置
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/e00f90cf-1457-7f61-605b-c8e8502b67ef.jpeg)

メッセージを受信できているか確認するために、jsonノードの後に debugノード を接続します。

### デプロイ
フローが完成したらデプロイします。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/235420/d303128a-98c5-27c9-af83-fa7cdc948b26.png)

フローを以下に記します。brokerは個別に設定ください。

~~~flow.json
[{"id":"905ee719.a8dc08","type":"mqtt in","z":"7cfb0a19.d152fc","name":"","topic":"raspberrypi/action","qos":"2","broker":"4d31db1d.329f64","x":190,"y":100,"wires":[["ea10645e.6d931"]]},{"id":"ea10645e.6d931","type":"json","z":"7cfb0a19.d152fc","name":"","property":"payload","action":"","pretty":false,"x":350,"y":100,"wires":[["d0c7d15.677f73"]]},{"id":"d0c7d15.677f73","type":"debug","z":"7cfb0a19.d152fc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":490,"y":100,"wires":[]},{"id":"4d31db1d.329f64","type":"mqtt-broker","z":"","name":"","broker":"mqtt.beebotte.com","port":"8883","tls":"","clientid":"","usetls":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]
~~~



## 動作確認
Google Home に「ラズパイにこんにちわと送信」と話しかけてみます。
Google Home からは、「ラズパイにこんにちわと送信します」と返答があります。
Node-RED の debugノード で以下のような JSON を受信します。

~~~
{ data: " こんにちは", ispublic: true, ts: 151775699461
~~~
![14.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/a23756a0-6783-07ec-502e-1e67ab807548.jpeg)



MQTTメッセージの受信をフロー開始のトリガーとできるため、メッセージを受信したらexecノードで任意のコマンドを実行することができます。
また、可変なJSONを受信するため、dataの内容をswitchノードで切り分けることも可能です。

以上で、Google Home から IFTTT を経由して Raspberry Pi に指示を出す仕組みは完成です。

## トラブルシューティング
### Google Home
Google Home が正常にコマンドを認識していれば、IFTTT の「 What do you want the Assistant to say in response?」で設定した文章を発声します。
上記の通りでない場合は、IFTTT と GoogleAssistant が正常に連携できていないか、指示者の活舌が悪いことが考えられます。

### IFTTT
アプレットの実行履歴は、アプレットの設定画面の「View activity log」から確認することができます。
![201.png](https://qiita-image-store.s3.amazonaws.com/0/235420/33524627-3075-d684-8516-6ac298799d4e.png)

IFTTT としてアプレットが正常に動作していれば、「Applet ran」と表示されます。
![201.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/65f83576-d003-a99c-0464-4c824a4faec3.jpeg)

正常に動作していない場合、「Applet skipped」と表示されエラー内容を確認することができます。
下図の場合、エラー内容が「Unable to make web request. Your server returned a 400」と表示されています。
![203.png](https://qiita-image-store.s3.amazonaws.com/0/235420/035c1800-1328-64c7-c0d2-b1ca8f9be2af.png)

REST API 実行時の HTTP code が 400 と表示されています。
HTTP code に対するエラー内容は、以下に記載されています。
実際の切り分けには、Error code も必要となります。 
[Beebotte Documentation REST API ](https://beebotte.com/docs/restapi)

上記のエラー原因は、JSONの記述形式のを指定のものではなくしたためです。
「{"data" : " {{TextField}}"}」とすべきところを「{data : " {{TextField}}"}」としました。


### Beebotte
Channel の 管理画面に、最後に受信したメッセージ内容と受信からの経過時間が表示されます。 
![301.png](https://qiita-image-store.s3.amazonaws.com/0/235420/bf6e6c80-44b1-f108-cbdb-df825408ed0e.png)

また、Beebotte のWEBサイト上で以下のテストが実施可能です。
・Subscribe
・Publish
・Read API
・Write API

以下の記事に手順を記載しました。
[Beebotte の WEBコンソールを利用した MQTTメッセージの送受信テスト](https://qiita.com/minatomirai21/items/a43d9b4aba1a081740cb)

最後に受信したメッセージの内容や、WEBサイト上での Subscribe や Publish により、エラーを切り分けてください。

### Raspberry Pi（Node-RED）
Node-RED の mqtt inノードが、broker（Beebotte）に正常に接続できている場合、ノード下に「接続済」と表示されます。
![302.png](https://qiita-image-store.s3.amazonaws.com/0/235420/c2757f4c-150d-d10b-1034-91d6087a754c.png)

また、起動中のNode-REDのログに以下のように表示されます。

~~~
[info] [mqtt-broker:4d31db1d.329f64] Connected to broker: mqtts://mqtt.beebotte.com:8883
~~~

接続に失敗している場合は、「接続中」などと表示されます。
![303.png](https://qiita-image-store.s3.amazonaws.com/0/235420/e7eb3841-7552-7083-bc05-c624c07db393.png)

また、起動中のNode-REDのログに以下のように表示されます。

~~~
[info] [mqtt-broker:4d31db1d.329f64] Connection failed to broker: mqtts://mqtt.beebotte.com:8883
~~~

上記接続失敗は、TOKENを異なるものに書き換えたためです。

JSONを受信できない場合は、broker への接続をご確認ください。