Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: 109分ごとに発生する人感センサーのゴースト検出に悩む

Sympapaです。

玄関や玄関ホール、廊下の照明を自動化している人は多いと思いますが、トイレの照明の自動化については否定派の人も多いんじゃないかと思います。
理由は「大きい方をしている時に動いていないと照明が消えてしまう」ためですね。消えてしまったら頭を振って照明を再度付ける経験をスーパーなどのトイレで経験されたことがある方も多いのではないでしょうか?
我が家では、この問題を解消するためにドア開閉センサーと人感センサー2つを組み合わせ、ちょっとややこしいロジックで「トイレに入っている」ことを判定して照明を自動化しています。

。。。なのですが、1週間ほど前に奥様から「最近トイレの照明が勝手に点いていることがある。1階のトイレも2階のトイレも。」と苦情を受けました。10日間ほど出張で家を空けていて帰って来た直後のハナシです。
Home Assistantの履歴をみた結果、どうやら人感センサーがゴースト検出(実際には人がいないのに人感を誤検出)していて、それが原因となっているようです。
そんなワケで原因究明と対策を試みます。

■我が家のトイレの照明自動化

本題に入る前に、我が家のトイレの照明自動化のロジックについて書いておこうと思います。
1階のトイレと2階のトイレそれぞれに、人感センサー2個[Aqara motion sensorをステータス更新間隔5秒に改造し人感検出後のリセットは3秒に設定したもの]とドア開閉センサー1個を設置し、これらのセンサーの組み合わせで「トイレに入ったこと」を判定してその判定を変数に入れ、照明の自動化に利用しています。
前述したとおり人感センサーの人感だけに頼って照明をON/OFFすると「大の方をしている時に動いていないと照明が消えてしまう問題」が起きるので、ちょっとややこしいことをしています。


まず、ドアを開けるか人感を検出した時に変数が「退室中」であれば照明をONにします。


次に、人感を検出した時にドアが閉まっていれば変数を「入室中」に変更します。設置しているAqara motion sensorはステータス更新間隔を5秒に改造し人感検出後のリセットは3秒に設定してあるので、仮にセンサーの前で動き続けたとすると、人感のステータスは3秒間検出→2秒間未検出→3秒間検出→2秒間未検出・・・と繰り返します。なので、トイレのドアを閉める前に一旦人感を検出していても、ドアを閉めてから5秒~10秒くらいの間動きがあれば再度人感を検出して入室判定してくれます。


そして、変数が「入室中」の時にドアを開けた場合は照明をOFFにし、その後ドアを閉めたら変数を「退室中」に変更します。


イレギュラーな動きに対応するため、人感センサーが10分間人感を検出しなかった場合は変数を「退室中」にして照明をOFFにする処理もいれています。一応、この処理によってゴースト検出が発生して照明がONになってしまっても10分後にはOFFになります。
他にも、トイレから出た後にドアを閉めなかったとか、トイレから出ようと一旦ドアを開けたけどやっぱり戻ったみたいなイレギュラーに対応する処理も組んでいますが、まぁ大体こんな感じです。


Aqara motion sensorのステータス更新間隔を5秒に改造する方法はコチラの記事に書いています。
sympapa.hatenablog.com

■一定間隔でゴースト検出してる!?

まずHome Assistantの履歴を見てみると、1階のトイレに設置している2つの人感センサーの内の1つが人がいないのに人感を検出している、いわゆるゴースト検出していることがわかりました。もうひとつの人感センサーには近いタイミングでの人感検出はされていないのに問題の人感センサーでは人感が検出されているんです。
そして、ゴースト検出は起きない時間帯もありますが(おそらく実際の人感を検出した後しばらくはゴースト検出が起きない)、起きる場合は不思議なことに決まって約109分間隔で起きています。なんだこりゃ。
2階のトイレについても同じく2つの人感センサーの内の1つが、人がいないのに約109分間隔でゴースト検出している時があることがわかりました。
1階と2階のトイレでゴースト検出発生のタイミングは異なっています。


いずれにしても、この謎の109分間隔ゴースト検出によって「入室中」判定となり照明もONになってしまうようです。う~む。


1階と2階のトイレでゴースト検出のタイミングが異なるので、電波干渉的なものではなさそうかな?
一定間隔で何かしそうなものとしてはLANのルーター(素人の勝手なイメージ(笑))があるのでルーターのログと照らし合わせてみましたが、ゴースト検出のタイミングでイベントの発生はなさそうでした。
そしてHome Assistantのログとかログブックを確認してみましたが、同じタイミングで起きているイベントもなさそうです。

同じAqara motion sensorは他にもいくつか使用しているのですが、廊下や階段などではパッと見、109分間隔のゴースト検出がなさそうでした。
でも、階段や廊下はそもそも夜中でも結構頻繁に家族の往来があるようで実際の人感を検出しているみたいなので、発生しているのかがわかりにくいだけかもしれません。


原因わからず。さほど探ってもいないけど(笑)

■対処療法

本来であればそもそものゴースト検出の方の対策をしたいところですが、家族の不満の解消が最優先です。家族の不満はスマートホーム生活の死活問題にもつながりかねません(笑)
そんなワケで「トイレに入った判定」を見直すことにしました。


修正前のロジックでは、2つの人感センサーの「どちらか」が人感を検出した時にドアが閉まっていれば「入室した」と判定するようにしていました。


修正後は人感センサーAが検出した時にドアが閉まっていてかつ人感センサーBが人感を検出していれば入室したと判定するようにしました。つまり2つの人感センサーの両方が検出されないと変数が「入室中」に変わらないようにしました。
但し、人感検出のリセットが3秒のままだと人感を検出してもすぐに未検出に変わってしまうので、センサーAが人感検出した時にセンサーBが一旦人感を検出していてもリセットされて「未検出」となっているタイミングと重なる可能性も高く、うまく入室判定されない可能性があります。
そこで人感センサーの取り付け位置を見直し、人感センサーBはドアを開けてすぐに人感が検出される位置に取り付けて人感検出後のリセットを60秒に設定し、人感センサーAは確実にトイレへ入ってから人感が検出される位置に取り付けて人感検出のリセットは元のまま3秒に設定しました。
こうすれば人感センサーBが先に検出され60秒間は「人感あり」のステータスを保持するので、人感センサーBで人感が検出されてそこからドアを閉めて人感センサーAが検出された時に人感センサーBのステータスはほぼ確実に「人感あり」となっているはずで、人感センサーが2つとも検出されていれば入室したと判定するというロジックがほぼ確実に成立するはずです。

■解決(後日追記)

問題の人感センサー、電池を一旦抜いたりZigbee2mqttと再ペアリングしたりしてもゴースト検出は解決しませんでした。
電池残量については90%となっていたので電池残量は疑っていなかったのですが、しかし試し電池を新品に交換してみたところ、ゴースト検出しなくなりました。
この人感センサーには照度センサーも内臓していて人感検出が無い時には54~55分くらいの間隔(すなわち109分の半分の間隔)で照度をレポートするのですが、人感のゴースト検出は照度のレポートと同じタイミングで起きていたことがわかりました。寒波が来ていたのでトイレ内の室温が低く、照度のレポート時に電池の電圧降下が起きてゴースト検出を誘発していたのかもしれません。まぁそうなると電池残量のレポートがアテにならん気がしますが(汗

■まとめ

そんなワケで人感センサーの謎の109分間隔ゴースト検出は後日無事に解決しました。
教訓: ボタン電池はパナを使え
それでは。