Alexa SDK for Node.js Ver2を使ったメール送信とJSONによるデータの受渡し」ではカスタムスキルを使用しましたが、自作のESP8266書き込みツールのオンボードLEDをスマートホームデバイスとするスマートホームスキルを作成します。スマートホームデバイス「LED」として登録し、「Alexa、LEDを点けて」「Alexa、LEDを消して」などのフレーズでLEDの点灯/消灯を制御します。自作のESP8266書き込みツールのスケッチにはesp8266-alexa-wemo-emulator-masterライブラリを使用し、WeMoエミュレーションを行います。esp8266-alexa-wemo-emulator-masterライブラリの詳細については、「witnessmenow/esp8266-alexa-wemo-emulator」を参照してください。

自作のESP8266書き込みツールについて

自作のESP8266書き込みツールは、ESP8266をスイッチサイエンスのESP-WROOM-02ピッチ変換用基板にはんだ付けし、タクトスイッチを用いてModeスイッチとResetスイッチを作成して、Arduino IDEでESP8266のスケッチを書き込めるようにしたツールです。パソコンとESP8266を接続するUSBのために、USB-シリアル変換モジュール「FT232RL」(秋月電子通商製)を使用しています。

自作のESP8266書き込みツール

Echo DotとWeMo Switch間のプロトコル

Echo DotとWeMo Switch間のプロトコルを次に示します。WeMo SwitchはEcho Dotと同一のWi-Fiネットワークに接続されている必要があり、UDPプロトコルによりWeMo Switchを検出します。

Echo DotとWeMo Switch間のプロトコル
【参考】「Alexa – NodeMCU: WeMo Emulation Made Simple」から抜粋

依存ライブラリのセットアップ

ESP8266開発環境(Arduino IDE 1.8.5)に、「witnessmenow/esp8266-alexa-wemo-emulator」から取得したAlexa Wemo switch emulatorライブラリzipファイル「esp8266-alexa-wemo-emulator-master.zip」をインストールします。

ダウンロードしたzipファイル形式のライブラリをArduino IDEに登録する方法を次に示します。
Arduino IDEのスケッチメニューを選択し、順に「ライブラリをインクルード」「.zip形式のライブラリをインストール…」をクリックし、表示されたファイル選択ダイアログで、タウンロードしたライブラリを選択します。

zipファイル形式のライブラリの登録方法

ESP8266書き込みツールのスケッチの作成

ダウンロードした「esp8266-alexa-wemo-emulator-master\examples\SingleSwitch\SingleSwitch.ino」を基に次にようにスケッチを作成します。

  • 15,16行目に、それぞれ、WiFiのSSIDとパスワードを設定します。
  • 22目で、ESP8266書き込みツールのLEDのGPIO名「16」を設定します。
  • 50行目で、WemoSwitchクラスのインスタンスを行います。パラメータは順に、Alexa スキルの呼び出し名, TCPポート番号, 点灯のコールバック, 消灯のコールバックとなります。
  • 51行目で、addDeviceメソッドで作成したインスタンスをWemoManagerクラスに登録します。

wemoalexa.ino

#include <ESP8266WiFi.h>

#include "WemoSwitch.h"
#include "WemoManager.h"
#include "CallbackFunction.h"

// prototypes
boolean connectWifi();

//on/off callbacks
void lightOn();
void lightOff();

//------- Replace the following! ------
char ssid[] = "xxxxx";       // your network SSID (name)
char password[] = "xxxxxx";  // your network key

WemoManager wemoManager;
WemoSwitch *light = NULL;

//const int ledPin = BUILTIN_LED;
const int ledPin = 16;

void setup()
{
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was Previously
  // connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Attempt to connect to Wifi network:
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  IPAddress ip = WiFi.localIP();
  Serial.println(ip);

  wemoManager.begin();
  // Format: Alexa invocation name, local port no, on callback, off callback
  light = new WemoSwitch("LED", 80, lightOn, lightOff);
  wemoManager.addDevice(*light);

  pinMode(ledPin, OUTPUT); // initialize digital ledPin as an output.
  delay(10);
  digitalWrite(ledPin, HIGH); // Wemos BUILTIN_LED is active Low, so high is off
}

void loop()
{
  wemoManager.serverLoop();
}

void lightOn() {
    Serial.print("Switch 1 turn on ...");
    digitalWrite(ledPin, LOW);
}

void lightOff() {
    Serial.print("Switch 1 turn off ...");
    digitalWrite(ledPin, HIGH);
}

Alexaスマートホームデバイスの検出

スケッチ「wemoalexa.ino」をESP8266に書き込んだ後、 Alexaにエミュレートしたスマートホームデバイスを検出させるために、パソコン上のデスクトップブラウザよりAlexaアプリをアクセスします。左側のメニューから「スマートホーム」を選択し、表示された画面の「デバイス」を選択し、検出ボタンを押して、スマートホームデバイスを検出します。検出が終了すると、次のように「LED WeMo Switch」と表示され、LEDがスマートホームデバイス名となります。

Alexaデバイス登録

Echo DotでLチカ実施

Echo Dotに向かって「Alexa、豆電球を点けて」と言うと自作のESP8266書き込みツールのオンボードLEDが点灯し、「Alexa、豆電球を消して」と言うと自作のESP8266書き込みツールのオンボードLEDが消灯します。

【参考】ライブラリ「FauxMoESP」とその依存ライブラリ

スマートホームデバイスにするために別のライブラリ「FauxMoESP」を使ってみましたが、スマートホームスキルとしての動作が確認できませんでした。ここにメモ書きとして残しておきます。
ESP8266開発環境(Arduino IDE 1.8.5)に次のライブラリをインストールします。()内は今回使用したzipファイル名を示します。

  1. ESPAsyncTCPライブラリ(ESPAsyncTCP-master.zip
  2. ESPAsyncUDPライブラリ(https://github.com/me-no-dev/ESPAsyncUDP/archive/master.zip)
  3. FauxMoESPライブラリ(xoseperez-fauxmoesp-3b05b7b7f111.zipをクリックして、「リポジトリをダウンロードする」を選択)