HomeKit ADK

やっとかよ


 Appleが HomeKitの ADK(Accessory Development Kit)ライブラリをオープンソース化した.せっかくなので自宅で動いている自前SmartHomeKitな RasPiを HomeKit対応させてみようと思う.というか Hey Siri対応だな.

 

RasPi上でのビルド


 mac上にビルド用の Dockerイメージを引っ張ってくるようだが,たいしたものではないのでセルフビルドすることにした.まず,libfaacをインストールしておく必要がある.これは標準のaptでは入ってこないので,/etc/apt/sources.list に http://www.deb-multimedia.orgを足して Acquire::AllowInsecureRepositories=trueしながら鍵を足して云々をする.

codefaq.org

次に aptで入るライブラリ・ツール群を入れる.libnfcとかも必要だったかも.

sudo apt -y install git clang libsqlite3-dev libasound2-dev libopus-dev ibavahi-compat-libdnssd-dev expect qrencode

それから適当な作業ディレクトリを掘ってリポジトリをクローンする.

git clone https://github.com/apple/HomeKitADK

最後にディレクトリを移動してから makeしてみる.

cd HomeKitADK && make TARGET=Raspi all

エラーが出るならばライブラリが足りないはず.エラーが出ないならばひとまず OKなので,自前の設定にするために二手間ほど加える.

鍵の固定


vi ./Tools/install.sh

 この中で provision_raspi.shというスクリプトを呼んでいるのだが,その引数に --setup-id HOGE を追加する.HOGEは [0-9A-Z]{4},つまり適当な 4桁の数値 or 英大文字.コレを入れておかないとアプリケーションの起動ごとに登録 (provisioning) が必要になる.

挙動の追加


vi ./Applications/Lightbulb/App.c

 この中の HandleLightBulbOnWriteという関数がコールバックとして呼ばれる.引数の bool valueが On/Offを意味するので,適当に書き換えて起こしたい挙動を追加する.自分は面倒なので stdlib.hを追加して system文で直接コマンドを呼ぶようにしてしまった.雑.

再ビルド & インストール


make clean && make TARGET=Raspi all

 もしエラーが出たら挙動追加部分が悪いということなので自己責任で直す.

./Tools/install.sh -d raspi -a Output/Raspi-armv6k-unknown-linux-gnueabihf/Debug/IP/Applications/Lightbulb.OpenSSL -n $HOST_NAME -p $PI_LOGIN_PASSWORD

 $HOST_NAMEは raspiのホスト名,$PI_LOGIN_PASSWORDはアカウント pi のパスワードを入れる.expectを使って(自分自身に ssh/scpして)アプリケーション(Lightbulb.OpenSSL)を ~/ に転送して provisioning して起動までやってくれる.provisioningの最中に QRコードが表示されるので,iPhoneなどの HomeKitアプリで登録を行う. setup codeは provision_raspi.shにもあるように 111-22-333.登録後は一旦 Ctrl-Cで終了し,~/Lightbulb.OpenSSLを何らかの形で自動起動できるようにしておくと良い.この際の引数は不要だが,実行カレントディレクトリは ~/ で sudoをつけて実行する必要があることに注意. 基本立ち上げっぱなしで自動起動設定もするつもりもないならば

cd ~/ && nohup sudo ~/Lightbulb.OpenSSL &

みたいにバックグラウンド実行してログアウトしてもOK.

お疲れ様でした


 あとは登録されたアイコンをタップする度に追加した処理 (例えば system文によるコマンド実行)がなされるはず.ということでシーン「もっと光を」を作成し,アクセサリとして On状態を追加したら「Hey Siri,もっと光を!」と叫ぶと部屋の電気がつくようになった.よかったね.