塩焼きブログ

塩焼きに関しての研究内容を公開しています

Apple HomekitとIRkitを使ったスマートホームの構築手順

Apple Homekitを使ってiPhoneから家電製品を自宅内・外出先からコントロールしたり、指定した時間、外出時、帰宅時に家電を自動コントロールするようにしたいと思います。

追記:あれから半年運用しましたが問題なしです!

IRkitでスマートホームを構築した序盤は電気のONとOFFしかしてなくてそれほど活用しているとはいえませんでしたが、半年運用しながら気が向いた時に「これも操作できるのでは?」「こんな自動化をしたら?」「この操作は自動化の必要なかった。。」といった感じで見直しをしたりもう一台購入しました。今現在はこんなことを自動化しています。

  • 平日のお昼の12時にルンバをONにして部屋の掃除
  • この記事を書いた時は冬だったが、追記している今は夏なので仕事が終わって自宅の最寄り歴に付いたらエアコン冷房をON
  • 自宅を出る時に家中のエアコンと電気のOFF(消し忘れ時も安心)
  • 自宅についたら家中の電気をON
  • 電気つけっぱとエアコンつけっぱで値落ちしても深夜になると自動でOFF(風邪を防止して安眠)
  • 朝になったら電気をつけて起こしてもらう

最初に書いた設定値に改善点なども見つかったのでそれは追記しておきました。引き続き、興味のある方はこの記事を参考にしてください!

どのように実現するのか?

理想はApple Homekitに対応した製品がAppleから発売されるのが一番ですが発売されていないのが現状です。発売されるのを待つとなると数年先になるのではないかと思います。

しかしエンジニアであれば今すぐに赤外線で操作できる家電をコントロールできます。

それにはIRkit(製品)とHomebridge(npm)を使います。

IRkitとは?

IRkitとは赤外線を送信して、リモコンで操作できる家電製品を操作することができる端末です。この端末には内部ネットワークからHTTPリクエスト経由で任意の赤外線を送信するAPIがあるため、Curlで赤外線情報を含むJSONを送信して家電を操作することができます。

Homebridgeとは?

Apple HomekitとIRkitの仲介役を担うのがNode.jsのnpmであるHomebridgeです。Homebridgeの仕事は予め定義されたconfig.jsonに基づいてネットワーク上に常駐します。Apple Homekitからの要求を受けたらconfig.jsonの赤外線情報をIRkitへ送ります。

IRkitの設定

IRkitの初回起動

IRkitに付属してきた説明書にすべての設定の手順が書いてあります。とても簡単で数分で完了します。

画像つきの解説がみたい方は以下の記事を参考にすると良いと思います。 http://crearc-design.com/2016/06/26/iphone-irkit/

ちなみに、IRkitをAPIからコントロール連携するためにはIRkitのIPアドレスが必要になります。IRkitを設定する時にiPhone側のアプリで確認すると端末固有の名前が付いていると思います。この名前でping IRkit1234.localとしてPINGを送信するとIPアドレスを知ることができます。この調べ方については以下が大変参考になります。 https://datahotel.io/archives/725

IRkitの動作確認

IRkitから赤外線を送信する場合はJSON形式で定義した赤外線のコードを送信します

curl -i "http://192.168.10.1/messages" -H "X-Requested-With: curl" -d '{"format":"raw","freq":38,"data":[123,456,789]}'

肝心の赤外線のコードの取得ですが、IRkitは常に赤外線を受信していて、赤外線をIRkitに向けて送信するとIRkitのランプが点滅して受信したことがわかります。点滅したあとに下記のようなリクエストをIRkitに送ることで最後に受信した赤外線情報を取得することができます。

curl -i "http://192.168.10.1/messages" -H "X-Requested-With: curl"

エラーで全くJSONが取得できない

リクエストを送ってもエラーが出て全く取得できない現象が起きました。これはIRkitの電源を挿し直して再起動することで解決しました。それ以降は全く問題なく取得できるようになりました。これはちょっとした不具合ですね。

Curlでリクエストを送るとIRKitがフリーズする

Curlで新しい赤外線情報を取得しようとしたら全く反応がなくなり動作しなくなりました。再度再起動をすると初回のリモコンの赤外線受信をするようなのですが、CurlでAPIにアクセスした途端に動作しなくなります。5回ほどその現象を繰り返して諦めてリセット(検索しても方法が見つからなかったので、試しに後ろにスイッチがあったのでここを爪楊枝で押しながらmicroUSBを指してしばらく待っていたらリセットのような挙動をした)して、再度初期設定から始めたら問題なく製品が動作するようになりました。

Homebridgeの設定

Homebridgeをネットワーク上に立ち上げます。立ち上げるマシンですが、常に起動しているMacや余ったPCにLinuxを入れたり、RaspberryPiでも構いません。何か適当にサーバーを作ってそこで起動します。ちなみに僕はRaspberryPiを使っています。RaspberryPiのセットアップからNode.jsのインストールについてはこちらで解説したことがあるので参考にしてください。

Node.jsの環境を整えたらHomebridgeに必要なソフトウェアとHomebridge本体をインストールします。

sudo apt-get install libavahi-compat-libdnssd-dev
sudo npm install -g homebridge
sudo npm install -g homebridge-irkit

