Home assistant:Sesame スマートロックが動く

Home Assistant・IoT

Home assistantにSesame 5 Proを登録できまして、ロック・アンロックもできるようにになりました。

セサミの他のガジェット、セサミタッチ・オープンセンサー・セサミボットは残念ながらWeb APIが無いので今のところHome assistantで扱えそうもない。セサミボットを操作できるようになったら良かったけど、現状は無理っぽい。

Sesame スマートロックから情報取得

Sesame Smart Lock
Instructions on how to integrate Sesame by CANDY HOUSE into Home Assistant.

Web APIでセサミの履歴や施錠解錠の操作方法などこちらで解説してあります。

Web API
Web API

今うちあるのはセサミ 5 Proで、Home assistantに登録していきます。

API key・UUID・Secret Keyの3つが必要

Home assistantでセサミ鍵を登録・操作するためには以下の3つが必要です。

  • API Key:ID(メルアド)のAPI Key
  • UUID:セサミ5やセサミ4など機器ごとのID
  • Secret Key:セサミ5やセサミ4など機器ごとのシークレットキー

APIはユーザーごとのキーで、UUID・Secret Keyはセサミ5など機器ごとのキーになります。

参考にしたのは以下の2つのページ

SESAMEスマートロックを Home Assistant から制御する方法 | Tats Shibata | 柴田竜典 | シバタツ
Template Lock Integration を使うことで、Sesame OS2 を搭載した SESAME 3 や SESAME 4 スマートロックを Home Assistant に対応させることができます
セサミ5をHomeKitで使う
Candy Houseの新しいスマートロック、セサミ5を、Homebridge経由でHomeKitから使えるよう設定しました。SwitchBotのスマートロックも良かったですが、セサミ5もちゃんと動いて、さらに安くて、コンパクトで、動作が早

UUID取得

まずはUUID取得、UUIDはセサミアプリを起動させてセサミ 5 Proを選択、右上の縦点3つをタップすると以下の画面になる。

UUIDは一番下の行、コピーはできないので手動でメモするか画像スキャンする。

UUID:1120041x-xxxx-xxxx-xxxx-xxxxxxxxxxxx

APIとSecret Keyを取得

セサミ5ProのQRコード取得

続いてSecret Keyを取得するのにQRコードが必要なので、「このセサミの鍵シェア」を選択してQRコードが表示されたらスクリーンショットを撮ってPCにコピーする。

QRコードはオーナーのを取得する。

APIとSecret Keyを取得するページ

ここ↓でもAPI取得できるけどこれは違った。

CANDY HOUSE Dashboard

こっちからAPIとSecret Keyを取得する。

https://partners.candyhouse.co/

こちら↑セサミIDでログインするとAPI Keyが表示されます。

Secret Key取得

続いてSecret Keyを取得します。

上記QRコードアイコンをクリックして先ほどスクリーンショットで撮ったQRコードをアップロードするとDevice Secret Keyの欄にキーが表示される。

正常動作するかテスト

UUIDとSecret Keyを入力できたら「ステータス取得を実行」ボタンを押すと、下にデータが表示されれば成功。

履歴取得とデバイスを操作ボタンも押してみましょう。

デバイス操作ボタンは押すごとにセサミ5Proの鍵が開いたり閉じたりします。

Pythonスクリプト 作成&テスト

APIを使ってうまく操作できそうなので、https://doc.candyhouse.co/ja/SesameAPIを参考にPythonスクリプトを書いていきます。

以下のスクリプトをHome assistantのサーバーにアップして、セサミが動作するかテストしてみます。

(注:APIキー、UUID、Secretキーをスクリプトに直接書いていて、セキュリティが低くなりますので、Home assistantのconfiguration.yamlに書いたほうが良いのかもしれません。)

#!/usr/bin/env python3
# encoding: utf-8

import json
import base64, datetime, json, requests, sys
from Crypto.Cipher import AES
from Crypto.Hash import CMAC

# APIキー、UUID、Secretキー
api_key = "WVAzmWMxxxxxxxxxxxxxxxxxxxxxxxxxx"
secret = "97a264xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
uuid = "1120041x-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

def main():
    try:
        command = sys.argv[1]
    except IndexError:
        print("Usage: sesame <status|lock|unlock|toggle>")
        sys.exit(1)

    if command == "lock":
        cmd = 82
    elif command == "unlock":
        cmd = 83
    elif command == "toggle":
        cmd = 88
    elif command == "status":
        cmd = None
    else:
        print("Invalid command")
        sys.exit(1)

    history = base64.b64encode("Python".encode()).decode()

    cmac = CMAC.new(bytes.fromhex(secret), ciphermod=AES)
    cmac.update(int(datetime.datetime.now().timestamp()).to_bytes(4, "little", signed=False)[1:4])
    sign = cmac.hexdigest()

    headers = {"x-api-key": api_key}

    if cmd is not None:
        url = f'https://app.candyhouse.co/api/sesame2/{uuid}/cmd'
        body = {
            "cmd": cmd,
            "history": history,
            "sign": sign
        }
        res = requests.post(url, json.dumps(body), headers=headers)
    else:
        url = f'https://app.candyhouse.co/api/sesame2/{uuid}'
        res = requests.get(url, headers=headers)

    if res.status_code == 200:
        if cmd == 82:
            print(json.dumps({"status": "locked"}))
        elif cmd == 83:
            print(json.dumps({"status": "unlocked"}))
    else:
        print(res.status_code, res.text)

