この前のblog
で階段ライトをHome Assistantで自動的につけることの顛末を書きました。つけたものは消さなくてはなりません。今回はそのお話。
最初に書いたHome Assistantのオートメーションは、階段に設置したモーションセンサーが動きを検知したら階段ライトをつけると同時にタイマーを起動し、例えば1分たったらライトを消す、という単純なものでした。これだと、階段で1分以上もたもたしているとライトが消えてしまいます。なので、モーションセンサーが動きを検知しなくなったらタイマーを起動し、タイマーが終了したらライトを消す、と改良しました。そうそう、階段が暗かったら、という条件も必要です。
本blogではコード(YAMLを含む)はできるだけ載せない方針なんですが、今回、この階段ライトを消すというオートメーションでハマったので、以下、そのオートメーションのYAMLです(srctohtmlを使いました)。分かりやすくするためにコメント("##"で始まる)を入れました。本筋でない部分は削除してありますので、これをそのままコピペして使わないようにしてください。
- trigger: ## このオートメーションのトリガー
- - platform: state
- entity_id:
- - sensor.staircase_motion_information ## モーションセンサー
- to: Active ## 動きを検知した
- id: Enter ## "Enter" というトリガーIDをつける
- - platform: state
- entity_id:
- - sensor.staircase_motion_information ## モーションセンサー
- to: None ## 動きがなくなった
- id: Leave ## "Leave" というトリガーIDをつける
- condition: ## このオートメーションの起動条件
- - condition:
- - type: is_no_light ## 階段が暗い
- condition: device
- device_id: ?????????????? ## 照度センサーのデバイスID
- entity_id: ?????????????? ## 照度センサーのエンティティID
- domain: binary_sensor
- - condition: state
- entity_id: input_boolean.stair_light_manually_on ## Zigbeeスイッチによる手動点灯でない
- state: "off"
- action: ## このオートメーションのアクション
- - if: ## もし "Enter" で起動されたら(動きを検出したら)
- - condition: trigger
- id:
- - Enter
- then:
- - service: script.stair_lights_turn_on ## 階段ライトをつける
- data:
- stair_brightness: 30 ## 明るさ30%
- - service: timer.cancel ## 念の為タイマーをキャンセルしておく
- target:
- entity_id: timer.stair_lights
- else: ## もし "Leave" で起動されたら(動きがなくなったら)
- - service: timer.start ## 30秒タイマーを起動
- target:
- entity_id: timer.stair_lights
- data:
- duration: "0:0:30"
- - service: script.stair_lights_turn_on ## 階段ライト暗くする
- data:
- 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にしたいと思います。