IFTTT から Raspberry Pi に指示を出す
以下の記事では、Google Home から IFTTT に連携する方法を記載しました。
Google Home で独自のコマンドを利用する(IFTTT)
本記事では、IFTTT から Raspberry Pi へ指示を出す方法を記載します。
つまり、Google Home から IFTTT を経由し、Raspberry Pi を操作します。
方針
本記事では、MQTTを使用して Raspberry Pi に指示を出すこととします。
MQTTについては、以下の記事等をご参照ください。
MQTTってどんなもの? | さきブログ
今回は、Beebotte を Broker として利用します。
Beebotte では、Rest API でメッセージを Publish することができます。
そこで、IFTTT の that として Webhook を指定し、Beebotte に Publish します。
Raspberry Pi では、Node-RED の mqtt inノード でメッセージを Subscribe します。
Subscribe した後は、受信したメッセージをjson形式に変換し、dataの内容に応じて処理を実行することができます。
Beebotte(MQTT Broker)の設定
まず、Broker である Beebotte を設定します。
Beebotte
Channel の作成
赤枠内の必須入力項目を入力します。
以下は入力例です。
項目 | 入力値 |
---|---|
Channel Name | raspberrypi |
Channel Description | Raspberry Pi |
Resource name | action |
Resource Description | action |
入力が完了したら[Create channel]を選択します。
Channel Token の確認
Channel Token に表示されている文字列(赤文字)を控えます。
IFTTT の設定
Google Home と Beebotte を連携させるアプレットを作成します。
this の設定
this の作成方法詳細は、以下の記事を参照ください。
Google Home で独自のコマンドを利用する(IFTTT)
本記事では、以下の値を入力します。
項目 | 入力値 |
---|---|
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 の設定
[Webhooks]を選択し、[Make a web request]を選択します。
各項目を入力します。
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]を選択し、アプレットを完成させます。
Raspberry Pi(Node-RED)の設定
指示を受ける Raspberry Pi を設定します。
Raspberry Pi では、MQTTメッセージのSubscriberとして Node-REDを使用します。
Node-RED の起動
Node-RED の管理画面へアクセスします。
詳細は以下の記事を参照ください。
Raspberry Pi での Node-Red 利用
mqtt inノードの設定
mqtt inノードを配置し、以下の通り設定します。
- mqtt inノード
項目 | 入力値 |
---|---|
サーバ | 新規に mqtt-broker を追加 → ペンのアイコンを選択して編集画面へ |
トピック | raspberrypi/action |
その他 | デフォルト値 |
- mqtt-broker
<Channel Token>の部分には、Beebotteで確認した Channel Token (赤色の文字列)を入力します。
項目 | 入力値 |
---|---|
[接続タブ] サーバ | mqtt.beebotte.com |
[接続タブ] ポート | 8883 |
[接続タブ] SST/TLS接続を使用 | 有効 |
[セキュリティタブ] ユーザ名 | token:<Channel Token> |
その他 | デフォルト値 |
jsonノードの配置
メッセージは string として受信されるため、扱いやすいように JSON 形式に変換します。
mqtt inノード の後ろに jsonノード を接続します。
debugノードの配置
メッセージを受信できているか確認するために、jsonノードの後に debugノード を接続します。
デプロイ
フローを以下に記します。brokerは個別に設定ください。
[{"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
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」から確認することができます。
IFTTT としてアプレットが正常に動作していれば、「Applet ran」と表示されます。
正常に動作していない場合、「Applet skipped」と表示されエラー内容を確認することができます。
下図の場合、エラー内容が「Unable to make web request. Your server returned a 400」と表示されています。
REST API 実行時の HTTP code が 400 と表示されています。
HTTP code に対するエラー内容は、以下に記載されています。
実際の切り分けには、Error code も必要となります。
Beebotte Documentation REST API
上記のエラー原因は、JSONの記述形式のを指定のものではなくしたためです。
「{"data" : " {{TextField}}"}」とすべきところを「{data : " {{TextField}}"}」としました。
Beebotte
Channel の 管理画面に、最後に受信したメッセージ内容と受信からの経過時間が表示されます。
また、Beebotte のWEBサイト上で以下のテストが実施可能です。
・Subscribe
・Publish
・Read API
・Write API
以下の記事に手順を記載しました。
Beebotte の WEBコンソールを利用した MQTTメッセージの送受信テスト
最後に受信したメッセージの内容や、WEBサイト上での Subscribe や Publish により、エラーを切り分けてください。
Raspberry Pi(Node-RED)
Node-RED の mqtt inノードが、broker(Beebotte)に正常に接続できている場合、ノード下に「接続済」と表示されます。
また、起動中のNode-REDのログに以下のように表示されます。
[info] [mqtt-broker:4d31db1d.329f64] Connected to broker: mqtts://mqtt.beebotte.com:8883
また、起動中のNode-REDのログに以下のように表示されます。
[info] [mqtt-broker:4d31db1d.329f64] Connection failed to broker: mqtts://mqtt.beebotte.com:8883
上記接続失敗は、TOKENを異なるものに書き換えたためです。
JSONを受信できない場合は、broker への接続をご確認ください。