Chapter 04

HomeKit実践

tokorom
tokorom
2020.10.12に更新

HomeKit Accessory Simulatorの利用

HomeKitを利用したアプリを開発するには、まずXcodeプロジェクトのCapabilitiesでHomeKitの項目をONにする必要があります[1]
このとき「Download HomeKit Simulator...」というボタンが表示されますので、ここからHomekit Accessory Simulatorを取得可能です(図. Additional Tools for Xcodeのダウンロード)。

Additional Tools for Xcodeのダウンロード
図. Additional Tools for Xcodeのダウンロード

正確には、この導線からAdditional Tools for Xcodeをダウンロードすると、その中のツールの1つにHomeKit Accessory Simulatorがあります(図. HomeKit Accessory Simulatorの場所)。

HomeKit Accessory Simulatorの場所
図. HomeKit Accessory Simulatorの場所

HomeKit Accessory Simulatorを利用すると、任意のアクセサリ(HMAccessory)、サービス(HMService)、キャラクタ(HMCharacteristic)を追加可能で、まだ日本では手に入らないアクセサリの挙動もシミュレート可能です(図. HomeKit Accessory Simulator)。
ここで作成したアクセサリは、シミュレータ上だけでなく実機のホーム(HMHome)に追加することができ、Apple純正のホームアプリでも、自作のHomeKit対応アプリでも利用することが可能です。たとえば、彩度(Saturation)などの数値もこのツールのGUIで変更でき、実際のHomeKit対応デバイスを利用するよりもデバッグやテストの効率が上がるケースがあります。

HomeKit Accessory Simulator
図. HomeKit Accessory Simulator

HomeKit対応製品利用実例

HomeKit Accessory Simulatorの利用ではシミュレータの有用性について紹介しましたが、やはり実際にHomeKitに対応したデバイスを利用しての開発は魅力的です。
この節では、日本で購入できるHomeKit対応製品のうち7つを実際に購入し、取得できた情報をまとめます。

Philips Hue

Philips Hue
図. Philips Hue

表. 主なサービス

HMServiceType 説明
Lightbulb 電球

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
PowerState 電源の状態 bool
Hue 色相 float
Saturation 彩度 float
Brightness 明るさ int

スマートIoT照明のパイオニアです。
PowerStateキャラクタで点灯/消灯を、HueSaturationBrightnessキャラクタで電球の色相、彩度、明るさをそれぞれ変更できます(ソースコード. Hueの電球の色を変える)。

Hueの電球の色を変える
// Hue、 Saturation、Brightnessに対応したキャラクタを取得
let hue = //< HMCharacteristicTypeHue
let saturation = //< HMCharacteristicTypeSaturation
let brightness = //< HMCharacteristicTypeBrightness

// 電球をピンク色に更新
hue.writeValue(355) { error in
}
saturation.writeValue(38) { error in
}
brightness.writeValue(91) { error in
}

キャラクタのvalueの更新が視覚的にわかりやすく、また、true/falseだけでなく数値のvalueを書き込み可能な製品はまだ珍しいです。
そのため、HomeKitプログラミングにトライするうえで最初に購入するものとして、おすすめしやすい製品の1つです。

また、今回紹介する製品の中では唯一、ブリッジの役割を担うアクセサリを含み、ブリッジにライトが連なるというアクセサリの多段構成も確認できます。

Elgato Eve Wireless Room Sensor

Elgato Eve Wireless Room Sensor
図. Elgato Eve Wireless Room Sensor

表. 主なサービス

HMServiceType 説明
TemperatureSensor 温度センサー
HumiditySensor 湿度センサー
AirQualitySensor 清浄度センサー
Battery バッテリー

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
CurrentTemperature 現在の温度 float -
CurrentRelativeHumidity 現在の相対湿度 float -
AirQuality 空気質 uint8 -
BatteryLevel 電池残量 uint8 -
ChargingState 充電の状態 uint8 -
StatusLowBattery 状況(電池残量低下) uint8 -

部屋に設置するだけで部屋の現在の温度(CurrentTemperature)、相対湿度(CurrentRelativeHumidity)、空気質(AirQuality)が参照できます。
空気質(AirQuality)キャラクタが確認できる製品は、今回紹介する製品の中ではこれだけです[2]
部屋の温度をトリガとしてエアコンを操作するなどの利用方法が考えられます。

空気質(AirQuality)キャラクタのvalueのフォーマットはuint8ですが、この数値の意味はHMCharacteristicValueAirQualityというenumとして定義されています(表. HMCharacteristicValueAirQuality値一覧)。

表. HMCharacteristicValueAirQuality値一覧

