Sympapaの日記

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

スマートホーム: トイレの照明自動化その2(これで完璧!?)

こんにちはSympapaです。

ちょっと前の記事でトイレの照明ON/OFFの自動化について書きました。
スーパーなどのトイレでウンチくんをしている時に頭を振っていないと照明が消えてしまうアレを防止するために、人感センサーとドアセンサーを組み合わせてトイレの照明ON/OFFを自動化したというお話でした。
しかしその後、想定していなかったイレギュラーに対応できていないことに気づいてしまいます。
今回は前回作成したトイレの照明ON/OFFのオートメーションを改善していきます。
前回の振り返りも書こうと思いましたが長くなりそうなので興味があれば前回の記事もみてやってください。
sympapa.hatenablog.com

基本仕様

以下のような仕様でオートメーションを作成していきます。
1.ウンチくんをしている時にじっとしていても消灯しない
2.人感センサー1個とドアセンサー1個を使ってトイレの照明ON/OFFを自動化する
3.トイレの外からドアを開けたら照明をONにする
4.トイレに「人が入っている」時にドアが開いたら照明をOFFにする
5.トイレの外からドアを開けたがそのままトイレに入らずドアを閉じた時は照明をOFFにする(イレギュラー対応)
6.トイレの外からドアを開けトイレの中に入ったがドアを閉めずそのまま出てドアを閉じた時も照明をOFFにする(前回想定していなかったイレギュラー対応)
7.用を足し終わりドアを開けたが「やっぱもうちょっとしたい」となり再びドアを閉めてトイレ内に留まった場合も照明をONにする(前回想定していなかったイレギュラー対応)
使用するセンサーは以下のとおりです。

  • ドアセンサー: Aqara Door and Window Sensor (MCCGQ11LM)
  • 人感センサー: Aqara Motion Sensor (RTCGQ11LM)の人感更新を5秒間隔に改造し人感検出後3秒で人感無しになるよう設定したもの(ずっと人感を検出している場合でも5秒間隔で人感検出→人感無しを繰り返す)


シーケンスを考える

そんなワケで以下のようなシーケンスを考えました。3つのシーケンスは並行して実行します。

[シーケンス1]トイレの外からドアを開けたら照明を点ける
トリガー: ドアを開く
条件: トイレ前の廊下の人感センサーが人感を検出している(トイレの外から中へ入るのを識別するため)
アクション:
1)照明をONにする
2)ドアが閉まって10秒後にトイレに入っているかの変数:toilet_occupiedがoffだったら照明をOFFにする(ドアを開けたけどトイレに入らなかった場合の対処)

[シーケンス2]トイレの中に人がいる判定の時にドア開けたら照明を消す
トリガー:ドアを開ける
条件: 変数:toilet_occupiedが"on"である
アクション:
1)[オートメーション1]を無効にする(そうしないとトイレの外へ出た時にシーケンス1が発動する場合がある)
2)照明をOFFにする
3)ドアが閉まったら[オートメーション1]を有効にする
4)変数:toilet_occupiedを"off"にする

[シーケンス3]トイレの中に人がいる判定
トリガー: 人感が検出される
条件: ドアが閉まっている
アクション:
1)トイレに入っているかの変数:toilet_occupiedを"on"にする
2)照明がOFFの場合は照明をONにする(用を足した後ドアを開けて照明が消えたがやっぱりトイレ内に留まりそのままドアを閉めた場合の対処)

このシーケンスをHome Assistantのオートメーションで組んでみましたが問題発生。
使っている人感センサーはセンサーの前にずっと人がいても5秒間隔で人感検出のトリガーを引いてくれるはずなのですが、[シーケンス3]でドアが閉まる前に人感が検出されているとドアを閉めた後に人感が検出されにくい(人がいない状態からは人感センサーの反応は良いが人が居る状態では激しく動かないと検出しない)のでなかなか[人感が検出される→ドアが閉まっている]という条件を満たさず[シーケンス3]のアクションが発動しない時があります。
[シーケンス3]が発動しないと[シーケンス1]でドアを閉めて10秒経過したら消灯してしまいます。

