2018年4月29日日曜日

Alexa と Raspberry Piでルンバに掃除してもらう:(おまけ)ArduinoからROI経由でルンバを動かす

前回まででAlexaからNode-RED経由でArduinoを呼び出せるようになりました。
で、Arduinoからルンバを動かすにはいくつかの方法があります。

1つが今回紹介するROI(Roomba Open Interface)です。
この方法のメリットはルンバ側にArduinoを載せるので、ルンバが移動しても通信し続けることができることでしょうか。
一方で、当然ながらルンバに出っ張りが出来てしまうので、掃除中に引っかかるリスクがあります。

もう一つの方法として、ルンバから離してArduinoを設置して赤外線経由で操作することもできます。
この方法の場合はルンバに何も付ける必要はありません。
その代わり、ドックにいる時にしかコマンドを送れません。

通常、ルンバは掃除が終われば自動的にドックに戻ってくるので、掃除中にコマンドを送りたいケースは少ないように思います。
そのため、普通に掃除させたいだけなら赤外線経由の方が本命だと思います。

そのような理由から、ROI経由での制御は「おまけ」として紹介します。
  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経由でルンバを動かす

ROIとは?

ROIは外部機器からルンバを制御するためのシリアルインターフェイスです。
ROIの詳細についてはiRobotのサイトに仕様書があります。

コネクタが付いている場所は機種によって微妙に異なるのですが、我が家にあるルンバ760では上部ハンドルの裏に付いています。

他の機種だと天板パネルを剥がした中に隠されている場合もあるようです。

Arduinoとルンバを接続する

ROIは7ピンのミニDINコネクタです。
秋葉原などに行くとプラグが売っているようですが、ジャンパピンを挿して接続しても何とかなります。

ピンアサインはROIの仕様書に載っています。


今回の場合、3番(RXD), 4番(TXD), 6番(GND) だけ接続すれば通信できます。
Arduino側のRX,TXは0番,1番ですが、それを使ってしまうとPCとのシリアル通信ができなくてデバッグしにくいです。
そのため、Arduinoの0番,1番を避けて、他のピンに繋ぎ、ソフトウェアシリアルで通信させます。

また、ルンバの電源でArduinoを駆動する場合はルンバの1番ピンから引き出してレギュレータを通してからArduinoのVinピンに入れれば良いと思います。

Arduinoからコマンドを送る

前回、FlashAirと接続するようにしたArduinoのコードにルンバとのシリアル通信を追加します。
下記の例ではArduinoの12番,13番ピンにルンバのTXDとRXDを繋いでいます。
ちなみに、ルンバのデフォルトのボーレートは115200らしいです。
#include <softwareserial.h>

#define PIN_SD_CLEAN 11

SoftwareSerial device(12, 13);

void setup() {
  Serial.begin(9600);
  pinMode(PIN_SD_CLEAN, INPUT);
}

// Arduino起動直後は全てHIGHになっているが無視させる
// 一旦LOWに落ちてからHIGHになると清掃開始
volatile bool clean_flag = HIGH;
void loop() {
  if ( clean_flag == LOW && digitalRead(PIN_SD_CLEAN) == HIGH ){
    Serial.println("Run Roomba with clean mode");
    device.begin(115200);
    byte buffer[] = {
      byte(128), // Start
      byte(135)  // Clean
    };
    device.write(buffer, 2);
  }
  clean_flag = digitalRead(PIN_SD_CLEAN);
  delay(1000);
}
はい、これだけ。
ROIは1コマンドが1バイトになっていて、コマンド順に並べたバイト列を送り込めばその順に実行されます。
ルンバはいくつかのモードを持っていて、低レベルコマンドを送るにはモードを切り替える必要があります。
128が起動なのですが、起動後のデフォルトはPassiveモードになっています。
Passiveモードではルンバのセンサ読み込みと掃除スタートができます。
今回は掃除したいだけなので、いきなりCleanコマンド(135)を送っています。

モードとコマンドについてはROIの仕様書に書かれています。
駆使すると、ルンバをラジコン化したり音を鳴らしたりインジケータを表示したり色々できます。

完成

出来上がると、こんな感じになります。

次回はROIではなく赤外線で起動します。

2018年4月21日土曜日

Alexa と Raspberry Piでルンバに掃除してもらう:(5)FlashAirのGPIO機能でArduinoのHTTP API

