HomeKit ADKでSlackにメッセージ送信するアクセサリを作ってみる
HomeKitADKのオープンソース化
つい先日(2019/12/18)、AppleがAmazon、Google、Zigbee Allianceと、スマートホームデバイスに関するワーキンググループを結成したとのビッグニュースが発表されましたね!
これに伴い、HomeKitに対応したアクセサリを開発するためのHomeKit ADKがオープンソース化されました。
https://github.com/apple/HomeKitADK
HomeKit対応アクセサリ作ってみよう!?
ちなみにHomeKitの世界ではHomeKitに対応した機器のことをアクセサリと呼びます。
ということで早速HomeKit対応アクセサリを作ってみましょう!
といってもハードウェアを作るわけではなく、手元のMac上で動き、HomeアプリからOnするとSlackになにか投稿するというアクセサリを作る実験をしてみようと思います。
と考えたわけですが、12/23現在ですとまだドキュメント等も優しくはないので、リポジトリを覗いてもなにがなんやらの状態です。
ひとまず、READMEに書かれているとおりに、必要なものをbrew installして、make allすれば、なにやらビルドは成功します。そして、ビルドされた
Output/Darwin-x86_64-apple-darwin19.0.0/Debug/IP/Applications/Lightbulb.OpenSSL
を実行したらなにやら動きます1。
こちらですが、
- まず、HomeKit対応したアクセサリはHomeKit Accessory Protocol(HAP)により操作される
- HomeKit対応するアクセサリではHAP Accessory Serverが動いている必要があり、これによりHomeアプリへの追加だったり、「ライトを点灯して」といった命令を受け入れる
- 上で動かしているLightbulb.OpenSSLは、ライト用のHAP Accessoryのサンプル
という理解で良さそうです。
LightbulbのサンプルをiPhoneのHomeアプリに追加してみよう
上のLightbulb.OpenSSLを動かしている状態で、iPhoneのHomeアプリを起動し、以下のようにすると、このサンプルのアクセサリを実際に追加できます。

- アクセサリの追加から「コードがないか、スキャンできません」を選ぶ
- 近くのアクセサリに「Acme Light Bulb」というのが表示されるので追加する
- 設定コードの入力を求められるので11122333を入力する
なお、設定コードは https://github.com/tokorom/HomeKitADK/blob/lightbulb_slack/PAL/Mock/HAPPlatformAccessorySetup.c#L12 に書かれていたものを使ってみました。将来、このサンプル用の設定コードは変わるかもしれません。
これでサンプルのLightbulbがHomeアプリに追加されましたので、Homeアプリ上でこのサンプルのライトを点灯/消灯することができるようになりました。
といっても実際に電球があるわけではないので、点灯したよ、消灯したよ、というのはログ上で確認できるのみです。ライトの点灯/消灯を切り替えると、
Info    HandleLightBulbOnWrite: true
Info    HandleLightBulbOnWrite: false
といったログが確認できるかと思います。
サンプルを改造してSlackにメッセージを送信させよう
HomeKit対応したライトを作る場合は、上のHandleLightBulbOnWriteのところで実際にライトを点灯させるコードを書くことになりそうです(Raspberry Piなどでそれをやってみるのも簡単と思います)。
今回はSlackにメッセージを送信するアクセサリを作るというのが目的なので、
https://github.com/tokorom/HomeKitADK/blob/lightbulb_slack/Applications/Lightbulb/App.c#L165-L184
このあたりに、SlackにメッセージをPOSTする機能を追加しましょう。
ただ、今回は実験なので(正直、C言語で書いてビルドし直して…というのが面倒なので)、
#include <stdlib.h>
して、
if (value) {
    system("./handleLightBulbOn");
}
ライトがOnになったら外部のShellスクリプトを叩くという実装だけして、あとはShellスクリプトで書く…という形に逃げちゃいます。。。
Slackにメッセージ送信するスクリプトの追加
ここからは慣れ親しんだSwiftなどでSlackにメッセージ送信するコード書くだけなので、ここで紹介するまでもないです。
例えば、こんなかんじのものです。
この例ではSlackのIncoming Webhooksを使っています。
touch handleLightBulbOn
chmod +x handleLightBulbOn
vim handleLightBulbOn
#!/usr/bin/swift
import Foundation
let slackURL = URL(string: "https://hooks.slack.com/services/foo/bar/baz") //< Incoming Webhooks
var request = URLRequest(url: slackURL!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-type")
let message = "ライトが点灯💡"
let postData = "{\"text\": \"\(message)\"}".data(using: .utf8)
request.httpBody = postData
let semaphore = DispatchSemaphore(value: 0)
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { _, _, _ in
    semaphore.signal()
}
task.resume()
semaphore.wait()
実験成功!
これをビルドし直して2Homeアプリに追加して、点灯命令を出したら、

とSlackにメッセージが投稿されるのを確認できました!
これにて実験終了。
![[HomeKit対応仕様] デロンギ マルチダイナミックヒーター](https://qiita-image-store.s3.amazonaws.com/0/7883/e2d9ecaa-7f81-761e-46ac-ca1555bdab71.png)
![[HomeKit対応仕様] Philips Hue モーションセンサー](https://qiita-image-store.s3.amazonaws.com/0/7883/a368e9a9-87fb-eb00-d425-0563e800440b.png)
![[HomeKit対応仕様] Koogeek Wi-Fiスマート LED](https://qiita-image-store.s3.amazonaws.com/0/7883/77fdcc8d-0c7a-b9d5-960d-9cb55319049f.jpeg)

![[HomeKit対応仕様] Philips Hue Dimmer スイッチ](https://qiita-image-store.s3.amazonaws.com/0/7883/3953d9ee-b01b-4fdd-a869-2215bbe5a33d.png)
![[HomeKit対応仕様] Philips Hue ホワイトグラデーション シングルランプ](https://qiita-image-store.s3.amazonaws.com/0/7883/ddd409f2-d2b4-a9de-c1c2-b2c11ec53d39.png)