if __name__ == "__main__":
    main()

Pythonスクリプトを設置して実行権限を与える。

sudo chmod 755 /home/khadas/script/sesame5pro.py

以下のようにシェルで実行するとセサミが動作するか確認しましょう。

statusはJsonで鍵の情報↓を返してくれます。

python3 /home/khadas/script/sesame5pro.py status
200 {"batteryPercentage":87,"batteryVoltage":5.947214076246334,"position":22,"CHSesame2Status":"locked","timestamp":1707025077,"wm2State":true}

python3 /home/khadas/script/sesame5pro.py lock
python3 /home/khadas/script/sesame5pro.py unlock
python3 /home/khadas/script/sesame5pro.py toggle

toggleは鍵が開いている時は閉じて、閉じている時は開けてくれます。

PythonスクリプトをDockerにコピー

先ほど作ったhomeassistantのDockerコンテナにPythonスクリプトをコピーします。

sudo docker cp /home/khadas/script/sesame5pro.py 1bde9cd526e6:/config/

セサミ鍵 動作テスト

ちゃんと動くかテストしたら♪ できました。

シェルから実行
sudo docker exec -it homeassistant python3 sesame5pro.py unlock
sudo docker exec -it homeassistant python3 sesame5pro.py lock
sudo docker exec -it homeassistant python3 sesame5pro.py status
Docker コンテナ内部から実行

こちらもちゃんと動く。

sudo docker exec -it homeassistant /bin/bash
python3 sesame5pro.py unlock
python3 sesame5pro.py lock
python3 sesame5pro.py status

Dockerコマンド(おまけ)

コンテナ
$ sudo docker container ls      #稼働中のコンテナ
$ sudo docker ps       #稼働中のコンテナ
$ sudo docker ps -a      #停止しているコンテナ
$ sudo docker rm [コンテナID] #コンテナ削除 消えない場合は-fで削除
イメージ
$ sudo docker images
$ sudo docker rmi [イメージID] #イメージ削除 消えない場合は-fで削除

Home assistantのconfiguration.yaml設定

configuration.yamlに以下を追加する。

ここでハマった、センサーの部分はrestにして直接ステータスの情報をapp.candyhouse.coに取りに行かないとダメみたい。

(打ち消し線の部分はコマンドラインでpython3 sesame5pro.py statusでステータス情報を取りに行ったらうまく行かなかった。)

shell_command:
  control_lock: 'python3 sesame5pro.py  lock'
  control_unlock: 'python3 sesame5pro.py  unlock'
  get_status: 'python3 sesame5pro.py  status'

sensor:
  - platform: rest
    name: "sesame status"
    resource: https://app.candyhouse.co/api/sesame2/11200411-UUID
    headers:
      x-api-key: WVAzmWMxxxxxxxapi_key
    value_template: '{{ value_json.CHSesame2Status }}'
    json_attributes:
      - batteryPercentage
      - batteryVoltage
      - position
      - CHSesame2Status
      - timestamp
    scan_interval: 100

sensor:
  - platform: command_line
    name: sesame_status
    command: 'python3 sesame5pro.py status'
    value_template: "{{ value | json_extract('CHSesame2Status') }}"
    scan_interval: 60

lock:
  - platform: template
    name: sesame_lock
    value_template: "{{ states('sensor.sesame_status') }}"
    lock:
      service: shell_command.control_lock
    unlock:
      service: shell_command.control_unlock

追加方法はFile editorからconfiguration.yamlを選んでファイルの下のほうに追加。

configuration.yaml追加・保存したら再起動しましょう。開発者ツールをインストールしてある場合は以下のように操作するとチェック・再起動ができる。

configuration.yamlを編集した場合は再起動は必須です。

開発者ツールで動作確認

左メニューの開発者ツール >サービスでShell Command: get_statusやShell Command: control_unlock・Shell Command: control_lockを見つけて「サービスの呼び出し」を押すとセサミが動作しました。

Statusの場合は↓このような表示になる。

Shell Command: get_status

エンティティ

開発者ツール > 状態でsensor.sesame_statusを動作しているかチェックする。

うまくいきました。

オーバービューに登録

あとはsensor.sesame_statusをオーバービューに登録するだけ。

ロック・アンロックの状態、鍵開け締めがHome Assistantでできるようになりました。

カギ以外のセサミはWeb APIは無い

ここ↓にAndroidとiOSの操作方法はあるが、セサミボットはWeb APIでは操作できないみたい。

クラス リファレンス
SesameSDK_iOS クラス リファレンス

コメント