🔓
SESAME3/4をpysesameos2で使う手順
利用するもの
ハードウエア
- Raspberry Pi Zero WH
- SESAME3 or 4
- 予めスマホのセサミアプリで登録しておく。
ソフトウエア
- pysesameos2
https://pysesameos2.readthedocs.io/en/latest/ - mqtt2sesame
- pysesameos2にサンプルとして含まれている。
https://github.com/mochipon/pysesameos2/tree/main/example/mqtt2sesame
- pysesameos2にサンプルとして含まれている。
サービス
- HiveMQ Cloud(MQTTブローカ)
構成図
こんな感じ
pysesameos2の設定手順
概要
- Raspberry PiのOSセットアップ
- HiveMQの準備
- SESAMEアクセス用シークレットの準備
- mqtt2sesameの設定
Raspberry PiのOSセットアップ
詳細は割愛。ポイントだけ記述。
- Raspberry Pi Imagerを利用
https://www.raspberrypi.org/software/ - OSはRaspberry Pi OS Liteを選択(with Desktopでもよい)
- Raspberry Pi ImagerでAdvanced optionsを設定すると、キーボードやディスプレイなしですぐにsshできる。(ヘッドレスセットアップ)
- Advanced optionsでの設定時、Wi-Fiは2.4GHzで利用できるものを選ぶ。(5GHzは未対応?)
- OSのupdateとupgradeはしておく。
HiveMQ Cloud(MQTTブローカ)の準備
- 下記手順を参照
https://zenn.dev/dorayaki/articles/4a566984adf76d - 次の情報を控える
- host
- (MQTT Credentialの)username
- (MQTT Credentialの)password
SESAMEアクセス用シークレットの準備
鍵シェア用のQRコードを取得
セサミアプリでオーナーまたはマネジャー権限のQRコードをクリーンショット保存する。
QRコードからシークレット類を取得
- 下記サイトで、QRコード画像を選択するとシークレット類が取得できる。
https://sesame-qr-reader.vercel.app/
- サイトにも書いてあるけど、ブラウザ側で処理される。オフラインでも動作可能。
- 完全ローカルでも動かせる。
https://github.com/mochipon/sesame-qr-reader
- 下記のように表示されるので、Secret KeyとPublic Keyを控えておく
mqtt2sesameの設定
-
Raspberry Piにssh。
-
必要なパッケージのインストール。
$ sudo apt install -y git python3-pip python3-virtualenv python3-venv
$ pip3 install --upgrade pip
3.pysesameos2のダウンロード。
git clone https://github.com/mochipon/pysesameos2.git
- pythonの仮想環境を作成し、必要なライブラリのインストール。
$ cd pysesameos2/example/mqtt2sesame
$ python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install -r requirements.txt
※ 本家の手順だと、仮想環境作成は virtualenv venv
。
- Bluetooth を使うために必要な権限をユーザに付与する。
(venv)$ sudo usermod -a -G bluetooth $USER
(venv)$ sudo reboot
- Raspberry Piにsshする。
-
discover.py
で、SESAMEのBluetooth接続用の識別子(BLE Device Indentifier
の部分)とSESAMEデバイスのUUID(SESAME device found
の部分)を控える。
$ cd pysesameos2/example/mqtt2sesame
$ . venv/bin/activate
(venv)$ python ../discover.py
INFO:pysesameos2.ble:Starting scan for SESAME devices...
--中略--
==========
SESAME device found: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
BLE Device Identifier: XX:XX:XX:XX:XX:XX
RSSI: -XX
Device Model: CHProductModel.SS4
Device is registered on the SESAME cloud?: True
==========
-
config.yml
を編集する
(venv)$ cd pysesameos2/example/mqtt2sesame
(venv)$ vi config.yml
===
sesame:
"XX:XX:XX:XX:XX:XX": # discover.pyで取得したBT接続用識別子
secret_key: XXXXXXXX # QRコードから取得したもの
public_key: XXXXXXXXXXXXXXXXXXXXXXXXXX # QRコードから取得したもの
mqtt:
host: XXXXXXXXXXXXX.XX.XX.hivemq.cloud # HiveMQ準備で用意したもの
port: 8883 # HiveMQ接続時の既定値は8883
username: XXXXXXX # HiveMQ準備で用意したもの
password: XXXXXXX # HiveMQ準備で用意したもの
topic_prefix: pysesameos2
===
- TLS接続できるように
mqtt2sesame.py
を編集。138行目あたりに、"mqtt_client.tls_set..."の行を追加する。
(venv)$ vi mqtt2sesame.py
===
mqtt_client.on_message = onMQTTMessage
mqtt_client.username_pw_set(config["mqtt"]["username"], config["mqtt"]["password"])
+mqtt_client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
===
-
mqtt2sesame.py
を起動する
(venv) $ python mqtt2sesame.py
INFO:__main__:Connect to the MQTT server: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.XX.hivemq.cloud
INFO:__main__:SESAME status changed: SESAME UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, status=CHSesame2Status.BleConnecting
INFO:__main__:SESAME status changed: SESAME UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, status=CHSesame2Status.WaitingGatt
INFO:__main__:SESAME status changed: SESAME UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, status=CHSesame2Status.BleLogining
INFO:__main__:SESAME status changed: SESAME UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, status=CHSesame2Status.Unlocked
INFO:__main__:Publish a message: topic=pysesameos2/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/status, payload=UNLOCKED
INFO:__main__:Connected: BLE UUID = XX:XX:XX:XX:XX:XX, SESAME UUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
- (venv)がでていない場合、
cd pysesameos2/example/mqtt2sesame && . venv/bin/activate
する。 - HiveMQへの接続が失敗していても、mqtt2sesame.pyのコンソールログから判断しにくい。その場合は、別セッションのsshで
netstat -t
で、8883へのtcp接続がESTABLISHEDされているかで確認。 - mqtt2sesame.pyのコンソールログで
ERROR:bleak.backends.bluezdbus.client...
が繰り返しでてSESAMEに接続できない場合には、Raspberry Piを再起動する。
pysesameos2経由でSESAMEを操作する
HiveMQにMQTTメッセージを送信し、SESAMEを操作する
-
下記の手順で、HiveMQのWeb Socket Clientを開く
https://zenn.dev/dorayaki/articles/4a566984adf76d#web-socket-clientでmqttブローカに接続しsubscribeとpublishする -
Topicに
pysesameos2/SESAME_DEVICE_UUID/cmd
、MessageにLOCK
またはUNLOCK
を入力し、Publishする
-
SESAMEが動作する。mqtt2sesame.pyのコンソールログには、以下のようなメッセージが出力される。
INFO:__main__:Publish a message: topic=pysesameos2/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/status, payload=UNLOCKED
INFO:__main__:Connected: BLE UUID = XX:XX:XX:XX:XX:XX, SESAME UUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
mqtt2sesameの自動起動化する
「Python virtualenv 自動起動」あたりでググってください
Androidから操作する
Android用のMQTT Clientで、HiveMQにメッセージをPublishしてください。このアプリはTaskerからも利用できます。
MQTT Client
メモ
- HiveMQのMQTTブローカは、ヨーロッパ配置で多少はNW遅延があるかもしれない。
- 国内配置のMQTTブローカSaaSで、無料or安価だと、AWS IoT Coreとかかな?良いものをご存じの方おしえてください。
- MQTTブローカをRaspberry PiローカルにMosquittoでたてて、Blynk経由でRaspberry Pi内でmosquitto_pubを実行してSESAMEを操作する方法もある。イメージ図。
- Blynkの使い方は「Raspberry Pi Blynk」あたりで検索
https://www.google.com/search?q=Rasberry+Pi+Blynk - 自分が確認できた方法は、Blynkの旧バージョンでの方法だったりするので手順化するのはやめておいた。(旧バージョンは機能するものの、新規機能追加は停止している状態)
- BlynkにHTTP Requestする時に、httpsにして接続もできるけど、不適切なサーバ証明書がかえってくるのも手順化するのを止めた理由。(証明書エラーを無視すれば通信はできる)
- Raspberry Piに対して、ポート開放することなく、インターネット越しで利用できて、セットアップが簡単で、無料利用もできる都合の良い方法があれば教えてもらえるとうれしいです。
- LOCK/UNLOCKではなく、TOGGLEを使いたい場合には、
mqtt2sesame.py
で2箇所改変する。
125行目付近
- if cmd == "LOCK" or cmd == "UNLOCK":
+ if cmd == "LOCK" or cmd == "UNLOCK" or cmd == "TOGGLE":
167行目付近
try:
sesame_uuid, command = await asyncio.wait_for(cmd_queue.get(), timeout=1.0)
if sesame_uuid in connected_devices:
if command == "LOCK":
logger.info("Execute locking: SESAME UUID = {}".format(sesame_uuid))
await connected_devices[sesame_uuid]["device_obj"].lock()
elif command == "UNLOCK":
logger.info(
"Execute unlocking: SESAME UUID = {}".format(sesame_uuid)
)
await connected_devices[sesame_uuid]["device_obj"].unlock()
+ elif command == "TOGGLE":
+ logger.info(
+ "Execute unlocking: SESAME UUID = {}".format(sesame_uuid)
+ )
+ await connected_devices[sesame_uuid]["device_obj"].toggle()
except asyncio.TimeoutError:
pass
- mqtt2sesame.pyで複数のSESAMEを操作したい場合は、config.ymlに2つのSESAMEの情報を書いておくことで、操作可能なもよう。2台までは動作確認がとれた。操作時には2台分のメッセージをpubする。
===
sesame:
"XX:XX:XX:XX:XX:XX": # discover.pyで取得したBT接続用識別子(SESAMEその1用)
secret_key: XXXXXXXX # QRコードから取得したもの(SESAMEその1用)
public_key: XXXXXXXXXXXXXXXXXXXXXXXXXX # QRコードから取得したもの(SESAMEその1用)
+ "YY:YY:YY:YY:YY:YY": # discover.pyで取得したBT接続用識別子(SESAMEその2用)
+ secret_key: YYYYYYYY # QRコードから取得したもの(SESAMEその2用)
+ public_key: YYYYYYYYYYYYYYYYYYYYYYYYYY # QRコードから取得したもの(SESAMEその2用)
mqtt:
host: XXXXXXXXXXXXX.XX.XX.hivemq.cloud # HiveMQ準備で用意したもの
port: 8883 # HiveMQ接続時の既定値は8883
username: XXXXXXX # HiveMQ準備で用意したもの
password: XXXXXXX # HiveMQ準備で用意したもの
topic_prefix: pysesameos2
===
Discussion