前回までで、Alexaからテレビを操作できるようになりました。
同じ方法でルンバも操作しようとしたところ、lircでルンバのリモコンコードを読み取る際にエラーになってしまいました。
理由がまるで分からず。。。

そこで、Raspberry PiではなくArduinoからルンバを操作することにしました。
ただ単に、Raspberry PiとArduinoのどちらでも赤外線が使える、というだけの話ですが。

Arduinoを使う場合、まずは母艦のNode-REDからの通信を受け取らないとどうにもなりません。
とは言え、数ビットの無線信号を受け取れれば良いだけなので、ESP-WROOM-02やBluetoothなど手段はいくらでもあります。
今回は、余っていた古いFlashAir(W-02)を使いました。

  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経由でルンバを動かす

FlashAirのGPIO機能

FlashAirのGPIO機能を使うと、SDカードの端子のうちの5つをHTTP経由でGPIOピンとして使用できます。
FlashAir Developersに詳しく説明されています。

つまり、FlashAirの端子とArduinoのピンを接続すると、ArduinoのピンのHigh/LowをHTTPから切り替えられます。
そのかわり、FlashAirのストレージとしての機能は使えなくなります。

FlashAirの動作を変更するには /SD_WLAN/CONFIG ファイルを編集します。
通常は不可視フォルダになっていますが、LinuxやMacでマウントするとShell経由で普通に編集できます。
Windowsの場合は不可視フォルダを表示すれば良いと思います。

このファイルを開いて末尾にIFMODE=1を追加すればGPIO機能が有効になります。

FlashAirをWiFi子機にする

通常、FlashAirはWiFiの親機として動作します。
そのため、自宅のLANの中にあるNode-REDからのHTTPリクエストを受け取れません。
そこで、FlashAirを無線子機としてWiFiルータに接続させます。

この設定についてもFlashAir Developersに詳しく書かれています。
ステーションモードの利用

そんなこんなで、出来上がったCONFIGファイルは次のようになります。
APPMODE=5
APPNAME={FlashAirの名前}
APPSSID={WiFiのSSID}
APPNETWORKKEY={WiFiのパスワード}
CIPATH=/DCIM/100__TSB/FA000001.JPG
VERSION=F19BAW3AW2.00.00
CID=02544d535730384708c00b7d7800d201
PRODUCT=FlashAir
VENDOR=TOSHIBA
MASTERCODE=18002d4ff0a2
IFMODE=1

FlashAirとArduinoを接続

こんな感じのSDカードスロットを使ってArduinoと接続します。 今回はルンバの起動ができれば良いだけなので1ビット送れれば十分です。
そのため、信号ピン1つと3.3V、GNDの3ピンだけ接続します。

FlashAirのSDIをArduinoの11ピンに繋ぎました。
3.3VとGNDは適宜。

HTTPからFlashAirのGPIOを書き換える

GPIO機能のHTTP APIについてはFlashAir Developersの「SDインターフェース端子のI/O利用(op=190)」に書かれています。
今回はSDOピン(CMD)をGPIOとして使うので、0x01のHIGH/LOWを切り替えられれば良いです。

つまり、URLパラメータとGPIOの組み合わせは次の通りです。
  • SDO=HIGH → op=190&CTRL=0x1f&DATA=0x01
  • SDO=LOW → op=190&CTRL=0x1f&DATA=0x00

ArduinoでFlashAirのGPIOを読む

Arduinoからピンの状態を読むのは普通に「digitalRead」で良いです。
ライブラリも何も必要ありません。
注意点としては、FlashAir起動時は全てのピンがHIGHになっていることでしょうか。

つまり、SDOピンがHIGHの状態を検知してルンバを起動させようと考えた場合、
FlashAirの電源投入時にHIGHなのでいきなりルンバが起動してしまいます。

電子回路的にHIGH/LOWを反転させても良いのですが、部品点数が増えて面倒なので、
Node-RED側で一旦LOWに落としてからHIGHにするようなリクエストを投げることで回避しました。
もしかしたら、Arduinoで一旦pinModeをOUTPUTにしてLOWに落とせるのかもしれませんが試していません。

Arduinoのコードはこんな感じです。
#define PIN_SD_CLEAN 11

void setup() {
  Serial.begin(9600);
  pinMode(PIN_SD_CLEAN, INPUT);
}

