準備
ラズパイの構築もリモコンの学習も完了させ、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。