Amazon Echoから家電を制御 1 ~node-red-contrib-alexa-local~

# 準備
[ラズパイの構築](https://qiita.com/tstkkmd/items/2c6dfde68ebbc90b0bb1)も[リモコンの学習](https://qiita.com/tstkkmd/items/71db748dc75127a84fe8)も完了させ、Node-REDにフローを書きます。描きます？
コードを書けないのでNode-REDは本当助かります。レゴ マインドストームみたい。

ブラウザから`http://{ラズパイのアドレス}:1880/`にアクセスします。

# node-red-contrib-alexa-localのインストール
Node-REDの右上にある「三」をクリックするとメニューが出てきます。
メニューの中から「パレットの管理」をクリックします。
「ノードを追加」タブで「node-red-contrib-alexa-local」を検索、「ノードを追加」します。

現在のバージョンではEcho Dotからのみデバイスを検索できるようです。
ついうっかり無印にDotを買い足したから使えたけれど...

「node-red-contrib-alexa-home-skill」なんてのもありますが、ukにあるサーバーがたまに落ちてるので、不意に操作ができなくなります。って言うか、操作できなくなったので乗り換えました。


# フローの作成
コードを書くことも、そもそもの知識もないので試行錯誤しました。
とりあえず先ほど追加したnode-red-contrib-alexa-localノードをフローエディタに置いてダブルクリックしてデバイス名をつけます。alexaに話しかけたとき、alexaが認識してくれるよう日本語で名付けます。
よし、お前は今日からテレビだ。

### 「alexa、デバイスを探して」
見つかりました。Philips Hueとして認識されるようです。テレビなのに電球です。

んで、なにするの？となるのですが、execノードも置いて`~/python-broadlink/cli/tv.sh on`を書いてデプロイ。当然、検索して沢山の先人の知恵をお借りしました。

### 「alexa、テレビをつけて」
ついた。電源入った。なんだ、Node-REDなんて簡単じゃん。ちょろいなNode-RED。当然先人の知恵のおかげです。

さて。デバイスに一対一でexecノードなんて作り方してたら醜いしカッコ悪い。
テレビをつけるか消すかしかできないし。

### そうだ、条件分岐しよう。
debugノードを接続して見るとなにやらmsg.payloadに"on"とあります。プロパティ？なにそれ。msg.payload？なにそれ。
ほう、alexaは「つけて」を"on"に変換するのか。
msg.briとかmsg.on_off_commandとか種類あるじゃん。わかんないよ。
もう少し条件分岐していろんなことをやらせたいので、switchノードを置きます。
switchノードで分岐するため、分岐できる条件を探します。
先ほどのdebugノードを眺めてmsg.bri、msg.on、msg.on_off_command、msg.change_directionが掛け声によりどのように変化するか確認します。

### その結果

|msg.|on|on_off_command|bri|change_direction|
|:-:|:-:|:-:|:-:|:-:|
|つけて|true|true|不定|0|
|けして|false|true|0|0|
|明るくして|true|false|74|1|
|大きくして|true|false|74|1|
|暗くして|true|false|24|-1|
|低くして|true|false|39|0|

おい、msg.bri。「暗くして」と「低くして」で挙動を変えるな。シーリングライトが暗くならず、気がつくまでに時間がかかったじゃないか。

### 後日、もう少し調べてみました
[Amazon Echoから家電を制御 1.25 ~node-red-contrib-alexa-localの日本語の情報が少ないのでもう少し調べてみる~](https://qiita.com/tstkkmd/items/6884e38dd6a4f9965e42)

### 見辛いのでひとまず、明暗を削除します

|msg.|on|on_off_command|bri|change_direction|
|:-:|:-:|:-:|:-:|:-:|
|つけて|true|true|不定|0|
|けして|false|true|0|0|
|大きくして|true|false|74|1|
|低くして|true|false|39|0|

msg.briを不定と書いたのは、msg.saved_briというのがあって、こいつが直前のbriを保持しやがるせいのようです。たぶん。

さて、さっきのswitchノードをダブルクリック。
msg.payloadをmsg.onに書き換え、端子を「==」から「is true」に変更し、端子を追加して「is false」も設定します。
そして各端子をいい感じにexecノードに接続。デプロイ。

### 「alexa、テレビをつけて」
alexa「はい」
よーし。ちょろいな。Node-RED。

### 「alexa、テレビをけして」
「はい」
...
**ん？**

暫くのち。

ああ...
execノードには引数として"on"をつけてました。
その引数を削除し、payloadにチェックを付けます。
payloadってことはmsg.onではダメなんだろうなと思いながらもデプロイ。

### 「alexa、テレビをけして？」
「はい」
...
知ってた。知っててやったもん。
msg.onをmsg.payloadに変換？する方法はないものか...と再び先人の知恵をお借りします。
なかなかこれだ！！という記事が見つからず途方にくれていました。
changeノードを置いて「値の代入」をクリックして見るとあるじゃないか。

**「値の移動」**

これでmsg.onをmsg.payloadに変換？できました。
さぁ、デプロイ。

### 「alexa、テレビをけして！！！！！！！！」
「はい」
よーし。よーし。よーーーーし。



ちょ、ちょろいな。Node-RED。


# Amazon Echoで遊ぼう
### 前提環境
[大凡1.5ｈで構築するraspberry pi + node-red + samba](https://qiita.com/tstkkmd/items/2c6dfde68ebbc90b0bb1)
### Amazon Echoから家電を制御シリーズ
[Amazon Echoから家電を制御 0 ~RMmini3 + python-broadlinkで学習~](https://qiita.com/tstkkmd/items/71db748dc75127a84fe8)
[Amazon Echoから家電を制御 1 ~node-red-contrib-alexa-local~](https://qiita.com/tstkkmd/items/10fb586be83de96bfe24)
[Amazon Echoから家電を制御 1.25 ~node-red-contrib-alexa-localの日本語の情報が少ないのでもう少し調べてみる~](https://qiita.com/tstkkmd/items/6884e38dd6a4f9965e42)
[Amazon Echoから家電を制御 2 ~テレビを我が手中に収めてやった 基本操作編~](https://qiita.com/tstkkmd/items/75771caeac9f00f3b668)
[Amazon Echoから家電を制御 3 ~テレビを我が手中に収めてやった ch操作編~](https://qiita.com/tstkkmd/items/a8c7a5ab001d6e299366)
[node-red-dashboardでwebリモコンを作ってみた](https://qiita.com/tstkkmd/items/5d205c8aacf32b9e3ecf)