HueのRemote APIで外部から家のライトを制御する。


## コードを受け取るための簡易サーバーの準備

1. Google Chromeの「[Web Server for Chrome](https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb/related?hl=ja)」のアドオンを追加する。
2. 追加したアドオンを起動する。
3. 「CHOOSE FOLDER」から任意のフォルダを選択する。
![スクリーンショット 2020-11-28 17.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324285/9686bebf-2fc5-d017-5e06-965772ff2a51.png)
4. これでWebサーバーが起動している状態になる。http://127.0.0.1:8887 にアクセスすると、「Index of current directory...」と表示されるページが開くはず。



## Remote Hue API appidsの登録
1. [HueのDevelopperサイト](https://developers.meethue.com)にアクセス＆ログインする。
2. 右上のユーザー名の所のドロップダウンリストから「Remote Hue API appids」選択する。
![スクリーンショット 2020-11-28 16.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324285/b16bc924-3325-fb5c-bc6f-d1ff76a86a43.png)
3. 「Add new Remote Hue API app」を選択する。
4. 「App name」と「Application description」を適当に入力し、Callback URLに先ほどの簡易WebサーバーのURLを入力する（今回の場合はhttp://127.0.0.1:8887）。
![スクリーンショット 2020-11-28 17.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324285/9b0c0e66-3cb0-b869-147c-ebdf4b5bb266.png)
5. 「Submit」を押すと、以下の情報が返ってくるはず：
    * AppId
    * ClientId
    * ClientSecret

## コードの取得

1. コードを受け取るための以下のURLの各パラメータを、2.で取得したものに置き換え、ブラウザで実行する。

https://api.meethue.com/oauth2/auth?clientid=<clientid>&appid=<appid>&deviceid=<deviceid>&devicename=<devicename>&state=<state>&response_type=code

|パラメータ名|概要|
|:--|:--|:--|
|clientid|Remote Hue API appidsに登録した時に取得した英数字の文字列|
|state|レスポンスに含める任意の文字列。30文字以上のランダムな文字列を指定することを推奨|
|deviceid|任意の文字列|
|devicename|任意の文字列|
|appid|Remote Hue API appidsに登録した時指定されたAppのID|
|response_type|「Code」を指定する。|

2. ログインやHue Bridgeとのリンクなどを確認されたら、ブラウザの表示にしたがって対応する。

3. 1.の簡易Webサーバーの画面が開く。このときURLを確認すると、パラメタータとして「Code」が記載されている（code=XXXXXXXXの部分）のでこれをメモしておく。

## ClientIdとClientSecretのbase64エンコード

前々段で取得したClientIdとClientSecretをbase64でエンコードしておく。

```bash
# bash
CLIENTID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CLIENTSECRET=XXXXXXXXXXXXXXXX

echo -n "${CLIENTID}:${CLIENTSECRET}" | base64
# base64でエンコードされた結果が出力される。
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
```

## Basic認証（トークンの取得）

1. Google Chromeの「[Talend API Tester - Free Edition](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm)」のアドオンを追加する。
2. 追加したアドオンを起動する。
3. 以下を指定して「Send」を実行する。
    * METHODに「POST」
    * SCHEMEに「https://api.meethue.com/oauth2/token?code=<前々段で取得したCode>&grant_type=authorization_code」
    * HEADERのAuthorizationに「Basic <前段で取得したbase64エンコード文字列>」
![スクリーンショット 2020-11-28 21.15.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324285/a9cc5e07-3d32-e0ab-53b6-519ff43ea800.png)
5. 成功すると200とaccess_tokenなどが返ってくる。

## API実行（Google Chromeの「Talend API Tester」で）
1. 以下を指定して「送信」を実行。
    * METHODに「PUT」
    * SCHEMEに「https://api.meethue.com/bridge/0/config」
    * HEADERのAuthorizationに「Bearer <前段で取得したaccess_token>」
    * HEADERのContent-Typeに「application/json」
    * BODYに「{ "linkbutton": true }」
2. Hue Bridgeのリンクボタンを押す。
3. 以下を指定して「送信」を実行。
    * METHODに「POST」
    * SCHEMEに「https://api.meethue.com/bridge/」
    * HEADERのAuthorizationに「Bearer <前段で取得したaccess_token>」
    * HEADERのContent-Typeに「application/json」
    * BODYに「{ "devicetype" : "<前々々々段で取得したAppId>
4. usernameが返ってくるはず。
5. 以下を指定して「送信」を実行。
    * METHODに「GET」
    * SCHEMEに「https://api.meethue.com/bridge/"username"/lights」
    * HEADERのAuthorizationに「Bearer <前段で取得したaccess_token>」
    * HEADERのContent-Typeに「application/json」
6. ライトの状態の情報が返ってくるはず。
![スクリーンショット 2020-11-28 21.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324285/dfa86037-341c-ee96-c392-1f1d4709ee5a.png)

7. あとはLocal APIと同様に活用可能。


## 参考
* [HueのRemoteAPIでライトを制御してみた](https://qiita.com/hanasaku/items/483df65e10897f04ecde)
* [Remote Authentication](https://developers.meethue.com/develop/hue-api/remote-authentication/)
* [Remote API Quick start guide](https://developers.meethue.com/develop/hue-api/remote-api-quick-start-guide/)

## TBD
トークンのリフレッシュ