IRKitとSiriを連携して家電制御したかった
GWはIRKitとSiriを使って家電制御する仕組みを作ってたんですが、
SiriProxyがまだiOS7に対応してないとのことで、連携できませんでした。。
完成させてから紹介するつもりでしたが、どんなことをしようとしたのか書いてみます。
IRKitとは
IRKit - iPhone,iPadを使って外出先からエアコン等の家電を操作できる学習リモコン
- 出版社/メーカー: maaash.jp
- メディア: エレクトロニクス
- この商品を含むブログを見る
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