SiriProxyのプラグインとしてSiriで家電を操作するSiriProxy-iRemocon

2013.01.05 / ruby

SiriProxy-iRemoconって何?

SiriProxyのプラグインの形で、Siriで家電を操作できるものを作りました。今のところ電気のON/OFFだけですが、こんな感じで

  • ライトを付けて
  • ライトを消して

とSiriに言う事で、部屋の電気を操作できます。

(2013.01.14追記) エアコンのON/OFFの様子も追加しました。

部屋の電気の操作ってどうやってるの??

このブログでは定番になってきましたが、やはりiRemoconを利用しています。詳しくはこちらをどうぞ。

SiriProxyって何?

SiriProxyはその名のごとくSiriのProxyサーバで、プラグイン形式で質問文に対して独自の処理を追加することができるものです。Readmeがしっかり書かれているとは言え、日本語のまともな導入事例の記事が無い+公式のReadmeが手順が間違ってる箇所があったのですこし手まどりましが、こんな感じで導入できます。

Ruby1.9.3の導入

RVMでインストール可能です。bundlerもあわせて導入。


  rvm install 1.9.3
  gem install bundler
  

DNSの設定 / dnsmasq

iOSデバイスからSiriへの通信は全てguzzoni.apple.com宛に送信されるのですが、この通信を全てSiriProxyが動作するサーバへ転送させる必要があります。

そこで、SiriProxyを起動するマシンで内部DNSを立てて、iOSデバイスのWiFiネットワークのDNSをこの内部DNSを向けさせてあげることで、iOSデバイスのSiriの通信はすべてSiriProxyを向くことになります。 公式ではdnsmasqの導入で実現を行っています。全体を通してここが一番厄介ですが、Homebrewを利用することで次のように導入可能です。


  brew install dnsmasq
  # confファイルを雛形から作成
  cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
  

ここで、dnsmasq.confには次のようにaddress情報を追記します。


  # Add domains which you want to force to an IP address here.
  # The example below send any host in double-click.net to a local
  # web-server.
  #address=/double-click.net/127.0.0.1
  # 192.168.0.6はSiriProxyが可動するマシンのアドレス
  address=/guzzoni.apple.com/192.168.0.6
  

保存後、


  sudo /usr/local/sbin/dnsmasq
  

で、稼働します。

稼働後、iOSのネットワークの設定で、DNSのアドレスを先ほどdnsmasqを設置したマシンのアドレスに上書きします。

8347244546 4eda101542 n

元々のDNSはアドレスは192.168.0.1でしたが、192.168.0.6で更新しています。

SiriProxyのセットアップ

ここまでくると後はそんなに詰まることが無いと思います。必要なライブラリや証明書を作成します。


  git clone https://github.com/plamoni/SiriProxy.git
  cd SiriProxy
  mkdir ~/.siriproxy
  cp ./config.example.yml ~/.siriproxy/config.yml
  rake install
  siriproxy gencerts
  

最後のgemcertsで~/.siriproxy/ca.pemな証明書が作成されているので、この証明書をメールで添付してiOSデバイス宛に送信します。iOSのメールアプリでメールを開くと、証明書のインストールが可能になります。

siriproxy.gemspecの編集

2013.1.5時点のgemspecにはバグがあって、最新のCFPropertyListを問答無用で利用しようとしてiOS6によるSiriの音声パケットの解析でコケる問題を持っています。Issueで散々盛り上がりながら、まだコードにマージされていないようなので、とりあえず手元で


  s.add_runtime_dependency "CFPropertyList"
  

と、あるのを


  s.add_runtime_dependency "CFPropertyList", '2.1.2'
  

と、修正します。

config.ymlの編集

このままSiriProxyを起動してもサンプルのプラグインは稼働しますが、SiriProxy-iRemoconのようにプラグインを追加するとなると、config.ymlを書き換える必要があります。~/.siriproxy/config.ymlのpluginsを次のような内容を追記します。この内容はSiriProxy-iRemoconの中のconfig-info.ymlと同一のものです。


  - name: 'Iremocon'
    git: 'git@github.com:katsuma/SiriProxy-iRemocon.git'
    host: '192.168.0.9'
  

hostはiRemoconに割り当てられているIPアドレスになります。(これ書いてる途中で電気のON/OFFの赤外線IDが自宅の内容固定のまま公開してることに気づいた。。あとで外部から設定できるように変更します。。→ 変更しました

SiriProxyの起動

ここまでくるとようやくビルド+起動ができる状態になって、


  bundle install
  siriproxy update .
  rvmsudo siriproxy server
  

で、SiriProxyが起動します。あとは冒頭の動画のようにSiriの内容を解析して動作するはずです。

SiriProxyのプラグインってどうなの?

びっくりするくらい簡単に書けます。基本的には

  • 期待する文章を正規表現でマッチさせる
  • そのブロック内で行いたい処理を書く

だけ。今回のプラグインもこんな感じのコードになっています。(以下、抜粋)


  class SiriProxy::Plugin::Iremocon < SiriProxy::Plugin
    listen_for /ライト?を?(つけて|付けて)/i do
      say 'ライトをつけます'
      signal_to_iremocon(1000)
      request_completed
    end
  end
  

listen_forメソッドの引数の正規表現が期待する文章です。ちなみに「ライト?」となってるのは、僕の滑舌が悪くて何度やっても「ライ」にしか聞き取ってくれなかったのでその補正です。。ひー。

あとは別途定義したsignal_to_iremoconで家電操作を行う信号を発信させるだけですね。また、最後のrequest_completedの呼び出しは、SiriProxyの作法的なものらしく、かならずブロックの最後で呼び出す必要があるそうです。

まとめ

こんな簡単にSiriに追加処理が書けるなんてSiriProxyかなり革命的です。。前回のエントリでRails4で家電操作サーバ作ろうとしてましたが、Siriの操作の方が楽しそうなのでこっちにシフトしようと思いますよ。 しかし、これは21世紀の「開けゴマ!」状態ですね。。家電の操作にとどまらず、何でもSiriに仕事を任せることができそうで夢広がりまくりです。うお〜

2013.01.14更新

2013.01.06更新

2013.01.05更新