Yamawine’s blog

ホームオートメーション奮闘記

階段ライトを自動で消す

この前のblog

yamawine.hatenablog.com

で階段ライトをHome Assistantで自動的につけることの顛末を書きました。つけたものは消さなくてはなりません。今回はそのお話。

 

最初に書いたHome Assistantのオートメーションは、階段に設置したモーションセンサーが動きを検知したら階段ライトをつけると同時にタイマーを起動し、例えば1分たったらライトを消す、という単純なものでした。これだと、階段で1分以上もたもたしているとライトが消えてしまいます。なので、モーションセンサーが動きを検知しなくなったらタイマーを起動し、タイマーが終了したらライトを消す、と改良しました。そうそう、階段が暗かったら、という条件も必要です。

 

本blogではコード(YAMLを含む)はできるだけ載せない方針なんですが、今回、この階段ライトを消すというオートメーションでハマったので、以下、そのオートメーションのYAMLです(srctohtmlを使いました)。分かりやすくするためにコメント("##"で始まる)を入れました。本筋でない部分は削除してありますので、これをそのままコピペして使わないようにしてください。

 

  1. trigger:  ## このオートメーションのトリガー
  2.   - platform: state
  3.     entity_id:
  4.       - sensor.staircase_motion_information  ## モーションセンサー
  5.     to: Active  ## 動きを検知した
  6.     id: Enter  ## "Enter" というトリガーIDをつける
  7.   - platform: state
  8.     entity_id:
  9.       - sensor.staircase_motion_information  ## モーションセンサー
  10.     to: None  ## 動きがなくなった
  11.     id: Leave  ## "Leave" というトリガーIDをつける
  12. condition:  ## このオートメーションの起動条件
  13.   - condition:
  14.     - type: is_no_light  ## 階段が暗い
  15.       condition: device
  16.       device_id: ??????????????  ## 照度センサーのデバイスID
  17.       entity_id: ??????????????  ## 照度センサーのエンティティID
  18.       domain: binary_sensor
  19.   - condition: state
  20.     entity_id: input_boolean.stair_light_manually_on  ## Zigbeeスイッチによる手動点灯でない
  21.     state: "off"
  22. action:  ## このオートメーションのアクション
  23.   - if:  ## もし "Enter" で起動されたら(動きを検出したら)
  24.       - condition: trigger
  25.         id:
  26.           - Enter
  27.     then:
  28.       - service: script.stair_lights_turn_on  ## 階段ライトをつける
  29.         data:
  30.           stair_brightness: 30  ## 明るさ30%
  31.       - service: timer.cancel  ## 念の為タイマーをキャンセルしておく
  32.         target:
  33.           entity_id: timer.stair_lights
  34.     else:  ## もし "Leave" で起動されたら(動きがなくなったら)
  35.       - service: timer.start  ## 30秒タイマーを起動
  36.         target:
  37.           entity_id: timer.stair_lights
  38.         data:
  39.           duration: "0:0:30"
  40.       - service: script.stair_lights_turn_on  ## 階段ライト暗くする
  41.         data:
  42.           stair_brightness: 3  ## 明るさ3%

 

このオートメーションですが、少々複雑かもしれません。まず、Zigbeeスイッチで階段ライトが点灯している時には、このオートメーションは動かないよう input_boolean.stair_light_manually_on というヘルパー変数が用意されています。次に、モーションセンサーが動きを検出しなくなったら、階段ライトを暗く(3%)します。タイマーの30秒が経ったら完全に消灯するという、これとは別のオートメーションがあります。

 

割と最近になってHome AssistantのオートメーションのトリガーにIDをつけることができるようなりました。これを使って、このオートメーションだけで、動きを検出した (Enter)/動きを検出しなくなった (Leave)、という二つの動作を実現しています。実はこれが諸悪の根源でした。このオートメーション、実は重大なバグがあって、この見つけるまで数日を要しました(と書くと偉そうですが、まあ良くある単純なミスです)。

 

実際のこのオートメーションはもう少し複雑で、時刻によって階段ライトの明るさを変えるようにしています。夜が遅くなるほど暗くしているわけです。このオートメーションを最初に書き終えたのは夜で、その時はちゃんと動きました。ですが、翌日の夕方になると、階段ライトがつきっぱなしで消えないという現象が起きたのです。しかたがないので、つきっぱなしの度に手動で消してを繰り返していると、夜遅くになるとちゃんと動くのが分かりました。なんで???

 

問題の箇所は、13行目から18行目にある階段の明るさのチェックの部分でした。夜の早い時間帯は階段ライトを明るく点灯していたため、照度センサーが「明るい」と判断してこのオートメーションが動作せず、ライトを消さなかったのです。つまり、ライトをつける時は暗かったのだけれども、ライトが付くと明るくなったというわけです。夜遅くなると、階段ライトは暗く点灯しますから、照度センサーも暗いと判断して、結果としてちゃんと動いていたということでした。

 

バグを治すまで家人からは「階段ライトつきっぱなしだよ?」と何度も言われる始末。こういう不具合(私のせいばかりではないのだけれど)はボディーブローのように積み重なって、最終的に「ホームオートメーションなんて要らない」なんて言い出しかねません。

 

今回の諸悪の根源(!)はオートメーションのトリガーIDでした。最初から二つのオートメーションで書いておけばそうはならなかったんではないか(私でなくHome Assistantのせい)。トリガーIDってそんなに便利?もっと言えばHome Assistantの記述方法とか「なんだかなぁー」と思うことがしばしばあります。この辺りについてはうまくまとめることができれば別途blogにしたいと思います。

  翻译: