コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home AssistantでDIY Smart Home】スマートロック!

【Home Assistant(Hass.io)】
ESPHomeでセサミ5を操作!

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 家の玄関のカギをセサミ4からセサミ5(SESAME 5)にアップグレードしました。以前、セサミ4を入れた時「一応Home Assistantからごにょごにょすることは出来ました」と言いましたがごにょごにょが面倒で放置。時は流れ、セサミデバイスにESPHomeからアクセスするモジュールを作ってくれた人が出てきました。おお!是非試してみましょう。

 基本的には下記サイトの言う通り進めます。 github.com

この記事の前提条件
Home Assistant core 2024.6.4
Home Assistant OS 12.4
Server Raspberry Pi 4(2GB)

 上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)

1. 準備

セサミ5
前提条件としてセサミ5はセットアップ済みで、セサミアプリ(セサミ、ひらけゴマ)経由で動作できているものとします。我が家ではそれに加えてWiFiモジュール2と セサミタッチPro、リモートnanoと連携しています。

ESP32S 開発ボード/DOIT ESP32 DevKit V1*1
いつものKeeYees ESP-32S開発ボード(38ピンで横幅スリム)がAmazonになかったのでこちらを購入。30ピンの少し古いやつ、少し安い。ピン配置はここを参照*2

2. 「esphome-sesame3」コンポーネント導入

2.1. ESP32S開発ボードをESPHomeで利用可能にする

 PC上のブラウザで、左側のサイドバーから[ESPHome]を選び、右下の[+NEW DEVICE]をクリックする。デバイス名を入力(例えばsesame、とか)。
 次に、開発ボードをPCに接続する。ボードの右下のチップを見ると「CP2102」と書いてある*3ので、CP2101で繋がっているCOMポートを選択する。もしなければ、キャンセルを押すと下記のような「ここからダウンロードせよ」的な画面がでるのでドライバをインストールして再チャレンジ。

「Preparing Installation」と出てクルクルし始めてからしばらく(私の環境では3分ほど)なんの反応もなく不安になりますが、急に「%」表示が出て進み始めます。
(ちなみに、前に使った開発ボードはコンデンサーをつけてあげないとUSB経由での書き込みが出来ませんでしたが、このDOIT ESP32 DevKit V1(の互換機)はUSBケーブルを挿すだけで書き込めました!その後のOTAでの書き込みついては、時々エラーが出て書けないこともありますが、そんな時は2~3回ほど「Install」すればいずれ書き込めます)

2.2. esphome-sesame3のconfig

 ESPHomeの「EDIT」ボタンでエディタを起動し、yamlファイルに初期されたコードに下記のように修正加筆して、Installする。

esphome:
  name: sesame
  friendly_name: sesame
  libraries:
    - https://github.com/homy-newfs8/libsesame3bt#0.17.0
  platformio_options:
    build_flags:
      - -std=gnu++17 -Wall -Wextra
      - -DMBEDTLS_DEPRECATED_REMOVED -DCONFIG_BT_NIMBLE_ROLE_BROADCASTER_DISABLED -DCONFIG_BT_NIMBLE_ROLE_PERIPHERAL_DISABLED
# Configure the maximum number of connections as required
      - -DCONFIG_BT_NIMBLE_MAX_CONNECTIONS=4
    build_unflags:
      - -std=gnu++11
    lib_ldf_mode: 'deep'

external_components:
  - source:
      type: git
      url: https://github.com/homy-newfs8/esphome-sesame3
      ref: v0.10.0
    components: [ sesame, sesame_ble ]

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "****<初期生成されたものをそのまま利用>************"

ota:
  - platform: esphome
    password: "****<こちらも初期生成をそのまま利用>*****"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # For changing IP address
  # use_address: 192.168.***.***

  # Static IP for this device
  manual_ip:
    static_ip: 192.168.***.***
    gateway: 192.168.***.1
    subnet: 255.255.255.0
    dns1: 192.168.***.1
    dns2: 0.0.0.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Sesame Fallback Hotspot"
    password: "**<初期生成のまま>**"

captive_portal:

## Use below definitions only for discovering your SESAME BT Addresses.
# sesame_ble:

 あとで、この後ろに設定を足してゆきます。
 これでWiFiの固定IP設定まで出来ましたので、このあとはPCから外してOTA(Over The Air)でインストール(アップデートインストール)が可能になります。

3. ESPHomeデバイスにセサミ5の設定

 ESPHomeデバイスからセサミ5にアクセスするためには「Bluetoothアドレス」「PSK(事前共有鍵)」の情報の取得が必要です。まずはそこから。

3.1. Bluetooth LE MACアドレスの取得

 .yamlファイルの最後のsesame_ble:コメントアウトを外してあげてインストールすると、Bluetooth LEで信号を垂れ流しているsesameバイスのログが見えます。

## Use below definitions only for discovering your SESAME BT Addresses.
sesame_ble:

 ESPHomeデバイスLOGSは下記のような感じで、「SESAME 5」より前の部分がBluetooth LE MACアドレスです。複数ある場合には(私のケースですね)、UUIDで区別します。UUIDはセサミアプリで確認できます。

