Google Home から スマートに Sesame を解錠する

# 動機

もともと 「OK, Google 行ってきます」の一言 (Google Assistant のルーティン) で

- 電気やエアコンの電源 OFF
- お掃除ロボットの起動

を実現していました。
この度、 スマートロックの [Sesame](https://jp.candyhouse.co/) を購入したので、上記のルーティンに「玄関の鍵の解錠」を追加しました。

> 実際に購入したのは Sesame の後継機(?) である Sesame mini で、こちらは対応しているドア (サムターン) の種類が豊富であることが特徴的です。
> うちのサムターンは少々特殊で他社製品では対応できないと言われましたが、Sesame mini ではアダプターを付けることで対応できました。 (アダプターは無料で作成してもらえます！)

# 構成

いろいろと試行錯誤した結果、 `Google Assistant (ルーティン)` → `IFTTT (Webhook)` → `GAS` → `Sesame` という構成にしました。


- IFTTT のトリガーは Google Assistant を、アクションは Webhooks を設定
- GAS には Sesame API を叩くスクリプトを用意して、 IFTTT の Webhook から呼び出す

## ボツ構成 その 1

`Google Assistant` → `Sesame`

直接 Google Assistant から Sesame へ接続することもできますが、解錠するには「OK, Google 玄関の鍵を開けて パスワード xxxxxx」のように、[パスワードを一緒に言う必要があります](https://ameblo.jp/candyhouse-inc/entry-12362632153.html)。
これをルーティンのコマンドとして設定できればシンプルに実現できたのですが、なぜかパスワードを正しく認識してくれず。。

## ボツ構成 その 2

`Google Assistant` → `IFTTT (Sesame)` → `Sesame`

IFTTT の トリガーに Google Assistant を、アクションに Sesame を設定する方法ですが、こちらも解錠にはパスワードを言う必要があったので今回はナシに。

他の方法を探していると、[Sesame API](https://docs.candyhouse.co/) からも簡単に解錠できそうなことがわかったので、Google Assistant から Sesame API を叩くことを目指しました。

## ボツ構成 その 3

`Google Assistant` → `IFTTT (Webhooks)` → `Sesame`

IFTTT の トリガーに Google Assistant を、アクションに Webhooks を設定して Sesame の API を叩くようにしようとしました。
しかし、 IFTTT の Webhooks は Content Type 以外のヘッダーを与えられないので Sesame API の API キーが設定できず断念。

結果として、上述のとおり IFTTT と Sesame の間に GAS を置いて、GAS から Sesame API を叩く構成としました。

**2019/10/27 追記**

[IFTTT の Webhook で解錠する方法が公式ページで紹介されていました。。](https://docs.candyhouse.co/#lock-or-unlock-sesame-as-an-ifttt-action)

- URL を `https://api.candyhouse.co/public/partners/ifttt`
- Body を `{"command": "*COMMAND*", "apikey": "*API_KEY*", "device_id": "*DEVICE_ID*"}`

とすれば GAS なしでできますので、こちらの構成のほうがよいです。

# 各種設定

## Sesame API キーと Sesame ID の取得

[Sesame の公式ページ](APIキー取得方法とセサミIDの確認方法) に詳しい方法が記載されていますのでここでは省略します。

## GAS で Web サーバー公開

IFTTT からリクエストを受け取ったら、 Sesame API に解錠のリクエストを送信する Web サーバーを作ります。

ここの内容は [Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法](https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3) を参考にしています。

### 1. Google Spread Sheet に空のシートを作る

http://spreadsheet.google.com にアクセスして空のシートを作ってください。

### 2. スクリプトエディタを開く

「ツール」-「スクリプト エディタ」を選んでスクリプトエディタを開いてください。

<img width="841" alt="スクリーンショット 2018-03-19 22.46.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/1f3635f0-4494-ab3d-3731-9d7773c2f9c5.png">


### 3. doPost() 関数の用意

以下のスクリプトを記述します。

```javascript:コード.gs
function doPost(e) {
  var payload = { "command": "unlock" };
  var headers = { "Authorization": "[Sesame API キー]" }; // 編集
  var options = {
    "method": "post",
    "contentType": "application/json",
    "headers": headers,
    "payload": JSON.stringify(payload)
  };
  var url = "https://api.candyhouse.co/public/sesame/[Sesame ID]" // 編集
  UrlFetchApp.fetch(url, options);
  return ContentService.createTextOutput("successfully processed!");
}
```

`[Sesame API Token]` と `[Sesame ID]` の部分はご自身のものに書き換えてください。 (`[`, `]` は不要)



### 4. Web アプリとして公開

「公開」メニューから「Webアプリケーションとして導入...」を選んでください。
(スクリーンショットを使いまわしているのでスクリプトの中身が上のものと異なりますが気にしないでください...)

<img width="1207" alt="スクリーンショット 2018-03-19 22.58.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/2e27f29b-a8d3-1d3a-4cb3-d07b10e148f3.png">


すると以下のようなダイアログが出てきます。

<img width="425" alt="スクリーンショット 2018-03-19 23.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/0f15ebd9-b0cf-9059-c7c5-46404fe4c87c.png">

- 変更内容の説明は適当に (空欄でも可)
- アプリケーションにアクセスできるユーザーは**全員（匿名ユーザーを含む）**に

変更して導入をクリックしてください。
成功すると、作成した Web アプリの URL が表示されます。

IFTTT からこの URL へリクエストを投げることになります。

## IFTTT の Applet 作成

[Make your own Applets from scratch](https://ifttt.com/create) から、以下のとおりの Applet を作成します。

- **This**: Google Assistant の `Say a simple phrase`
    - **What do you want to say?**: トリガーとなる任意のフレーズ
    - **Language**: `Japanese`
- **That**: Webhooks の `Make a web request`
    - **URL**: GAS で作った Web アプリの URL
    - **Method**: `POST`

## Google Assistant でルーティンの設定

`アシスタントが行う操作` > `+ 操作の追加` > `コマンドを入力` に、 IFTTT で設定した **トリガーとなる任意のフレーズ** を入力して 追加 & ルーティンを保存します。

# おわりに

「OK, Google 行ってきます」をトリガーに自動で玄関の鍵が解錠され、シームレスに外出できるようになりました。Sesame では解錠されたあと N 秒後に自動で施錠する設定もできるのでとても便利です。

あとは帰ってきたときの「手ぶらで解錠」をトリガーに、リビングの電気をつけたりできるようになれば嬉しいですが、今のところはそれを実現する手段はなさそう(?)です。

ログを見るに、内部的には **解錠の手段** も取れているようなので、 [Sesame Webhook](https://docs.candyhouse.co/#sesame-webhook) のトリガーに解錠の手段などが設定できるようになることを期待しています。