// Arduino起動直後は全てHIGHになっているが無視させる
// 一旦LOWに落ちてからHIGHになると清掃開始
volatile bool clean_flag = HIGH;
void loop() {
  if ( clean_flag == LOW && digitalRead(PIN_SD_CLEAN) == HIGH ){
    Serial.println("Run Roomba with clean mode");
  }
  clean_flag = digitalRead(PIN_SD_CLEAN);
  delay(1000);
}

Node-REDからArduinoにHTTPリクエスト

少々ブサイクですが、次のようにしました。
Alexaに「ルンバで掃除して」と言うと左端の「ルンバ」ノードが呼ばれます。
まず最初に真ん中のフローで「Roomba reset」が呼ばれます。
「Roomba reset」はHTTPリクエストのノードです。
FlashAirに「op=190&CTRL=0x1f&DATA=0x00」を投げて全てのピンをゼロリセットしています。
FlashAirの起動後、2回目以降の「ルンバ掃除して」の場合は前回呼び出し時にゼロリセットされているので、この処理は無意味になります。

先ほどのRoomba resetが先に実行されるように、上部のフローでは2秒delayが入っています。
本当はdelayよりも、Roomba resetの実行後にフラグを書き換えるなどしてロックした方が良さそうに思いますが手抜きです。
この手抜きのせいで、「ルンバ掃除して」と言ってから実行されるまでに2秒掛かってしまうので微妙に違和感があります。

2秒後に「Roomba clean」が呼ばれます。
これは「op=190&CTRL=0x1f&DATA=0x01」でSDOピンをHIGHにしています。
この時点でArduino側ではルンバの制御に入ります。

その後、5秒delayを掛けて再度ゼロリセットしておきます。
5秒というのは、Arduino側がHIGHを確実に検知できるよう、長めに取っています。

最初のdelayについては、もし検知し損ねても処理に失敗するのは起動後最初の1回だけなのでイライラが少ないです。
また、長すぎると「ルンバ掃除して」からのタイムラグが長くなってしまうため、できるだけ短く。
2回目のdelayは短かすぎると毎回失敗し、長くてもユーザビリティに影響ないので長めに。

ここまででNode-REDからHTTP経由でArduinoに1ビット信号を送ることができるようになりました。
次回はArduinoからルンバを操作します。

2018年4月17日火曜日

Alexa と Raspberry Piでルンバに掃除してもらう:(4)Node-REDからテレビを操作

前回まででNode-REDでRaspberry PiとAlexaを連携させ、さらに赤外線リモコンのコードをコピーしました。
今回はついに、Alexa → 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経由で制御する/li>
  7. (おまけ)ArduinoからROI経由でルンバを動かす
  8. Arduinoから赤外線経由でルンバを動かす
  9. Node-REDからFlashAir/Arduino経由でルンバを動かす

Node-REDから赤外線機能を呼ぶ場合、次の二種類のケースがあると思います。
  • 母艦のRaspberry Piに赤外線LEDを付ける場合
  • 母艦とは別のRaspberry Piに赤外線LEDを付ける場合
まずは前者から。

母艦のNode-RED から母艦の lirc を呼ぶ

1台のRaspberry Piの上でNode-RED と lirc を連携させるのは非常に簡単です。
Node-REDをセットアップした時と同じ手順でノードの追加画面を開きます。
「lirc」というキーワードでノードを検索すると「node-red-contrib-lirc」というノードが見つかるので追加します。
すると、こんな感じで出力のリストに「lirc」が増えます。

この「lirc」をドラッグして右の広いところにドロップ。
ドロップした「lirc」ノードをダブルクリックして図のように入力します。

「Name」は何でも良いです。分かりやすい名前をつけます。

「Controller」はLinuxのlircコマンドの第一引数です。
今回は1回送信したいので「SEND_ONCE」です。

「Device Name」はirrecordコマンドで指定したデバイス名です。
前回「TV」というデバイスを登録したので「TV」。

「Output」は「1」固定です。
lirc が複数の赤外線LEDをサポートした時のために用意されているようですが、現状では1個しか使えないので「1」。

ここで勘の良い方は「あれ?」と思うかもしれません。
デバイス「TV」には複数のリモコンボタンがあるはずなのですがその設定がありません。
例えば「on」とか「ch1」とかをどこかで指定する必要があるはずです。
lircノードではメッセージペイロードでこれらのボタン名を指定します。

メッセージペイロードとは


