ESP-WROOM-02(ESP-WROOM-32)を使って、ボタンを押したらIFTTTにイベントを送信する箱を作る。

# はじめに
[中国Broadlink社](https://www.ibroadlink.com/)のRM miniという製品があります。赤外線リモコンを学習しておいて、スマホやGoogle Homeからのアクションで、リモコン操作が行えるデバイスです。

Google HomeとRM miniを組み合わせると、いままでの家電をそのままに(赤外線リモコンがついている家電に限られますが)スマートホーム化できる、ナウい仕組みが実現するのです!

「ねえグーグル、電気をつけて」で、家の中の照明を一斉に点灯・消灯するのはとても便利で未来的です。しかし…最初のうちは楽しいのですが、しばらくすると、しゃべるよりスイッチを押したほうがはるかに楽…。
そこで、[IFTTT](https://ifttt.com/)のイベントを発生させる、専用のボタンを[ESP-WROOM-02](http://akizukidenshi.com/catalog/g/gK-12236/)で作ってみました。

※(2020/08/01追記)記事はESP-WROOM-02(ESP8266)で作っていますが、ソースコードはESP32でも使えるように少し直しました(#defineだらけで見にくくなってしまいましたが…)。

# RM miniはIFTTTでコントロールできる。
RM miniシリーズは、密かにクラウド側のバージョンアップを続けており、いつの間にか[IFTTT](https://ifttt.com/)にも対応するようになりました。そのためには、新しいAndroidアプリ「[BroadLink - Universal Remote](https://play.google.com/store/apps/details?id=cn.com.broadlink.econtrol.international&hl=ja)」に乗り換える必要があります。ihcを使っていた方は、そのまま設定も引き継がれます。
設定したら、[https://ifttt.com/broadlink](https://ifttt.com/broadlink) で使えるようになります。サンプルには、「日の出になったら実行する」などあって、これだけでも便利に活用できそうです。
このAndroidアプリで、RMminiの赤外線リモコンの設定を行います。

# IFTTTのWebhookを使う。
[IFTTT](https://ifttt.com/)には、[Webhook](https://ifttt.com/maker_webhooks)機能があります。これを使うと、httpのPOSTをイベントにすることができます。ESP-WROOM-02を使って、ボタンを押したらPOSTするようにすれば、ボタンを押したらIFTTT経由でRM miniにイベントを送ることができます。

[Webhook](https://ifttt.com/maker_webhooks)のページで「Setting」をクリックすれば、APIキーを取得できるので、これをコピーしておきます。

# ESP-WROOM-02でボタンを押したらIFTTTにイベントを送信する箱を作る。
  
これを読んでいる方は、引き出しの中に昔買ったESP-WROOM-02が入っていると思いますので、これを使いましょう。ボタンは、ホームセンターに売っている呼び鈴用のプッシュスイッチを使ってみました。
![s_IMG_20200606_203427247_PORTRAIT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/0b2a257d-c1ea-f268-8224-94e6dda95485.jpeg)

回路図は以下のような感じ。最近はお安い評価ボードが容易に手に入るので、その場合はスイッチ(SW1～SW3)と動作確認用のLEDを配線するだけです。

![ESP-WROOM02-ifttt-btn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/84c60fa3-9c64-5741-c80c-71b2389a550e.png)


# ソースコードを手元の環境に合わせて修正する。
ソースは https://github.com/tonasuzuki/ifttt-btn に置いておきましたので、使ってください。以下を手元の環境に合わせて修正します。
※(2020/08/01追記)記事はESP-WROOM-02(ESP8266)で作っていますが、ソースコードはESP32でも使えるように少し直しました。


- IFTTTのWebhook maker keyを入れる
```#define IFTTT_MAKER_KEY "ここにAPI keyを入れる"```

- 家の無線LANのSSIDとパスワードを書く
```const char ssid[] = "ここにSSIDを入れる";```
```const char pass[] = "ここにpasswordを入れる";```
- ボタンの数と、ボタンを接続したGPIO番号を書く(上記回路図のまま接続したならそのまま)
```#define BUTTON_NUM 3    // ←ボタンの数```
```int nButtonPins[] = {14, 12, 13};  //←GPIO番号を並べる```
- 動作確認用のLEDのGPIO番号を書く。(上記回路図のまま接続したならそのまま)
```#define LED_PIN 5```

- Light sleepまでの時間を設定する。
```#define BUTTON_SLEEP_TIME (300*1000)  //←5分後にLight sleep```
```#define BUTTON_SLEEP_TIME 0  //←Light sleepしない場合```
    - 最後にボタンを押したあと、指定ミリ秒経過後にLight sleepする時間です。Light sleep中は消費電力が1mAくらいになるらしいので、電池で駆動したい場合などは設定するといいでしょう。ただし、ボタンを押したら無線LANに接続するのに数秒かかるので、ちょっとイライラします(笑)。Light sleepしなくないならば、0を設定します。 

接続したボタンを押すと、IFTTTのwebhookに「esp-buttons1」のようなイベントが送信されます。(イベント名の最後の「1」は、押したボタンによって変わります)。
なお、送信はhttpsではなくてhttpです。(httpsのお手軽な実装方法、よくわからないです…)

# IFTTTでトリガーに合わせた処理内容を設定する。
あとは、IFTTTのwebhookイベントに、Broadlinkのアクションを設定します。
![IFTTT_action.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/b00d19c3-70c4-8c99-b334-9a6f165710ae.jpeg)

なお、アクションに設定できるリモコン操作は、1つだけです。ボタンを押したら、複数の照明をONにするなど、一つのイベントで、複数のアクションを実行させたい場合は、同じイベント名でアクションを複数作ります。
![IFTTT_action2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/bccc626d-9e0c-b60e-62e5-29b12736a02d.jpeg)

# 最後に
ボタンを押したら、IFTTTにイベントを送信するだけの箱を作ってみました。上記事例では照明をつけたりしていますが、IFTTTのイベントを発生させるだけなので、例えば雨が降ったらLINEでメッセージを送るなど、応用が効くとか思います。みなさんも試してみてください。