TaskerでSesame miniを手ぶら解錠(RESTask編)

# はじめに
SESAMEアプリの手ぶら解錠。とても便利なのですが
どうしても安定性が低くドアの前で待たされることもしばしば。
あれと思ってスマホを開くとようやく開いたり。

特にうちでは2台使っているので2台とも手ぶらで開くというのは
5回に1回もないくらいです。

投稿時点でもアプリの改善などをしてくれているようなので
それに期待しつつそれまでは自前で対応しようということで
AndroidのアプリであるTaskerを使って手ぶら解錠の仕組みを作ります。

HTTP Shortcutsを使った方法はこちらの記事にまとめています。
[TaskerでSesame miniを手ぶら解錠(HTTP Shortcuts編)](https://qiita.com/kamijyo/items/3f4765bed28543882f68)

# 準備するもの
- SESAME mini
- アンドロイド端末
- [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)
- [RESTask](https://play.google.com/store/apps/details?id=com.freehaha.restask&hl=ja)

# 手順1. ダッシュボードで情報収集
## APIキーの取得
CANDY HOUSEの[ダッシュボード](https://my.candyhouse.co)にログインして
下の方の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キーが表示されます。
これは後からは参照できなくなるので必ずコピーしておきましょう。

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

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

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

# 手順２．Taskerの設定
TaskerとRESTaskをインストールして設定をしていきます。
最終的にプロファイルを２つ、タスクを３つ作ります。

## 手順２－１．タスクの作成と確認アクションの追加
タスクとは動作（アクション）を組み合わせたものです。
作成したいのは解錠するタスクですが、
まずは施錠確認のアクションを作成しましょう。

タスクタブの右下の＋ボタンでタスクを作成できます。
名前を入力してタスク編集画面に入り、
右下の＋ボタンでアクションを追加します。

Sesame APIにGETしたいのでTasker自体のアクションである
ネット内のHTTP:GETメソッドを使いたいところなのですが
このメソッドではREST APIが使えません。
そこでプラグインのRESTaskを使用します。

アクションの追加でプラグインからRESTaskを選択し
設定の鉛筆アイコンを押すとRESTaskの画面に変わります。

ここで設定するのはHostの部分だけです。

```
https://api.candyhouse.co/public/sesame/********-****-****-****-************
注）****部分はデバイスID
```

![1 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/d3d2f505-f50b-e07a-079e-5646d08d399f.png)

次にHeadersタブに移り以下のヘッダーを追加します。

- Nameは「Authorization」
- Valueには手順１で取得したAPIキー
を入力します。

![1 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/115da40d-c654-59db-3b67-c1f8c0d61e9d.png)

これで右上の▶を押すと以下のようなウィンドウが表示されます。

![1 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/6b383177-4232-cb50-7b06-9cd53e7379d2.png)

ざっくりと内容を解説すると、
- 「locked」が施錠状態で、閉まっていればtrue、開いていればfalse
- 「battery」は電池の残量
- 「responsive」はSESAME miniが現在操作可能であるか
を表しています。

手動で鍵を開閉して、lockedの状態が反映されることを確認してみましょう。
確認できたら右上の保存ボタンを押して保存します。

## 手順２－２．解錠アクションの追加

そのまま解錠アクションも作成します。
手順２ー１と同様にRESTaskの画面に入り、

- Request TypeをPOST
- Hostは手順２ー１と同じ

```
https://api.candyhouse.co/public/sesame/********-****-****-****-************
注）****部分はDevice ID
```

![1 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/ad57df9f-fc16-7e4b-cba4-b01cea81d379.png)

- Enable custom bodyにチェックを入れて
- Custom bodyに以下を記入します。

```
{"command":"unlock"}
```

![1 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/dda95c8c-da7c-9d97-6a3f-2ecc94f51dd7.png)

次にHeadersタブで以下の2つのヘッダーを追加します。

|Header|Value|
|---|---|
|Authorization|手順１で取得したAPIキー|
|Content-Type|application/json|

![1 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/1a8034a0-3047-cd27-6802-c4fc22a226a5.png)

これで右上の▶を押すとTaskIDが表示されて鍵が開きます。
動作が確認できたら保存を押してTaskerに戻ります。

解錠を実行して解錠されたことを確認するために
確認アクションの上に解錠アクションを移動して
その間にタスク→待機/Waitで5秒のウェイトを入れます。

## 手順２－３．解錠アクションの結果の取得

これでWeb APIを動かす準備は整ったのですが
Taskerからの実行では結果のウィンドウが表示されないので
このままでは施錠結果を確認することが出来ません。
そこで確認アクションの結果を取得するアクションを追加します。

コード→Javascript(小)/Javascriptletを作成し
コードの部分に以下を入力します。

```
var locked = JSON.parse(rtres).locked
```

RESTaskの実行結果は%rtresという変数に入るので
その中からlockedの内容を取得しています。

ちなみに%rtresをそのまま通知などで表示させると
手順２ー１で見たウィンドウの内容が表示されます。

これで%lockedに施錠状態(trueかfalse)が入ったので
それを表示したり、分岐したりして使います。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/f4781627-9dea-bf23-78db-2a947fed1de8.png)

これを解錠という名前のタスクとして保存しましょう。
ちなみに通知の内容はこんな感じにしています。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/f4de4a46-3182-2c68-8573-d6c67006cc16.png)

## 手順３．Sesame 発見プロファイルを作成
プロファイルはトリガーとタスクを関連付けるものです。
今回はSesame miniをBluetoothで検知できたら解錠します。

公式アプリでは接続できたらBluetooth経由で解錠しているので
接続自体が不安定だったり接続するまで時間がかかったりしますが、
Sesame miniのBluetoothを検知したらWeb APIで解錠するので
Bluetooth接続の不安定性に左右されません。

右下の＋ボタンでプロファイルを作成して名前（「発見」等）を入力し
状態カテゴリーから「ネット」→「近くのBluetooth」を選択。
住所欄で虫眼鏡の検索アイコンを押して
Sesame miniのMACアドレスを指定します。

CANDYHOUSEのDASHBOARDの[Sesame List](https://my.candyhouse.co/#/sesameList/0)で
Serialに表示されているのがMACアドレスです）

Low-Energy(LE)機器と未接続の機器にチェックを入れて戻り、
最後にタスクとして解錠を指定します。

![1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/7601cd4e-a23f-0488-060b-83715721d518.png)

これでSesame miniを検知すると解錠タスクが起動します。

これだけでも近づけば解錠するという機能は出来たのですが
家の中にいる時でも玄関に近づくたびに解錠されてしまいます。

そこで一度解錠したらこのプロファイルは無効にするようにします。

解錠タスクの編集画面に移ってアクションの追加で
「Tasker」→「プロファイルの状態」から名前に「発見」を指定し
セットに「オフ」を指定します。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/5e160492-0380-75d6-e9d6-9a4e8aead067.png)

これで一度解錠したらその後は近付いても解錠されません。
このままではずっと解錠されなくなってしまうので、
次は自宅の付近に近付いたらプロファイルを有効にします。

## 手順４．発見オン/発見オフ タスクを作成
発見をオン/オフするタスクを作成します。
発見オンと名付けたタスクを作成し、
「Tasker」→「プロファイルの状態」から名前に「発見」を指定し
セットに今回は「オン」を指定します。
同様に発見オフというタスクも作成します。
動作確認のために通知を作成しておいた方がいいでしょう。

## 手順５．自宅付近プロファイルを作成
プロファイルの作成から現在地を選択し、自宅の位置を指定します。
範囲は30mか50mがいいと思います。
このプロファイルにはタスクとして発見オンを指定します。

指定した発見オンの部分を長押しすると出口タスクを追加できます。
このトリガーが無効になったときに発動するタスクを指定するもので、
ここでは発見オフを指定してバッテリー消費を抑えます。

![p (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/83096e0b-eaf2-c39b-158d-8b0cd4520611.png)

# まとめ
以上で、自宅から30mか50m以内に入ったら発見プロファイルが有効になり
周囲のBluetoothを探し始めます。

BluetoothでSesame miniが検知されたら解錠タスクが起動し
Web APIから解錠されます。

解錠されたら発見プロファイルは無効化されるため
再度玄関に近付いても解錠されることはありません。

自宅付近を通過した際には近付いた時に発見が有効になりますが
離れると発見が無効化されるためバッテリー消費を抑えます。

自宅付近の判定に「状態→電話→近くの基地局」を使うと
よりバッテリー消費が抑えられますが、
電波状況によっては登録した基地局につながらず
トリガーがオンにならないこともあるため、
自宅周辺を歩き回って出来るだけ沢山の基地局を
登録する必要があります。

# おわりに
セキュリティには気をつけて運用してください。

端末の設定でRESTaskの省電力設定などをオフにしないと
TaskerからのRESTaskの起動が不安定になるようです。
うまくActionが動かないときはTaskerだけでなく
RESTaskの省電力設定なども見直して下さい。

Taskerのデフォルトの設定では画面消灯中の監視は
600秒になっており10分毎にしかチェックされません。
その場合は自宅の範囲を広げて時間稼ぎをするか、
チェックの間隔を短くして対処してください。

チェックの間隔を短くするとバッテリー消費は増えます。
私は120秒にして使っています。