[08:20:23][I][sesame_ble:107]: 01:02:03:04:05:06 SESAME 5 UUID=01020304-0102-0102-0102-010203040506
・
・

3.2. PSKの取得

 PSKの情報はシェアする鍵のQRコードに含まれています。
 アプリのセサミ設定画面を開いて「このセサミの鍵をシェア」を押してQRコードを表示させる。どのタイプの鍵を作るか聞いてくる(オーナー、マネージャ、ゲストの3レベル)ので、流出リスクを考えるとゲスト権限の鍵でいきたいところですが、ゲストキーでは権限不足なようで少なくともマネージャ権限以上が必要です。

 QRコードの読み取りアプリ等でQRコードからテキストを取り出すことはできます。取り出したテキストはbase64エンコードされているので、解読はできますが面倒*4
 mochipon氏(セサミ3/4用のPythonライブラリ「pysesame3」をつくった人)が提供している「QR Code Reader for SESAME(下記)」を使うと結構簡単に情報が手に入ります(ま、sesame用に情報を取り出すためのツールですから当然ですが)。そのサイトにさきほど生成したQRコードを読ませると、下記のような情報がデコードされます。

  • Name:アプリで設定した鍵の名前
  • Produc:製品名。sesame5と出るはずですが、このQR Readerはセサミ3/4なのでセサミ5はUnkownに。
  • UUID:セサミ4では表示された気がしますが、見えませんね
  • Key Level:Manager=1とか
  • Key Index:(?)
  • Secret Key:これが欲しいやつ!ですね。どこかにメモっておきましょう。
  • Public Key:公開鍵。セサミ4などSesame OS2のデバイスでは必要になるらしい。

これをセサミの数だけ繰り返します。


 githubにソースありますし、ネットにつながっていなくても動作する(上の画面のデーコード結果の画面ではネット(WiFi)を切っています)のでセキュリティ的に少し安心かな。

3.3. ESPhome Configにロック(Lock)の設定

 ESPHomeのセサミ用デバイスのconfigにsesame:セクションを定義して、玄関ドアの取っ手部分上側のセサミ5(lock_upper)と玄関ドアの取っ手部分下側のセサミ5(lock_lower)の設定します。
 address:Bluetooth LE MACアドレスを、secret:にPSK(事前共有鍵)を設定します。

(前略)
sesame:
- id: sesame1
  model: sesame_5
  address: !secret sesame1_bluetooth
  secret: !secret sesame1_secret
  public_key: ""
  lock:
    name: lock_upper
    id: lock_upper
- id: sesame2
  model: sesame_5
  address: !secret sesame2_bluetooth
  secret: !secret sesame2_secret
  public_key: ""
  lock:
    name: lock_lower
    id: lock_lower

4. Home AssistantでESPHome for Sesameバイスを利用可能に

 最近のHome Assistantは優秀で、新しいデバイスを設定すると「設定」サイドバー→「デバイスとサービス」→「統合」の画面に、「設定しますか?」と表示されます。
 自力でデバイス追加したいときは、同じく「設定」サイドバー→「デバイスとサービス」→「統合」→「ESPHome」画面で、右下の「デバイスの追加」をクリックして、設定したESPHomeのIPアドレスを「ホスト」の欄に記入してあげれば追加できます。

(画面はSesame用ESPHomeデバイス追加済みですが…)

 これでlock.sesame_lock_upperlock.sesame_lock_lowerという2つのlockエンティティが生成されました。値はlockunlockunknownですね、たぶん。

こんな感じでUIからも使えるようになります。

5. おわりに

 WiFiモジュール2がいつまでたっても売り切れのまま入荷しないので、代わりにこのESPHomeデバイスを使う人もいるとか。たしかに反応も良く、結構便利に使えそうです。
 私は(リモートnanoは買ったが)リモートを買い損ねたので、Xiaomiの壁スイッチでも使って、自作リモートでも作って遊ぼうかな…。

P.S.
設置編書きませんでしたが、セサミ5とBluetooth接続しているのでなるべくセサミ5(玄関)に近い所にESP32デバイスを置きましょう。私は玄関にTapoカメラ用ACアダプタボックスを設置したのでそこの空きスペースに格納しました。ちょうど延長ケーブルにタップ一つ空いていましたし。

maky-ba.hatenablog.com

*1:正確にはDOITの互換機。より正確にはDOIT DevKitがEspressif 社製DevKitの互換機なので、互換機の互換機…

*2:と言いながらピン配列はまったく使いませんでしたね。まあ、情報の備忘録として。

*3:中華デバイスの場合「書いてある」が、本当の事が書いているかは、まあ、あまり信用置けませんが。ボードメーカですら仕入れ先に騙されたりする(確信犯的に騙されることもありそうですが)ので「闇」なのかもしれませんが。今回は正しくCP2102だった様子。

*4:pythonで数行のコードを書いてやってみましたが。ううむ、まあ、そこまでする必要は。車輪の再発明は不要!、ですね。