IRKitの自分専用APIサーバ&自分専用UIをHerokuに立てて快適生活を目指す

年明けにどうしても前から気になっていたIRKitを買いました。理由は簡単で、子供がリモコン大好きで勝手に押しまくって色々大変なので、リモコンをなくしてしまいたいと思っているからです><

非常に完成度の高いガジェットで、大満足です。何の努力もせずにインターネット越しでIRKitを操作できるのには感動すら覚えました。とはいえ、通常の使い方だとクライアント側で信号情報を管理する必要があり(IRKit自体は何も記憶せず、常にクライアントが信号を送るというデザインにsimple is bestを感じますが)、家族で共有したりするのにはちと面倒です。つまり、信号情報を家族のスマホ全部で共有するのがめんどくさい。

なので、そういう情報は全部サーバ上に置いてしまって、秘密のリモコン画面からボタンを押せば誰がやっても同じ挙動になるのがいいなと思いましたので作りました。

APIサーバ

こちらはだれでも再利用可能な様に作ってみました。Heroku deploy button置いてるので、ご自由にどうぞ。ポイントは、ruby-irkitで生成される.irkit.jsonをgistやdropboxなどで認証なしに秘密のURLでサーブさせるところ。これをやるためにruby-irkitにPRだして採用してもらいました。

うまくできると、READMEにある感じで認証も何もなく秘密のURLを叩くだけでリモコン操作できます。

リビングのテレビの電源をつける
$ curl -X POST https://your-app-name.herokuapp.com/SECRET_TOKEN/api/living/tv_on

リビングのテレビの電源を消して、エアコンの電源も消す
$ curl -X POST https://your-app-name.herokuapp.com/SECRET_TOKEN/api/living/tv_off,airconditioner_off

Heroku app名もまぁまぁランダムなので、それだけでもいいかなぁと思いましたが、せっかくHeroku deployにrandom generatorがあったのでそれを使って生成されるtokenをURLに入れることでちょっとだけ秘密度を上げてみました。Basic認証等にしなかったのは、これを別ドメインでサーブしているリモコンUIからAjaxで叩きたかったので、CORSで苦労したくなかったためです。認証は無いので、単純に全開けしちゃってます。

curl例の2つめみたいに、コンマでつなげると1つのデバイスに複数命令を実行させたりもできます。テレビの操作でメニュー開いてから選ぶみたいなのがあったのでこういうのが無いと辛い。

リモコンUI

こっちは再利用とか厳しいので、手元で作って直接Herokuにpushしてます。秘密の情報である上記APIサーバのURLもベタッと書いてます。開発が楽だったので、静的サイトなんですがSinatra+Slim+Livereloadな感じです。画面キャプチャはこんなの。

画像はFlickrで適当に、アイコンはSketch 3を使って適当に書いて(というか人のをコピペして)SVGへ。あとはBootstrapで配置してjavascriptでPOSTするだけ。画像やアイコンの著者の方に感謝(あとでクレジット探して追記しておきます)。ちなみにボカしてるボタンはまだ実装してないところです。Apple TVのリモコンどうしよっかなー。。。

index.slimはこんな感じ。作り始めなので、色々いい加減です。slimが中にcoffeeをそのまま書けるので、開発には便利でした(勝手にjsに変換してくれる)。

というわけで、とりあえず動くものができたので、ブラッシュアップしていきたい気もしますが、時間はなさそう。。。

ちなみに何に一番時間がかかったかって、デザインに決まってるじゃないですか。。。1日かけてこの程度しか作れないですよ。。。