LoginSignup
34
22

More than 3 years have passed since last update.

Google Home + IFTTT + Beebotte(MQTT Broker) + ESP32でLチカしてみた

Last updated at Posted at 2018-05-13

MQTTはPub/Subモデルの軽量なメッセージプロトコルで、IoTやM2Mでも利用されています。

BeebotteはMQTTブローカー(メッセージの配信を仲介するサーバー)のひとつで、API(URL)を叩くことでメッセージを流すこともできます。
1日あたりのメッセージ数が50000件までは無料で使えるので、無料枠でもかなり遊べるのが魅力的です。

IFTTTはWebhooksでAPI(URL)を叩くことはできますが、MQTTブローカーとしては機能しません。

そこでIFTTTとBeebotteを組み合わせることで、IFTTTにある任意のトリガー(今回はGoogle Assistant)でIoT機器へメッセージを配信することができます。今回はESP32をGoogle Homeから操作してみたいと思います。

構成図.png

この記事で紹介する内容では、最低限やっておきたいセキュリティ対策としてWiFiのパスフレーズのハッシュ化と MQTT over SSL/TLS による通信の暗号化を実施します。
(IFTTT -> Beebotte 間と Beebotte -> ESP32 間がトークンを使った単純な認証を用いているため、トークンを定期的に更新するとより良いです)

動作環境

Beebotteの設定

Beebotteにアクセスしてログインし、Control Panelを開き、Create New ボタンをクリックします:

beebotte_01.png

Channel Nameには beebotte_test, Channel Descriptionには google home -> ifttt -> beebotte -> esp32(適当な説明), Resource nameには led, Resource Descriptionには led on/off(適当な説明)を入力し、Create Channelボタンをクリックします:

beebotte_02.png

作成されたチャンネル名をクリックしてChannel Token(token_xxxxxxxxxxxxxxxx のような形式)を取得します:

beebotte_03.png

ESP32にスケッチを書き込む

スケッチとツールのダウンロード

mascii/esp32-beebottle から Clone or download -> Download ZIP でZIPファイルをダウンロードして解凍するか、リポジトリを git clone します

必要なライブラリのインストール

先ほどダウンロードしたスケッチで knolleary/pubsubclientbblanchon/ArduinoJson
(6.x系)が必要なので、以下のいずれかの方法でインストールします:

  • Arduino IDE上の スケッチ->ライブラリをインクルード->ライブラリを管理 で、PubSubClient と ArduinoJson を検索してインストール
    • ArduinoJsonは6.x系をインストール
  • knolleary/pubsubclientbblanchon/ArduinoJson のリポジトリをZIPファイルとしてダウンロードし、Arduino IDE上の スケッチ->ライブラリをインクルード->.ZIP形式のライブラリをインストール でダウンロードした2つのZIPファイルを読みこむ

CA証明書のダウンロード

https://beebotte.com/certs/mqtt.beebotte.com.pem からCA証明書をダウンロードし、先ほどダウンロードしたスケッチと同じディレクトリに置きます

CA証明書の変換

macOSなどBashがある方は bash convcert.sh mqtt.beebotte.com.pem, Node.jsが入っている方は node convcert mqtt.beebotte.com.pem を実行すると、certificate.h(Arduino スケッチが読み込める形式のCA証明書) が作成されます。

BashやNode.jsがない環境(Windowsなど)の場合は、メモ帳以外の改行コードLFに対応したエディタ(Atom, VSCode, TeraPad, サクラエディタなど)を用いて以下の手順で certificate.h を作成します:

  • mqtt.beebotte.com.pem をテキストエディタで開き、内容をコピー
  • convcert.html をブラウザで開いてコピーした内容を変換(JavaScriptの実行許可が必要)
  • 変換された内容をコピーし、テキストエディタに貼り付けてスケッチと同じディレクトリ上に certificate.h として保存

ie11.png

設定ファイルの作成

config_sample.h をコピーして config.h を作成し、WiFiとBeebotteの設定を行います。

