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)"
表示されたdeviceid
とclientkey
を保存。
赤外線信号を記録する
電気のリモコンを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 を参考にしました。deviceid
とclientkey
を先ほど保存した値に、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が切れないように設定しておく必要があります。