ゆべねこの足跡

IT系のはなしを残しておく場所です

LINEから家のエアコンを操作する with ESP32

今回はネットワーク上のトリガーによってローカルでアクションを起こすということをやっていきます。ということで、前からずっとやってみたかったLINEから家のエアコンの操作するシステムを作ってみました!

目次

実行環境

システム構成

f:id:yubeshineko:20190105133041p:plain

トリガーとなるワードが送信されたことが確認されたらCloudMQTTにPublishするコードをHerokuにデプロイします。バックエンド側のスクリプトはGoで書きました。

CloudMQTTについて

数あるMQTTブローカのうちの1つ。Herokuのadd onとして利用できるサービスですが、CloudMQTT単体でもサービスを提供しているようです。いくつかの料金プランが用意されていますが、今回は無料プランであるCut Catを使います。無料プランには以下の制限がありますが個人で遊ぶ程度なら十分です。

  • 5 connections
  • 5 users
  • 5 acl rules
  • 0 bridges
  • No kinesis integration
  • API now throttled, 30 req/minute

準備

ソフトウェア領域

  • 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

ハードウェア領域

知識

作業

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 回路を組む

f:id:yubeshineko:20190105175640j:plain

本体にはUSBで給電します。ゲート抵抗は100Ωにしました。赤外線LEDには100mAまで流せるので100mA流れる想定で考えます。赤外線LEDにつなぐ抵抗ですが、赤外線LEDにかかる電圧は1.35~1.6Vらしいので、1.35Vと見積もることにしてオームの法則を適用すると大体15Ωくらいがベストだと考えられます。

完成

ESP32がCloudMQTTに接続している状況でLINEにてメッセージを送るとエアコンがつくようになります。

今後

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

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

ESP8266: Connecting to MQTT broker – techtutorialsx