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から操作してみたいと思います。
この記事で紹介する内容では、最低限やっておきたいセキュリティ対策としてWiFiのパスフレーズのハッシュ化と MQTT over SSL/TLS による通信の暗号化を実施します。
(IFTTT -> Beebotte 間と Beebotte -> ESP32 間がトークンを使った単純な認証を用いているため、トークンを定期的に更新するとより良いです)
動作環境
-
MH-ET LIVE ESP32 MiniKitなどのESP-WROOM-32搭載ボード
- 内蔵の青色LED(GPIO 2)をLチカで利用
- Installation instructions for Mac OS または Steps to install Arduino ESP32 support on Windows に書かれている手順でArduino IDEとarduino-esp32をインストール
Beebotteの設定
Beebotteにアクセスしてログインし、Control Panelを開き、Create New ボタンをクリックします:
Channel Nameには beebotte_test
, Channel Descriptionには google home -> ifttt -> beebotte -> esp32
(適当な説明), Resource nameには led
, Resource Descriptionには led on/off
(適当な説明)を入力し、Create Channelボタンをクリックします:
作成されたチャンネル名をクリックしてChannel Token(token_xxxxxxxxxxxxxxxx
のような形式)を取得します:
ESP32にスケッチを書き込む
スケッチとツールのダウンロード
mascii/esp32-beebottle から Clone or download -> Download ZIP でZIPファイルをダウンロードして解凍するか、リポジトリを git clone
します
必要なライブラリのインストール
先ほどダウンロードしたスケッチで knolleary/pubsubclient と bblanchon/ArduinoJson
(6.x系)が必要なので、以下のいずれかの方法でインストールします:
- Arduino IDE上の スケッチ->ライブラリをインクルード->ライブラリを管理 で、PubSubClient と ArduinoJson を検索してインストール
- ArduinoJsonは6.x系をインストール
- knolleary/pubsubclient と bblanchon/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
として保存
設定ファイルの作成
config_sample.h
をコピーして config.h
を作成し、WiFiとBeebotteの設定を行います。
WiFiの password
は平文のまま(そのまま入力)でも構いませんが、ハッシュ化した値を入力することを推奨します。
ESP32のArduinoスケッチにWi-Fiのパスワードを平文で書くのはやめよう!
// 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に書き込みします。
ESP32とBeebotteの動作確認
Arduino IDEのシリアルモニタで、WiFiとMQTTの接続が確立していることを確認します:
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を点灯させることができるはずです:
IFTTTの設定
IFTTTにアクセスしてログインし、以下のような内容でアプレットを作成します(LEDをオンにする例)。
Step 1. Choose a service (this)
Google Assistantを選択しますStep 2. Choose trigger
"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を選択しますStep 4. Choose action
"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を点灯させる)
Google Home + IFTTT + Beebotte + ESP32 で LEDつけてみた pic.twitter.com/Fs4LPABtr9
— mascii (@mascii_k) 2018年5月12日
「OK Google, 電気つけて」で、LEDが点灯しました!
感想
この構成は多分できるんだろなと思っていましたが、いざちゃんとやろうとすると一筋縄ではいかなかったりしました(今回は証明書まわりなど)。
今回の記事も多くの人に試してもらえたらいいなと思い、少し面倒ですがWindowsとMac両方を考慮して記事やコードを書きました。
OS間の差異やTLSについてなど、自分自身の勉強にもなりました。
お手軽さを求めるのなら、Beebotteの代わりにBlynk(恐らくMQTTではなく独自プロトコルを用いている)を使った構成のほうが良さそうな感じでした。
通信経路が一部暗号化されていないですが、こちらをまず試してみるのもありだと思いました。
Google Homeに話しかけてESP32でLチカしてみる(@miso_developさんの記事)