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 日かけてこの程度しか作れないですよ。。。