rawValue 説明
unknown 0 未定義
excellent 1 とても良い
good 2 良い
fair 3 普通
inferior 4 良くない
poor 5 とても良くない

動作には単3電池3本が必要で、電池の残量などもBatteryLevelChargingStateStatusLowBatteryキャラクタで把握可能です。

Elgato Eve Weather Wireless Outdoor Sensor

Elgato Eve Weather Wireless Outdoor Sensor
図. Elgato Eve Weather Wireless Outdoor Sensor

表. 主なサービス

HMServiceType 説明
TemperatureSensor 温度センサー
HumiditySensor 湿度センサー
Battery バッテリー

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
CurrentTemperature 現在の温度 float -
CurrentRelativeHumidity 現在の相対湿度 float -
BatteryLevel 電池残量 uint8 -
ChargingState 充電の状態 uint8 -
StatusLowBattery 状況(電池残量低下) uint8 -

Elgato Eve Wireless Room Sensorの屋外用です。こちらで取得できるのは現在の温度(CurrentTemperature)、相対湿度(CurrentRelativeHumidity)です。

この製品自体は気圧の計測もサポートしていますが、iOS 11時点のHomeKitは気圧のキャラクタをサポートしていません。
ただ、HomeKitは未定義のサービス(HMService)やキャラクタ(HMCharacteristic)を許容していますので、気圧の情報も未定義のサービス、キャラクタから無理やり参照することはできます(ソースコード. 気圧を取得)。

気圧を取得
// Eve Weatherの気圧を示すserviceType
let serviceType = "E863F00A-079E-48FF-8F27-9C2605A29F52"
// Eve Weatherの気圧を示すcharacteristicType
let characteristicType = "E863F10F-079E-48FF-8F27-9C2605A29F52"

// 上記serviceType/characteristicTypeと合致するキャラクタを取得
let service = home.servicesWithTypes([serviceType])?.first
let candidates = service?.characteristics
    .filter { $0.characteristicType == characteristicType }

guard let airPressure = candidates?.first else {
    return
}

airPressure.readValue { error in
    guard let value = airPressure.value as? Float else {
        return
    }
    // 取得した気圧をprint
    print("airPressure: \(value)")
}

動作には単3電池2本が必要で、電池残量関連のキャラクタも参照可能です。

Eve Weatherを外壁に設置
図. Eve Weatherを外壁に設置

屋外用ということで外壁等に設置することになります(図. Eve Weatherを外壁に設置)。両面テープなど付属していませんので別途購入が必要です。
防水等級はIPX3(防雨形)です。完全防水ではなく生活防水レベルとのことですので、強い雨の日にも故障しないかはわかりません(設置してから3ヶ月の範囲では雨の日でも問題なく利用できています)。

Elgato Eve Door & Window Wireless Contact Sensor

Elgato Eve Door & Window Wireless Contact Sensor
図. Elgato Eve Door & Window Wireless Contact Sensor

表. 主なサービス

HMServiceType 説明
ContactSensor 接触センサー
Battery バッテリー

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
ContactState 接触センサーの状態 uint8 -
BatteryLevel 電池残量 uint8 -
ChargingState 充電の状態 uint8 -
StatusLowBattery 状況(電池残量低下) uint8 -

ドアや窓の開閉状態を感知することができる接触センサーです。
この製品は2つの部品に分かれており、この2つが近接しているかどうかを判定できます。

接触センサーの状態(ContactState)キャラクタのvalueのフォーマットはuint8ですが、この数値の意味はHMCharacteristicValueContactStateというenumとして定義されています(表. HMCharacteristicValueContactState値一覧)。

表. HMCharacteristicValueContactState値一覧

rawValue 説明
detected 0 接触
none 1 非接触

動作には単3電池1本が必要で、電池残量関連のキャラクタも参照可能です。

Eve Door & Windowを開き戸に設置
図. Eve Door & Windowを開き戸に設置

設置用の両面テープも付属しています。図. Eve Door & Windowを開き戸に設置は自宅の玄関の開き戸にこの製品を設置した例ですが、設置場所さえ確保できれば引き戸にも設置できます。

Elgato Eve Motion Wireless Motion Sensor

Elgato Eve Motion Wireless Motion Sensor
図. Elgato Eve Motion Wireless Motion Sensor

表. 主なサービス

HMServiceType 説明
MotionSensor モーションセンサー
Battery バッテリー

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
MotionDetected 動きを検知 bool -
BatteryLevel 電池残量 uint8 -
ChargingState 充電の状態 uint8 -
StatusLowBattery 状況(電池残量低下) uint8 -

