たゆたふ。

定まる所なく揺れ動き、いろいろやってみたメモ。など

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

hero.hatenablog.jp

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

irMagicianの準備

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

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

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

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

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

irmcliのインストール

インストールと言っても irmcli 自体は単なる Pythonスクリプトなので、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 上のフローを登録する。 次のようなフローにした。

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つの設定で値を書き換えてある。

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

Switchノード

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

Exec ノード

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

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

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

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

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

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

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

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

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

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