Alexa Gadgets toolkitから自作スマートリモコンで家電操作

今年9月の技術書典7で「[スマートスピーカーでおうちハック](https://booth.pm/ja/items/1560393)」という、VUIの活用事例の同人誌を売っていたところ、yumu19さんにお買い上げいただきまして、このアドベントカレンダーにもお誘いいただきました。ありがとうございます。うおおお！


## やりたいこと

今年の9月に「Alexaカスタムスキル」に対応した「Alexa Gadgets Toolkit」を使い、Raspberry Piで作った赤外線リモコンで **エアコン** を操作したいと思います。

SwitchBotやNatureRemoなどスマートリモコンを買えば出来る事なのですが、せっかくAmazonがEchoからBluetoothをぶっ放せるようにしてくれたので、DIYに挑戦してみました。


## 材料

・Amazon Echo Show5
・Raspberry Pi3 
・スマートリモコン部品一式
　参考）格安スマートリモコンの作り方
　https://qiita.com/takjg/items/e6b8af53421be54b62c9

作業環境
・Mac Book Air 11' (OS : High Sierra)
・VS Code



## 手順


###1. Raspberry Piで赤外線リモコンを作る

まず最初に、ラズパイ側を用意します。
大変わかりやすく丁寧な記事があったので参考にさせていただきました。

格安スマートリモコンの作り方
https://qiita.com/takjg/items/e6b8af53421be54b62c9
この中で「ラズパイで回路を制御」までをやります。
「ユニバーサル基盤へのハンダ付け」は飛ばしました。


「赤外線を受信する回路」と「赤外線を発信する回路」を１枚のブレッドボードに入れた時の完成図がわからなかったんですが、ブレッドボードの左右に分けてそれぞれの回路の部品をさして、ジャンパワイヤーも説明にあった合計6本分をラズパイのGPIOと繋いだら両方の回路が動きました。以下がその完成図です。

![RaspberryPi.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/63e5645f-93b7-3f81-46e3-d66b4d85da1f.jpeg)

#### 動かなくて困った時の便利なデバッグ方法
ブレッドボードの右の方に灰色っぽいLEDが刺さってます。ここが赤外線を発信する際に使われるのですが、可視光線ではないので通電してるかどうかがわかりません。そこでデバッグ時にはLチカする時に使う、そこらへんに落ちて居た赤いLEDに差し替えて確認をしました。

#### 赤外線のパターンを学習させて実行しても、動かない機種もある

私の場合、天井の電灯とエアコンの二つを操作対象にしたかったのですが、電灯の方はウンともスンともいいませんでした。
回路が間違えたかなぁ？と何時間もハマって、ひょっとして他のリモコンでやったら動くのでは？とエアコンのリモコンで試したら一発で動きました。

#### ラズパイと対象家電の距離や障害物

赤外線LEDが1個だと出力が弱くて、2m程度しか届きませんでした。
また、ラズパイと対象家電の周りに障害物があると、割とあっさり届かないです。。


#### sh化しておく

動作確認ができたら、ラズパイ内で他のPythonからexec実行できるようにsh化します。piユーザー配下に置きました。サンプルは[こちら。](https://github.com/sitopp/AlexaGadgetsToolkit-RemoCon/tree/master/RaspberryPi/%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E9%83%A8%E5%88%86)

```
エアコンをつけるコマンド
/home/pi/infrared-remocon/homebot/bin/pi-send.sh airconon

エアコンを消すコマンド
/home/pi/infrared-remocon/homebot/bin/pi-send.sh airconoff
```



###2. AVSに登録する

製品を売るわけではないですが、Amazon Developerサイトに"製品"を登録してIDを発行する必要があります。やり方は公式を参照ください。

https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples#registering-a-gadget-in-the-alexa-voice-service-developer-console

ここのページの、以下の部分を実行します。

- Registering a gadget in the Alexa Voice Service Developer Console
 - 入力例）
 - 製品名：RemoCon
 - 製品ID：RemoCon_Gadget
 - 製品タイプ：Alexa ガジェット
 - 商品カテゴリー：その他、リモコン
 - 製品概要：リモコンですー
 - 画像：（セットしない）
 - この製品を商品として配信する予定ですか ?：いいえ

- Installation


###3. Alexaスキルの作成

[Alexa Gadgets ToolkitのサンプルはGithubに公開されており](https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples
)、スクリーンショット満載の詳しい作成手順もあります。全部英語ですが、Google翻訳に頼りながら一通りやると大変勉強になります。今回の試みは、Alexaカスタムスキルとラズパイ上のPythonのプログラムが双方向に命令を送りあう「colorcycler」を流用して作りました。参考になる部分だけを引用しながら進めます。

#### 「家電リモコン」Alexaスキルコードをダウンロード

自分の書いたサンプルコードをGithubにアップしましたので、作業用PCにCloneしてください。
https://github.com/sitopp/AlexaGadgetsToolkit-RemoCon

展開すると、以下のようになっています。

```
AlexaGadgetsToolkit-RemoCon/
　├ AlexaSkill/
　│　└ NodeJS/ 
　│　　　└ lambda/
　│　　　│　└ custom/
　│　　　│　　└ index.js
　│　　　└ models/
　│　　　│　└ ja-JP.json
　│　　　└ skill.json
　└ RaspberryPi/
　　　└ AlexaGadgetsToolkit対応部分
　　　│　└remocon.ini
　　　│　└remocon.py
　　　└ リモコン部分
　　　　　└pi-learn.sh
　　　　　└pi-send.sh
```

この中の「AlexaSkill」以下を使います。詳しいスキルの使い方を書くと長尺になってしまうので、またしても公式の説明を借ります。


https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples/tree/master/src/examples/colorcycler#prepare-the-skill-code-for-deployment-nodejs-version

- Prepare the skill code for Deployment (NodeJS Version
- Create your Lambda function
- Create your skill （注1、注2）
- Test your skill
 
注1. Add utterance samples for Amazon. は何を言ってるのかわかりづらいですが、発話サンプルを記述したJsonを「Jsonエディター」で編集してね、という意味です。そこで、「ja-JP.json」をエディタなどで開いて、中身を全部コピペしてください。

注2. 「18.On the left, select Invocation.〜」のところのキャプチャ画像に「color cycler」と書かれていますが、私のサンプルコードを使うと「家電リモコン」になるはずです。
 

###4.ラズパイとAmazon Echoをペアリング

#### AVSで登録した製品のIDをiniファイルに書く

まず、さっき作った製品のIDを確認します。
https://developer.amazon.com/alexa/console/avs
上記にアクセスし、「製品」＞「RemoCon」をクリック。
すると以下の画面が開きます。

![AVS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/4885ff08-bbfc-888c-7dfb-4790ea3c3426.png)


次にパソコン上のエディタでremocon.iniファイルを開き、上の画面から「Amazon ID」と「Alexa ガジェットのシークレット」をコピーして記入します。

例）
Amazon ID が「1234567890」
Alexa ガジェットのシークレット が「hogehogehogehogehogehoge」だった場合

```remocon.ini
[GadgetSettings]
amazonId = 1234567890
alexaGadgetSecret = hogehogehogehogehogehoge

[GadgetCapabilities]
Custom.RemoConGadget = 1.0
```

#### ラズパイ上にAlexa Gadgets Toolkit関連のファイルを置く


```
cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Samples/src/examples
mkdir remocon
vi remocon.py
（サンプルコードの「remocon.py」の中身を貼り付けて保存。）
vi remocon.ini
（上で編集した「remocon.ini」の中身を貼り付けて保存。）

```

#### Echoとペアリング

同じディレクトリで、続けて以下のコマンドを実行します。

```
chmod 755 remocon.py
python3 remocon.py 
```

now in pairing mode〜というメッセージが出たら、Echoとペアリングをしてください。

説明はこちら。https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples/blob/master/README.md#pairing-your-gadget-to-an-echo-device


 - Echo DotやEcho Plusなど画面なし端末の場合「If you're using an Echo device without a screen」
 
 - Echo ShowやEcho Show5など画面有り端末の場合は「If you're using an Echo device with a screen」

画面有り端末の方が圧倒的に楽でした。

#### ペアリングのトラブルシュート

もしエラーが出てしまったら、[こちら](https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples/blob/master/README.md#troubleshooting-guide)にトラブルシュート方法が乗ってますので、頑張って解決してください。私も何種類かエラーが出ました。。


###5. 家電リモコン操作

いよいよ通しでの動作確認です。
赤外線リモコンが、ちゃんと対象家電の1〜2m以内にあることを確認してから、
Echoに向かって、命令を伝えましょう。

```
あなた「アレクサ、家電リモコンを開いて」
Echo「お館様、ご命令を」
あなた「暖房をつけて」
Echo「暖房をつけます」
```

 
そういえば、忍者ごっこをしててAlexaのセリフを時代劇風にしたまま、Githubにコミットしてしまいました。うわぁぁぁ はずかしー

まっ、いいか。適当に直して使ってください。


###6. まとめ

これで説明は終わりです。
いかがでしょうか？
書いてて、やっぱりNature Remoを買った方が早いよね。。という気がしてきました(笑)

ですがAlexa Gadgets Toolkitの実力はこんなもんじゃございません。
Echoがしゃべっている内容と連動してロボット同士が戦うとか、
早押しクイズのボタンを作ったりもできるようです。
リファレンスを読んでたら、リップシンクも使えるようなので、
3Dキャラをしゃべらせられたらいいなぁ。。などと夢が膨らみます。



以上です！
みなさま、来年も良いお年を！(^o^)