その後以下の場所に設定ファイルを設置します。

vi /home/pi/.homebridge/config.json

nameは検出された時の表示名、usernameは先程のMACアドレス、portは立ち上げておきたいポート、pinは認証時に入力させたいものを記載します。今回は設定ファイルを指定せずに一度起動した時に生成されたポート番号とPINを入れてみましたが、おそらく自分で指定できるに違いない。。

{
  "bridge": {
    "name": "Homebridge01",
    "username": "11:AA:22:BB:33:CC",
    "port": 50000,
    "pin": "123-45-678"
  },
  "description": "IRKit01 Control",
  "accessories": [
    {
      "accessory": "IRKit",
      "name": "リビングの電気",
      "irkit_host": "192.168.10.1",
      "on_form": {"format":"raw","freq":38,"data":[1111,'...']},
      "off_form": {"format":"raw","freq":38,"data":[2222,'...']}
    },
    {
      "accessory": "IRKit",
      "name": "寝室の電気",
      "irkit_host": "192.168.10.1",
      "on_form": {"format":"raw","freq":38,"data":[1111,'...']},
      "off_form": {"format":"raw","freq":38,"data":[2222,'...']}
    }
  ]
}

追記: 昔はIPアドレスを直書きしていましたが、最近はIRKit9999.localみたいに書いて動かしてます。むしろこう書かないとたまにIPアドレスが変わってIRKitとの連携ができなくなってIPアドレス書き直して再起動とかしなきゃいけなくて大変です。

そして以下のコマンドで起動することができます。

homebridge

iPhoneのホームアプリからHomebridgeが検出できるようになっていると思います。先程accessoriesで指定したものがどの部屋にあるのかなどを聞かれるので質問に従って設定していけば、自然に家電をコントロールできるようになると思います。ちなみにこのままではコンソールを閉じると停止してしまいますのでforeverを使ってプロセスの永続化を行いましょう。

forever start /usr/local/bin/homebridge

foreverについては過去に詳しく解説しています。こちらのNode.jsでforeverを使ってスクリプトの起動を永続化するを参照してください。

追記: 後からhomebridgeのホスト名を変更する場合

HomeBridgeはavahiを使っていると思います。私はRaspberry PiでHomeBridgeを運用していたのですが、ある日Raspberry Piの2台目を追加するにあたり既存Raspberry Piのホスト名を変更しました。(raspberrypi.localからhoge.localに変更)

この変更をした所HomeBridgeは動作しなくなり(正確にはiPhoneからAppleHomekitで操作できず)、どうしようもない状態に陥りました。一時間位試行錯誤した結果、~/.homebridge配下にある、config.json以外のフォルダをリネームして退避し、その後homebridgeを再起動することでiPhoneから検出できるようになりました。

この時私は一度iPhoneから既存のHomeBridgeの設定を削除して新規追加しました。おそらくこうしないともう対応できないのかな?うまくやれば設定を引き継げそうですが、既存フォルダのファイルを一つ開いたらバイナリみたいなよくわかんないけど調べると時間かかるので辞めました。うーむ、このせいでオートメーションの複雑な設定は失われました。。

また、今回Raspberry Piが停電等により再起動した時でも/etc/rc.localの設定で自動的にHomeBridgeを起動しようと思ったのですがroot権限で実行するとアクセサリが発見できませんでした。今思えば、おそらくHomeBridgeは~/.homebridgeを見る設定になっているので、rootでやるとrootのユーザーディレクトリを見るのかもしれない。rootのユーザーディレクトリ配下の設定ファイルを参照しながら起動したのでアクセサリが0ということになっていたのではないかと思います。rootで実行する時はrootのユーザーディレクトリにHomeBrdigeの設定ファイルを置かねば。

しかし自動起動設定だからといってrootに変更するのは少し違う気がするので、その辺は少し手心を加えて対応しようかなって思ってます。以上追記でした。

外出先から自宅を操作する

外出先から自宅を操作するにはApple TVがおすすめです。Apple TVに自分のiCloudアカウントでログインをすると、設定のiCloudの項目にHomekitに関する項目が現れONにすることができるようになります。この項目をONにしておけば自動的に連携をして、外出先からも操作ができるようです。

テレビの音量やエアコンの温度の管理について

Homebridgeを通したApple Homekitでそういうことができるのかは不明ですが、IRkit自体に適切に赤外線を送りさえすれば細かいコントロールは可能だと思います。ただ、どのような手順を踏んでそのような操作をするかについては考える必要がありそうです。リモコンで直接操作するほうが案外楽なのかも。。。

技術メモ

無理にApple Homekit経由のみで使う必要はありません。HTTPリクエストでIRkitは動作しますので、例えばcronジョブで自宅の電灯を管理しても良いですし、人間が来たら赤外線で感知して家中の電源をつけるといったこともこの製品を使えば可能です。Node.jsではなくPHPやJavaでやってもいいかもしれません。

自作の音声認識システムを通して、「テレビのチャンネルを1にして」という動作に対応したりなど夢は広がりますね。

エアコンの機種ごとの赤外線をGithubにあげていけばこのあたりもっと簡単に実装できそうです。自分でいちいち赤外線を認識させて取得する作業は大変。。

参考サイト