WiFiの password は平文のまま(そのまま入力)でも構いませんが、ハッシュ化した値を入力することを推奨します。
ESP32のArduinoスケッチにWi-Fiのパスワードを平文で書くのはやめよう!

config.h
// Wi-FiアクセスポイントのSSIDとパスワード
const char *ssid = "SSID";
const char *password = "0000000000000000000000000000000000000000000000000000000000000000";

// クライアントID(任意)
const char *clientID = "ESP32";

// Beebotteのチャンネルトークン
const char* channelToken = "token_xxxxxxxxxxxxxxxx";

// トピック名("channel/resource"の形式)
const char* topic = "beebotte_test/led";

スケッチの書き込み

スケッチ(esp32-beebottle.ino)内の #define LED_PIN 2 でLEDのピンを指定しているので、適宜変更してください。
このスケッチを書き込む前に、簡単なLチカのスケッチを試しておくと良いかもしれません。

LEDのピン指定を確認したら、Arduino IDE上の ツール -> ボード での設定が ESP32 Dev Module となっていることを確認して、スケッチをESP32に書き込みします。

ArduinoIDE_01

ESP32とBeebotteの動作確認

Arduino IDEのシリアルモニタで、WiFiとMQTTの接続が確立していることを確認します:

ArduinoIDE_02.png

macOSなどcurlコマンドがある場合は、以下のコマンドでLEDを点灯させることができるはずです:

curl -d '{"data":"led_on"}' -H "Content-Type: application/json" -X POST \
 'https://api.beebotte.com/v1/data/publish/beebotte_test/led?token=token_xxxxxxxxxxxxxxxx'

curlコマンドがない場合は、Beebotteの Account Settings -> Access Management で Secret Key をコピーし、Console上 の Secret Key に貼り付けて、PublishのフォームにChannel: beebotte_test, Resource: led, Data: led_on を入力してPublish dataボタンを押すことで、LEDを点灯させることができるはずです:

beebotte_04.png

beebotte_05.png

IFTTTの設定

IFTTTにアクセスしてログインし、以下のような内容でアプレットを作成します(LEDをオンにする例)。

Step 1. Choose a service (this)

Google Assistant.png
Google Assistantを選択します

Step 2. Choose trigger

ifttt_step2.png

"Say a simple phrase" を選択します

Step 2. Complete trigger fields

設定項目 設定内容
What do you want to say? 電気つけて
What's another way to say it? (optional) 電気をつけて
And another way? (optional) ライトをオン
What do you want the Assistant to say in response? 点灯します
Language Japanese

ここは、ご自身がGoogle Homeに話す癖や、好みを反映した方が良いです。

Step 3. Choose action service (that)

Webhooks.png
Webhooksを選択します

Step 4. Choose action

Make a web request.png
"Make a web request" を選択します

Step 5. Complete action fields

設定項目 設定内容
URL 例) https://api.beebotte.com/v1/data/publish/beebotte_test/led?token=token_xxxxxxxxxxxxxxxx
Method POST
Content Type application/json
Body {"data":"led_on"} (オフの場合は{"data":"led_off"})

tokenは適切なものに置き換えてください

Step 6. Review and finish

アプレットの名前を決定して Finish します。

動作確認(話かけてLEDを点灯させる)

「OK Google, 電気つけて」で、LEDが点灯しました!

感想

この構成は多分できるんだろなと思っていましたが、いざちゃんとやろうとすると一筋縄ではいかなかったりしました(今回は証明書まわりなど)。
今回の記事も多くの人に試してもらえたらいいなと思い、少し面倒ですがWindowsとMac両方を考慮して記事やコードを書きました。
OS間の差異やTLSについてなど、自分自身の勉強にもなりました。

お手軽さを求めるのなら、Beebotteの代わりにBlynk(恐らくMQTTではなく独自プロトコルを用いている)を使った構成のほうが良さそうな感じでした。
通信経路が一部暗号化されていないですが、こちらをまず試してみるのもありだと思いました。
Google Homeに話しかけてESP32でLチカしてみる(@miso_developさんの記事)

参考文献

34
22
0

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
34
22