Amazfit BipでSESAME miniを解錠する(RESTask編)

# はじめに
[Amazfit Bip](https://www.tjc-jp.com/xiaomi/amazfit_bip/index.html)というスマートウォッチがあります。
https://www.tjc-jp.com/xiaomi/amazfit_bip/images/mj-amazfit-10mix.jpg

反射型液晶で常時画面表示でありながら公称45日の連続使用時間。
手に入れてから1週間しか経っていないので確認できていませんが
これまでの減りからするとたしかに数十日は持ちそうです。

薄いので付け心地も申し分なくボタンなどもとても押しやすいです。
唯一の欠点を上げるとすると、アレに似すぎているということくらい。

今回はこのAmazfit Bipを使ってSESAME miniの解錠をします。
と言ってもTasker連携アプリを使って連携させるだけなので
実質ただのアプリの紹介記事です。

# 必要なもの
- Amazfit Bip (アプリ自体はAmazfit Arc, Amazfit Corにも対応しているようです)
- SESAME mini
- Android端末
- [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm) - Google Play Store 有料
- [RESTask](https://play.google.com/store/apps/details?id=com.freehaha.restask&hl=ja) - Google Play Store 無料
    - TaskerからWebAPIを用いてSESAME miniを操作するPlug-inです。
- [Tools & Amazfit](https://play.google.com/store/apps/details?id=cz.zdenekhorak.amazfittools) - Google Play Store 有料
    - Plug-inとして、Amazfitの操作をTaskerに知らせたり、TaskerからAmazfitに文字を表示したり出来ます。
    - 本当はもっと多機能なアプリです。

# やること
Tools & Amazfitは、Taskerに対応しているプラグインとして
イベントプラグインとアクションプラグインの2種類を持っています。

イベントプラグインでは、TaskerでAmazfitの操作を感知できるもので
ボタン押下や心拍数、充電状態などをトリガーに指定できます。
アクションプラグインでは、TaskerからAmazfitを操作できるもので
通知内容を指定したり、モニターやバイブなどのモードを切り替えられます。

この記事では、Taskerのプロファイルの部分で
Amazfit ToolsのイベントプラグインでButton Pressedをトリガーに指定し、
それをキッカケに動く動作として解錠タスクを作成します。
（記事内の順番では先にタスクを作成してトリガーを紐付けています。）

解錠タスク内では、RESTaskを使ってSESAME miniに解錠の指示を出しつつ、
Amazfit Toolsのアクションプラグインを使用してAmazfitに通知を送っています。

# 手順１. ダッシュボードで情報収集
## 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とRESTaskをインストールして設定をしていきます。
タスクとは動作（アクション）を組み合わせたものです。
今回はRESTaskを用いて解錠させるアクションを作成します。

タスクタブの右下の＋ボタンでタスクを作成できます。
適当な名前（「解錠」など）を入力してタスク編集画面に入り、
右下の＋ボタンでアクションを追加します。

アクションの追加でプラグインからRESTaskを選択し
設定の鉛筆アイコンを押すと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に戻ります。

Taskerのタスク画面の左下にも▶ボタンがあります。
これを押すと並べたアクションが順に実行されていきます。
今はまだ1つしかアクションがありませんが一度押して
ちゃんと鍵が開くか確認します。
動作確認が出来たら解錠タスク作成は終了です。

RESTaskの画面からはちゃんと解錠できるのに
TaskerからはRESTaskが動かないときには、
Androidのアプリ設定でRESTaskの自動起動の設定を
見直してみてください。

# 手順３．プロファイルを作成
プロファイルはトリガーとタスクを関連付けるものです。
今回はAmazfitのボタンを押されたら解錠タスクが動くようにします。

まず、Tools & Amazfitアプリの「ボタン→歯車タブ→Plugin Integration」の
チェックを有効にしてください。

右下の＋ボタンでプロファイルを作成して名前（「Amazfit」など）を入力し
「イベント→プラグイン→Amazfit Tools」を選択、
Configurationの鉛筆ボタンを押してButton Pressedを選択して戻り
更にTaskerのプロファイル画面まで戻って下さい。

するとそのトリガーが有効になったときに動かすタスクを聞かれるので
先程設定した解錠タスクを指定してください。

これでAmazfitのボタンを押したら鍵が開くようになりました。

# 手順４. Amazfitへの表示を設定
何も反応がないとちゃんと押されたのかが不安になるので
ボタンを押されたらAmazfitに通知を出すようにしましょう。

解錠タスク内にアクションの追加でプラグインからAmazfit Toolsを選択、
設定の鉛筆アイコンを押すとAmazfit Toolsの画面に変わります。
「カスタム通知→振動とテキスト→振動とテキスト」で
表示したいタイトルと内容を指定してください。

|タイトル|内容|
|---|---|
|SESAME|OPEN SESAME|

ここはやはりこんな感じでしょうか。
場所はRESTaskの上でも下でもいいでしょう。

タスク画面の左下の▶ボタンを押して、
解錠されてAmazfitに通知が飛ぶのを確認しましょう。

# 手順５．2回押しで動作するようにする
今のままだと1回押しただけで反応してしまいます。
というか何回押しても反応します。
これではふとした時に誤って触れてしまうと
鍵が開いてしまうことになるので
2回押した時にのみ動作するようにしましょう。

解錠タスクのアクションの追加から「タスク」を選択、
「If」を選んで

- %button_count ~ 2

と設定します。
%button_countはAmazfit Toolsが作る変数で
ボタンを押された回数が入力されているため
今回は2回押された時という条件を指定しています。

次にアクションの追加から再度「タスク」を選択、
「End If」を選択します。

最後に「If」を解錠タスクの一番上に持ってきて
全てのアクションを「If」と「End If」の間に挟むようにすると
自動的に挟まれたアクションが右にインデントします。

こうすることでボタンを2回押した時にのみ
作成した2つのアクションが動作するようになります。

# おわりに
とりあえずボタンを押して解錠するところまで書いてみました。

色々と工夫するとこんな感じにも出来ます。
https://j.gifs.com/VA0RKX.gif

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

# 追記（Tools & Amazfit単体での解錠）
1つの鍵の解錠だけであればTools & Amazfit単体の機能でも可能です。
アプリのボタン機能で、右下の＋ボタンのMoreからHTTP Requestを選択。

|タイトル|内容|
|---|---|
|HTTP Request URL|https://api.candyhouse.co/public/sesame/<b>デバイスID</b>|
|HTTP Request Method|POST|
|HTTP Request Headers|Authorization : <b>APIキー</b><br>Content-Type : application/json|
|HTTP Request Body|{"command" : "unlock"}|

このように設定すればOKです。

デフォルトでは2回押しから設定されていきます。
1回押しに設定したいときにはButton Settingsの歯車タブの
Single Button Pressesを有効にしてください。
3回押しだけに設定したいときには2回押しのアクションを
No Actionに設定して下さい。