Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

SwitchBot人感センサーでPCモニターを自動ON/OFFしようとしてハマった話

はじめに

昨年のブラックフライデーで買ったSwitchBot人感センサーを、ようやく少しまともに使おうと思いました。

人がいるときはPCモニターをON、席を離れたらOFF。文字にすると簡単で、いかにも「AIにちょっとスクリプトを書いてもらえば終わりそう」な雰囲気。まぁチャッピーでも終わらなかったわけだが。

そんなわけで備忘録です。

何を作ったか

Windows PCのモニターを、SwitchBot人感センサーまわりの情報を見ながら自動でON/OFFする仕組みです。

Pythonの監視スクリプトを動かして、必要に応じてPowerShell側の補助処理を呼びます。常駐はタスクスケジューラです。こう書くと簡単そうですが、かなり試行錯誤するはめに。

最初に考えたこと

最初は素直にSwitchBot APIを使えばよいと思っていました。

公式APIなら分かりやすいし、状態も取れるし、なんとなく正道っぽい。しかし、API方式は呼び出し回数の制限が気になります。短い間隔でポーリングしようとすると自分の使い方では8時間程度が限度でした。

ということで、できるだけローカル側で完結する構成へ寄せました。

ハマったところ

そこで考えたのが、SwitchBot人感センサーが近くに発している「無線の信号」を見る方法です。

SwitchBot人感センサーは「BLE(Bluetooth Low Energy)」という規格で情報を発信しています。この信号をPCで直接受信して在席判定を試みましたが、一筋縄ではいかなかった。

信号に含まれるRSSI(電波強度)値だけでは、「センサー自体が近くにあること」しか分からず、在席判定には不十分。

そこで、信号に含まれるメーカー独自データ(manufacturer_data)に着目。ここにセンサー内部の状態らしき、在席判定に使えそうな情報が含まれているようです。

これらのデータを、「人がいるとき」「いないとき」「動いたとき」のパターンで記録・解析し、在席状態と連動する値を特定することで、判定の精度を高めました。ほんと時間かかった。

成果物

試行錯誤の末に作成したスクリプトをGitHubで公開しています。

switchbot-monitor-automation

おわりに

「人がいるかどうかの判定」という単純な処理でも、実際にやってみると奥が深いものです。現時点で3か月ほど運用していますが、なんとか実用的な範囲で安定して動作しています。

将来の自分用メモですが、もし manufacturer_data の構造に詳しい方がいれば、ぜひ知見を共有していただけると嬉しいです。