Introduction
Hello everyone. Hope you are all well.
I’ve been here for absolutely ages lurking away and decided finally to make an account to start sharing some stuff I’ve been working on. One in the hopes to give a little back to the community and two to hopefully improve on them with more sets of eyes. This is my first submission of a blueprint here, so please do let me know if there’s anything that can be improved on, or just your experience with it. It’s always good to hear some success stories from something I’ve made.
Door Knock Detection
This is my door knock detection blueprint that I devised to detect those lazy buggers who cant be bothered to press my doorbell and would rather knock like a caveman. I ran into a myriad of issues initially when I bought the vibration sensor for this purpose, especially with false knock positives as someone walked through the door. I created this blueprint to remedy those issues and also to apply it to both of my external doors without repeating logic.
I’ve been using this for way over a year now on my own doors and I don’t remember it ever failing.
Features
- Detects a door knock with any vibration sensor.
- Robust trigger conditions to enable minimal/zero false positives.
- Custom action to fire when the knock is detected.
- Customisable check duration and a “no change” duration to tune it to your setup and sensors.
- Global custom condition to disable the entire automation from running.
Requirements
- Contact Sensor for door open/close detection
- Vibration sensor on the door to detect the knock
Available Settings
Check Duration
This setting is best set as low as possible as it will delay the action from running. I didn’t mind making those who knock wait an extra 3 seconds for my arrival. If they rang the door bell they’d get me 3 seconds earlier! Others may not.
This check duration is there to delay the automation from checking the state of the door. So when the vibration happens, a delay runs for the inputted time before checking the next setting and if the contact sensor is closed. This is due to sensor trigger timing’s more than anything as we don’t live in a perfect world where the vibration always happens before the door changes state. Initially I had a lots of cases where the vibration sensor would go off just after, sometimes just before, the door closed.
Door Inactive Duration
This setting can be whatever you feel comfortable with. It’s just an additional check so we don’t get any false positive triggers. After the door knock triggers, and the check time has passed. This condition looks to see if the door has changed state within the last ‘x’ seconds. This was again to add some robustness to the automation as the vibration doesn’t always happen exactly before the door opens/closes sometimes, with my zigbee sensors anyway, it fired a few seconds after I’d walked through the door and shut it.
Blueprint
blueprint:
name: "Door Knock Detection"
description: This blueprint will trigger a custom action when a knock at the door is detected by a vibration sensor.
domain: automation
author: NotExpectedYet
homeassistant:
min_version: 2024.6.0
input:
entities:
name: Entities
icon: mdi:vibrate
input:
virbation_sensor:
name: Vibration Sensor
description: The vibration sensor you have attached to the door. This is used to detect the knock.
default: []
selector:
entity:
domain: binary_sensor
device_class: vibration
contact_sensor:
name: Contact Sensor
description: The contact sensor you have attached to the door. This is used to detect whether the knock was a knock, or just someone opening/closing the door.
default: []
selector:
entity:
domain: binary_sensor
device_class:
- door
- opening
- window
settings:
name: Settings
icon: mdi:cog
input:
check_duration:
name: Check Duration
description: The duration to wait before making sure the door is still in the "closed" state. This is best set as low as you can reasonably get away with as it will delay the action.
default:
hours: 0
minutes: 0
seconds: 3
milliseconds: 0
selector:
duration:
no_change_time:
name: Door Inactive Duration
description: When the knock is detected, the door must not have changed state for this amount of time.
default: 30
selector:
number:
min: 1
max: 120
unit_of_measurement: seconds
action_to_trigger:
name: Action to Trigger
description: The action to trigger when a knock has been detected.
default: []
selector:
action:
global_condition:
name: Global condition
description: "Customised condtitions to stop the *entire* automation running."
default: []
selector:
condition:
trigger:
- platform: state
entity_id: !input virbation_sensor
from: "off"
to: "on"
condition: !input global_condition
variables:
contact_input: !input contact_sensor
no_change_time_input: !input no_change_time
contact_triggered_over_x_ago: >-
{{(as_timestamp(now()))-(as_timestamp(states[contact_input.split(".")[0]][contact_input.split(".")[1]].last_changed)) > no_change_time_input }}
action:
- delay: !input check_duration
- if:
- condition: template
value_template: >-
{{ contact_triggered_over_x_ago }}
- condition: state
entity_id: !input contact_sensor
state: "off"
then: !input action_to_trigger
mode: single
Future
Dunno! Happy for thoughts and ideas. Currently it does what it says on the tin and I’ve had no personal need to expand it further. I have had an idea now just writing this, there is a limitation currently in that it only detects knocks on a closed door. I wonder if a similar methodology could be applied for open doors, personally it’s not warranted but I may do it if someone asks nice enough.