IRKitを使って家に帰ったら電気がつくようにした

IRKitを買ったので、Taskerで家に帰ったら電気がつくようにしました。

IRKitを使うと家電をWeb APIで制御できます。


SmartWatch 2 で扇風機とか動かす via IRKit その2 - YouTube

設定メモ

必要なもの * インターネットに接続された無線LAN環境 * IRKit * Android端末 * 赤外線リモコンで操作できる照明器具

IRKitの準備

先にIRkitを使用可能にしておきます。 iOSデバイスが無くてもHTTP APIだけで最初のセットアップも可能と思われますが試していません。

http://maaash.jp/2014/01/irkit-internet-http-api/

デバイスに POST /keys とやると、一時的に有効な clienttoken というのをもらえます。 これをサーバ側に POST /1/keys で送ると、 サーバ側でこのIRKitデバイスと新しいクライアントの情報を関連づけて記録して deviceid, clientkey をもらえます。 これをつけて POST /1/messages すれば、messageをサーバ経由でデバイスに届けて、赤外線を送ってくれます。

$ curl 192.168.XXX.XXX/keys

ここで表示されたclienttokenをコピー。

$ curl "https://api.getirkit.com/1/keys" -d "clienttoken=(コピーしたclienttoken)"

表示されたdeviceidclientkeyを保存。

赤外線信号を記録する

電気のリモコンをIRKitに向け、点灯の信号を送ってから、以下のコマンドを実行します。

$ curl 192.168.XXX.XXX/messages > light_on.json

Internet APIでもできるはずですが、記録した信号が正しくない場合があったので注意が必要です。

念のため、この信号であっていることを確認します。電気を消したあと、以下のコマンドを実行し、電気がつけば成功です。

$ curl 192.168.XXX.XXX/messages -d "`cat light_on.json`"

送信用スクリプトを書く

http://daisukeblog.com/?p=2344 を参考にしました。deviceidclientkeyを先ほど保存した値に、dataを先ほど保存したjsonの内容に書き換えてください。

var id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var msg = {"format":"raw","freq":38,"data":[...]};

function send(message){
  var xhr = new XMLHttpRequest();
  xhr.open("post", "https://api.getirkit.com/1/messages", false);
  var form = new FormData();
  form.append("deviceid", id);
  form.append("clientkey", key);
  form.append("message", JSON.stringify(message));
  xhr.send(form);
}

function main(){
  send(msg);
}

try{
  main();
}
catch(e){
  flash(e.message);
}
exit();

動作確認は少し直せばブラウザかnode.jsでできると思います。また、後述のJavaScriptletの設定画面でもテストできます。

Taskerの設定

Android端末にTaskerをインストールしておきます。 Taskerは、Androidのタスク自動化アプリで、任意の条件(Context)を満たした時に任意の処理(Task)を実行できます。

基本的なところは以下のURLを見ながら設定しました。 http://d.hatena.ne.jp/kmorita78/20110405/p1

自宅にいるかどうかの判定にはWifiが使えそうですが、端末がスリープするとWifiが切れ、外出判定になって電気が消えてしまうという問題がおきます。 Wifiを切らないこともできますが、それよりも基地局の情報で判定した方がいいです。

Context(起動条件)にState > Phone > Cell Nearを選択し、Scanボタンを押してしばらく待つと、基地局情報が登録できます。スキャンは自宅で行ってください。

(スキャンできているときは基地局のリストが更新されていきます。うまくいかない場合、メニュー > Preference > MONITOR > Use New Cell APIを有効化すると成功することがあります。LTEで通信している場合はチェックしたほうが良いようです)

スキャンできたら、Taskを作ります。TaskはJavaScriptletを選択し、先ほど用意したスクリプトを貼り付けます。これでProfileは完成ですが、せっかくなので自宅を離れたときに電気が消えるようにします。

Profileの下に詳細が出ますが、Task名を長押しするとメニューが出て、タスクの変更やExit Taskの設定ができます。Exit Taskとは、Contextが満たされなくなった場合に実行されるTaskです。今回なら、スキャンした基地局の圏内を出たときに実行されるので、電気を消すにはよいタイミングです。

電気をつけるときと同様に、赤外線信号を記録とスクリプトの作成をし、Taskを作って貼り付けます。非常に面倒ですが、今のところ1メッセージごとにTaskを用意する必要があります。将来、IRKitアプリとTaskerのプラグインができれば、メッセージの記録と管理をIRKitアプリに任せ、メッセージ名だけで送ることも可能になると思います。

Wifi運用の場合

Wifi運用の場合は、ContextにState > Net > Wifi Connectedを使用すれば、同様に制御できます。ただし、スリープ中にWifiが切れないように設定しておく必要があります。