Sympapaの日記

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

Home Assistant: Qrio lockのオートロックを一時停止し再施錠を忘れた場合に自動施錠してくれるオートメーション

f:id:sympapa:20210812104541p:plain
なんだかくどくて長いタイトルになりましたがこんにちは。
それにしてもHome Assistantって名前もロゴも直球でそのままを表してますよね。
おかげでGoogle検索するとGoogle HomeGoogle Assistantの記事がヒットしたりして検索の邪魔をしてくれます。

そんなワケで前回の記事のまとめを含めて、続きを。。。

■前回の記事のまとめもろもろ

<解決したい問題>

  • "Qrio lock"は普段オートロックを有効にして使っている。
  • 我が家には室内でタバコを吸ってはいけない法律があり玄関先でタバコっているが、その時にいちいちオートロックして欲しくない。
  • そんな時のためにQrio Lockにはロックのノブを素早く"開→閉→開"とやるとオートロックが一時的に停止する機能があり、それを使ってタバコを吸う。
  • しかし一時停止状態は次にマニュアルで施錠するまで延々と続く仕様である。
  • タバコを吸い終わって家に入る時に、普段はオートロックなので施錠するのを忘れる時がある。

<ハード的な制約とか仕様とか>

  • "Qrio lock"はAPIが公開されていない。
  • "Qrio lock"の施錠/解錠状態をAlexaの定型アクションのトリガーとして使えるので、施錠/解錠状態はHome Assistantにも伝えることが出来る。
  • 施錠はAlexa経由で行うことになるがHome AssistantからAlexaへトリガーを送る方法がHome Assistantに標準で用意されていない模様。しかし前回の記事で書いた方法で解決。
  • "Qrio lock"オートロックの有効/無効状態は取得できない。
  • "Qrio lock"にはドア開閉センサーが内臓されているがその状態は取得できない。
  • オートロックが有効の場合はドアが閉まると数秒後に施錠される。

■さてどうするか
自動化する上で使えるセンサーの類は3つです。
1. Alexaから取得できる施錠/解錠状態→Qrio Lockの状態のサーバーへの反映は結構タイムラグがある(施錠/解錠操作から数十秒変化しない場合がある)
2. 既に玄関(内側の)に設置してあるHueの人感センサー→一瞬でHome Assistantに反映される
3. 先日Aliepressで購入し届いたAqaraのドアセンサー→一瞬でHome Assistantに反映される

1.は"Qrio lock"の施錠/解錠をトリガーにHome Assistantのスクリプトを呼び出すことで、Home Assistant上のユーザー変数が"locked"/"unlocked"と変わるようにしました。
Home Assistantではユーザー変数が使えなさそうなので"home-assistant-variables"という変数が使えるようになるカスタムコンポーネントをインストールしましたが、今考えると施錠/解錠の2パターンだけのステータスなので単純に"input boolern"を使えば良かったのかもしれません。
施錠/解錠の状態はタイムラグが長いので、ドアが開いたのをトリガーにして「外に出た時は施錠しない」「中に入った時は施錠」するって感じにしますか...
外にも人感センサーがあれば確実に「外から中」or「中から外」どちらなのかを判別できるけど、人感センサーの在庫がないし他の人が玄関に居たら成立しなくなるので、あまりこだわらずにドアの開閉回数を基本に判定することにします。
そして、確実に施錠するために施錠する指示は施錠状態の変数が"locked"になるまで何回かは繰り返し送るようにします。
そんな事を考えながら以下のようなお^とメーションを組んでみました。

<メインのオートメーション>
トリガー:ドアを開ける

ロック状態の変数を"unlocked"にする

ドアが閉まるのを待つ

ドアが開いて かつ 玄関内側人感センサーが人感を検知する のを待つ

ドアが閉まるのを待つ

アレクサへ施錠してってトリガーを送る

10秒待つ

ロック状態の変数が"locked"になっているか確認→Yesならここで終了

Noならアレクサへ施錠してってトリガーを送る

10秒待つ

ロック状態の変数が"locked"になっているか確認→Yesならここで終了

Noならアレクサへ施錠してってトリガーを送る

以降10秒待って変数見てトリガー送るを7回繰り返し

モードはシングル(実行中にトリガーがあっても再起動しない)


<施錠されたらメインのオートメーションを止めるオートメーション>
施錠されてもメインのオートメーションが走り続けると施錠の指示を10回までは送り続けるので、ロック状態の変数がlockedになったらメインのオートメーションを停止するオートメーションを作成

スクリプト
・ロック状態の変数をlockedにするスクリプトを作成
・ロック状態の変数をunlockedにするスクリプトを作成

<alexa側の定型アクション>
・"Qrio lock"が"ロック済み"になったら変数をlockedにするスクリプトを呼び出す
・"Qrio lock"が"ロック解除済み"になったら変数をunlockedにするスクリプトを呼び出す


これでオートロックを一時停止状態にしてから(してなくても発動しますが)ドアを開けて外に出てドアを閉め、次にドアを開けてドアが閉まると施錠するようになりました。
つまるところ、オートロックの一時停止はもともと次にマニュアルで施錠するまで続く仕様だったのが、1回外に出てタバコを吸い中へ入れば自動的に施錠されるという挙動に変わりました。
オートロックが有効の場合もこのオートメーションが発動してしまいますが"Qrio lock"の中で施錠が完結するので、このオートメーションがオートロックの邪魔をすることはありません。

<問題点>

  • タバコを吸っている間に他の人がやって来てドアを開けて閉めると施錠される(内側から来ても外側から来ても)
  • 家族が玄関から外に出た数秒後に自分がオートロックを一時停止しタバコを吸いに出ると、施錠/解錠状態の取得にタイムラグがあるため施錠される時がある

外にも人感センサーを取り付ければ「外から中」or「中から外」どちらなのかを判別できますが、それやっても外から家族が帰って来た場合は解決できませんね。
まぁオートロックを一時停止したのを忘れて解錠しっぱなしになるのは避けられるので良しとしましょう。