2018年4月7日土曜日

Alexa と Raspberry Pi でルンバに掃除してもらう:(2)Node-RED

前回説明した構成を実際に作っていきます。
今回はNode-REDの部分です。
  1. 材料を揃える。
  2. 母艦のRaspberry PiにNode-REDをセットアップしてAmazon Echo Dotに認識させる【今回】
  3. Raspberry Pi Zero WをヘッドレスでWiFi対応セットアップする
  4. Raspberry Piで赤外線リモコンのコードをコピーする
  5. Node-REDから赤外線機能を呼び出してテレビを操作する
  6. FlashAirのGPIO機能でArduinoをHTTP API経由で制御する
  7. (おまけ)ArduinoからROI経由でルンバを動かす
  8. Arduinoから赤外線経由でルンバを動かす
  9. Node-REDからFlashAir/Arduino経由でルンバを動かす

Alexa で家電を操作するには、Node-REDの他にはIFTTTを使う方法もあるようです。
ただ、IFTTTの場合はAlexaへの呼び掛けが
「Alexa、ルンバをトリガー!」
という、作者が過労で首を痛めそうな感じになってしまいます。
いや、むしろ、「トリガー ON」と言うだけのために IFTTT を使うのも良いかもしれません。

Node-REDとは


話が逸れましたが、Node-REDとAlexaを組み合わせると
「ルンバで掃除して」
という比較的自然な呼び掛けで電源を入れることができます。

Node-REDはフローベースの開発環境です。
開発環境と言っても、基本的にプログラムを書く必要はありません。
Raspberry Pi上で動作するWebアプリになっていて、
ブラウザ上で部品を並べて行くだけで処理を指定できます。


指定できるノードは、GPIOやShellコマンド呼び出し、メール送信や
HTTP Request, Response など Raspberry Piとの親和性の高いものが用意されています。

ここに拡張用のノードでAlexa Home Skillを追加すれば Alexa と連携できる、という仕組みです。



セットアップ


Raspberry Pi自体のセットアップについては過去記事をご参照ください。
Raspberry Piをファイルサーバにする

Raspberry PiでNode-REDをセットアップするには次のようにします。
アップデートに20〜30分程度かかるので気長に待ちます。

$ bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

Node-REDのWebサーバの起動はpiユーザで行います。
Shell実行してしまうので root は避けましょう。
とは言え、Node-REDのページを外部からアクセスされた時点で、ユーザ権限でも何でもダメな感じがするので、気にしても仕方ないですが。

起動は「node-red-start」コマンドで。
$ node-red-start
起動したらブラウザから「http://{IPアドレス}:1880/」にアクセスするとNode-REDを使えます。
再起動時に自動起動するようにします。
$ sudo systemctl enable nodered.service

Alexa Home Skill

続いて、Node-REDにAlexa用のノードを追加できるようにします。
「Node-RED Alexa」でググると、大抵はNode-RED Alexa Home Skill Bridge(以下「Bridge」)が紹介されていると思いますが、実は必要ありません。

Node-REDの画面右上の設定メニューから「パレットの管理」を選びます。


「ノードを追加」タブで「node-red-contrib-alexa」で検索するといくつかのノードがヒットします。
今回は「node-red-contrib-alexa-local」を使います。

node-red-contrib-alexa-localはBridgeなしで動作するローカルのHome Skillです。
Bridge と組み合わせる場合は「node-red-contrib-alexa-home-skill」です。
では、Bridge有りと何が違うのかと言うと、、、ほとんど同じです。。。
むしろBridgeのサーバに依存しない分、安定して動作するように思います。
また、全てNode-RED上で設定できるため、localの方が分かりやすいです。

なお、Bridgeの有無に関係なく、Home Skillのノードはスキルを自作しないので手軽です。
一方で、あまり複雑なことはできません。
基本的に照明の操作用なので、次の3つのことができます。

ON/OFF操作

「○○をON」または「○○をつけて」と言うとAlexaがON/OFFの命令をノードに送って来ます。
どうやら、Alexaは照明以外の動詞でも「ON」だと認識してくれるようです。
そのため、「ルンバで掃除して」でもOKでした。

相対値指定

「○○を明るくして」「○○を上げて」と言うとAlexaは「+1」を送って来ます。
もちろん「下げて」なら「-1」です。
これもキーワードにゆとりを持たせてあるので「○○を大きくして」でもOK。
ところが「テレビの音量を上げて」はNGでした。

絶対値指定

「○○を10にして」と言うとAlexaは「10」を送って来ます。
どうやら照明の明るさを絶対値指定できるようです。
これを使うと「テレビを8にして」と言えばチャンネルを変える設定を作ることが可能です。
「チャンネル」というデバイスを作っておけば「チャンネルを8にして」でもOK。

Alexa Home Skillのノードを作成する

Node-REDの左ペインの「入力」から「alexa local」のノードをドラッグして追加します。
追加したらダブルクリックして「ルンバ」という名前を付けます。
この名前はAlexaに呼びかける時のデバイス名になるので「Roomba」などと書くと認識してもらえません。


今度は出力ノードの「debug」を追加して、先ほどの「ルンバ」ノードと接続します。
「debug」ノードは入力された文字列をコンソールに出力してくれます。
設定できたら右上の「デプロイ」をクリックして反映します。

Amazon Echo

ここまででNode-REDの準備は一旦終わりです。
Amazon Echoに「Alexa、デバイスを探して」と言ってしばらく待ちます。
「ルンバという新しいデバイスを見つけました」
と回答してもらえれば成功。

「ルンバで掃除して」と言うとNode-REDのデバッグ用コンソールに何か表示されると思います。


次回はひとまずAlexaやNode-REDから離れて赤外線リモコンを作ります。

0 件のコメント:

コメントを投稿