🔑
Sesame 3 / 4 APIを使う
必要なもの
- Sesame 3 or Sesame 4 本体
- Sesame 3 / 4用アプリでのユーザー登録
- UnixライクなOS(LinuxとかmacOSとか)
- curl
- Python 3
手順
API KEY と Client IDの取得
candy houseのダッシュボードにログインする。
メールアドレスを入力。
メールアドレス宛にワンタイムトークンが届くので入力。
ダッシュボードにログインしてしばらく待つと API KEY
と Client ID
が生えてくる。 API KEY
をメモする。
状態の取得
curlコマンドで取得できる。 your_api_key
にはダッシュボードで取得した API KEY
を入力すること。
curl \
-X GET \
-H "X-API-KEY: your_api_key" \
https://app.candyhouse.co/api/sesame2/your-sesame-uuid
{
"batteryPercentage":100,
"batteryVoltage":6.116129032258065,
"position":232,
"CHSesame2Status":"locked",
"timestamp":1623645891
}
秘密鍵の取得
Sesame 3アプリの このセサミの鍵をシェア からQRコードを取得する。
このとき、ゲストキーではなく、マネージャかオーナーを選択すること。
表示されたQRコードをQRコード読み取りアプリなどを使ってテキストを取得する。
次のような文字列が得られる。
ssm://UI?t=sk&sk=xxxx&l=0&n=%E5%8B%9D%E6%89%8B%E5%8F%A3
クエリ文字列部分を Python urllib モジュールでパースする。
>>> import urllib.parse
>>> urllib.parse.parse_qs('t=sk&sk=xxxx&l=0&n=%E5%8B%9D%E6%89%8B%E5%8F%A3')
{
't': ['sk'],
'sk': ['xxxx'],
'l': ['0'],
'n': ['勝手口']
}
パラメタ | 意味(推測) |
---|---|
t | データ種別 |
sk | 秘密鍵など |
l | 鍵の権限 (0=オーナー, 1=管理者, 2=ゲスト) |
n | 操作対象のセサミの名称 |
sk
パラメタをBASE64デコードする。
import base64
sk = 'xxxx'
sk_bytes = base64.b64decode(sk)
sk
パラメタは mochipon さんの実装によると次の意味になる。
byte offset | 意味 |
---|---|
0 | 機器 (0=Sesame 3, 1=WiFi Module 2, 2=Sesame Bot, 3=Sesame Cycle) |
1-16 | 秘密鍵16bytes |
17-81 | 公開鍵64bytes |
82-83 | 鍵インデックス |
84-99 | Sesame Device UUID |
秘密鍵のHEX文字列を取得する。
secret_key_hex = sk_bytes[1:17].hex()
解錠操作
Pysesame3 がよく出来ているのでこれを使う。
from pysesame3.auth import WebAPIAuth
from pysesame3.lock import CHSesame2
# アカウントの API KEY
auth = WebAPIAuth(apikey="your-api-key")
# Sesame 3 の UUID
your_key_uuid = "sesame-uuid"
# 前段の手順で取得した秘密鍵の HEX 文字列
your_key_secret = "secret-key-hex"
device = CHSesame2(
authenticator=auth,
device_uuid=your_key_uuid,
secret_key=your_key_secret,
)
# 解錠処理。 `My Script` はヒストリに記録される文字列。
device.unlock(history_tag="My Script")
Discussion
ありがとうございます Python触ったことがなく Pysesame3の使い方がさっぱりだったのでとても助かりました
できれば同様に Pysesameos2 についても書いていただければありがたいです
pysesameos2を存じませんでした。情報ありがとうございます。
BT用のライブラリなのですね。なにかの折に試してみます。