はじめに
Homebridgeからセサミ5を動かしたかったので、CANDY HOUSE公式のBluetooth APIを参考に、Pythonでセサミ5を動かすライブラリと、それを基にMQTTとブリッジするスクリプトを作りました。
Home AssistantやHomebridgeとセサミ5をMQTT経由で連携させたり、Pythonからセサミ5を動かせるようになります。Bluetoothで直接通信するのでWeb APIと違い、アクセス数の制限がなく、Hub3不要、かつ動作も速いです。
WindowsとLinuxで動きます。動作未確認ですが、おそらくmacOSでも動きます。今回はRaspberry Pi OS Bookworm (64-bit), Raspbrry Pi Zero 2 Wを例に説明させていただきます。
Qiita初投稿、Python初心者なので、色々と変なところがあるかもしれませんがご容赦ください。
MQTTでセサミ5を操作
Raspberry Pi OSをアップデート
このスクリプトは、BlueZ 5.82以降でないと動作しないので、まずはRaspberry Pi Trixieにアップデートしてしまいます。
セサミ5のServiceとCharacteristicを取得できないバグがあるためです。恐らく、bluezのissue #438と同じ現象だと思います。間違っていたらすみません。5.68で修正済みらしいですが、私は5.82しか試していません。
-
パッケージリストの書き換え
sudo nano /etc/apt/sources.list
でbookworm
をtrixie
に書き換えます。/etc/apt/sources.listdeb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware deb http://deb.debian.org/debian-security/ trixie-security main contrib non-free non-free-firmware deb http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
次に、
sudo nano /etc/apt/sources.list.d/raspi.list
で同様に書き換えます。/etc/apt/sources.list.d/raspi.listdeb http://archive.raspberrypi.com/debian/ trixie main
-
アップグレードの実行
sudo apt update sudo apt full-upgrade
-
再起動
sudo reboot
ssm2mqttのインストール
-
Releasesから最新の
ssm2mqtt_x.x.x.zip
をダウンロードします現時点での最新版は0.2.2です
wget https://github.com/meronepy/ssm2mqtt/releases/download/v0.2.2/ssm2mqtt_0.2.2.zip
-
zipファイルを展開、
/usr/local/bin/ssm2mqtt
に配置unzip "ssm2mqtt*.zip" sudo cp -r ssm2mqtt /usr/local/bin/ssm2mqtt
-
ファイルの所有者を変更
sudo chown -R ${USER}: /usr/local/bin/ssm2mqtt
-
仮想環境を構築
cd /usr/local/bin/ssm2mqtt python -m venv .venv
-
バックエンドのライブラリをインストール
.venv/bin/pip install -r requirements.txt
-
MACアドレスとUUIDの対応を確認
$ /usr/local/bin/ssm2mqtt/.venv/bin/python /usr/local/bin/ssm2mqtt/discover.py Address : XX:XX:XX:XX:XX:XX Model : Sesame 5 Name : None RSSI : -88 Registered : True UUID : 12345678-90ab-cdef-1234-567890abcdef
公式アプリの
UUID
と比較して、目的のセサミ5のMACアドレスを確認します。Address
とUUID
を後で使うのでメモしておきます。 -
シークレットキーの取得
mochipon様作成のQR Code Reader for SESAMEを使用して、公式アプリのQRコードから抽出しSecret Key
をメモしておきます。マネージャー以上の権限が必要です。
-
nano config.json
で設定ファイルを編集devices
セクションを、先ほどメモしておいたAddress
とSecret Key
で書き換えます。
history_name
は公式アプリの操作履歴に表示される名前です。
mqtt
セクションはお使いのMQTTブローカーの値に合わせて書き換えてください。{ "history_name": "ssm2mqtt", "mqtt": { "base_topic": "ssm2mqtt", "host": "localhost", "port": 1883, "user": "", "password": "" }, "devices": { "XX:XX:XX:XX:XX:XX": "1234567890abcdef1234567890abcdef" } }
-
自動起動を設定(やらなくてもok)
sudo cp ssm2mqtt.service /etc/systemd/system/ssm2mqtt.service sudo systemctl enable ssm2mqtt.service
-
起動!!!
-
自動起動を設定済みの場合
sudo systemctl start ssm2mqtt
-
自動起動を設定していない場合
/usr/local/bin/ssm2mqtt/.venv/bin/python /usr/local/bin/ssm2mqtt/main.py
お疲れさまでした。これで無事に起動したと思います。
-
MQTTから開錠する
mqttで、ベーストピック/セサミのUUID/set
トピックに、UNLOCKED
メッセージをパブリッシュすることで施錠します。施錠の場合はLOCKED
です。
-
開錠例
mosquitto_pub -t "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/set" -m "UNLOCKED"
MQTTでステータスの受信
ベーストピック/セサミのUUID/get
トピックをサブスクライブして、セサミの状態が変化するとリアルタイムでパブリッシュされます。
受信例
mosquitto_sub -t "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/get"
以下のフォーマットでパブリッシュされます。
{
"position": -13,
"lockCurrentState": "LOCKED",
"batteryVoltage": 6.062,
"batteryLevel": 100,
"chargingState": "NOT_CHARGEABLE",
"statusLowBattery": false
}
homebridge-mqttthingの設定例
{
"type": "lockMechanism",
"name": "ssm2mqtt",
"url": "mqtt://localhost:1883",
"topics": {
"getLockCurrentState": "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/get$.lockCurrentState",
"getLockTargetState": "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/get$.lockCurrentState",
"setLockTargetState": "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/set",
"getBatteryLevel": "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/get$.batteryLevel",
"getChargingState": "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/get$.chargingState",
"getStatusLowBattery": "ssm2mqtt/12345678-90ab-cdef-1234-567890abcdef/get$.statusLowBattery"
},
"lockValues": [
"UNLOCKED",
"LOCKED"
],
"accessory": "mqttthing"
}
Pythonでセサミ5を操作
ライブラリのインストール
pip install git+https://github.com/meronepy/gomalock.git
Pythonからの開錠例
import asyncio
from gomalock.sesame5 import Sesame5
MAC_ADDRESS = "XX:XX:XX:XX:XX:XX"
SECRET_KEY = "1234567890abcdef1234567890abcdef"
async def main():
async with Sesame5(MAC_ADDRESS, SECRET_KEY) as sesame5:
await sesame5.unlock("gomalock")
if __name__ == "__main__":
asyncio.run(main())
まとめ
セサミ5を動かすPythonライブラリと、MQTTのブリッジスクリプトを作ってみたので紹介させていただきました。稚拙な文章ですが、最後まで読んでいただき本当にありがとうございます。もし、「コードのここの部分がおかしい」とか「挙動が変」などありましたらぜひ教えてください!