Sympapaです。
新居の玄関ドアには工務店の標準仕様であるYKK APのヴェナートD30を採用しました。
電気錠はリモコンを持っていれば帰宅時にドアノブに付いたボタンを押すだけで解錠できるリモコンキー仕様です。
Home Assistantと連携したいので100V仕様にしてJEM-A端子が付いている操作盤YS KAG-B3を導入しました。
しかしYKK APの電気錠は、玄関ドアの屋内側には解施錠ボタンが無く、オートロック機能も帰宅時に機能するものは付いていますが外出時に機能するものは付いていません。
私は何故か実物を見るまで、屋内側にも解施錠ボタンがあってオートロック機能も当然あるものだと思い込んでいたのです。痛恨のミスでした。
そんなワケで、YKK AP玄関ドアをJEM-A端子 - ESP32 - ESP HOME - Home Assistantと繋いでHome Assistantから電気錠を操作できるようにし、更にドアの屋内側に解錠ボタンを追加してオートロック機能を実現しちゃおうってのがこのシリーズになります。
前回はHome Assistantと接続するところまでを書きました。
sympapa.hatenablog.com
今回は、ドアの屋内側に解錠ボタンを取り付け、オートロック制御のオートメーションを組むところまでを書いていきます。
■玄関ドアの屋内側に取り付けるボタンを選ぶ
この計画で最も悩んだのが玄関ドアの屋内側に取り付けるボタン選びです。
手っ取り早いのはZigbbe接続のリモートボタンなのですが小さいものを探しても40mm×40mmくらいあります。ドアノブに取り付けるには大きすぎます。ドアノブに手をかけてボタンを押してそのままドアノブを押してドアを開けるってのがスマートだと思うんですよね。
それに後付け感もなるべく出したくないので結構悩みました。
そんなワケでマルツで物色していたところ、薄型で14mm×14mmというサイズでクリック感も悪くないタクトスイッチを見つけました。これならドアノブ上にくっつけられそうです。
www.nkkswitches.co.jp
Zigbee接続のドア開閉センサーのリードスイッチを取り外して代わりにこのタクトスイッチを接続し、Zigbeeで接続できるようにしてやりました。
リードスイッチは磁力でオンオフする単純なスイッチなので、リードスイッチ式のドア開閉センサーのリードスイッチを取り外して代わりに好きなスイッチを接続すれば無線式リモートスイッチが簡単に作れます。ドア開閉センサーは小さいものがほとんどなのでコンパクトに作れるし、工夫次第で色々な使い道があるDIYスマートホーム化の強い味方です。
このドア開閉センサーの改造についてはこちらの記事で書いています。
sympapa.hatenablog.com
ドア開閉センサーの本体はドアノブの裏側にくっつけて目立たないようにします。黒の塗装をしてやろうと思いましたが、とりあえず黒のビニルテープを貼ってごまかしました(笑)
というわけで取り付けた感じ、いつも見る角度から見ればさほど後付け感も無くクリック感も良いので及第点ですが、覗き込んだら落第です(笑)
できれば3Dプリンターで何か作ってうまいことしたいですね。3Dプリンター欲しい。。。
■オートロックのオートメーションを組む
まずは構想です。
我が家の玄関ドアの電気錠の仕様として、JEM-A端子を使って解錠した場合、ドアを一定時間(設定により25秒 or 50秒)開けなければ自動的に再施錠されますが、ドアを開けるとその後自動施錠はされません。
従って、このボタンで解錠した後は、ドアを開けて閉めた後に施錠するオートメーションを組まなくてはいけません。
誤動作やバグを減らすために、このボタンは「解錠専用」とすることに決めました。
このボタンを押すと、解錠する→ドアが開くのを待つ→ドアが閉まるのを待つ→施錠する というオートメーションを組むことにします。
そして、操作盤にはロックだけではなくドアの開閉状態も表示されるのですが、ドアの開閉状態を出力する端子などはありません。ドアが開くと操作盤のLEDが光るので、操作盤を改造してLEDの電流を拾えばドアの開閉状態をESP32を使って取得できそうな気がしますが、ハンダ付けしてしまうと保証がきかなくなりそうだしハンダづけが苦手なので(笑)、ドアにドア開閉センサーを取り付けてドア開閉状態を取得することにしました。
そうすると、ドア開閉センサーの通信エラーなどで状態を正しく取得できなかった場合のフェールセーフも考えなくてはいけません。
ここはボタンを押して解錠後5分間「解錠」状態の場合は、2分毎に施錠されるまで施錠の操作を繰り返すことで対応することにしました。
まぁ途中でエラーなどによりHome Assistantが停止してしまったらどうしようもありませんが。。。
実際に組んだオートメーションは下記のモノです。
オートロックのシーケンスが作動中であることのフラグとして、"input_boolean.auto_lock_running"を先に作成しておきました。
alias: Entrance_door_button_pushed description: "" trigger: - type: not_opened platform: device device_id: ボタンのドア開閉センサー entity_id: ボタンのドア開閉センサーの開閉 domain: binary_sensor condition: - condition: state entity_id: binary_sensor.entrance_lock_status state: "on" enabled: true action: - service: switch.turn_on data: {} target: entity_id: switch.entrance_lock_toggle - service: input_boolean.turn_on target: entity_id: input_boolean.auto_lock_running data: {} - wait_for_trigger: - type: opened platform: device device_id: ドアのドア開閉センサー entity_id: ドアのドア開閉センサーの開閉 domain: binary_sensor for: hours: 0 minutes: 0 seconds: 1 timeout: hours: 0 minutes: 0 seconds: 55 milliseconds: 0 - wait_for_trigger: - type: not_opened platform: device device_id: ドアのドア開閉センサー entity_id: ドアのドア開閉センサーの開閉 domain: binary_sensor for: hours: 0 minutes: 0 seconds: 1 timeout: hours: 0 minutes: 5 seconds: 0 milliseconds: 0 - repeat: sequence: - if: - type: is_off condition: device device_id: 対象のESP32 entity_id: ロックの状態 domain: binary_sensor for: hours: 0 minutes: 0 seconds: 1 then: - type: turn_on device_id: 対象のESP32 entity_id: ロックの開閉 domain: switch - delay: hours: 0 minutes: 0 seconds: 5 milliseconds: 0 - if: - type: is_on condition: device device_id: 対象のESP32 entity_id: ロックの状態 domain: binary_sensor for: hours: 0 minutes: 0 seconds: 1 then: - service: input_boolean.turn_off metadata: {} data: {} target: entity_id: input_boolean.auto_lock_running_boolean - stop: "" error: false - delay: hours: 0 minutes: 2 seconds: 0 milliseconds: 0 until: - type: is_on condition: device device_id: 対象のESP32 entity_id: ロックの状態 domain: binary_sensor for: hours: 0 minutes: 0 seconds: 1 mode: single
そしてこのオートメーションが走っている時に他の方法で施錠された場合を想定し、施錠されたら上のオートメーションの動作を停止するオートメーションを作成します。
まぁこのオートメーションを作成するんだったら、上のオートメーションでロックしたら停止するシーケンスは要らなかったですね(汗)
alias: auto_lock_running_cancel description: "" trigger: - type: turned_on platform: device device_id: 対象のESP32 entity_id: ロックの状態 domain: binary_sensor for: hours: 0 minutes: 0 seconds: 2 condition: - condition: state entity_id: input_boolean.auto_lock_running_boolean state: "on" for: hours: 0 minutes: 0 seconds: 2 action: - service: automation.turn_off metadata: {} data: stop_actions: true target: entity_id: automation.entrance_door_button_pushed - service: automation.turn_on target: entity_id: - automation.entrance_door_button_pushed data: {} - service: input_boolean.turn_off target: entity_id: input_boolean.auto_lock_running_boolean data: {} mode: single