そこで人感センサーの位置を変更し、ドアを閉めて便座のところへ到達するまでは人感が検出されないようにしました。
こうすることで人感更新間隔が長い人感センサーでもこのシーケンスが使えるはずです。

f:id:sympapa:20210911102919p:plain
変更前: ドアを閉める前に人感検出される
f:id:sympapa:20210911102930p:plain
変更後: 便座に近づくまで人感検出しない


出来上がったオートメーション

実際のHome Assistantのオートメーションは以下のようになりました。
オートメーション1ではドアを開けてやっぱりトイレに入らずにドアを閉めた時にはすぐに照明を消したかったところですが、オートメーション3でトイレに入ったかを判定するのにある程度の時間を設けた方が良いのでドアを閉めて10秒後にトイレに入っていなければ消灯するようにしました。

alias: オートメーション1(トイレの照明をON)
description: ''
trigger:
  - platform: state
    entity_id: binary_sensor.door_sensor_1_on_off(ドアセンサー)
    from: 'off'
    to: 'on'
condition:
  - type: is_occupied
    condition: device
    device_id: zzzzz(廊下の人感センサー)
    entity_id: binary_sensor.motion_sensor_2_occupancy
    domain: binary_sensor
action:
  - service: script.トイレの照明を点けるスクリプト
  - wait_for_trigger:
      - type: not_opened
        platform: device
        device_id: xxxxx(ドアセンサー)
        entity_id: binary_sensor.door_sensor_on_off
        domain: binary_sensor
  - delay:
      hours: 0
      minutes: 0
      seconds: 10
      milliseconds: 0
  - condition: state
    entity_id: var.toilet_occupied(トイレに入ってるかの変数)
    state: 'off'
  - service: light.turn_off
    target:
      device_id: bbbbb(トイレの照明)
    data:
      transition: 2
mode: restart
alias: オートメーション2(トイレから出たら照明をOFF)
description: ''
trigger:
  - platform: state
    entity_id: binary_sensor.door_sensor_on_off(ドアセンサー)
    from: 'off'
    to: 'on'
condition:
  - condition: state
    entity_id: var.toilet_occupied(トイレに入っているかの変数)
    state: 'on'
action:
  - service: automation.turn_off
    target:
      entity_id: automation.オートメーション1
  - service: light.turn_off
    target:
      device_id: bbbbb(トイレの照明)
    data:
      transition: 2
  - wait_for_trigger:
      - type: not_opened
        platform: device
        device_id: xxxxx(ドアセンサー)
        entity_id: binary_sensor.door_sensor_on_off
        domain: binary_sensor
    timeout: '15'
  - service: automation.turn_on
    target:
      entity_id: automation.オートメーション1
  - service: var.set(変数セット)
    data:
      entity_id: var.toilet_occupied(トイレに入っているかの変数)
      value: 'off'
      icon: mdi:human-handsdown
mode: single
alias: オートメーション3(トイレに入ったら変数をonにする)
description: ''
trigger:
  - type: motion
    platform: device
    device_id: yyyyy(トイレの人感センサー)
    entity_id: binary_sensor.motion_sensor_ias_zone
    domain: binary_sensor
    for:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 0
condition:
  - type: is_not_open
    condition: device
    device_id: xxxxx(ドアセンサー)
    entity_id: binary_sensor.door_sensor_on_off
    domain: binary_sensor
action:
  - service: var.set(変数のセット)
    data:
      entity_id: var.toilet_occupied
      value: 'on'
      icon: mdi:human-handsup
  - condition: state
    entity_id: light.hue_bulb_1_on_off
    state: 'off'
  - service: script.照明を点けるスクリプト
mode: single

1週間くらいこのオートメーションを使ってますが我ながら完璧すぎるオートメーションが出来たと思います(^^;
では。