ATOM LiteをAlexa対応デバイス化


ATOM MatrixをいろいろいじっていくうちにシンプルなATOM Liteも欲しいなと思って、購入しました。

購入したのはとATOM Matrixと同じく[スイッチサイエンス](https://www.switch-science.com/catalog/6262/)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/f33ae221-f312-23cc-40cf-82b85aeb8c12.png)


中身はほぼ一緒ですが、ATOM Martixと比べて、LEDが25個から1個になったのと6軸センサが付いていません。
高さが半分近くになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e422d51e-fde9-214b-a3b9-3708f575cbf2.png)

# Alexa（Amazon Echo）とデバイスの連携について
私のうちの中では、Amazon Echoを部屋ごとに配置していて、リビングの照明などはAlexaでコントロールできるようにしています。
以前に書いた[新しくなったenebularを使ってみる Vol.2　～Amazon EchoとMbedを繋げて照明をコントロール～](https://qiita.com/jksoft/items/2f4ebe583353af8db011)では、Node-REDとWebサービスを組んで行っていましたが、大掛かりなので、ローカルネットで完結できないかと思って、調べてみるとESPシリーズ向けにデバイスをAlexa対応デバイスにできるライブラリを見つけたので、ATOM Liteを使って試してみます。

# ATOM LiteをAlexa対応デバイス化
ATOM Liteのセットアップ方法はATOM Matrixと同様なので、[ATOM Matrixを触ってみた](https://qiita.com/jksoft/items/fa92281f90bcbc32929c)を参照してください。
照明をON/OFFできるように[Grove リレー](https://www.switch-science.com/catalog/807/)を繋げています。（プログラムではATOM LiteのLEDもON/OFFしてるので、お試しの場合はリレーが無くても大丈夫です。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/37eecfc1-e535-35e2-76b4-217e0ae7b206.png)


## ライブラリの追加
見つけたライブラリは[FauxmoESP](https://bitbucket.org/xoseperez/fauxmoesp/src/master/)というものです。
ArduinoIDEのライブラリマネージャで検索すればインストールできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/cd89609d-8483-901b-a0a3-3adf56477e25.png)

FauxmoESPの中で[AsyncTCP](https://github.com/me-no-dev/AsyncTCP)というライブラリも使っているようなので、こちらもインストールします。こちらはGitubからZIP形式でダウンロードして、インストールします。

## プログラム
FauxmoESPのexampleを参考にプログラムを作りました。
FauxmoESPに対して、デバイス名とコールバックを設定すれば動作したので、基本的には簡単に応用できると思います。
コールバック関数の中身は軽くしてねとコメントがあったので、コールバック関数の中で変数を変更して、loop関数の中でそれを検出して、処理するようにしています。
ATOM Lite上のスイッチでもON/OFFできるようにしています。

```cpp
#include "M5Atom.h"
#include <WiFi.h>
#include "fauxmoESP.h"

const int RelayPin = 32;
const char DEVICE_NAME[] = "light";

typedef enum {
    NO_EVENT    = 0,
    LIGHT_ON,
    LIGHT_OFF
} EVENT;

fauxmoESP fauxmo;

// Wi-FiのSSID
const char* ssid = "ssid";
// Wi-Fiのパスワード
const char* password = "pass";

volatile EVENT event = NO_EVENT;

// コールバック関数 登録したデバイスにAlexaからイベント来ると呼ばれる
void AlexaCallback(unsigned char device_id, const char *device_name, bool state, unsigned char value) {
  Serial.printf("Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value);
  if (strcmp(device_name, DEVICE_NAME) == 0) {
      if(state) {
        event = LIGHT_ON;
      } else {
        event = LIGHT_OFF;
      }
  }
}

// コントロールON / OFF
void LightControl(bool value) {
  if(value){
    Serial.println("ON");
    M5.dis.drawpix(0, 0xf00000);
    digitalWrite(RelayPin, HIGH);
  } else {
    Serial.println("OFF");
    M5.dis.drawpix(0, 0x000000);
    digitalWrite(RelayPin, LOW);
  }
}

void setup() {
  
  pinMode(RelayPin, OUTPUT);
  digitalWrite(RelayPin, LOW);
  
  M5.begin(true, false, true);
  delay(50);
  M5.dis.drawpix(0, 0x000000);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.print("WiFi connected\r\nIP address: ");
  Serial.println(WiFi.localIP());

  fauxmo.createServer(true);
  fauxmo.setPort(80);
  fauxmo.enable(true);

  // デバイス名を登録
  fauxmo.addDevice(DEVICE_NAME);

  // コールバック関数を登録
  fauxmo.onSetState(AlexaCallback);
}

void loop() {
  static bool state =false;
  
  if (M5.Btn.wasPressed()) {
    if(state) {
      event = LIGHT_OFF;
    } else {
      event = LIGHT_ON;
    }
  }
  switch (event) {
    case LIGHT_ON:
      LightControl(true);
      state = true;
      event = NO_EVENT;
      break;
    case LIGHT_OFF:
      LightControl(false);
      state = false;
      event = NO_EVENT;
      break;
    default:
      break;
  }
  
  fauxmo.handle();
  delay(50);
  M5.update();
}


```

## 結果
Amazon EchoもしくはスマホのAlexaアプリで、「デバイスを探して」というとデバイスの検出が始まります。「新しいデバイスが見つかりました」となれば、成功です。
Alexaアプリの「すべてのデバイス」に「light」という名前のデバイスが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/d4907bf9-6b8e-089c-4808-e7236fb532f4.png)
(Royal Philips Electronicsスマートデバイスと出てくるので、そのデバイスを模擬しているかんじですかね)

あとはAmazon EchoもしくはスマホのAlexaアプリに向かって、「ライトを点けて」or「ライトを消して」という風に言えばライトをON/OFFします。
![unnamed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e6fab0f9-1493-da1c-f501-91924e4f6d7a.gif)
[youtube](https://youtu.be/fEKq3Rp09kE)

もちろん中身は同じなので、ATOM Matrixでも同じことができます。