yutaponのブログ

javascript界隈の興味あるネタを備忘録的に残しておく場所

IRKitとSiriを連携して家電制御したかった

GWはIRKitとSiriを使って家電制御する仕組みを作ってたんですが、
SiriProxyがまだiOS7に対応してないとのことで、連携できませんでした。。


完成させてから紹介するつもりでしたが、どんなことをしようとしたのか書いてみます。


IRKitとは

IRKit、とても面白い商品だと思います。
一言で言えば学習リモコンで、HTTPサーバが内蔵されてるのでHTTPでAPIを叩くこともできます。

APIがあるということは、プログラムから利用できるので発想次第でいろんな使い方ができます。


面白い使い方だなーと思ったのはこちら。
橋本商会 » IRKitで一番2ch実況が盛り上がってるテレビチャンネルを追跡する

2chの実況が盛り上がっているチャンネルに自動で切り替えるというもの。
ただ単に家電を制御するのではなく、プラスα面白い使い方してるのがいいですね。


やりたかったこと

IRKitとSiriがあれば未来部屋と似たような環境を作れると思ったのです。
引越ししたので未来なお部屋を作ってみた。 - お前の血は何色だ!! 4

学習リモコンとしてはiRemoconよりIRKitの方が安いし、
いつも手元にiPhone5sまたは先代のiPhone4sがあるので、
Siriをマイク代わりにすれば行けると踏んだのですが・・・


Siriの通信を仲介させるためのSiriProxyがiOS7に対応していません。(iPhone4sもiOS7にしてしまった)
plamoni/SiriProxy · GitHub

iOS7未満かつiPhone4s以上の端末が手元にあればSiriProxy使えるので、そういう方は試してみると面白いと思います。


IRKitで家電を制御する

基本的にはこちらを見ながらやればだいたいのことができます。
IRKit - Open Source WiFi Connected Infrared Remote Controller


IRKit本体はリモコンの信号を記憶しておくようなストレージがついてないので、
Client側で記憶する必要があるようです。

私はNode.jsでAPIサーバーを作って、MongoDBに信号のデータを入れておきました。
(commandというコレクションを作って、一つの信号につき1ドキュメントで保存する)


また、複数の家電の電源を一度に落としたり、つけたりできるようにしたかったので
taskというコレクションを作って、そこに複数のcommandを入れるってことを作ろうとしましたがGW中にはできませんでした。


node-irkit

最初はrequestモジュールを使って自前で実装していたんですが、
ぐぐったら便利なモジュールが公開されていたのでこちらを使わせていただきました。
dameleon/node-irkit · GitHub
 

使い方

npmでサクッとインストールします。

$ npm install --save node-irkit

 

ローカルネットワークしか試していませんが、こんな感じで使います。

var irkit = require('node-irkit');

// ローカルネットワーク用のAPIを取得
var api = irkit.getLocalApi('http://192.168.0.100'); // IRKitのIPを渡す

// IRKitに直近で送られたデータを取得する
api.getMessage(function (err, res) {
    // resに信号のデータが入っている
    // こんな感じの→ {"format":"raw","freq":38,"data":[4713,1150, ...]}
});

// IRKitを介して赤外線を送る
api.postMessage({ /* ↑のresに入っているデータのフォーマットで送る */ }, function (err, res) {
    // 送信に成功してもresは空で返ってくる
});


インターネット越しにAPI叩く使い方も対応されてます。
これ使えば外から自宅のエアコンをONにするとかできます。
こちらはいずれ必要になった時に触ってみます。


管理画面の実装

サーバーはAPIサーバーに徹するということで、管理画面のクライアントサイドはBackbone.jsを使って組んでいました。

そこで思ったのが、素のBackboneだけで一からアプリケーションを組む場合、限られた時間で成果を出すのがきついということ。

いろいろと自前で実装しなければならない仕組みが多く、Backboneをラップしたフレームワークの習得が必要だと感じました。

流行りのAngularJSでもいいですけど。


SiriProxyについて

入れてサーバー起動するところまでやって、iPhone5sで「test siri proxy」と何度か話しかけてみましたが、SiriProxyと接続されてる感じがしませんでした。

ここを見ると日本語も対応しているようなので、使えたらかなり面白くなったのになー。
室温をSiriでコントロール - Okiraku Programming


SiriProxyはRubyで実装されてるので、Node.jsよりRailsの方が相性いいかもしれない。

ちなみにSiriProxyのReadmeには rvm が推奨されているけど、rbenvでも一応うごいた。


おわりに

SiriProxyの活動をウォッチしつつ、未来部屋目指していこうと思います。
iOS7 Support and Discussion · Issue #542 · plamoni/SiriProxy · GitHub