Node-RED では前のノードから後のノードに対してメッセージが渡されます。
デフォルトではメッセージはJSON形式で書かれるようです。
このメッセージには「msg」というオブジェクト名がつけられています。
msgオブジェクト内の要素は上流の入力次第なのですが、どの入力も「payload」という要素を1つ持っています。
多くのノードで、この msg.payload を入力パラメータとして解釈する仕様になっています。

lirc ノードでは msg.payload の値をリモコンのボタン名として解釈します。
つまり、lirc ノードにフローを繋ぐ際、msg.payload に「on」を代入すればテレビに対してonの信号が飛びます。
(TV.lircd.conf に「on」が定義されていれば、ですが。)

この約束を頭の片隅に入れておいて、Node-RED の入力側からフローを繋いでいきます。

Alexa からの入力とつなぐ

Node-REDの「入力」のリストから「alexa local」を追加します。
名前は「テレビ」。
前にも説明しましたが、この名前がAlexaで呼びかける時のデバイス名になるので要注意です。

さらに、「機能」のリストから「template」を追加して、alexa local の右側からtemplate の左側に線を繋ぎます。
繋いだらtemplateノードをダブルクリック。
このtemplateノードで、lirc に渡す msg.payload を代入します。

「名前」は適当に分かりやすい名前を付けます。
「設定先」は代入したい変数。今回は「msg.payload」ですね。
今回は固定文字列を埋め込みたいので「形式」は「平文」で構いません。

テンプレートのところに書いた内容が msg.payload に代入されます。
今回は「on」です。
「{{hoge}}」などと書くと、入力に渡された msg.hoge 変数の値が埋め込まれます。
「構文」を指定するとJavaScriptで演算した結果を代入することもできます。

設定できたら、templateノードの右側(出力側)をlircノードの左側(入力側)に繋いで完成。
右上の「デプロイ」ボタンを押すと保存されます。

もし、Alexa に「テレビ」デバイスを認識させていなければ「Alexa デバイスを探して」と言うと見つけてくれます。


Alexa から実行

Raspberry Piの赤外線LEDをテレビの赤外線受光部の近くに貼り付けておきます。
この状態で「Alexa テレビをつけて」と言うとテレビがつく、、、はずです。

うまくいかない場合は、debug ノードを追加して msg オブジェクトの中身を確認していき、lirc に正しくメッセージが渡っていることを確認します。
メッセージが渡っているようであれば、今度は Linux 上で lirc がエラーになっていないかを確認するとか。
それでも問題ないようなら、赤外線LEDを普通のLEDに付け替えてみて、ちゃんと光るかどうかを確認。
ハード/ソフト/ネットワークが絡み合っているので、1つずつ接点を潰しながら不具合箇所を特定する地味な作業になります。


別々のRaspberry PiでNode-REDとlircを動かす場合

Node-RED から何らかの方法でネットワークに飛ばし、lirc側も何らかの方法でリクエストを受け取れば良いです。
lirc 側で Apache からShellコマンドを読んでも良いのですが、いっそのこともう1つNode-REDを立ち上げても良いです。
オーバースペックですが。

lirc 側の Node-RED では「入力」の「http」ノードを追加して、好きなパス名を指定。
ここで指定したパスを、母艦側から呼び出します。
http ノードと lirc ノードを接続すれば、lirc 用 HTTP API の完成。

母艦側では「機能」の「http request」ノードを追加。
ダブルクリックして、lirc 側の IP アドレスと、「http」ノードのパスを設定すれば呼び出せます。

その他は同じRaspberry Piで Node-REDとlircの両方を動かす場合と同じです。
まぁ、Node-REDを両方に立ち上げるなら、lirc 側のNode-REDにalexa localノードを作った方が手っ取り早いですが。。。

完成

そんなこんなで、Alexa とテレビの連携が完成しました。
頑張ってNode-REDを設定すると、テレビのON/OFFの他に録画リストから番組を選んで再生したり色々できます。

次回からはさらにルンバと連携させていきます。

2018年4月14日土曜日

Alexa と Raspberry Pi でルンバに掃除してもらう:(3)Raspberry Piを赤外線リモコンにする

前回まででRaspberry Pi上でNode-REDが動きました。
ここまでが母艦側になります。
今回は母艦からコントロールされるエッジ側の準備です。

余談ですが、、、
ちょっと前までのIoT分野ではデータ収集がメインだったので
「エッジ」→「ゲートウェイ」→「サーバ」という名前の付け方が
多かったように思います。

