自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

SESAMEスマートロックをMacroDrodのウィジェットボタンからAPI経由で操作する

f:id:maru0014:20201204225354p:plain

marumo家では簡単に取り付けてアプリから解錠できる スマートロック SESAME を3年前から愛用しています。物理的な鍵を持たなくていい上に鍵の閉め忘れも無くなるので便利すぎてもうもとには戻れません。

しかし、不便な点がひとつあってアプリから開けようとする場合は

  1. 玄関前に到着
  2. スマホを起動
  3. アプリを起動
  4. BluetoothまたはWeb経由での接続を待つ
  5. 鍵の検証を待つ
  6. ボタンをタップして解錠

という手順になります。

そしてこの中の4~5が上手く行かずBluetoothで接続しにいったと思ったらやっぱりWi-Fiで接続に切り替わって、さらにもう一度Bluetoothに切り替わって検証中になってからようやくボタンが押せるようになる。みたいな煩わしいことがたまにあってストレスでした。

再現できたので録画してみました。解錠可能になるまでに約40秒も要しています。

ドーラならジャスト40秒なので許すかもしれませんが、自動化厨にとってはとても我慢なりません。

f:id:maru0014:20201204225447g:plain

IFTTT対応なんだからIFTTT経由にすれば解決 のはずだった

そこでアプリも起動せず玄関に付く前の階段あたりでWeb経由で解錠リクエストを送信すれば多少タイムラグがあってもすぐに部屋に入れる!ということでSESAMEをIFTTTに連携、IFTTTアプリでウィジェットボタンを作成、スマホのホーム画面のボタンを押せば開くようにしていました。

f:id:maru0014:20201204225548p:plain

これで

  1. スマホを起動
  2. ウィジェットボタンをタップして解錠

の2ステップに!と喜んでいたのも束の間、IFTTTの有料化に伴ってこのウィジェットボタンが使えなくなってしまったのです...。仕方なくここ数日はアプリを起動して~の手順に戻って利用していました。

それでも極度のめんどくさがりのため耐えきれず「そういえばSESAMEは公式API使えたような...!!」ということで今回のタイトルの内容になります。

PowerShellから試しにリクエストを投げてみる

SESAMEの公式ドキュメントはとても分かりやすくシンプル。

https://docs.candyhouse.co/#sesame-api

トークンをヘッダーに入れてGETリクエストを投げるだけで管理しているSESAMEが取得できます。

# リクエスト例
curl -H "Authorization: <YOUR_AUTH_TOKEN>" \
  https://api.candyhouse.co/public/sesames

# レスポンス例
[
    {
      "device_id": "00000000-0000-0000-0000-000000000000",
      "serial": "ABC1234567",
      "nickname": "Front door"
    }, {
      "device_id": "00000000-0000-0000-0000-000000000001",
      "serial": "DEF7654321",
      "nickname": "Back door"
    }
]

トークンはダッシュボードのAPI設定ページにアクセスして取得可能。ADDボタンをクリックして表示された文字列をコピーしておきます。※1度しか表示されないので注意

f:id:maru0014:20201204225601p:plain

Get Sesame list (SESAMEの一覧を取得)

メイン機がWindowsかつ最近PowerShellを触ることが多いのでPowerShellでテストしてみました。

$token = "<YOUR_AUTH_TOKEN>"
$Headers = @{Authorization = $token}
Invoke-RestMethod -Headers $Headers -Uri https://api.candyhouse.co/public/sesames

実際に実行するとこのように device_id, serial, nickname が返ってきます。

うちは1つしか設置していないので1つだけですね。

f:id:maru0014:20201204225610p:plain

Get Sesame status(SESAMEの状態を取得)

次に特定のSESAMEの解錠/施錠ステータスを取得してみます。

# リクエスト例
curl -H "Authorization: <YOUR_AUTH_TOKEN>" \
  https://api.candyhouse.co/public/sesame/00000000-0000-0000-0000-000000000001

# レスポンス例
{
    "locked": true,
    "battery": 100,
    "responsive": true
}
$token = "<YOUR_AUTH_TOKEN>"
$Headers = @{Authorization = $token}
Invoke-RestMethod -Headers $Headers -Uri https://api.candyhouse.co/public/sesame/<SESAMEのdevice_id>

f:id:maru0014:20201204225620p:plain

Control Sesame (SESAMEを開ける/閉める)

今度は解錠してみます。こっちはPOSTリクエストである点に注意。

commandの値は lock または unlock を指定します。

# リクエスト例
curl -H "Authorization: <YOUR_AUTH_TOKEN>" \
    -H "Content-Type: application/json" \
    -X POST -d '{"command":"unlock"}' \
    https://api.candyhouse.co/public/sesame/00000000-0000-0000-0000-000000000001

# レスポンス例
{
  "task_id": "01234567-890a-bcde-f012-34567890abcd"
}
$token = "<YOUR_AUTH_TOKEN>"
$Headers = @{Authorization = $token}
$json = ConvertTo-Json -InputObject @{command = "unlock"}
Invoke-RestMethod -Uri "https://api.candyhouse.co/public/sesame/<SESAMEのdevice_id>" `
-Headers $headers `
-Method Post `
-ContentType "application/json" `
-Body $json

無事に開きました。これを使えばMacroDroidに限らず色々なところで使えそうですね。

※開け閉めして遊んでいたら家族に うぃんうぃん うるさいと言われたので実験するときは注意w

f:id:maru0014:20201204225633p:plain

MacroDroidで実行できるようにする

スクリプトによってAPIを叩いて解錠できることは分かりました。

あとはスマホのウィジェットボタン化をどうするか。これにはMacroDroidを使ってみることにしました。

play.google.com

有名所のTaskerでも良かったんですが、分かりやすいUIで トリガー、アクション、条件の3つを設定していくというiPaaS的な形だったのでお試しです。

トリガー:ウィジェットボタン

トリガーを追加 > ユーザー入力 > ウィジェットボタンを選択

見た目も分かりやすいように カスタム > 画像を選択 にてSESAMEアプリのアイコンを選択すると良いでしょう。

f:id:maru0014:20201204225659p:plain

アクション:シェルスクリプト

アクションを追加 > アプリ >シェルスクリプト を選択

f:id:maru0014:20201204225712p:plain

Webリクエストを送信するだけなので非ルート化でOK。

以下のスクリプトのトークンとデバイスIDを自身のものに変更して設定しましょう。

条件は設定不要なのでこれで保存。

curl -H "Authorization: <YOUR_AUTH_TOKEN>" \
-H "Content-Type: application/json" \
-X POST -d '{"command":"unlock"}' \
https://api.candyhouse.co/public/sesame/<SESAMEのdevice_id>

f:id:maru0014:20201204225722p:plain

ウィジェットボタンを配置

あとはマクロをボタンとして配置するだけです。

  1. ウィジェットの選択にてMacroDroidを選択
  2. MacroDrod Customを選択
  3. 設定したマクロを選択(例ではオープンセサミ)

以下の例では画面下部に配置していますが、うっかり押してしまう可能性も考えると上の方に置くのがいいかも?

f:id:maru0014:20201204225739g:plain

まとめ

これで日々の無駄な時間のうち30秒くらいは節約できたと思います。

直にAPIを叩いているためか、IFTTT経由だったときよりも若干レスポンスが早い気がしますね。

あと、今回は触れていませんがSESAMEのダッシュボードではステータス変更時のWebhookを設定できるようでした。

鍵が開いたとき、閉まったときをトリガーに何かを呼び出すということが出来るようになるので夢が広がりますねー。