テクノロジの無駄づかい

日々の「ステュディオス」を求めて遠回りしがちなエンジニアの記録

Google Homeでリモコン操作をやってみた。その2

hero.hatenablog.jp

上に示したポストで Google Home -> Node-RED までを書いたけど、これはその続き。 Node-RED でMQTTのメッセージを受けた後、赤外線を発するまでを書く。

irMagicianの準備

Node-REDのフローのフローを作成する前に、その要素として必要になる赤外線リモコン irMagicianの準備をしておく。

f:id:HeRo:20180108140216p:plain

irMagician は大宮技研製の赤外線リモコンモジュール。 Raspiとの組み合わせでよく使われるものらしく、Amazonでも購入できる。 USB接続なので、電子工作苦手な私にはありがたい。

最初はirmagicianを使ってリモコン信号を記録しようとMacBookに接続して、動かしてみた。 その時点では、少々不安定なものの動いており、それらしいデータも取れていた。

しかし、そのデータを書き込んで動作確認するも、ターゲットのシーリングライトは全く反応しない。 キャプチャしたリモコン信号データが、Macではうまく書き出せないのかなと思い、 Raspi上で試すと今度は書き出したデータを書き込もうとするとエラーが発生する。 こりゃダメだと思い、仕方なくJSのライブラリの利用は諦めた。

ググると、pythonを使っている人が多そうだった。 で、netbuffalo/irmcli: irMagician command line utilityを試してみた。

irmcliのインストール

インストールと言っても irmcli自体は単なる puthon のスクリプトなので、github から cloneするだけ。

ただ、素のraspiだと、git や pip がないのと、pyserial に依存しているのでそれらをインストールする必要がある。 手順は次の通り。

sudo apt-get update
sudo apt-get install git python-pip
sudo pip install pyserial
git clone https://github.com/netbuffalo/irmcli.git

リモコンデータの作成

リモコン信号のキャプチャするには次のコマンドを実行し、リモコン受光部に実際のリモコンの赤外線を浴びせる。

$ python irmcli/irmcli.py -c

キャプチャした信号は irMagician に保持されているので、次のコマンドで、発信することができる。 irMagicianを操作したい機器に向ければそれで操作できる。

$ python irmcli/irmcli.py -p

リモコン信号をファイルに書き出すには次のコマンド。

$ python irmcli/irmcli.py -s -f [書き出し先ファイルパス]

書き出したファイルを読ませてリモコンを発信するには次のコマンドを使う。

$ python irmcli/irmcli.py -p -f [読み込ませるファイルパス]

一通りのやりたい操作をRaspi上で試して問題なく動作したので、 ターゲットのシーリングライトのリモコンのON/OFFの信号をキャプチャしてファイルに保存しておく。 irMagicianが保持できるリモコン信号は1つで、しかも揮発性で電源落とせば消えてしまう。 したがって、onとoffのそれぞれの信号をデータとして保存しておいて、発信するたびに読み込ませる必要があるのだ。

事前準備はここまで。

Node-REDのフローの登録

いよいよNode-RED上のフローを登録する。 次のようなフローにした。

f:id:HeRo:20180108100726p:plain

mqtt in ノードは その1 に書いたとおりの設定。 それ以降の設定を順に説明する。

JSON ノード

文字通り、受けたメッセージをJSONに変換する。 その1で書いたように、IFTTTからBeebotteには次のようなJSONを送信している。

{ "data": {"room": "bedroom","device": "light","action":"{{TextField}}"} }

これが、次の様にmag.payloadstringで入れられて送られて来る。

"{"data":{"room":"bedroom","device":"light","action":"オン"},"ispublic":true,"ts":1515375632470}"

これを後の処理で使いやすいようにJSONをオブジェクトに変換する。

{"data":{"room":"bedroom","device":"light","action":"オフ"},"ispublic":true,"ts":1515375632470}

Change ノード

Changeノードを制すものがNode-REDを制すほど使い勝手のあるノードらしい。

ここでは次の3つの設定で値を書き換えてある。

f:id:HeRo:20180108104648p:plain

1つ目と2つ目は オンオフをそれぞれ、onoffに書き換えている。 3つ目で、msg.payload.datamsg.payloadにセットして必要な値のみ後続の処理に送るようにしている。

Switchノード

Switchノードは条件分岐を行うノード。 ここでは、msg.payload.actionの値 on|offにより、点灯するのか消灯するのかを制御する。 次の様に設定した。

f:id:HeRo:20180108105715p:plain

Exec ノード

前述の様に node様のJSのライブラリはうまく動かなかったので、それを内部で利用する node-red-contrib-irmagician を使うことはできなさそうということで、pythonCLIツールirmcliを Execノードで実行することにした。 まあ、Exec ノードがあればどんな言語で実装されたものでも、コマンドラインで実行できればなんとかなる。

次の様に設定した。 次のキャプチャは 点灯用だけど、同様に消灯用も登録する。違うのは読み込ませるjsonファイルのみ。 f:id:HeRo:20180108110841p:plain

ついにシーリングライトのON/OFF

これですべての設定が完了した。

今回、利用したRaspiは 昔に買って、使い道なく放置していた RASPBERRY PI 1 MODEL B+。 Raspiの中でスペックは最も低いが、代わりに消費電力はPi3より小さいし、Node-REDを動かすだけなら問題ない。 ただ、起動して動作するまでは少々時間がかかるが、ずっと稼働させておくものなので気にならない。

f:id:HeRo:20180108141028p:plain

実際にやってみると、irMagicianの赤外線が方向にシビアできちんと対象の方向に向けていなければ赤外線が届かない。 それで、irMagicianを繋いでいるUSBケーブルに針金を巻き付け方向を保っている。

Google Homeに「OK Google、寝室ライトオン」と話しかければシーリングライトが点灯するし、 「OK Google、寝室ライトオフ」と話しかければ消灯する。 これまで、夜明かりをつけるときには暗闇でリモコンを探していたので思った以上に便利だ。

本当は、寝室のエアコンも操作したかったところだが、irMagicianの指向性が思った以上に強く、一つでいろんな家電を操作するには使いづらい。 LED拡散キャップも試してみたが、今度が距離的に厳しくなりすぎる。 ラズベリー・パイ専用 学習リモコン基板 だと部屋に1個で事足りるようになるだろうか。

まあ、しばらくは寝室の明かりだけかな。

あ、部屋を片付けてたら、大昔に買った PC-OP-RS1が出てきた。これまだ動くかなぁ。