WEBアプリでSmartHome Hue編 Node-RED+Hue+RaspberryPi   



**環境**
---------------------------------------

　RaspberryPi　/　Linux raspberrypi 5.10.63
　Philips Hue /　Version4.8.0 

**構成**
---------------------------------------
![スクリーンショット 2021-11-23 3.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/040b81ec-e5dc-81da-4f5f-4afbce7a7a33.png)

![スクリーンショット 2021-11-23 19.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/bb459347-4c0e-8046-e5cd-e1f9ce2ec08f.png)

**Node-RED**
---------------------------------------
・Node-REDのセットアップ
セットアップは公式を参照。
私は、macにもインストールしてmacである程度フローを構築してから、
VPNでJSONでラズベリーパイに渡して組んでいきました。
[https://nodered.jp/docs/user-guide/]

・Hueノードの追加
node-red-contrib-hueplusをインストール
[https://flows.nodered.org/node/node-red-contrib-hueplus]

Bridgeには自分で名前をつけて、編集ボタンをクリック。
![スクリーンショット 2021-11-19 13.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/a6cc8058-7e0d-5212-7065-79f0ed0c7e8d.png)
BridgeにIPアドレスを入力し、その状態でHueBridge側のリンクボタンを押して、API　KEY横のボタンを押すと自動的にAPI　keyが割当られる。
![スクリーンショット 2021-11-19 13.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/7008b418-4f12-ae90-deef-b4f005b88318.png)



・Dashboardノードの追加
node-red-dashboardをインストール
[https://flows.nodered.org/node/node-red-dashboard]
下記のようなダッシュボードが用意されているのを今回は活用。
![dashboarde.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/8e243609-0063-f91c-ce2d-f8ccc1da11cc.png)


**Hue API**
---------------------------------------
・Hue　APIから自宅のID取得
"http://Hue BridgeのIPアドレス/debug/clip.html"
にアクセスするとAPIデバッグ画面を表示。
![スクリーンショット 2021-11-19 13.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/49854f6c-b731-cc7d-662c-26d770a69415.png)

・Light　API
URLに下記を入力し、GETすると下記の様に現在の電球ごとの状態が返される。
/api/APIkey/lights
API　keyには先程、Node-REDのhueノード追加した際取得した値を入れる。

```json:{
	"1": {
		"state": {
			"on": true,
			"bri": 254,
			"hue": 15648,
			"sat": 105,
			"effect": "none",
			"xy": [
				0.4349,
				0.4036
			],
			"ct": 331,
			"alert": "lselect",
			"colormode": "ct",
			"mode": "homeautomation",
			"reachable": false
		},
		"swupdate": {
			"state": "noupdates",
			"lastinstall": "2021-08-23T05:50:49"
		},
		"type": "Extended color light",
		"name": "Hue color lamp 1",
		"modelid": "LCT007",
		"manufacturername": "Signify Netherlands B.V.",
		"productname": "Hue color lamp",
		"capabilities": {
			"certified": true,
			"control": {
				"mindimlevel": 2000,
				"maxlumen": 800,
				"colorgamuttype": "B",
				"colorgamut": [
					[
						0.675,
						0.322
					],
					[
						0.409,
						0.518
					],
					[
						0.167,
						0.04
					]
				],
				"ct": {
					"min": 153,
					"max": 500
				}
			},
			"streaming": {
				"renderer": true,
				"proxy": true
			}
		},
		"config": {
			"archetype": "sultanbulb",
			"function": "mixed",
			"direction": "omnidirectional",
			"startup": {
				"mode": "custom",
				"configured": true,
				"customsettings": {
					"bri": 254,
					"ct": 331
				}
			}
		},
		"uniqueid": "00:17:88:01:02:31:38:2f-0b",
		"swversion": "67.88.1"
	},
	"2": {
		"state": {
        .... 以下省略
```

・scene　API
URLに下記を入力し、GETすると下記の様に現在hueアプリで設定していたシーンが返される。
/api/APIkey/scenes

実際運用上、電球ごとにAPIを叩くことは少ないと思うので、Hueアプリで設定したシーンをAPIで叩くほうが使いやすいと思うので、scenes　APIで各シーンの名前をNODEに入れる。
例えば、下記では、HueアプリでRelaxというシーンを組んでいるので、それを呼び出したい場合、
A21E1OATRrZxC1pを入れる。


```json:
	"A21E1OATRrZxC1p": {
		"name": "Relax",
		"type": "GroupScene",
		"group": "1",
		"lights": [
			"1",
			"6",
			"7"
		],
		"owner": "a5e05d2b-cc6f-4a46-9130-ca0b4f7faa07",
		"recycle": false,
		"locked": false,
		"appdata": {
			"version": 1,
			"data": "hj5dO_r01_d01"
		},
		"picture": "",
		"image": "a1f7da49-d181-4328-abea-68c9dc4b5416",
		"lastupdated": "2021-02-19T08:49:31",
		"version": 2

```



**Node-REDでダッシュボード作成**
---------------------------------------
下記のようにリビングに対して、シーンを再生するUIを作成。

![スクリーンショット 2021-11-22 13.11.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/f9c3a795-c898-a793-cd08-9e9f74f5aefa.png)

各NODEは下記のように設定。
ここでは、scenes　APIで記載したシーン名を入力。ここは、Hueアプリで設定したRelaxという名前ではなく、secneｓAPIで紐付いた名前を入れる。
![スクリーンショット 2021-11-22 13.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/428a7b59-8f2d-840c-2d52-77677bf4b266.png)

どのグループかを選択。
![スクリーンショット 2021-11-22 13.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/627ceaef-a05e-62e8-4809-f403d7496588.png)

この状態でデプロイし、webでアクセスすると下記のUIが表示される。
下記にアクセス。ラズベリーパイは安定性のため、有線LANで常時稼働状態で運用しており、常時再生できるようにしています。
http://Raspberry PiのローカルIPアドレス:1880/ui

![IMG_2918.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/20e2f42e-90af-9640-40f2-477126cb6216.jpeg)


API経由で再生するとタイムラグ出るかと思ったけど全然問題ない。
homekitやIFTTTは使いづらかったり、細かい設定がしにくいので、これからダッシュボードにいろんな機能を付加していこうと思います。