[HomeKit対応仕様] Philips Hue Dimmer スイッチ


<img src="https://qiita-image-store.s3.amazonaws.com/0/7883/3953d9ee-b01b-4fdd-a869-2215bbe5a33d.png" height=300 />

<a target="_blank" href="https://www.amazon.co.jp/gp/product/B01N3L04OW/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B01N3L04OW&linkCode=as2&tag=tokorom-22&linkId=df2cceb28ec6b63bef5e55831de49fe0">[Amazon] Philips Hue(ヒュー) Dimmer スイッチ</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=tokorom-22&l=am2&o=9&a=B01N3L04OW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 主なサービス

|`HMServiceType`〜 | 説明 |
|--- | ---- |
|`StatelessProgrammableSwitch` | ステートレス・プログラマブル・スイッチ |
|`Battery` | バッテリー |

## 主なキャラクタ

|`HMCharacteristicType`〜 | 説明 | フォーマット | 書き込み |
|--- | ---- | ---- | ---- |
|`InputEvent` | プログラマブル・スイッチ・イベント | uint8 | - |
|`BatteryLevel` | 電池残量 | uint8 | - |
|`ChargingState` | 充電の状態 | uint8 | - |
|`StatusLowBattery` | 状況（電池残量低下） | uint8 | - |

## 概要

スマートIoT照明のパイオニアであるPhilips Hueのランプのプログラマブルスイッチです。

Hueの公式ページにもAppleのHomeKit対応製品一覧にもこの製品がHomeKit対応しているとは書かれていなかったのですが、購入して利用してみたらHomeKit対応していて驚きました。
単体で買えば3000円程度とHomeKit対応したプログラマブルスイッチとしては格安です。

なお、この製品を動作させるにはHueのブリッジが必要であることに注意が必要です。
逆に、Hueのブリッジがあれば、Hue以外の（HomeKit対応した）ランプのコントロールにも利用できます。
HomeKit的には単なるプログラマブルスイッチですので、ランプの点灯/消灯以外のあらゆる操作にも対応可能です。

この製品は電池で動作しますので電池残量関連のキャラクタも参照可能です。

## InputEventをトリガーとするサンプルコード

`InputEvent`をトリガーとして特定のシーンを実行する、具体的には、ボタンを押したらランプを点灯/消灯するサンプルコードを紹介します。

なお、単にシーンを実行するだけならコードを書かなくともApple純正のHomeアプリで設定できますので、ここでは、

- ランプが消灯していれば点灯する
- ランプが点灯していれば消灯する

とトグルになるサンプルとします。

```swift
// 設定したいボタンのInputEventを探す
// このサンプルでは適当な１つのInputEventを取得
let service = home.servicesWithTypes([HMServiceTypeStatelessProgrammableSwitch])?.first
let candidates = service?.characteristics.filter { $0.characteristicType == HMCharacteristicTypeInputEvent }
guard let inputEvent = candidates?.first else {
    return
}

// InputEventが取り得る値は0のみ
let event = HMCharacteristicEvent(characteristic: inputEvent, triggerValue: NSNumber(value: 0))

let powerState = //< チェック対象のランプのPowerStateキャラクタ

// ランプが点灯中の場合という条件を作る
let onState = HMEventTrigger.predicateForEvaluatingTrigger(
    powerState,
    relatedBy: .equalTo,
    toValue: true
)

// ランプが点灯中なら消灯するというトリガを作る
let offTrigger = HMEventTrigger(name: "点灯->消灯", events: [event], predicate: onState)
let lightOff = //< ライトを消灯するシーン
home.addTrigger(offTrigger) { error in
    offTrigger.addActionSet(lightOff) { error in
        offTrigger.enable(true) { error in
            // エラー処理などは省略
        }
    }
}

// ランプが消灯中の場合という条件を作る
let offState = HMEventTrigger.predicateForEvaluatingTrigger(
    powerState,
    relatedBy: .equalTo,
    toValue: false
)

// ランプが消灯中なら点灯するというトリガを作る
let onTrigger = HMEventTrigger(name: "消灯->点灯", events: [event], predicate: offState)
let lightOn = //< ライトを点灯するシーン
home.addTrigger(onTrigger) { error in
    onTrigger.addActionSet(lightOn) { error in
        onTrigger.enable(true) { error in
            // エラー処理などは省略
        }
    }
}
```

## まとめ

なんやかんや物理スイッチが便利というのと、HomeKitでの遊び道具として、Hueをお持ちのかたにとっては安価で有用なプログラマブルスイッチです。
設定可能なボタンも４つありますので、遊びかたにも幅ができます。

もちろん、HomeKitなしでもHueのランプのコントローラとして普通に便利です。

## iOS 11 Programmingについて

この記事は「iOS 11 Programming」の **第12章 HomeKit入門とiOS 11における新機能** の中の **12.4.2 HomeKit 対応製品利用実例** への追加コンテンツ的位置付けにもなっています。
この製品がサポートするサービス（`HMService`）やキャラクタ（`HMCharacteristic`）の表など、全てこの書籍に合わせた形で掲載しております。

「iOS 11 Programming」にご興味のあるかたは是非、以下リンクからご参照ください。

<a target="_blank" id="purchase" style="text-decoration:underline; color:#1DA1F2;" href="http://peaks.cc/tokorom/iOS11">
iOS 11 Programming
<img src="https://s3-ap-northeast-1.amazonaws.com/peaks-images/project002_cover.jpg" height=200 />
</a>