HueのRemoteAPIでライトを制御してみた

## はじめに
PhilipのHueをRemoteAPIで制御する方法をまとめてみた。

## 事前に準備するもの
Hueライト
Hue Bridge
Hue developer　Programへの登録(https://developers.meethue.com/)
Bridgeの登録 (https://account.meethue.com)

## Hueライトと　Hue Bridgeのローカル接続
RemoteAPIを試す前に、ローカルにHueライトとBridgeを配置した状態で制御すると理解が深まる。
詳細な手順はここでは省く。
以下の公式サイトに手順が詳しく載っている。
https://developers.meethue.com/documentation/getting-started

## HueのRestAPIを使用できるようになるまでの流れ
1. Remote Hue API appsへの登録
2. AuthTokenの取得
3. ユーザID/whilelistの取得
4. ライトの状態取得
5. ライトの制御

## 1. Remote Hue API appsへの登録
この登録をしないと、RemoteAPIは使用できない。
以下の記述は必須。
* App Name: 任意のアプリケーション名。
　　　　　例）sampleHueApp
* CallbackURL：　OAuthによる認証成功時にリダイレクトするURL。
**トークン発行時にCallbackURL先へのレスポンスコードを使用するため存在するURLをしていする必要がある。**
トークン発行用に超簡易サーバーを立てて、リダイレクト先に指定した。
　　　　例）http://localhost:9000
* Application desciption: アプリの特徴(なんでもいい)
　　　　例） OAuth control

## ローカルに簡易Webサーバーを立てる
CallBackURLを受けれる様にローカルに超簡易サーバー(Web Server for Chrome)を立てる。ここでは、
https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb?hl=ja

![スクリーンショット 2018-09-27 23.37.24.png](https://qiita-image-store.s3.amazonaws.com/0/234299/cbe92e45-1337-fe3e-5ce9-53b1c38b2925.png)


## 2. AuthTokenの取得
ブラウザから、下記アカウントにアクセスして、途中api.meethue.comにログインする。
https://api.meethue.com/oauth2/auth?clientid=<clientid>&response_type=code&state=xUvdhs&appid=<appname>&deviceid=mydeviceid&devicename=mydevicename


| 設定項目       |     設定項目 |  設定例 |
|:-----------------|:------------------|:------------------|
| clientid             |1. で発行されたclientid | U4kdidlYHJduJ5d
| response_type     | response_typeの値（固定）　 | code
| state             | レスポンスを受けた時の状態設定(任意どんな文字列でもOK） | xUvdhs
| appid             | 1. で発行されたappname | sampleHueApp
| deviceid             | デバイスid(任意どんな文字列でもOK）  | mydeviceid
| devicename             | デバイス名(任意どんな文字列でもOK）　 | mydevicename

上記をブラウザで実行すると、ローカル立てた簡易Webサーバーに以下のレスポンスコードが返ってくる。
ここの**code=XvXXkQHx**の部分は後のトークン取得で使用するのでメモっておくこと。

http://localhost:9000/?code=XvXXkQHx&state=xUvdhs

### トークンの取得
トークンの取得にはダイジェスト認証とBasic認証の2種類のがあるが、ここではBasic認証でトークン取得をする。
トークンの取得はPOSTで実行し、 clientidとclientsecretは1で取得したものを使用する。
base64のエンコードした文字列を設定すること。
ヘッダー部には、Authorization: Basic <base64(clientid:clientsecret)>を設定する。

エンコード文字列は以下で取得できる

```
echo -n "<clientid>:<clientsecret>" | openssl enc -e -base64
eEEXh4CXXXXXXX==

#　トークンの取得リクエスト
curl -X POST https://api.meethue.com/oauth2/token?code=XvXXkQHx&grant_type=authorization_code -H "Authorization: Bearer eEEXh4CXXXXXXX=="

# レスポンスコード
{
    "access_token": "XXXXXXXXXXXXXXXXXXXX",   ←これがアクセストークンになる。
    "access_token_expires_in": "XXXXXXXXXXXXX",
    "refresh_token": "XXXXXXXXX",
    "refresh_token_expires_in": "XXXXXXXXXX",
    "token_type": "BearerToken"
}
```

## 3. ユーザID/whilelistの取得

```
curl -X GET https://api.meethue.com/v2/bridges/ -H 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXX'

## レスポンス
[
  {
    "success": {
      "username": “*****"
    }
  }
]

```

## 4. ライトの状態取得

```
curl -X GET https://api.meethue.com/bridge/<username>/lights -H "Authorization: Bearer XXXXXXXXXXXXXXXXXXXX"  | python -m json.tool

{
...
"state": {
    "alert": "none",
    "bri": 254,
    "colormode": "ct",
    "ct": 366,
    "mode": "homeautomation",
    "on": true,
    "reachable": true
...
}

```


## 5. ライトの制御
```
# ライトの消灯
curl -X PUT https://api.meethue.com/bridge/<username>/lights/1/state -H "Authorization: Bearer XXXXXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{"on":false}'
```