モーションセンサーです。
動きを検知(MotionDetected)している状態かどうかをtrue/falseで取得できます。
Apple純正のホームアプリには「センサーが何かを検知したとき」をトリガとしたオートメーションを作成する機能がありますが、このMotionDetectedキャラクタはその用途に使えます(図. ホームアプリの新規オートメーション画面)。

ホームアプリの新規オートメーション画面
図. ホームアプリの新規オートメーション画面

動作には単3電池2本が必要で、電池残量関連のキャラクタも参照可能です。

なお、センサーの感度なども変更することができ、変更したい場合はApp Storeから「Elgato Eve」をダウンロードして設定します(図. Elgato Eveの設定画面)。

Elgato Eveの設定画面
図. Elgato Eveの設定画面

※2020/10/6追記: 2020年現在ではPhilips Hueモーションセンサーがありますので、既にHueを導入済みのかたにはこちらをお勧めします

D-Link Omna 180 Cam HDカメラ
図. D-Link Omna 180 Cam HDカメラ

表. 対応するカメラコントロール

プロパティ名 説明
streamControl HMCameraStreamControl ビデオストリーム(動画)
snapshotControl HMCameraSnapshotControl スナップショット(静止画)
microphoneControl HMCameraAudioControl マイク
speakerControl HMCameraAudioControl スピーカー
settingsControl HMCameraSettingsControl カメラ設定

表. 主なサービス

HMServiceType 説明
CameraControl カメラコントロール
Microphone マイク
Speaker スピーカー
MotionSensor モーションセンサー

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
ImageMirroring 画像反転 bool
Mute 消音 bool
Volume 音量 int
MotionDetected 動きを検知 bool -

2017年10月時点で日本で購入可能な唯一のHomeKit対応IPカメラです。

ビデオストリーム(動画)の利用、スナップショット(静止画)の撮影、マイクやスピーカーの利用と、HomeKitがサポートするカメラコントロールとしては一通りのことができます。
また、カメラを利用したモーション検知(MotionDetected)も可能です。

App Storeから「OMNA」アプリをダウンロードして利用することで、HomeKitがサポートしていない部分の設定変更もできます。

カメラで撮影している動画をアプリで表示する具体的な方法、マイクやスピーカーの設定方法などについてはHomeKit入門カメラの利用で紹介しています。

Koogeek Smart Plug P1

Koogeek Smart Plug P1
図. Koogeek Smart Plug P1

表. 主なサービス

HMServiceType 説明
Outlet コンセント

表. 主なキャラクタ

HMCharacteristicType 説明 フォーマット 書き込み
PowerState 電源の状態 bool
OutletInUse コンセント使用中 bool -

いわゆるスマートコンセントです。
このデバイスを経由してコンセントとファン(扇風機)などの機器を接続し、接続した機器の電源のOn/Offを更新することができます。
このデバイスのプラグは3ピンのため、日本で一般的な2ピン用のコンセントで利用する場合は、別途3ピン→2ピン変換プラグが必要です(図. プラグの形状)。

プラグの形状
図. プラグの形状

具体的なコントロール方法ですが、このアクセサリが持つPowerStateキャラクタに対してwriteValue(true)で電源On、writeValue(false)で電源Offができます。
また、OutletInUseキャラクタにより、コンセントに機器が接続されているかをtrue/falseで参照することもできます。

なお、Koogeek Smart Plug P1は、今回紹介する製品の中ではassociatedServiceTypeプロパティを更新できる唯一のデバイスです。

associatedServiceTypeプロパティを更新するには、Apple純正のホームアプリ[3]でこのデバイスの詳細画面を開きます。ここで「タイプ」に表. 選択できるassociatedServiceTypeの2種[4]のどちらか、コンセントに接続した機器に合致するものを選択します。

表. 選択できるassociatedServiceType

HMServiceType 説明
Fan ファン
Lightbulb 電球

たとえば、ここで「ファン」を選択すると、ホームアプリ上でのこのサービスを示すアイコンもファンになり、電源をオンにすると勢いよくファンが回るようなギミックも見られます(図. associatedServiceType)。

associatedServiceTypeの変更
図. associatedServiceType

脚注
  1. もう1点、アプリのInfo.plistにNSHomeKitUsageDescriptionを設定しておく必要があります ↩︎

  2. 空気質の参照が不必要なら、もう少しだけ低価格な「Elgato Eve Degree Indoor Sensor」も選択肢にあがります ↩︎

  3. その他、App Storeで公開されているKoogeek Homeアプリなどからも変更が可能です ↩︎

  4. 選択項目としてはもう1つ「コンセント」がありますが、これを選択するとassociatedServiceTypenilが設定されます ↩︎