Node-REDでSesame API v3を使う

#はじめに
Node-REDでのSesame API v3の使い方を解説しているサイトが意外にも見つからなかったので
試行錯誤した結果をメモ代わりに残せたらと思ってこちらに書いています。

#必要なもの
- SESAME mini
- Node-REDの環境

#参考文献
- Sesame APIのドキュメント https://docs.candyhouse.co/#sesame-api

# 手順1. ダッシュボードで情報収集
## API Keyの取得
CANDY HOUSEのダッシュボードにログインして
下の方のAPI settingsからSEND CODEを押して
送られてきた認証コードを入力してConfirm。

![candy1.jpg](https://qiita-image-store.s3.amazonaws.com/0/257268/6f6241c2-6d22-a142-9fc2-95a2dae69a02.jpeg)
CANDY HOUSEダッシュボード
https://my.candyhouse.co

API KeysでADDを押すと数秒してAPI Keyが表示されます。
このKeyは後からは参照できなくなるので必ずコピーしておきましょう。

## Device IDの確認
Sesame Listから操作したいSesameを選択してデバイス画面に移動。
（カーソルがリンク表示になりませんがそのままクリックできます）
各デバイスの画面のURLにデバイスIDが含まれています。

```
https://my.candyhouse.co/#/sesameList/0/[********-****-****-****-************]
```

この****の部分の文字列をDevice IDとして記録しておきます。

# 手順2. 開閉状態を取得するフロー
いきなり鍵を開けたり閉めたりするフローを作るのはこわいので
まずは鍵の開閉状態を取得するフローを作成しましょう。

## Nodeの配置
Node-REDへ移動して、
「Inject」「function」「http request」「debug」ノードを配置してつなぎます。
![node1.jpg](https://qiita-image-store.s3.amazonaws.com/0/257268/16634b92-6538-a530-8296-876962cccba2.jpeg)

## functionノードの設定
functionノードに以下のコードを入力し、先程取得したAPI Keyを入力してください。

```
msg.headers = {'Authorization' : "[API Key]"};
return msg;
```

## http requestノードの設定
http requestには、Methodは「Get」、Returnは「a parsed JSON object」として
URLに以下を指定します。

```
https://api.candyhouse.co/public/sesame/[********-****-****-****-************]
```

****部分はさっきのDevice IDです。
![node2.jpg](https://qiita-image-store.s3.amazonaws.com/0/257268/1984e670-f632-ed9b-5d7f-78dbf9db2b43.jpeg)

## 実行
これで準備は終わりです。
InjectノードをクリックしてDebug表示を確認しましょう。
以下の様なresponseが帰ってくれば成功です。

```
{"locked": true, "battery": 100, "responsive": true}
```

鍵の開閉状態で処理を分けるような場合は「Switch」ノードをつないで
「msg.payload.locked」が「true」か「false」かで分岐できます。
![node3.jpg](https://qiita-image-store.s3.amazonaws.com/0/257268/0c2d5b1e-4a67-e1cb-b2ae-f1998795ca38.jpeg)

# 手順3. 鍵を開閉するフロー
基本的な構造は手順2とほぼ同様で、中身だけを変えていきます。

## functionノードの設定
functionノードに以下のコードを入力し、先程取得したAPI Keyを入力してください。
以下は施錠の場合です。
「lock」の部分を「unlock」にすれば解錠です。

```
msg.headers = {'Content-Type' : 'application/json', 'Authorization' : "[API Key]"};
msg.payload = {'command' : 'lock'};
return msg;
```

## http requestノードの設定
http requestには、Methodは「POST」、Rerurnは「a parsed JSON object」として
URLに以下を指定します（手順2と同じ）。

```
https://api.candyhouse.co/public/sesame/[DeviceID]
```

## 実行
Injectノードを押してちゃんと鍵が閉まれば成功です。
Debugにはtask_idが投げられてきます。

```
{"task_id":"[********-****-****-****-************]"}
```

# 手順4. 実行結果を取得するフロー
手順2のフローをコピーして、手順3のフローの後に接続します。
実行待ちとして、間に5秒程度のDelayを入れておきます。
その後各ノードのプロパティを変えていきます。
![フロー3.jpg](https://qiita-image-store.s3.amazonaws.com/0/257268/9b2a140a-2f1a-0272-86a0-df07f72f6d8c.jpeg)


## functionノードの設定
functionノードに以下のコードを入力し、API Keyを入力します。
手順2からコピーしていれば、そのままで大丈夫です。

```
msg.headers = {'Authorization' : "[API Key]"};
return msg;
```

## http requestノードの設定
http requestには、Methodは「GET」、Returnは「a parsed JSON object」として
URLに以下を指定します。

```
https://api.candyhouse.co/public/action-result?task_id={{payload.task_id}}
```

## 実行
Injectノードを押してちゃんと鍵が閉まれば成功です。
Debugには（payloadを経由して）指定したtask_idと実行結果が投げられます。
msg.payload.successfulの内容でSwitchで分岐させればいいでしょう。

```
{"task_id":"[task_id]","status":"terminated","successful":true}
```

statusがprocessingになるようならDelayを長く取ります。
私の環境では5秒あれば十分でした。

# おわりに
セキュリティには十分に注意して使ってください。