Philips Hue x Johnny-Five x 温度センサ(LM35)でオフィスIoTやってみた

この記事は[Monstar Lab, Inc. Advent Calendar 2016](http://qiita.com/advent-calendar/2016/monstar-lab) 1日目の記事です。
モンスター・ラボ初のAdvent Calendarです！よろしくお願いします。🙋

## オフィスにHueがやってきた!!!
先日、どうしてもHueが欲しくて「Hueほしいよォ〜〜」って言ってたら、会社がR&D用に買ってくれました。
![IMG_2108.JPG](https://qiita-image-store.s3.amazonaws.com/0/38442/b8a118d3-fd5d-f7a8-5e77-5b92fef9e937.jpeg)

<img width="504" alt="スクリーンショット 2016-11-25 18.53.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/a3a378ea-0f95-57ad-dbd1-2b3f83a0687b.png">

ありがとうございます！！！！
というわけで、さっそくオフィスで使ってみました。

## Hueのセットアップ
### IPアドレスを調べる

Hueブリッジが同じネットワーク内に繋がっている状態で https://www.meethue.com/api/nupnp にアクセスすると、IPアドレス情報が取得できます。
<img width="563" alt="スクリーンショット 2016-11-25 15.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/aed88457-b8d5-b20a-8b12-e1831aa97daf.png">

### APIデバッグツールを使う

`http://<IPアドレス>/debug/clip.html` にアクセスするとデバッグツールが使えます。
<img width="579" alt="スクリーンショット 2016-11-25 16.40.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/95c0587c-666e-9093-a211-635761b6a063.png">

### ユーザを作成する

下記のように指定します。

>URL: `/api`
HTTP METHOD: `POST`
Message Body: `{"devicetype": "hogehoge"}`

以前は `username` を指定できたらしいのですが、公式サイト（http://www.developers.meethue.com/documentation/getting-started ）に、

>Currently it is possible to create your own usernames in the bridge (e.g. “newdeveloper”), however, this option will be removed in future bridge versions,  so we need to use the randomly generated username that the bridge creates for you.

と書いてあったので、ランダム値の `username` を使うしかなさそうです・・・。

作成の際には、ブリッジのリンクボタン（ブリッジ中央のボタン）を押してから `POST` します。
`success` したら、 `username` がレスポンスされます。

### 動作例（APIデバッグツール）
#### Hueのステータスを取得

>URL: `/api/<username>/lights/`
HTTP METHOD: `GET`
Command Response:

```
{
	"1": {
		"state": {
			"on": false,
			"bri": 254,
			"hue": 14910,
			"sat": 144,
			"effect": "none",
			"xy": [
				0.4596,
				0.4105
			],
			"ct": 370,
			"alert": "none",
			"colormode": "ct",
			"reachable": true
		},
		"type": "Extended color light",
		"name": "Hue color lamp 1",
		"modelid": "LCT007",
		"manufacturername": "Philips",
		"uniqueid": "00:17:88:01:02:31:58:07-0b",
		"swversion": "5.38.1.14919"
	},
	"2": {
		"state": {
			"on": false,
			"bri": 43,
			"hue": 0,
			"sat": 0,
			"effect": "none",
			"xy": [
				0.6409,
				0.3332
			],
			"ct": 0,
			"alert": "none",
			"colormode": "xy",
			"reachable": false
		},
		"type": "Extended color light",
		"name": "Hue color lamp 2",
		"modelid": "LCT007",
		"manufacturername": "Philips",
		"uniqueid": "00:17:88:01:02:31:56:f7-0b",
		"swversion": ""
	},
	"3": {
		"state": {
			"on": false,
			"bri": 43,
			"hue": 0,
			"sat": 0,
			"effect": "none",
			"xy": [
				0.6409,
				0.3332
			],
			"ct": 0,
			"alert": "none",
			"colormode": "xy",
			"reachable": false
		},
		"type": "Extended color light",
		"name": "Hue color lamp 3",
		"modelid": "LCT007",
		"manufacturername": "Philips",
		"uniqueid": "00:17:88:01:02:31:56:c7-0b",
		"swversion": ""
	}
}
```

`1` と書いている数字がHueの識別IDです。

#### Hueの点灯/消灯

>URL: `/api/<username>/lights/status/1`
HTTP METHOD: `PUT`
MessageBody: `{"on":true}` or `{"on":false}`

#### Hueの色操作

>URL: `/api/<username>/lights/status/1`
HTTP METHOD: `PUT`
MessageBody: `{"on":true, "sat":254, "bri":254,"hue":10000}`

`sat` は彩度、 `bri` は輝度、 `hue` は色相（0~65535の範囲。16bitColor?）

### 動作例（curl）
ターミナルから `curl` でも叩けます。

#### Hueのステータスを取得

```
curl http://<IP-address>/api/<username>/lights/
```

#### Hueの点灯/消灯

```
curl http://<IP-address>/api/<username>/lights/1/state -X PUT -d '{"on":true}'
```
```
curl http://<IP-address>/api/<username>/lights/1/state -X PUT -d '{"on":false}'
```

#### Hueの色操作

```
curl http://<IP-address>/api/<username>/lights/1/state -X PUT -d '{"on":true, "sat":254, "bri":254,"hue":10000}'
```

余談ですが、CLIでJsonを `GET` する場合、[jq](https://stedolan.github.io/jq/)を導入すると幸せになれます。

## センサーと連携してみる
温度センサと連携して、オフィスの気温によって照明の色が変わるIoTを作ってみました。

- ハードウェア: Arduino UNO
- センサー: 温度センサ LM35
- フレームワーク: [Jonny-Five](http://johnny-five.io/)

```thermometer.js
var five = require("johnny-five");
var fetch = require("node-fetch");
var board = new five.Board();
var requestBody;

board.on("ready", function() {
    var temperature = new five.Thermometer({
        controller: "LM35",
        pin: "A0",
        freq: 1000
    });

    temperature.on('data', function() {
        console.log('celsius: ', this.celsius);

        if (this.celsius >= 27) {
            requestBody = '{"on":true, "sat":254, "bri":50,"hue":10000}';
        } else if (this.celsius == 26) {
            requestBody = '{"on":true, "sat":254, "bri":50,"hue":20000}';
        } else if (this.celsius == 25) {
            requestBody = '{"on":true, "sat":254, "bri":50,"hue":30000}';
        } else if (this.celsius <= 24) {
            requestBody = '{"on":true, "sat":254, "bri":50,"hue":40000}';
        }

        fetch('http://<IP-address>/api/<username>/lights/1/state', {
            method: 'PUT',
            body: requestBody
        })
        .then(function(res) {
            return res.json();
        }).then(function(json) {
            console.log(json);
        });
    });
});
```

23〜24℃では通常の照明色ですが、
![IMG_2348.JPG](https://qiita-image-store.s3.amazonaws.com/0/38442/051b26d6-7f20-461f-6d0d-9255713e1df8.jpeg)

少し暑くなってくると（25℃〜27℃以上）、照明の色が暖色に変わります。
（実験ではわざと温度センサに触れて温度を上げています。）
![IMG_2347.JPG](https://qiita-image-store.s3.amazonaws.com/0/38442/4d4a34ef-49e8-b9f8-caf6-fa2806cb46ab.jpeg)

## まとめ
Hueをセンサーと組み合わせて、オフィスの気温を視覚的に把握できるようになりました。
他にも、組み合わせとアイディア次第で応用ができそうです。

- 湿度を測定して、オフィスエリアの乾燥を検知する（＋加湿器を操作する）
- 至適温度を越えたら、Slackに通知する（＋エアコンを操作する）

などなど。
IoTを使ってより良いオフィス環境を手に入れていきましょう！！！！！

明日は @noboru_i 氏が担当します。お楽しみに！

### 参考サイト
- Getting started  
http://www.developers.meethue.com/documentation/getting-started
- 未来を感じる照明：Hueで遊んでみた その１  
http://heckey.hatenablog.com/entry/2014/01/06/154100
- プログラマブル電球hueをRubyから使う  
http://shokai.org/blog/archives/8324
- CLIでJSONの整形をする  
http://yuroyoro.hatenablog.com/entry/2013/04/02/190709