🔓

SESAME3/4をpysesameos2で使う手順

2021/10/05に公開

利用するもの

ハードウエア

  • Raspberry Pi Zero WH
  • SESAME3 or 4
    • 予めスマホのセサミアプリで登録しておく。

ソフトウエア

サービス

  • HiveMQ Cloud(MQTTブローカ)

構成図

こんな感じ

pysesameos2の設定手順

概要

  1. Raspberry PiのOSセットアップ
  2. HiveMQの準備
  3. SESAMEアクセス用シークレットの準備
  4. 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ブローカ)の準備

SESAMEアクセス用シークレットの準備

鍵シェア用のQRコードを取得

セサミアプリでオーナーまたはマネジャー権限のQRコードをクリーンショット保存する。
https://ameblo.jp/candyhouse-inc/entry-12653318542.html

QRコードからシークレット類を取得

  1. 下記サイトで、QRコード画像を選択するとシークレット類が取得できる。
    https://sesame-qr-reader.vercel.app/
  1. 下記のように表示されるので、Secret KeyとPublic Keyを控えておく

mqtt2sesameの設定

  1. Raspberry Piにssh。

  2. 必要なパッケージのインストール。

$ 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
  1. pythonの仮想環境を作成し、必要なライブラリのインストール。
$ cd pysesameos2/example/mqtt2sesame
$ python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install -r requirements.txt

※ 本家の手順だと、仮想環境作成は virtualenv venv

  1. Bluetooth を使うために必要な権限をユーザに付与する。
(venv)$ sudo usermod -a -G bluetooth $USER
(venv)$ sudo reboot
  1. Raspberry Piにsshする。
  2. 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
==========
  1. 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
===
  1. 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)  
===
  1. 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を操作する

  1. 下記の手順で、HiveMQのWeb Socket Clientを開く
    https://zenn.dev/dorayaki/articles/4a566984adf76d#web-socket-clientでmqttブローカに接続しsubscribeとpublishする

  2. Topicにpysesameos2/SESAME_DEVICE_UUID/cmd、MessageにLOCKまたはUNLOCKを入力し、Publishする

  3. 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 自動起動」あたりでググってください
https://www.google.com/search?q=python+virtualenv+自動起動

Androidから操作する

Android用のMQTT Clientで、HiveMQにメッセージをPublishしてください。このアプリはTaskerからも利用できます。
MQTT Client
https://play.google.com/store/apps/details?id=in.dc297.mqttclpro&hl=ja&gl=US

メモ

  • 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