今回のように母艦が複数のエッジデバイスを制御するような場合、
サーバ/クライアントモデルとかデータフローがあまり関係ないので
「サーバ」とか「ゲートウェイ」という名付け方は不適切に感じます。

呼び方がよく分からないので、ここでは制御の頭脳側を「母艦」と呼ぶことにします。
母艦から制御されるデバイス側を「エッジ」と呼ぶことにします。


エッジ側は複数のデバイスそれぞれに対応させる必要があります。
最終的にはルンバを動かしたいのですが、実はルンバの赤外線は
結構面倒だということがわかったので、まずはテレビを動かしてみようと思います。

【注意】
今回のやり方ではルンバは動きません。
後日説明しますが、ルンバの場合はRaspberry PiではなくArduinoを使います。
  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経由で制御する/li>
  7. (おまけ)ArduinoからROI経由でルンバを動かす
  8. Arduinoから赤外線経由でルンバを動かす
  9. Node-REDからFlashAir/Arduino経由でルンバを動かす

lircをインストールする


2018年4月13日金曜日

Raspberry Pi Zero W をヘッドレスでWiFi対応セットアップする

Alexaでルンバを動かすことを目指していますが、今回はちょっと脱線します。
単にRaspberry Piのセットアップを簡単にする方法を紹介するだけなので必須ではありません。
  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経由で制御する/li>
  7. (おまけ)ArduinoからROI経由でルンバを動かす
  8. Node-REDからFlashAir/Arduino経由でルンバを動かす
Alexa で色々な家電の操作ができる仕組みを作成していく中でRaspberry Pi Zero Wは良い選択肢だと思います。
赤外線で家電を操作することを考えると、どうしても家電の近くにRaspberry PiかArduinoを置くことになりがちです。
その際の条件を考えていくと、次のような感じになります。
  1. 安い → 家電の数だけ設置する必要がある。
  2. 目立たない → あちこちに無骨な基板が転がっていると気になるので。。。
  3. 配線が少ない → 少なくとも無線化は必須。ACアダプタなしでUSBケーブル程度。
Raspberry Pi Model Bだと価格がネック。
Arduinoだと無線が貧弱なのでちょっと厳しい。
そんなこんなでRaspberry Pi Zero Wに行き着きます。

ただ、Raspberry Pi Zero WはHDMIやUSBがマイクロタイプなので、セットアップの際に配線がごちゃごちゃしがち。
そんな訳で、キーボードもモニタも無しでRaspberry Pi Zero Wをセットアップします。

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経由で制御する/li>
  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 と連携できる、という仕組みです。

Alexa と Raspberry Pi でルンバに掃除してもらう:(1)準備

Amazon Echo Dot を手に入れたのですが、あまり使い道がありません。
音楽を掛けるか、子供が「豆しば」を連呼する程度。

「音声操作のスマートホーム!」とか言っても、家中の家電を一気に買い換えるわけにもいかず。

そこで、Amazon Echo Dotで拾った音声コマンドを赤外線で飛ばして家電を操作します。
Alexa対応の赤外線リモコンを買えばいいじゃん」という意見は無視して、最終的に次の構成を目指します。



Alexa からの音声コマンドは Raspberry Pi 上のNode-REDで受け取ります。
Alexa + Node-RED でググると大抵はNode-RED Alexa Home Skill Bridgeを使う方法が出てきますが、今回は Home Sill Bridge なしのローカル構成で組みます。

Node-RED で中継した後、別の Raspberry Pi に飛ばして赤外線で家電を操作します。
なぜ Raspberry Pi が1台ではダメなのかと言うと、赤外線の到達距離が短いので家電の近くにRaspberry Piを置く必要があるからです。

(2018/04/08追記)
ルンバのリモコンはRaspberry Piで上手くリモコンコードをコピーできないようです。
コードを自力で解析すると結構しんどいので、FlashAirで中継してArduinoからシリアル経由でROSをハックするという強硬手段に切り替えました。

作成の流れ

材料は少ないのですが、構成が結構複雑です。
次の順番で作っていきます。

  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経由で制御する/li>
  7. (おまけ)ArduinoからROI経由でルンバを動かす
  8. Arduinoから赤外線経由でルンバを動かす
  9. Node-REDからFlashAir/Arduino経由でルンバを動かす

完成するとこうなります。
Alexa + Raspberry Pi (Node-RED) + FlashAir + Arduino + ルンバ。

Alexa + Raspberry Pi(Node-RED) + 赤外線 + テレビ。