【深淵】SwitchBot開閉センサーの​入室・​退室で​Alexaの​定型アクションを​動かしたい

記事サムネイル
INDEX / 目次

前提

家の扉を開けたら、Alexaが「おかえり」と言ってくれる。
私はそんな平和でささやかな日常を送りたいんです。

一方、ただの開閉センサーでは入室したのか、退出したのかまでは区別がつきません。

そこに現れたのがSwitchBot開閉センサー。
「入室」「退出」の検知ができるんです。
その秘密は開閉センサーだけじゃなくて、手前に人感センサーがついてるんですよね。

これをよしなに使ってくれて、「入室」「退出」が検知できます。

SwitchBotアプリのオートメーションの条件設定画面

最高です。
でも特大の罠があります。「入室」「退出」がトリガーに使えるのはSwitchBotアプリ内だけなんですよ。

Alexaで定型アクションのトリガーにしようとすると、

特大粛清されて「閉じている」か「開いている」かしか分からなくなります...
これでは入室・退室を検知できず、開いたこと、閉じたことしか分かりません。

SwitchBotの設備しかない家の場合、SwichBotアプリで頑張って完結すれば問題ありませんが、SwitchBot以外が共存する我が家では問題大有りです。

なんとかしてでも実現する方法

課題を分解すると、

  • AlexaではSwitchBot開閉センサーの値を取れない
  • SwitchBotではSwitchBot外の機器を操作できない

この両者を解決するにはSwitchBot↔️何か↔️Alexaと二人を取り持つ仲介役が必要です。

数年前ならIFTTTのAlexa対応があったことで比較的短いルートで実現できていましたが、IFTTTのAlexa対応が消失した今「超頑張るルート」しか残されていません。

NHKの某ミーム状態

そんなSwitchBot↔️何か↔️Alexa の最強の仲介者はHome Assistant(詳細後述)です。

ただ条件がありまして...

  • 常時起動している自宅サーバー
  • Matterに対応したSwitchBot製ハブ(SwitchBot ハブ2など)
  • Dockerの知識

の3つが必要になります。

一体これのどこがスマートなのでしょうか

概要

実現方法の概要としてはこんな感じです。

  1. SwitchBot 開閉センサーが反応
  2. 1の情報がBluetooth経由でMatter対応ハブに送られる
  3. 2の情報がMatter対応ハブ経由でMatterプロキシサーバーに送られる
  4. 3の情報がHome Assistantに送られる
  5. 4の情報を元にHome Assistantで条件分岐が走る
  6. 5の情報を元にAlexaの定型アクションが実行される

あまりにも遠い。
こんなブルシットジョブが世の中に蔓延るから地球温暖化も進んでしまいます。

シーケンス図にするとこんな感じです。

しかし要素としてはシンプルで

  1. Home Assistantで複数センサーの条件を元に分岐
  2. 1のための情報と結果を伝播する色々

です。

条件分岐の要「Home Assistant」

Home Assistantはオープンソースのスマートホーム管理システムです。
わざわざ専用OSSを使ってスマートホームするような人が使う、いわば逸般向けというのもあり、実行条件を条件分岐で細かく設定できます。

オートメーション設定例。yamlで設定できます。

「SwitchBot開閉センサー」からは

  • 開閉センサーの状態
  • 人感センサーの状態

のどちらもそれぞれ独立して取得できます。
SwitchBotがテンプレで用意している「入室を検知」みたいなものは内部的にこれを条件分岐しているみたいですが、それをHome Assistantを使って自前で頑張る形です。

帰宅検知

帰宅とは外から内に来ることです(当たり前)。
でもそれが至極重要で、この性質のおかげで帰宅検知は簡単です。
人感センサーはSwitchBot開閉センサー(つまり家の中)側についているので、

外(家の中にいない=人感センサーなし)の状態で、開閉センサーが開く

この状態が帰宅と定義できます。
実際には人感センサーは玄関のドア付近にいるだけで反応してトリガーされまくるので、開閉センサーを開始のトリガーにします。

外出検知

外出、鬼門です。どのくらい難しいかというと、真冬に布団から出る時くらい難しいです。
帰宅と逆で「人感センサー反応あり」の状態で「開閉センサーが開く」が外出だと言えそうですが、ここには絶大な罠が潜んでいます。
外出には「荷物の受け取り」という特大フェイントが潜んでいます。
上記単純な条件で作ると、ドアを開けて段ボールを持って帰っただけで家中の照明やエアコンが消えてしまい、人を不快にするスマートホームになってしまいます。

フェイント外出を回避するために条件を足します。

「人感センサー反応あり」の状態で「開閉センサーが開く」

に加えて、

  • 開閉センサー開閉後も人感センサー反応がある→まだ家にいるのでフェイント
  • 開閉センサー開閉後も人感センサー反応がない→外に出ている

さらにここに、「ちょっと郵便受けを見に行くだけ」のケースも対応できるように検出時間にバッファを持たせます。
その上で、帰宅検知との誤検知を防ぐフラグも仕込んで...

その結果がこちら

今回も例によって、トリガーは開閉センサです。(人感は部屋にいて反応しまくるため)

即時伝達の要「Matter」

ところで、 この条件で実現できることに気づいた私はうきうきでHome Assistantに繋ぎました。

...

......

.........


............でも、いつまで経っても来ないんですよね。
センサーの値が。


Home AssistantはSwitchBotを公式API経由で接続できますが、センサーデータは調子が悪いらしく、センサーの値が気まぐれで届くんですよね...
(家にある人感センサーProはすぐ届くのに、開閉センサーだけ永遠に届かなかったり)

そんな問題を解決するのがMatterです。
スマートホーム界隈では繋がらないことでお馴染みMatterです。

Matterと言うのはスマートホームの標準規格で、家の中のネットワークで通信を完結させることで世界が滅んでも使える仕様になっています。

「SwitchBotAPIが調子悪いならMatterを使えばいいじゃない」と言うことです
Matter経由で直接家にいるSwitchBotデバイスの値をもらうことで、センサーデータ遅延問題を解決します。

SwitchBot開閉センサーはMatter非対応ですが、SwitchBotハブミニやハブ2などMatter対応デバイス経由で「サブデバイス」に設定するとMatter操作が可能になります。

SwitchBotアプリでの設定画面

​SwitchBot開閉センサーを「サブデバイス」にしたMatter対応SwitchBotハブをMatterサーバーに繋いで、MatterサーバーとHome Assistantを繋げば、完成です。
(MatterサーバーはHome Assisntant同様にOSSがあります。docker composeで同居させるだけです。)

Home Assistantで見れる様子

このほかHome AssistantとAlexaの連携でもかなり闇がありますが、長すぎるので端折ります。

総括

これである程度は動くようになりました。

たまにうまく動かないので、ちゃんと電気を切ってから家を出ますが...(これじゃ意味なさすぎないか????)

みんなの反応を探し中...