Arduino MKR WiFi 1010 で始める Arduino IoT Cloud【その3：Alexa連携編】

Arduino MKR WiFi 1010 に関し、以下の 2つの記事の内容を進めて、Arduino MKR WiFi 1010 に内蔵された LED の ON/OFF を Arduino IoT Cloud のダッシュボードのスイッチと連動させる、ということをやっていました。

- [Arduino MKR WiFi 1010 で始める Arduino IoT Cloud【下準備編】 - Qiita](https://qiita.com/youtoy/items/930f0e05302785856366)
- [Arduino MKR WiFi 1010 で始める Arduino IoT Cloud【その2：ダッシュボード連携編】 - Qiita](https://qiita.com/youtoy/items/e247056e1696161ebba1)

今回は上記で行った内容を流用して、AIアシスタントの Alexa との連携を行ってみます。
上記の 2つ目の記事と同様に内蔵LED の ON/OFF を制御する、という内容にしたので、以下のツイートの動画のように大変地味なデモとなっています 笑

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Arduino MKR WiFi 1010内蔵の LED を使ったので地味すぎる動画だけど、 <a href="https://twitter.com/hashtag/Alexa?src=hash&amp;ref_src=twsrc%5Etfw">#Alexa</a> との連携ができた！<br><br>↓Arduino IoT Cloud のダッシュボード連携の話を記事に書いてたけど、これに少し追加をするだけで実現できてしまった！<a href="https://t.co/myATl67ZkO">https://t.co/myATl67ZkO</a><a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://twitter.com/hashtag/ArduinoIoTCloud?src=hash&amp;ref_src=twsrc%5Etfw">#ArduinoIoTCloud</a> <a href="https://twitter.com/hashtag/ArduinoCloud?src=hash&amp;ref_src=twsrc%5Etfw">#ArduinoCloud</a> <a href="https://twitter.com/hashtag/IoTLT?src=hash&amp;ref_src=twsrc%5Etfw">#IoTLT</a> <a href="https://t.co/AteNN7iIV0">pic.twitter.com/AteNN7iIV0</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1426772783623589899?ref_src=twsrc%5Etfw">August 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Arduino MKR WiFi 1010 と Alexa の連携の話
Arduino MKR WiFi 1010 に関して 3つ目となる以下の記事を書いた際、記事の中の [「Alexa Integration」という項目の部分](https://qiita.com/youtoy/items/7885aa0e85e1dbf78cdc#alexa-integration)で、Alexa連携の話に軽く触れていました。

●Arduino Cloud と Arduino IoT Cloud などの情報を整理してみる【未完】 - Qiita
　https://qiita.com/youtoy/items/7885aa0e85e1dbf78cdc

具体的には、以下の 1つ目の記事と、その記事の中に書かれていた 以下の 2つ目から 5つ目の項目の内容を掲載していました。

- [Remote working with Arduino: Alexa and the Arduino IoT Cloud | Arduino Blog](https://blog.arduino.cc/2020/05/13/remote-working-with-arduino-alexa-and-the-arduino-iot-cloud/)
- [Arduino IoT Cloud Amazon Alexa Integration - Arduino Project Hub](https://create.arduino.cc/projecthub/303628/arduino-iot-cloud-amazon-alexa-integration-4e6078)
- ["Alexa, Light My Mood" - Arduino Project Hub](https://create.arduino.cc/projecthub/315381/alexa-light-my-mood-885534)
- [Full Control of Your TV Using Alexa and Arduino IoT Cloud - Arduino Project Hub](https://create.arduino.cc/projecthub/313276/full-control-of-your-tv-using-alexa-and-arduino-iot-cloud-9e7c4d)
- [Create a voice-controlled device with Alexa and Arduino IoT Cloud in 7 minutes | Arduino Blog](https://blog.arduino.cc/2019/11/12/create-a-voice-controlled-device-with-alexa-and-arduino-iot-cloud-in-7-minutes/)

この時点では、「Alexa連携が気になる話の 1つで、情報源はこのあたり」というのを書いていただけだったのですが、そんな中、以下のツイートを見かけて実際に動作させられることが分かりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Arduino MKR WiFi 1010を使ってAlexa連携をやってみました！<br><br>公式にサポートされたArduino cloud IoTを使ったら簡単に実現できました😊<br><br>調査必須ですが、Arduinoデバイスをセンサーとして認識させることもできるようなので、オリジナルセンサーによる定型アクションも実現できそう👍 <a href="https://t.co/XKnrBFVeaR">pic.twitter.com/XKnrBFVeaR</a></p>&mdash; norippy@車 x IoT研究中 (@Norio_Delux) <a href="https://twitter.com/Norio_Delux/status/1426589942805712901?ref_src=twsrc%5Etfw">August 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今回の実践を進めるに到った経緯は、上記のような流れでした。

### ポイントとなる内容を整理する
上で書いていた 5つのリンクのうち、2つ目の以下の内容が、「Getting the Alexa skill」という感じの書かれ方でリンクされていたので、これを見てみました。

●Arduino IoT Cloud Amazon Alexa Integration - Arduino Project Hub
　https://create.arduino.cc/projecthub/303628/arduino-iot-cloud-amazon-alexa-integration-4e6078

とりあえず、まずは Arduino MKR WiFi 1010 のみでできる（内蔵LED のみでできる）という形にしたかったので、それに必要そうな内容のみを見ていきました。
（材料のパートで書かれていたシールドやフルカラーLED などは不要となるように進めました）

#### 必要な開発環境や Alexaスキルについての概要
もう少し先を見ていくと、必要な開発環境や Alexaスキルなどが書いてありました。
![必要な開発環境など.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ea8af962-1596-b874-7d5c-92b84fd5872c.jpeg)

Alexaスキルに関する話以外は、[冒頭に書いていたセットアップ編の記事](https://qiita.com/youtoy/items/930f0e05302785856366)と、[同じく冒頭に書いていたダッシュボード連携を行った記事](https://qiita.com/youtoy/items/e247056e1696161ebba1)で実施したものが大半でした。

具体的には、以前の 2つの記事を進めたことで、今回必要な手順の中の以下を済ませた状態となっています。

- Arduino Cloud のアカウントは作成済み
- 「Arduino Create plugin（Arduino Create Agent）」はセットアップ済み
- Arduino IoT Cloud にデバイスを 1台登録済み
   - 登録デバイスと紐付いた「変数」の設定をお試し済み
   - Wi-Fi用の情報（SSID とパスワード）は登録済み
- オンラインの Web Editor からデバイスへのプログラム書き込みが成功したのを確認済み

ちなみに、過去の2つの記事の内容を進めた結果、以下のツイートの動画の内容が実現できている、という状態です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Arduino IoT Cloud のダッシュボード上に設置した「スイッチウィジェットの ON/OFF」と、「Arduino MKR WiFi 1010内蔵の LED の ON/OFF」とを連動させられた！！<a href="https://twitter.com/hashtag/IoTLT?src=hash&amp;ref_src=twsrc%5Etfw">#IoTLT</a> の発表に向け、また一歩前進した！<a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://twitter.com/hashtag/ArduinoIoTCloud?src=hash&amp;ref_src=twsrc%5Etfw">#ArduinoIoTCloud</a> <a href="https://t.co/u7WwWS1RzK">pic.twitter.com/u7WwWS1RzK</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1425373685666312193?ref_src=twsrc%5Etfw">August 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ここで、何らか Alexa連携をするための重要な要素を少し足してやれば、良さそうな感じがしました。

[上であげていたドキュメント](https://create.arduino.cc/projecthub/303628/arduino-iot-cloud-amazon-alexa-integration-4e6078)を見ていくと、ポイントになるのは「Arduino IoT Cloud上で設定する 変数 を Alexa連携に対応したものにすること（以下の画像の部分に書かれている内容）」が 1つあるようでした。
![ポイントになる部分（変数）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/661188fd-c2e2-0ad5-4c8f-9a0bc546f4be.jpeg)

それともう 1つ、重要になるのが以下の Arduino用の Alexaスキルで、こちらを用いてアカウントリンクを行う（Alexa と Arduino Cloud用アカウントを紐付ける）ということも行う必要があるようでした。

●Amazon.co.jp: Arduino : Alexaスキル
　https://www.amazon.co.jp/Arduino-LLC/dp/B07ZT2PK2H/
![Arduino用のAlexaスキル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ba31d6e4-bc90-b522-2c90-941a72c07c5c.jpeg)

これらを設定しておくと、Arduino MKR WiFi 1010 が、Alexa から見て Alexa対応デバイス（スマートホーム端末）として検出できるようです。

上記の話の詳細は、この後で書いていきます。

### Alexa連携を試す
繰り返しになりますが、これ以降の手順を進めるにあたり、以下の記事に書かれた「アカウントの作成やデバイスの登録」といった内容は行っておいてください。

- [Arduino MKR WiFi 1010 で始める Arduino IoT Cloud【下準備編】 - Qiita](https://qiita.com/youtoy/items/930f0e05302785856366)
- [Arduino MKR WiFi 1010 で始める Arduino IoT Cloud【その2：ダッシュボード連携編】 - Qiita](https://qiita.com/youtoy/items/e247056e1696161ebba1)

#### Alexaスキル関連の対応
Alexaスキルに関する部分について、まずはスマホの Alexaアプリ上で以下の操作を進めていきました。

Alexaアプリで、Arduino用のスキルを有効化します。
![手順1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/198443a2-f5a4-0f2d-d7ff-367fcb8b4b66.jpeg)

次にアカウントリンクを行う画面が出るので、Arduino Cloud のアカウントのログイン用情報を入力してください。
![手順2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d96995c8-3a0f-cb6e-e37a-03927123b783.jpeg)
そして、以下のようにアカウントリンクが正常に行われたという表示が出るのを確認してください。
![手順3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/36c6ef6d-29d4-5fa5-3250-dc18d3a6aa39.jpeg)

その後、以下の画面が出てきますが、後で別の画面から検索ができるので、今はキャンセルして Arduino IoT Cloud・Arduino MKR WiFi 1010関連の準備を進めてみます。
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f3bb4159-8fcc-71cd-bd65-b5d1e00ead83.jpeg)

#### Arduino IoT Cloud上で変数を追加する
Arduino IoT Cloud で登録済みデバイスを選択した後のトップの画面で、左側にある「Variable」の部分で、「ADD」と書かれたボタンを押します。
![デバイス選択後の画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d81c5920-4853-5f48-9983-8a4b129cbc93.jpeg)

その後の画面でポイントになるのは、「Select variable type」と書かれた中で、表示される変数の種類の絞り込みを行う部分に「Alexa compatible」という部分があるので、これを選択することです。
![変数設定でのフィルター.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/cd7fd0e3-65e9-b075-6fbf-1f5f579eee24.jpeg)
これによって、Alexa連携に必要な変数のみが表示された状態になるようでした。
![フィルター後の表示.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8a048bc1-ef74-5e14-dd14-32e31b4f8a2f.jpeg)

今回、Arduino MKR WiFi 1010内蔵の LED の ON/OFF を扱うので、「Alexa compatible」を選択した状態で表示された中の、それに該当しそうな true/false の値をとる「Light」を選びました。
変数名は適当に「alexa_light」として、他の設定はデフォルトのままにしました。
![自分が設定した変数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bc0e06f9-3f4c-e5d3-8d59-6c7db897dbad.jpeg)

#### プログラムを書き込む
上記の変数の追加を行うと、[前回のダッシュボード連携を行った際のプログラム]
(https://qiita.com/youtoy/items/e247056e1696161ebba1)に少しだけ処理が加わったものが自動で生成されていました。

具体的には、プログラムの最後に以下の部分が追加されていました。

```c
void onAlexaLightChange() {
}
```

内容的には、[前回の記事で書いたプログラム]
(https://qiita.com/youtoy/items/e247056e1696161ebba1)の中の、ダッシュボード上のスイッチに関わる処理（スイッチの ON/OFF に連動して動く処理）と同じ内容（ `led_status = !led_status;` という処理）を書いてやればとりあえず動きそうです。

最終的に、以下のプログラムを Arduino MKR WiFi 1010 に書き込みました。

```c
#include "thingProperties.h"

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  
  Serial.begin(9600);
  delay(1500); 

  initProperties();

  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  setDebugMessageLevel(4);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
}

void onLightChange() {
  if(light){
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

void onAlexaLightChange() {
  if(alexa_light){
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}
```

### Alexaアプリでデバイスを登録する
ここまでの準備ができたら、Alexaアプリから Arduino MKR WiFi 1010 を使えるようにするための設定の続きを進めます。

Alexaアプリのデバイスタブを開きます。
![手順A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/aa3042d4-b8dc-0a8b-fe9a-c0a84b530190.jpeg)

画面右上にある「黒丸に白い十字が描かれたボタン」を押して、その後に画面下に表示されるリストの「デバイスの追加」を選択します。
![手順B.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/678e6eb4-a95f-df7f-d78b-f1214c546f38.jpeg)

その後に出てくるリストの一番下の「その他」を選びます。
![手順C.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0cbcb1d8-ffd6-9247-022e-2f67aef6c0d5.jpeg)
次の画面では「デバイスを検出と書かれたボタン」を押します。
![手順D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3754a7e3-29b7-cee9-9899-58228f6c5f7e.jpeg)
そうすると「接続するデバイスを検出中...」と表示されるので、しばらく待ってみてください。

しばらくすると、以下のように Arduino MKR WiFi 1010 がスマートホーム端末の「ライト」として検出されました。
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f0ecf3ac-6b41-3cf5-df81-f0dc9c9f0ca7.jpeg)

デバイスを検出できて接続された状態になると、スマホの Alexaアプリの上部にある横並びのリストの「すべてのデバイス」を選んだ際に、Arduino MKR WiFi 1010 が追加されているのが確認できます。
![すべてのデバイスのアイコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/39772d9b-c2db-9847-53cf-74be518c1a6c.jpeg)

以下のように「alexa_light」という、Arduino IoT Cloud上で変数名として設定した名称で、リストの中に登録されていました。
![Arduino MKR WiFi 1010 が追加された状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1ada9b9f-5dfc-4172-15b7-5ab63cb0a47f.jpeg)

### Alexaアプリで定型アクションを設定する
ここまでできれば、あとは Alexaアプリの中で定型アクションとして設定すれば、Alexaアプリやスマートスピーカーから Arduino MKR WiFi 1010 の制御を行うことができます。

自分の場合、Alexaアプリの「その他」のタブを選んだ中の「定型アクション」の中で、ON/OFF を制御するためのものを追加して試しました。
![Alexaアプリの「その他」のタブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ffe53c54-7cc5-9633-1d87-dea32be2cc16.jpeg)
例えば、以下は LED を ON にするための定型アクションです。
![LED を ON にするための定型アクション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/45ce897e-5f98-de8c-3ebe-6703e880e7f8.jpeg)

ここでは、定型アクションについての説明やその設定方法の詳細は省きますが、気になる方は以下のページ等をご覧ください。

- [Amazon.co.jp ヘルプ: Alexa定型アクションについて](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GJWYQVSUF3W9V7N9)
- [Amazon.co.jp ヘルプ: Alexa定型アクションをセットアップする](https://www.amazon.co.jp/gp/help/customer/display.html/ref=vnid_G2PYLKJN3XVZ55EQ?nodeId=G2PYLKJN3XVZ55EQ)
- [Amazon.co.jp: Alexaの定型アクションを活用しよう: Alexaスキル](amazon.co.jp/b?ie=UTF8&node=7468186051)

## まとめ
今回、Alexa と Arduino MKR WiFi 1010 との連携を試して動作させることができました。

試した内容が内蔵LED の ON/OFF のみで、Arduino IoT Cloud上での変数設定の項目を見た感じだと、他にもいろいろな機能を組み合わせられそうだったため、さらに詳細を調べたりできればと思います。

## 【追記】
@norippy_i　さんが記事を書かれたとのことで、追記しました。
[内蔵された RGB LED を使う方法](https://docs.arduino.cc/tutorials/mkr-wifi-1010/built-in-rgb)、良いな。

●Arduino MKR WiFi 1010 を Arduino IoT Cloudを使ってAlexa対応デバイスをつくる - Qiita
　https://qiita.com/norippy_i/items/d59c39ca50d88287ab57