RaspberryPi
node-red
AmazonEcho
rmmini3
python-broadlink

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

準備

ラズパイの構築リモコンの学習も完了させ、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。「暗くして」と「低くして」で挙動を変えるな。シーリングライトが暗くならず、気がつくまでに時間がかかったじゃないか。

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

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。