Noed-RED(enebular)でAlexaから家電を操作してみる

# はじめに
Alexaから独自に家電を操作する方法としてはスマートホームスキルを自作方法がありますが、認証を実装したりと敷居が高いです。
手軽に実装する方法として[Node-RED](https://nodered.org/)を利用した「[Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk/)」というサービスを使用する方法があります。
今回[enebular](https://www.enebular.com/ja/index.html)からも利用可能であるNode-REDを使用してAlexaからの家電操作を実装してみようと思います。



# Node-RED Alexa Home Skill Bridge
これは仕組みがよくできていて、一般的にAlexaのスマートホームスキルはスキルとそれに対応する家電デバイスが1:1で紐付きます。
対してNode-RED Alexa Home Skill Bridgeは、一般的なスマートホームスキル同様「[Node-RED](https://www.amazon.co.jp/Ben-Hardill-Node-RED/dp/B01N0D97FZ)」というスキルがありますが、これに対応するデバイスをNode-RED Alexa Home Skill BridgeのWebページより仮想デバイスとして登録できるのです。
Webページで登録した仮想デバイスはAlexaアプリ上でも表示され、複数デバイスを登録できるのでAlexaアプリでも登録した分だけ仮想デバイスが表示されます。



# Alexaスマートホームスキルの仕組み
Alexaスマートホームスキルは色々と決まりごとがあって、家電種別ごとに可能な操作が指定されています。
照明であればオン/オフや色温度の変更といった操作で、エアコンであればオン/オフや温度/湿度の変更といった、あらかじめ決められた操作のみを指定できます。
なので例えば、シーリングファンの場合はオン/オフや色温度の変更は可能ですが、ファンの回転速度や回転方向は現状Alexaスキルから指定できません。

[サポートされるデバイスの種類（amazon alexa）](https://developer.amazon.com/ja/docs/smarthome/understand-the-smart-home-skill-api.html#what-kind-of-devices-are-supported)

これは音声操作時の発話の制限にもつながっており、「アレクサ、照明をパーリーモード」といった独自の発話指定は行なえません。
あくまで操作発話は「アレクサ、照明つけて」や「アレクサ、照明明るくして」といったプリセットに絞られます。
※「照明」といった機器名はNode-RED Alexa Home Skill Bridgeでの仮想デバイス登録時に好きに決められます。



# enebular
実はまだ触りたてであまり理解できていないのですが、エッジデバイスの統合デプロイ環境みたいな感じかなとふんわり把握しています。
Node-REDを内部的持っているようで、enebularのクラウド環境にデプロイできるようです。
またログとかも色々可視化できるようなので、このあたりの機能もおいおい触ってみたいなと思っています。



# 家電操作の流れ
Firebaseに対し家電操作コマンドをHTTP Putすることで、ラズパイから変更を検知して家の家電を操作する仕組みが既にあるので、今回はAlexaへ話しかけてからFirebaseへのコマンド書き込みまでをゴールとしようと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/f619a2a0-d3da-7274-f6c5-a44aa6f09642.png)

ラズパイ以降の仕組みについては以下の記事が参考となるかと思います。
[Google Homeでやったことまとめ](https://qiita.com/miso_develop/items/99624915d3d6e41a5fb3)



# 実装

## Node-RED Alexa Home Skill Bridge
Node-RED Alexa Home Skill Bridgeを以下の流れで操作します。

1. アカウントの作成
1. 仮想デバイスを追加
1. Alexaスキル「Node-RED」を有効化
1. Alexaアプリのスマートホームから仮想デバイス検出

こちらの記事にて要点を絞って解説されているので、こちらに沿っていけばすんなりいけると思います。
[1. アカウント作成（Node-RED Alexa Home Skill Bridgeを設定する[On Onion Omega2+]）](https://qiita.com/spiderx_jp/items/20b5cb9418296dd0c5cd#1-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)



## enebular
enebularは以下の流れになります。

1. アカウント作成
1. Project作成
1. フローの編集

こちらも公式ドキュメントにて丁寧に解説されていますので、こちらに沿っていけばすんなりいけると思います。
[Introduction（enebular）](https://docs.enebular.com/ja/GetStarted/Introduction.html)



## Node-RED

### ノードの追加
最初に「node-red-contrib-alexa-home-skill」ノードと「node-red-contrib-firebase」追加しておく必要があります。
追加方法は、

Node-RED画面右上のハンバーガーアイコン > パレットの管理 > ノードを追加タブ > 検索 > ノードを追加ボタン

となります。



### フローの最終型
最終的にこのようなフローとなりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/2bc01b2f-521d-4fd1-68f5-2b42be0f1ac6.png)

#### alexa homeノード
一番左のノードがalexa homeノードとなります。
ここはNode-RED Alexa Home Skill Bridgeで登録したデバイスを指定します。

alexa homeノードの設定方法はこちらの記事が参考になると思います。
[フロー作成（Node-RED Alexa Home Skill Bridgeを設定する[On Onion Omega2+]）](https://qiita.com/spiderx_jp/items/20b5cb9418296dd0c5cd#%E3%83%95%E3%83%AD%E3%83%BC%E4%BD%9C%E6%88%90)

#### functionノード
左から2つ目がfunctionノードとなります。
alexa homeノードのデバイス名を元にFirebaseへ書き込む家電操作コマンドを組み立てます。

例えば「アレクサ電気つけて」という発話であれば「light つけ」とFirebaseへ書き込むよう家電操作コマンドを組み立てています。
※Firebaseから先の仕組みがIFTTTのGoogle Assistantベースで作られており、Google Assistantでは「つけて」が「つけ て」と形態素解析が行われた結果で返ってくるため、このようなコマンドとなっています。

またテレビのチャンネル操作についてもスマートホームスキル自体は対応していますが、Node-RED Alexa Home Skill Bridgeが対応していません。
なので「二チャン」「四チャン」のように個別に発話を登録しておく必要があります。
Alexaでは日本語の数字は漢数字で表現されるためこのような記述となります。

ここのfunctionノードは漢数字を通常の数字に変換し、Firebaseへ送る家電操作コマンドを組み立てています。

#### firebase modifyノード
一番右にあるのがfirebase modifyノードとなります。
こちらは以下のように設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/bd08dcca-3afb-2d4b-ed08-a459f83137be.png)

|プロパティ|設定値|
|---|---|
|Firebase|[後述します]|
|Child Path|[Firebase Realtime Databaseのパス]|
|Method|set|
|Value|msg.payload|
|Name|（空白）|

Firebaseは初回設定時は「新規に firebase config を追加...」を選択します。
すると以下の設定画面になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/207109/391ca41d-97ed-f747-24c7-7b79ddd41411.png)

ここでは以下のように設定します。

|プロパティ|設定値|
|---|---|
|Firebase|[FirebaseのIDを指定]|
|Auth Type|None|

以上でフローの構築は完了です。
ちなみにfirebaseノードの下にあるのはdebugノードなのであってもなくてもいいです。

### デプロイ
最後にデプロイを行います。
画面右上のデプロイボタンを押すだけです。

デプロイが完了しましたらAlexaに話しかけて家電を自由自在に操作してみてください。



# さいごに
Node-REDのようなビジュアルプログラミングのメリットは、プログラムができない人でも比較的とっかかりやすいという点があると思いますが、プログラムができる人にも仕組みがパっと見で大体理解できるというメリットがあると思います。
コードだとやはりコメントや仕様書、メモを残しておかないと実装後に時間をおいてから触るときに困りますが、ビジュアルプログラミングでは画面を見ただけでかなりの量の情報を把握できます。

複雑な仕組みになってくるとつらみが増すとは思いますが、MVCでいうModelをコードで管理し、ControlをNode-REDで管理するといった使い分けを行うことで保守性の高いシステムを構築できるのではないかと思います。