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から離れて赤外線リモコンを作ります。

6 件のコメント:

  1. 初めまして。こちらの情報を参考にさせていただき、
    node-red-contrib-alexa-localでローカルノードを作成しでデプロイを
    しましたが、alexaがデバイスを発見できません。
    Raspberrypiは有線でLANに接続しており、node-red-contrib-alexa-home-skillを
    使ったテストでは、問題なくデバッグに値が出力されるのですが、
    node-red-contrib-alexa-home-skillを削除した状態では
    ローカルノードの発見をすることができていません。
    何かalexa側で追加のスキルを導入するなどが必要なのでしょうか。
    30分ほど時間をおいてから改めてデバイス検出を指示しても状況に
    変化はありません。何しろnode-redを使い始めて3日目くらいでいろいろ
    手探りの状況でして・・・・・。
    ドキュメント的にも「スキルの追加は要らない」と書いているので、
    特にこれといってスキルの追加もしていない状態なのですが・・・・・。
    何かアドバイスをいただければと思います。
    よろしくお願いいたします。

    返信削除
    返信
    1. Alexa側に「Node-RED」というスキルを入れる必要があったかもしれません。
      説明が足りていませんでしたね。すみません。

      削除
    2. 返信ありがとうございます。そもそもhome skilもデバイスとの接続が
      安定せず、途方に暮れていたたのですが、「alexa」となっているものを
      一通りインストールしてみたところ、home skilの方は安定して使えるように
      なりましたので、そちらで当分使用します。
      どうもありがとうございました。

      削除
  2. node-red-contrib-alexa-local 0.3.24 のKnown issueに以下のようにあります。
    Doesn't support Echo Gen 2 & Echo Plus local devices discovery yet.
    Echo Show, Echo Spot, Sonos One do not have the capability to discovery devices locally

    この条件に該当していませんか?

    返信削除
    返信
    1. コメントありがとうございます。
      上記情報は目にしていたのですが、「Echo」と「Echo Dot」は
      別物か?とも思っていましたので・・・・・。
      上記条件にも、Echo Dotの2世代目なので該当しているかもしれません・・・・・。

      削除
    2. ビンゴのようですね。
      私の環境は初代Echo dotです。
      現行機種だとアウトなのかもしれません。

      削除