LoginSignup
96

More than 5 years have passed since last update.

IFTTT から Raspberry Pi に指示を出す

Last updated at Posted at 2018-02-05

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の内容に応じて処理を実行することができます。
1.png

Beebotte(MQTT Broker)の設定

まず、Broker である Beebotte を設定します。
Beebotte
101.png

Channel の作成

[Create new]を選択します。
1.png

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

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

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

2.jpg

Channel Token の確認

作成した Channel を選択します
3.png

Channel Token に表示されている文字列(赤文字)を控えます。
4.png

IFTTT の設定

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

this の設定

this の作成方法詳細は、以下の記事を参照ください。
Google Home で独自のコマンドを利用する(IFTTT)
102.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

[Webhooks]を選択し、[Make a web request]を選択します。
3.jpg

各項目を入力します。
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

Raspberry Pi(Node-RED)の設定

指示を受ける Raspberry Pi を設定します。
Raspberry Pi では、MQTTメッセージのSubscriberとして Node-REDを使用します。
105.png

Node-RED の起動

Node-RED の管理画面へアクセスします。
詳細は以下の記事を参照ください。
Raspberry Pi での Node-Red 利用

mqtt inノードの設定

4.jpg

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

  • mqtt inノード
項目 入力値
サーバ 新規に mqtt-broker を追加
→ ペンのアイコンを選択して編集画面へ
トピック raspberrypi/action
その他 デフォルト値

10.jpg

  • mqtt-broker

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

項目 入力値
[接続タブ] サーバ mqtt.beebotte.com
[接続タブ] ポート 8883
[接続タブ] SST/TLS接続を使用 有効
[セキュリティタブ] ユーザ名 token:<Channel Token>
その他 デフォルト値

11.jpg

12.png

jsonノードの配置

12.jpg

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

debugノードの配置

13.jpg

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

デプロイ

フローが完成したらデプロイします。
13.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

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

IFTTT としてアプレットが正常に動作していれば、「Applet ran」と表示されます。
201.jpg

正常に動作していない場合、「Applet skipped」と表示されエラー内容を確認することができます。
下図の場合、エラー内容が「Unable to make web request. Your server returned a 400」と表示されています。
203.png

REST API 実行時の HTTP code が 400 と表示されています。
HTTP code に対するエラー内容は、以下に記載されています。
実際の切り分けには、Error code も必要となります。
Beebotte Documentation REST API

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

Beebotte

Channel の 管理画面に、最後に受信したメッセージ内容と受信からの経過時間が表示されます。
301.png

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

以下の記事に手順を記載しました。
Beebotte の WEBコンソールを利用した MQTTメッセージの送受信テスト

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

Raspberry Pi(Node-RED)

Node-RED の mqtt inノードが、broker(Beebotte)に正常に接続できている場合、ノード下に「接続済」と表示されます。
302.png

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

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

接続に失敗している場合は、「接続中」などと表示されます。
303.png

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

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
96