0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Matterに対応したApple Watchによる在席センサーを作ってみた。

0
Posted at

最初に

引っ越しを機にスマートホーム環境を整えたくなり、部屋の中の「どこにいるか」を検知できるセンサーを物色していました。

すると Aqara の FP2(ミリ波で位置/ゾーン検知できるやつ)を発見。製品ページ
他にSwitchbotからもミリ波の人感センサーPro がある。製品ページ

……しかし、赤外線を使わない人感センサーは、どれも、高い

そこで、腕に付けている Apple Watch という高級トラッカー?を使って、デスクにいるかどうかを判定する在席センサーを自作することにしました。

この記事でやること / やらないこと

やること

  • XIAO ESP32S3 Plus(ESP32-S3)で BLE をスキャン
  • Apple Watch が発する BLE の Nearbyを見て在席判定
  • Matter センサーとして Home アプリ(Homekit)に追加

やらないこと

  • 部屋の中の座標を検出
  • BLE の詳細の説明

一般的なMatterセンサーの作成手順(参考)

前提

今回の在席センサーは以下の方法では作成できませんでしたが、一般的なMatterセンサーを作る上で参考になるかと思い、残しています。急ぐ人はスキップでOK。

使用ボード

Seeed Studio XIAO ESP32S3 Plus → 販売ページ
(ESP32S3系のマイコン(M5stack)とかでも動くかも?)

XIAO ESP32S3 Plusの初期設定

Arduino IDEのインストール(省略)

XIAO ESP32S3 Plus用の設定

Seeed 公式に沿って進めれば良いが、以下の点だけ注意(後で使用するライブラリに合わせて修正)

  • 公式(Blinkの動作確認までで十分)

  • ボードマネジャーでesp32をインストールする際にバージョンを2.0.14をインストールする

ライブラリの動作確認

今回使用するライブラリは以下のもので、Arduino環境でもMatterで動作するようにしていただいているものです。

READMEに沿えばOK

  • Arduino の C++17 サポートを有効化 (複数箇所あり)
  • Arduino IDE にライブラリをダウンロードし、インポート
  • 大きなパーティション方式を選択(今回は、Maximum APP)
  • Erase Flash Before Sketch Uploadオプションを有効化

File > example > ESP32 Arduino Matter > Light を選択し、アップロードすると以下のように、シリアルモニターにMatter追加用のQRコードと手動設定用のペアリングコードが表示される。(アップロード前にシリアルモニターは開いておくように)

XIAO系のLEDはアクティブLOWなので、サンプルコードを、LED_PINをLED_BUILTINに変えることと、LEDの論理を反転させることを、気になる人は 修正していただきたい。

そのあとは、普通にQRコードのURLを開いて、読み取るとiPhoneのHomeアプリに追加できる。

認定されていないアクセサリと表示されるが、おっしゃる通りなので、このまま追加と使える。

この方法でできなかった理由

今回のセンサーは BLE をガッツリ使うため、Matter 側の BLE 利用と競合したり相性問題が出たりで、
ライブラリや設定の調整をするのがめんどくさかった。

本題

脱線しました。本題です。

今回作成したソースコード

以下のGitHubに置いてます。
使用する際は README を参考にしてください。
なお、利用は自己責任でお願いします。

仕組み

Apple Watch は定期的に、周囲の Apple デバイスに向けて Nearby(Apple Continuity 系)の BLE 広告を出しています。

この Nearby の中身は、以下の reverse engineering プロジェクトでかなり解析が進んでいます。

Github: continuity : An Apple Continuity Protocol Reverse Engineering Project

また、Home Assistant に統合している人もいました。

Github: ESPHome-Apple-Watch-detection

ただ、自分の運用では Apple の Home アプリを中心にしたかったので、

  • Matter 対応
  • (オプションで)IRK を使った端末特定

として実装してみました。

在席判定の考え方

「Apple Watch が近くにある」だけだと、

  • 机に置いてある
  • 充電している

みたいなケースも拾ってしまいます。

そこで、この実装では ロック状態(腕に付けている / 解除されている) をもとに

  • 腕に付いていて、かつロック解除の時のみ → 在席
  • ロックされている、またはApple Watchが検出されない → 離席

とする方針にしています。

判定に使う値:data_flags

Nearby の data_flags が状態によって変わるので、ここを判定基準にしました。

  • 0x98 → ロック解除済み(在席扱い)
  • 0x18 → 腕についている等のロック状態

data_flags の意味は iOS/watchOS のバージョンとかで変わるかもしれませんが、個人で使う分には多分困らないので採用しています。

オプションのIRKについて

Bluetooth の発信元を追跡する方法として、BLE 広告に含まれる送信元アドレスを使って端末を識別したいところですが、Apple Watch はプライバシー保護のために一定時間ごとに変化するアドレス(Resolvable Private Address)を使うため、単純なアドレス照合では追跡できません。

そこで、IRK(Identity Resolving Key)を用いることで、変化するアドレスが同じデバイスによるものかを特定することができ、安定して Apple Watch を特定することができます。

しかし、IRK による識別だけでは在席判定の反応がやや遅くなることがありました。
そのため、この実装では IRK を端末特定の補助として使いながら、Nearby 広告も併用して反応速度とのバランスを取っています。
なお、Nearby ベースだけでも、十分実用的でした。

HomeKitへの追加

HomeKitへの追加は一般的なMatterのセンサーと同様です。(上記参照)

動作検証

使用デバイス

  • Apple Watch SE3

結果

  • 近づいてから3~10 秒程度で検出可能
  • 離席もほぼタイムアウトの設定通り
  • 距離判定は、Apple Watch の場所(腕に見えてる、服の中、胴体で隠れる等)によって誤差が大きい
  • 費用は1500円程度

まとめ

  • ミリ波を使ったセンサーはまだまだ高い
  • Apple WatchのBLEで十分に在席の判定ができる
  • 離席の検知と距離の誤差は難しい

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?