LINEから家のエアコンを操作する with ESP32
今回はネットワーク上のトリガーによってローカルでアクションを起こすということをやっていきます。ということで、前からずっとやってみたかったLINEから家のエアコンの操作するシステムを作ってみました!
目次
実行環境
システム構成
トリガーとなるワードが送信されたことが確認されたらCloudMQTTにPublishするコードをHerokuにデプロイします。バックエンド側のスクリプトはGoで書きました。
CloudMQTTについて
数あるMQTTブローカのうちの1つ。Herokuのadd onとして利用できるサービスですが、CloudMQTT単体でもサービスを提供しているようです。いくつかの料金プランが用意されていますが、今回は無料プランであるCut Catを使います。無料プランには以下の制限がありますが個人で遊ぶ程度なら十分です。
準備
ソフトウェア領域
- LINEアカウントとLINE developersへの登録
- HerokuアカウントとHerokuCLIがインストールされた環境
- Go言語で開発する環境
- Arduino IDEのインストール
- 赤外線データ(データの取得にはこちらを利用しました)
- Arduinoライブラリのインストール(括弧内は実行時バージョン)
- PubSubClient(2.7.0)
- IRremote(2.2.3)
IRremoteについては本家ではESP32での赤外線送信は対応していないため、こちらの方のものを使わせていただきます。
$ cd your_Arduino_Dir/libraries $ git clone https://github.com/SensorsIot/Arduino-IRremote.git IRremote
ハードウェア領域
- ESPr Developer 32(ESP32)
- 赤外線LED
- MOSFET 2N7000
- 電池ボックス(単三2本)
- ジャンパワイヤ数本
- 抵抗(15Ω, 100Ω共に1/4W)
知識
作業
1 LINE チャネル作成と設定。
プロバイダーの作成は省略します。チャネルはMessaging APIとして作成し、プランはDeveloper Trialとします。チャネル基本設定画面まで行ったらChannel Secret
とアクセストークン
をどこかにメモしておきましょう。その後以下の設定をします。
メッセージ送受信設定
- Webhook送信 : 利用する
LINE@機能の利用
- 自動応答メッセージ : 利用しない
- 友だち追加時あいさつ : 利用しない
下の2つは必須ではないですが、毎回出てくると鬱陶しいのでこの設定にしておくのがオススメです。
2 Herokuにアプリをデプロイする
このアプリ内ではLINEから送られてきたメッセージの処理とCloudMQTTへのPublishを行います。
2.1 プロジェクトファイル作成
$ cd $GOPATH/src $ mkdir [アプリ名] $ cd [アプリ名] $ pwd /あなたのGOPATH/src/[アプリ名]
2.2 Herokuへのログインとその他諸々
$ pwd /あなたのGOPATH/src/[アプリ名] $ echo 'web: [アプリ名]' > Procfile $ git init $ git add . $ git commit -m “first commit” $ heroku login $ heroku create [アプリ名] -b https://github.com/heroku/heroku-buildpack-go.git $ heroku config:set CHANNEL_SECRET="[Developer用管理画面で取得したChannel Secret]" $ heroku config:set CHANNEL_TOKEN="[Developer用管理画面で取得したChannel Access Token]" $ heroku addons:add cloudmqtt
Procfileには、Heroku上で自分のアプリケーションを動かすためのコマンドが記述されます。Buildpackの中で自動的にgoプログラムをgo build
して go install
で$GOPATH/bin
にインストールされる仕組みになっているため、web:
の後はherokuプロジェクト名を書くのが定石のようです。
ここでさっきメモしたChannel Secret
とアクセストークン
をherokuの環境変数として登録しておきます。また、add on であるCloudMQTTもこの段階で登録しておきます。add onの登録ができたらherokuの環境変数にCLOUDMQTT_URL
が追加されているので$ heroku config:get CLOUDMQTT_URL
で環境変数を取得しどこかにコピペしておきます。デフォルトではmqtt://User:Password@Server:Port
となっているはずです。$ heroku addons:open cloudmqtt
でCloudMQTTのページに飛べるので環境変数と見比べてみてください。
確認すると分かるのですが、デフォルトではポートがMQTTポートになっていますね。コーディングするときのことを考えて、この部分をSSLポートに変えておきましょう。
$ heroku config:set CLOUDMQTT_URL="mqtt://User:Password@Server:SSLPort"
2.3 コードを書く
一応httpで来た時はhttpsにリダイレクトするようにしました。トピックはesp32/airconとしました。
2.4 CA証明書の取得
こちらのページよりPEM形式のルート証明書を取ってきます。テキストエディターにコピーしてca-certificates.crt
として保存しましょう。
2.5 デプロイ
パッケージ依存関係の保存をしてデプロイします。godep
をインストールしていない方は$ go get github.com/tools/godep
でインストールしましょう。
$ godep save $ godep go install $ git add . $ git commit -m “second commit” $ git push heroku master
最終的にはこんな構造になります。
$ tree -L 1 . . ├── Godeps ├── Procfile ├── ca-certificates.crt ├── main.go └── vendor
2.6 LINEのWebhook URLの設定
https://[アプリ名].herokuapp.com/callback
という形で登録します。さて、ここまで来たら第一段階突破です。友達登録を済ませたらCloudMQTTのWEBSOCKET UIを開きましょう。LINEで「つけて」「けして」と送信してみてCloudMQTTにメッセージがPublishされたら成功です。
3 ESP32のコードを書く
config.h
// Wi-FiアクセスポイントのSSIDとパスワード const char *ssid = "your_ssid"; const char *password = "your_password"; // クライアントID(任意) const char *clientID = "Arduino"; //CLOUDMQTT const char *host = "CloudMQTT_Server"; const char *CloudMQTT_user = "CloudMQTT_User"; const char *CloudMQTT_pass = "CloudMQTT_Password"; const int port = CloudMQTT_SSLPort; const char *topic = "esp32/aircon";
certificate.h
const char* ca_cert = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\n" \ ... 略 ... "mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n" \ "-----END CERTIFICATE-----\n" \ ;
CA証明書は先ほどのものと同じものを利用します。しかし、上記のようにArduinoに読み込ませるには少し変換が必要なようです。手打ちでやるのも面倒なのでこちらの方のプログラムを利用させていただき、証明書の変換をします。
最後にコードをESP32に書き込みます。
4 回路を組む
本体にはUSBで給電します。ゲート抵抗は100Ωにしました。赤外線LEDには100mAまで流せるので100mA流れる想定で考えます。赤外線LEDにつなぐ抵抗ですが、赤外線LEDにかかる電圧は1.35~1.6Vらしいので、1.35Vと見積もることにしてオームの法則を適用すると大体15Ωくらいがベストだと考えられます。
完成
ESP32がCloudMQTTに接続している状況でLINEにてメッセージを送るとエアコンがつくようになります。
LINE - CloudMQTT(SSL接続) - ESP32で家のエアコンを制御
— ゆべしネコ (@yubeshineko) 2019年1月4日
※最初音量注意かも? pic.twitter.com/j9UtC7yuBk
今後
ESP32を電池で駆動してみたいと考えていますが、どうやらWiFi接続している時はかなり電力を消費するらしいです。センサーの値を一定時間ごとに通知するなどのシステムでは一瞬だけWiFiに接続して後は解除するということができるのですがサーバに接続しっぱなしで電池駆動するとなると半日も持たないかもしれないですね...
ということで、気が向いたらそこらへんの実装をしてみたいと思います。ではでは...
参考サイト
- Herokuアプリ
GitHub - line/line-bot-sdk-go: Go SDK for the LINE Messaging API
HerokuとGoでLINEの Messaging API環境を作ってみた - Qiita
Documentation - Go | CloudMQTT
MQTT の golang クライアントで TLS 接続を試す - Qiita
- Arduinoコード
Google Home + IFTTT + Beebotte(MQTT Broker) + ESP32でLチカしてみた - Qiita