Arduino-ESP32でAlexaに照明をオン/オフしてもらう

# はじめに
ESP32のArduinoアプリを作るだけで、Alexaに照明をオン/オフしてもらうことができました。（Alexaスキル、Node-RED、IFTTTといったサービスは不使用）

本記事はその備忘録です。（2019/10/30現在で有効なものです）

※注意：NECフォーマットの赤外線リモコンに対応した照明のみが対象です

# 使用したもの
* [ESPr® Developer 32](https://www.switch-science.com/catalog/3210/)　 ※これ以降は「ESP32」と呼称  
* Arduino IDE (バージョン1.8.5) 
* [Echo Dot 第3世代](https://www.amazon.co.jp/%E7%AC%AC3%E4%B8%96%E4%BB%A3%E3%80%81%E3%83%98%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AC%E3%83%BC-Amazon-Unlimited-%E5%80%8B%E4%BA%BA%E3%83%97%E3%83%A9%E3%83%B31%E3%81%8B%E6%9C%88%E5%88%86-%E4%BB%A5%E9%99%8D%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0/dp/B07XQF5CB6)　※AndroidのAlexaアプリにこの機器を登録している状態で本手順を実施しました
* 電子部品(以下の「結線」の項目を参照）

# 結線

以下の通りに繋げて、IO19の制御で赤外線の信号を送るようにします。
　
![connections.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/d8343448-f2bc-76e5-d320-15e3c5affa95.png)

 - 部品リスト
  - 5mm赤外線LED
  - トランジスタ　２ＳＣ１８１５ＧＲ
  - 抵抗（100Ω、10Ω）

# 手順

１. Arduino IDEに以下のライブラリを追加する  

 - [FauxmoESP](https://bitbucket.org/xoseperez/fauxmoesp/src/master/)　(ver.3.1.0)　※1, 3
 - [AsyncTCP](https://github.com/me-no-dev/AsyncTCP)　(ver.1.1.1)　 ※1
 - IRremoteESP8266　(ver.2.6.6)　※2  

※1: zipファイルでインストールしました（[参考記事](http://www.humblesoft.com/wiki/?Arduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)）
※2: Arduino-IDE ライブラリ・マネージャーでインストールしました（[参考記事](http://www.humblesoft.com/wiki/?Arduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)）
※3:「ダウンロード」→「タグ」で特定のバージョンをダウンロードできます

２. Arduinoのスケッチ[(githubに置きました)](https://github.com/bigw00d/esp32_arduino_alexa/blob/master/esp32_alexa_light_control/esp32_alexa_light_control.ino)を取得して、自身の環境のSSIDとパスワードを入れる（以下のコード部分）

```
char ssid[] = "";
char password[] = "";
```

３. スケッチの赤外線信号コード(32bit)※を使用する照明のものに置き換える（以下コードの「0x」から始まる16進数の部分）

```
      case LIGHT_ON:
        Serial.println("LIGHT ON");
        irsend.sendNEC(0x1768800,32); // ON
        alexa_event = NO_EVENT;
        break;
      case LIGHT_OFF:
        Serial.println("LIGHT OFF");
        irsend.sendNEC(0x17688FF,32); // OFF
```

※赤外線信号コードは事前に取得しておく（[参考記事](https://qiita.com/TwDaiki/items/64df9953f0eb63e3e8ef))

４. ESP32にスケッチを書き込む

５. ESP32が起動している状態でアレクサに「デバイスを探して」と言うと、「ライトが見つかりました」とペアリングしてくれる(Alexaアプリを使用してもよいです：[参考記事](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201749240))

６. 「Alexa、ライトをつけて」とか「Alexa、ライト を消して」というとライトをON/OFFしてくれる ※  

※「ライト」という言葉を変えたい場合は以下のコードの"ライト"を変更します（2カ所）:

```
    fauxmo.addDevice("ライト");
    
    fauxmo.onSetState([](unsigned char device_id, const char *device_name, bool state, unsigned char value) {
      //  If you have to do something more involved here set a flag and process it in your main loop
      Serial.printf("Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value);
      if (strcmp(device_name, "ライト") == 0) {
```


# 雑感

「よーし、Alexaスキルを使うぞー」と意気込んでいましたが、調べてみたらArduino IDEだけで実現できて、喜んでいいのか複雑な気持ちになりました。

FauxmoESPというスマートホーム用のライブラリでバージョン3.0.0が正常に動作しないという[記事](https://kuracux.hatenablog.jp/entry/2018/09/21/230649)を見ていましたが、最新版？の3.1.0では問題なく使用できてよかったです。

そして、「IR Remote」という赤外線通信用のライブラリのビルドが通らず途方に暮れかけていたところ、[Lang-Shipさんの記事](https://lang-ship.com/blog/?p=886)を見てIRremoteESP8266を使えばよいとわかりました。（感謝！）

本当に、先人たちの知恵や努力には感謝です。

また、[ゆべねこの足跡さんの記事](https://yubeshicat.hatenablog.com/entry/2019/01/08/010643)が今回のスケッチのベースとなっていますが、それとは別の[クラクスの記録帳さんの記事](https://kuracux.hatenablog.jp/entry/2018/09/21/230649)の通りにやると、声だけでなくAlexaアプリでライトをON/OFFすることができました。

その辺りの違いはライブラリFauxmoESPのバージョンによるもののように思えますが、その辺りはもう少し突っ込んで見てみたいところです。

あと、ESP32 Developerを使用していますが、赤外線LEDのIOを変えればM5Stickでも使えそうです。

それでは、見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・｡)			
			

# 参考記事
 + M5StickCで赤外線リモコンを使う(Lang-Ship)
  + https://lang-ship.com/blog/?p=886
 + AlexaからESP32につながったLEDを操作した話(ゆべねこの足跡)
  + https://yubeshicat.hatenablog.com/entry/2019/01/08/010643
 + ESP32をAmazon Alexaのスマートホームのデバイスに登録する方法(クラクスの記録帳)
  + https://kuracux.hatenablog.jp/entry/2018/09/21/230649

# 更新履歴
* 2019-10-30：新規作成 
* 2019-11-27：「手順」にfauxmoESPの特定バージョンをDLする方法を追記
* 2020-01-16：「使用したもの」の「Echo Dot 第3世代」に補足情報を追記