2014年09月26日
Raspberry Pi + irMagician (赤外線リモコン・ボード) でホーム・オートメーションを楽しむ方法
今日は前回の記事(小型赤外線 IR リモコン irMagician ファースト・インプレッション)の続き。 irMagician に Web インタフェースを用意して自宅にあるエアコン、テレビ、シーリング・ライトなどの赤外線機器を簡単・遠隔地から制御する簡単なホーム・オートメーション環境を作ってみますよ。
Raspbery Pi + irMagician で作るホーム・ネットワーク内リモコン環境を作る
前回の記事では irMagician と Python を使って自宅の赤外線リモコンを学習、学習したデータを送信する方法を学びましたよね。 これに Web ベースの操作画面があればもっと気軽に楽しめそう。 そこで RemoteIRF (Frontend) という簡単な Web アプリケーションを作ってみました。
RemoteIRF は Python/Tornado をエンジンにした Web アプリケーションでリモコン操作を行うユーザ・インタフェースの他に HTTP/JSON を使って制御機器の登録や制御リクエストをやり取りする API (アプリケーション・プログラミング・インタフェース)としての機能も持っています。
それにあともう一つ、実際に赤外線で機器を制御する RemoteIRE (Element) というアプリケーションも作りました。 IRE は IRF に対して自分の管理している家電デバイスを登録し、制御リクエストを受信した場合にはその内容に基づいて irMagician から赤外線を送信するアプリケーションです。
それにあともう一つ、実際に赤外線で機器を制御する RemoteIRE (Element) というアプリケーションも作りました。 IRE は IRF に対して自分の管理している家電デバイスを登録し、制御リクエストを受信した場合にはその内容に基づいて irMagician から赤外線を送信するアプリケーションです。
早速使ってみましょうか。 まずは前回の記事を参考にして Raspberry Pi で irMagician を使うための基本的なセットアップを終わらせて下さい。
- カーネル・パラメーターを変更(cmdline.txt & inittab)してシリアル・インターフェースの割り当てを解除
- PySerial ライブラリをインストール(python-pip & pyserial)
- リモコンの赤外線データを irMagician でキャプチャ、プレイ、JSON ファイルへ保存
続いて Python Web フレームワーク Tornado をインストールします。
これで動作環境のセットアップはおしまい。
最後に RemoteIRF、RemoteIRE を GitHub からダウンロード(clone)します。
※ git が無い場合は先に $ sudo apt-get install git-core
さて、まずはユーザー・インタフェースになる RemoteIRF から起動してみましょう。 次の例では 80 番ポート(無指定の場合は 8888 番ポート)、ログイン認証で利用するユーザーID/パスワードを共に admin に指定しつつ Web サービスを起動しています。
ブラウザで次の URL にアクセスすると・・・、
ログイン・ページが表示されるはずです。
ログインしてみるとまだ Remote Devices には何もリストされていません。
ここで RemoteIRE に移動しましょう。
この下を見ると devices というディレクトリがあるはずです。 ここへ家電名でディレクトリを作り、その中へ irMagician 用 JSON ファイルを入.json/切.jsonなど制御の意味を表すファイル名でコピーしておきます。 例えばこんな構成。
準備が出来たら次のコマンドで RemoteIRE を起動してみましょう。 -s オプションで Web サービス(RemoteIRF)の起動しているホスト名(IP アドレス)、-p オプションでそのポート番号を指定します。
もう一度ブラウザでリモコン Web ページを表示してみると・・・
お、用意した家電名が表示されましたね! タップするとリモコン・メニューもリストされるはずです。
何故わざわざ Web アプリケーション(RemoteIRF)と赤外線送信アプリケーション(RemoteIRE)を分けたかのかと思った方もいたかもしれません。 その理由はインターネットを経由してホーム・ネットワーク内の端末(例えば Raspberry Pi)に赤外線送信リクエストを届ける為なんですよ。
RemoteIRF が提供する http://[address or host name]:port/remocon/request という URL へ HTTP/GET するとリモコン制御のリクエストが生成されるまで HTTP レスポンスは送信されません(正確には最大 5 分経つと一度再接続を要求するレスポンスを返します)。
この状態で Web アプリケーションのメニュー上から家電制御を行うと同じ URL へ家電・制御名称を含んだ JSON 形式のリモコン制御リクエストを POST するのでその瞬間、即座に HTTP/GET レスポンスが RemoteIRE の元に送信されるのです。
これは HTTP ロング・ポーリングと呼ばれる方式でサーバー側でイベントが発生してから相手(クライアント)に伝わるまでの時間が短い(リアルタイム性が高い)、常にネットワークの末端にいる HTTP クライアント(ここでは RemoteIRE)からサーバーへの接続を試みるのでファイヤー・ウォール(NAT ルーター)の内側にいるクライアントともコミュニケーション出来るという2つの利点があります。
ここへホーム・ネットワーク上の Raspberry Pi/RemoteIRE から接続します。
するとほら、何処からでも宅内の家電を制御できる”クラウド・リモコン”が出来ましたよ!
※ インターネット上のサーバーは無く、しかも無料でホームネットワークのリモコンを制御したい、という人には ngrok との組み合わせがオススメです(詳しくはこちら)。
それでは、より良いリモコン・ライフを。
pi@raspberrypi ~ $ sudo pip install tornado
Downloading/unpacking tornado
...
Successfully installed tornado certifi backports.ssl-match-hostname
Cleaning up...
これで動作環境のセットアップはおしまい。
最後に RemoteIRF、RemoteIRE を GitHub からダウンロード(clone)します。
pi@raspberrypi ~ $ git clone https://github.com/netbuffalo/RemoteIRF.git
pi@raspberrypi ~ $ git clone https://github.com/netbuffalo/RemoteIRE.git
※ git が無い場合は先に $ sudo apt-get install git-core
さて、まずはユーザー・インタフェースになる RemoteIRF から起動してみましょう。 次の例では 80 番ポート(無指定の場合は 8888 番ポート)、ログイン認証で利用するユーザーID/パスワードを共に admin に指定しつつ Web サービスを起動しています。
pi@raspberrypi ~ $ cd RemoteIRF/
pi@raspberrypi ~/RemoteIRF $ sudo python server.py -p 80 -user admin -passwd admin
2014-09-25 21:38:54,323 INFO - starting remote IR WebAPI & UI on 80 ...
ブラウザで次の URL にアクセスすると・・・、
http://[IP アドレス or ホスト名]/remocon/login
ログイン・ページが表示されるはずです。
ログインしてみるとまだ Remote Devices には何もリストされていません。
ここで RemoteIRE に移動しましょう。
pi@raspberrypi ~ $ cd ~/RemoteIRE/
この下を見ると devices というディレクトリがあるはずです。 ここへ家電名でディレクトリを作り、その中へ irMagician 用 JSON ファイルを入.json/切.jsonなど制御の意味を表すファイル名でコピーしておきます。 例えばこんな構成。
RemoteIRE
|
└── devices
├── エアコン
│ ├── 運転停止.json
│ ├── 除湿(風量自動温度28).json
│ ├── 暖房(風量自動温度28).json
│ └── 冷房(風量自動温度28).json
└── テレビ
├── CH1.json
├── CH4.json
├── CH5.json
├── CH6.json
├── CH7.json
├── CH8.json
├── メニュー決定.json
├── メニュー録画開始.json
├── 電源オフ.json
└── 電源オン.json
準備が出来たら次のコマンドで RemoteIRE を起動してみましょう。 -s オプションで Web サービス(RemoteIRF)の起動しているホスト名(IP アドレス)、-p オプションでそのポート番号を指定します。
pi@raspberrypi ~/RemoteIRE $ python irelement.py -s localhost -p 80
もう一度ブラウザでリモコン Web ページを表示してみると・・・
お、用意した家電名が表示されましたね! タップするとリモコン・メニューもリストされるはずです。
Raspberry Pi に irMagician が接続されていれば GO! ボタンのタップで家電が動き出すはずですよ!
実は GO! ボタンをタップした時点では Web サービス(RemoteIRF)から RemoteIRE 宛にリモコン命令を含む HTTP レスポンスが送信されただけでして、本当に赤外線の送信に成功したのかどうかは History メニューから確認する必要があります。
ここでは HTTP レスポンス(制御リクエスト)を受信した RemoteIRE が赤外線送信コマンドを irMagician へ送り、その結果として irMagician が出力したメッセージを履歴として確認することが出来るのです(Done !、OK なら送信成功、Failed や 履歴無しなら赤外線の送信に失敗ですね)。
これで無線 LAN の電波さえ届けば家の中どこからでも家電を制御できますね!
Raspbery Pi + irMagician + インターネットで作る屋外何処からでもリモコン環境
何故わざわざ Web アプリケーション(RemoteIRF)と赤外線送信アプリケーション(RemoteIRE)を分けたかのかと思った方もいたかもしれません。 その理由はインターネットを経由してホーム・ネットワーク内の端末(例えば Raspberry Pi)に赤外線送信リクエストを届ける為なんですよ。
もし貴方がグローバル・アドレスを持ったインターネット上のサーバー/サービスを利用可能で Python(> 2.7)/Tornado を動かすことが出来るのならば RemoteIRF だけをインターネット上に移して下さい。 すると何処からでもホーム・ネットワーク内の家電に対してリモコン操作することが出来るようになります。
RemoteIRF が提供する http://[address or host name]:port/remocon/request という URL へ HTTP/GET するとリモコン制御のリクエストが生成されるまで HTTP レスポンスは送信されません(正確には最大 5 分経つと一度再接続を要求するレスポンスを返します)。
この状態で Web アプリケーションのメニュー上から家電制御を行うと同じ URL へ家電・制御名称を含んだ JSON 形式のリモコン制御リクエストを POST するのでその瞬間、即座に HTTP/GET レスポンスが RemoteIRE の元に送信されるのです。
# HTTP Response (IR Request) example
{"action": "control",
"device": "\u30a8\u30a2\u30b3\u30f3",
"command": "\u51b7\u623f\uff08\u98a8\u91cf\u81ea\u52d5\u6e29\u5ea628\uff09"}
これは HTTP ロング・ポーリングと呼ばれる方式でサーバー側でイベントが発生してから相手(クライアント)に伝わるまでの時間が短い(リアルタイム性が高い)、常にネットワークの末端にいる HTTP クライアント(ここでは RemoteIRE)からサーバーへの接続を試みるのでファイヤー・ウォール(NAT ルーター)の内側にいるクライアントともコミュニケーション出来るという2つの利点があります。
例えば僕はさくらの VPS をレンタルしていまして www.netbuffalo.net というインターネット上のサーバーを使うことが出来ます。
このクラウド・サーバーで RemoteIRF を起動しておき、
[root@cloud RemoteIRF] # python server.py -user netbuffalo -passwd hogehoge
2014-09-26 01:42:49,897 INFO - starting remote IR WebAPI & UI on 8888 ...
ここへホーム・ネットワーク上の Raspberry Pi/RemoteIRE から接続します。
pi@raspberrypi ~/RemoteIRE $ python irelement.py -s www.netbuffalo.net -p 8888
2014-09-26 01:47:37,289 INFO - initializing device entries...
2014-09-26 01:47:37,295 INFO - URL: http://www.netbuffalo.net:8888/remocon/device/init
2014-09-26 01:47:37,462 INFO - Success
2014-09-26 01:47:37,471 INFO - creating device entry for エアコン ...
2014-09-26 01:47:37,475 INFO - URL: http://www.netbuffalo.net:8888/remocon/device/add
2014-09-26 01:47:37,604 INFO - Success
2014-09-26 01:47:37,609 INFO - waiting remocon request...
2014-09-26 01:47:37,612 INFO - URL: http://www.netbuffalo.net:8888/remocon/request
するとほら、何処からでも宅内の家電を制御できる”クラウド・リモコン”が出来ましたよ!
※ インターネット上のサーバーは無く、しかも無料でホームネットワークのリモコンを制御したい、という人には ngrok との組み合わせがオススメです(詳しくはこちら)。
それでは、より良いリモコン・ライフを。
ゼロ・トゥ・ワン―君はゼロから何を生み出せるか
posted with amazlet at 14.09.26
ピーター・ティール ブレイク・マスターズ
NHK出版
売り上げランキング: 11
NHK出版
売り上げランキング: 11
この記事へのトラックバックURL
この記事へのコメント
参考にさせていただいております。
pi@raspberrypi ~/RemoteIRE $ python irelement.py -s localhost -p 80の所でつまずいてしまいました。
pi@raspberrypi ~/RemoteIRE $ python irelement.py -s localhost -p 80
2014-10-26 13:39:20,959 INFO - initializing device entries...
2014-10-26 13:39:20,964 INFO - URL: http://localhost:80/remocon/device/init
2014-10-26 13:41:28,441 ERROR - Exception caught: <urlopen error [Errno 97] Address family not supported by protocol>
とエラーがでてしまいます。故にデバイスリストが表示されません。
それ以前はすべてうまく行きました。devicesディレクトリ内に家電名ディレクトリその中にjsonファイルも保存してあります。念のためsudoもつけましたが結果は同じでした。
RemoteIRFとIREはターミナルの別タブで実行しています。
お手数をお掛けしますが、ご教授のほどお願いいたします。
Posted by hato at 2014年10月26日 13:59
hatoさん、調べてみますね。
Posted by netbuffalo at 2014年10月26日 16:18
hatoさん、手元で簡単に確認したのですが、同様の現象は確認出来ませんでした。引き続き調べてみますが、今日はこれ以上作業ができないので明日またご連絡致します。お時間頂きますがよろしくお願いします(明日以降お時間のあるときにこのページを覗いてみて下さい)。
Posted by netbuffalo at 2014年10月26日 17:02
ありがとうございます。
お手隙の時で結構ですので。
Posted by hato at 2014年10月26日 19:58
hatoさん、手元のpiで再現させた訳ではないのですが、IPv6が有効な環境で動かした場合にご連絡頂いたエラーが発生するようです(詳しくは http://goo.gl/7YPLtP)。
そこでRemoteIRF(Webアプリケーション)のソースを少しだけ変えました。RemoteIRFをもう一度GitHubからコピー(git clone https://github.com/netbuffalo/RemoteIRF.git)して試してみて頂けないでしょうか。
そこでRemoteIRF(Webアプリケーション)のソースを少しだけ変えました。RemoteIRFをもう一度GitHubからコピー(git clone https://github.com/netbuffalo/RemoteIRF.git)して試してみて頂けないでしょうか。
Posted by netbuffalo at 2014年10月27日 13:32
ありがとうございます。
今、会社の環境で別SDカードですが試しましたら家電名を取得しました。
今さっきダウンロードしたので、ひょっとしたら変更して頂いた後かもしれません。
帰宅後、昨日のSDカードでソース変更後のRemoteIRFで試してみます。ちなみに会社のルータはIPv6は無効になっていました。
では、また報告させていただきます。
Posted by hato at 2014年10月27日 13:54
hatoさん、動作確認出来て良かったです。IPv6ですがルータの設定とは違いアプリケーションが動いているサーバー(今回はRaspberry Piでしょうか)自身の設定でIPv6サポートが有効になっている場合に発生するようです(こちらで再現確認はしておりませんが)。それでは。
Posted by netbuffalo at 2014年10月27日 16:46
無事、動きました。本当にありがとうございました。
Posted by hato at 2014年10月27日 21:59
hatoさん、良かったです!!!
Posted by netbuffalo at 2014年10月27日 22:59
大宮技研でメールをしましたので、お返事頂けると幸甚です。
Posted by 大宮技研 at 2014年12月03日 21:23
大宮技研さま、ご連絡ありがとうございました。
本日メール致しました!
有益な情報をご提供頂きありがとうございまいた。
本日メール致しました!
有益な情報をご提供頂きありがとうございまいた。
Posted by netbuffalo at 2014年12月04日 19:33