Publish doorbell loud restore blueprint v3.0
This commit is contained in:
12
CHANGELOG.md
Normal file
12
CHANGELOG.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## 3.0.0
|
||||
|
||||
- Publish-ready blueprint by `lightningpicture`.
|
||||
- Removed hardcoded device entities.
|
||||
- Added inputs for Android ringer mode and volume sensors.
|
||||
- Temporarily sets Android device to loud mode before the doorbell notification.
|
||||
- Sends an alarm-stream snapshot notification.
|
||||
- Plays a spoken Android TTS doorbell announcement.
|
||||
- Restores previous ringer mode and volume levels after notification.
|
||||
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 lightningpicture
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
55
README.md
Normal file
55
README.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# Doorbell Loud Restore Notification Blueprint
|
||||
|
||||
Home Assistant blueprint for Android doorbell notifications.
|
||||
|
||||
When the doorbell trigger fires, the blueprint:
|
||||
|
||||
- reads the Android phone's current ringer mode and volume levels
|
||||
- temporarily switches the phone to loud mode
|
||||
- raises alarm, notification, and ringer volume
|
||||
- sends an alarm-stream snapshot notification
|
||||
- plays a short spoken doorbell announcement
|
||||
- restores the previous ringer mode and volume levels
|
||||
- keeps two actionable notification buttons available
|
||||
|
||||
## Blueprint
|
||||
|
||||
```text
|
||||
blueprints/automation/lightningpicture/doorbell-cam-loud-restore-notification.yaml
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- Home Assistant Companion App for Android
|
||||
- the target Android device's mobile_app notify service
|
||||
- enabled Companion App sensors:
|
||||
- Ringer mode
|
||||
- Volume level alarm
|
||||
- Volume level notification
|
||||
- Volume level ringer
|
||||
- a camera entity for the doorbell snapshot
|
||||
- a binary sensor, switch, or other entity that turns from `off` to `on` on doorbell press
|
||||
|
||||
## Important Android Permissions
|
||||
|
||||
For reliable loud notifications and restore behavior, allow the Home Assistant app to:
|
||||
|
||||
- change ringer mode / Do Not Disturb settings
|
||||
- use notification channels that bypass Do Not Disturb
|
||||
- run in the background without battery optimization blocking it
|
||||
|
||||
## Default Announcement
|
||||
|
||||
```text
|
||||
Es hat gerade an der Haustür geklingelt.
|
||||
```
|
||||
|
||||
The announcement text is configurable in the blueprint input.
|
||||
|
||||
## Tested Setup
|
||||
|
||||
- Home Assistant 2026.6.4
|
||||
- Android / Samsung mobile_app target
|
||||
- ringer modes tested: `vibrate` and `silent`
|
||||
- restore verified for ringer mode and alarm/notification/ringer volume levels
|
||||
|
||||
@@ -0,0 +1,279 @@
|
||||
blueprint:
|
||||
name: Doorbell loud restore notification v3.0
|
||||
description: "Version 3.0 by lightningpicture. Publish-ready Android doorbell blueprint: reads the phone's current ringer mode and volume levels, temporarily switches the phone to loud mode, sends an alarm-stream snapshot notification, plays a short spoken doorbell announcement, then restores the previous ringer mode and volume levels. Supports two actionable notification buttons."
|
||||
domain: automation
|
||||
input:
|
||||
notification_title:
|
||||
name: Notification title (Optional)
|
||||
description: 'Default: "Someone at the doorbell ring!"'
|
||||
default: Someone at the doorbell ring!
|
||||
announcement_text:
|
||||
name: Spoken doorbell announcement
|
||||
description: Android TTS announcement played after the doorbell notification.
|
||||
default: Es hat gerade an der Haustür geklingelt.
|
||||
selector:
|
||||
text:
|
||||
multiline: false
|
||||
multiple: false
|
||||
doorbell_button:
|
||||
name: Trigger entity
|
||||
description: Changing state of this entity from <off> to <on> will start the doorbell notification automation.
|
||||
selector:
|
||||
entity: {}
|
||||
doorbell_cam:
|
||||
name: Doorbell Cam
|
||||
description: The Camera from which to take a photo for the notification.
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
- camera
|
||||
multiple: false
|
||||
notify_dev:
|
||||
name: Device to notify
|
||||
description: Device or group of devices for notification through the mobile_app notification service. For example <notify.mobile_app_iphone>, <notify.all_devices>
|
||||
selector:
|
||||
text:
|
||||
type: search
|
||||
multiline: false
|
||||
multiple: false
|
||||
ringer_mode_sensor:
|
||||
name: Android ringer mode sensor
|
||||
description: Ringer mode sensor of the target Android device. Usually named <device> Ringer mode.
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
- sensor
|
||||
multiple: false
|
||||
alarm_volume_sensor:
|
||||
name: Android alarm volume sensor
|
||||
description: Alarm volume level sensor of the target Android device. Used to restore the previous alarm volume.
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
- sensor
|
||||
multiple: false
|
||||
notification_volume_sensor:
|
||||
name: Android notification volume sensor
|
||||
description: Notification volume level sensor of the target Android device. Used to restore the previous notification volume.
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
- sensor
|
||||
multiple: false
|
||||
ringer_volume_sensor:
|
||||
name: Android ringer volume sensor
|
||||
description: Ringer volume level sensor of the target Android device. Used to restore the previous ringer volume.
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
- sensor
|
||||
multiple: false
|
||||
ios_sound:
|
||||
name: Notification sound
|
||||
description: Notification sound for iOS (Optional). Default <US-EN-Morgan-Freeman-Someone-Is-Arriving.wav>
|
||||
default: US-EN-Morgan-Freeman-Someone-Is-Arriving.wav
|
||||
selector:
|
||||
select:
|
||||
mode: dropdown
|
||||
custom_value: true
|
||||
options:
|
||||
- US-EN-Morgan-Freeman-Someone-Is-Arriving.wav
|
||||
- US-EN-Morgan-Freeman-Wife-Is-Arriving.wav
|
||||
- US-EN-Morgan-Freeman-Boss-Is-Arriving.wav
|
||||
- US-EN-Morgan-Freeman-Girlfriend-Is-Arriving.wav
|
||||
- US-EN-Morgan-Freeman-Welcome-Home.wav
|
||||
- US-EN-Morgan-Freeman-Son-Is-Arriving.wav
|
||||
- US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav
|
||||
- US-EN-Morgan-Freeman-Motion-Detected.wav
|
||||
- US-EN-Morgan-Freeman-Motion-In-Wine-Cellar.wav
|
||||
- US-EN-Morgan-Freeman-Motion-In-Garage.wav
|
||||
- US-EN-Daisy-Back-Door-Motion.wav
|
||||
- US-EN-Daisy-Front-Door-Motion.wav
|
||||
- US-EN-Alexa-Motion-In-Garage.wav
|
||||
- US-EN-Alexa-Motion-In-Back-Yard.wav
|
||||
- US-EN-Alexa-Motion-Detected-Generic.wav
|
||||
sort: false
|
||||
multiple: false
|
||||
uri_:
|
||||
name: Dashboard tab
|
||||
description: Dashboard tab to open by clicking the <Dashboard> button. Default </lovelace/default_view>
|
||||
default: /lovelace/default_view
|
||||
action1_title:
|
||||
name: Action 1 title (Optional)
|
||||
description: Action to perform on clicking the action 1 button
|
||||
default: action1
|
||||
action1:
|
||||
name: Action 1
|
||||
description: Action to run when action button 1 is pressed
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
action2_title:
|
||||
name: Action 2 title (Optional)
|
||||
description: Action to perform on clicking the action 2 button
|
||||
default: action2
|
||||
action2:
|
||||
name: Action 2
|
||||
description: Action to run when action button 2 is pressed
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
delay:
|
||||
name: Delay (Optional)
|
||||
description: The time during which the actions in the notification are active
|
||||
default: '30'
|
||||
selector:
|
||||
number:
|
||||
min: 0.0
|
||||
max: 120.0
|
||||
unit_of_measurement: seconds
|
||||
mode: slider
|
||||
step: 1.0
|
||||
variables:
|
||||
button: !input doorbell_button
|
||||
ringer_mode_sensor: !input ringer_mode_sensor
|
||||
alarm_volume_sensor: !input alarm_volume_sensor
|
||||
notification_volume_sensor: !input notification_volume_sensor
|
||||
ringer_volume_sensor: !input ringer_volume_sensor
|
||||
image_file: /local/doorbell/{{ expand(button)[0].last_changed | as_timestamp |
|
||||
timestamp_custom("%Y-%m-%d_%H-%M-%S") }}.jpg
|
||||
trigger:
|
||||
- entity_id: !input doorbell_button
|
||||
platform: state
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
condition: []
|
||||
action:
|
||||
- alias: Set up variables for the actions
|
||||
variables:
|
||||
action_1: '{{ ''ACTION_1'' ~ context.id }}'
|
||||
action_2: '{{ ''ACTION_2'' ~ context.id }}'
|
||||
ringer_mode_before: "{{ states(ringer_mode_sensor) }}"
|
||||
alarm_volume_before: "{{ states(alarm_volume_sensor) }}"
|
||||
notification_volume_before: "{{ states(notification_volume_sensor) }}"
|
||||
ringer_volume_before: "{{ states(ringer_volume_sensor) }}"
|
||||
- data_template:
|
||||
entity_id: !input doorbell_cam
|
||||
filename: /config/www/doorbell/{{ expand(button)[0].last_changed | as_timestamp |
|
||||
timestamp_custom("%Y-%m-%d_%H-%M-%S") }}.jpg
|
||||
service: camera.snapshot
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_ringer_mode
|
||||
data:
|
||||
command: normal
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_volume_level
|
||||
data:
|
||||
media_stream: alarm_stream
|
||||
command: 999
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_volume_level
|
||||
data:
|
||||
media_stream: notification_stream
|
||||
command: 999
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_volume_level
|
||||
data:
|
||||
media_stream: ring_stream
|
||||
command: 999
|
||||
- delay: "00:00:01"
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
title: !input notification_title
|
||||
message: "{{ as_timestamp(now()) | timestamp_custom('%d.%m.%y - %H:%M', true) }}"
|
||||
data:
|
||||
ttl: 0
|
||||
priority: high
|
||||
channel: alarm_stream
|
||||
push:
|
||||
interruption-level: critical
|
||||
sound: !input ios_sound
|
||||
image: '{{ image_file }}'
|
||||
actions:
|
||||
- action: '{{ action_1 }}'
|
||||
title: !input action1_title
|
||||
destructive: true
|
||||
- action: '{{ action_2 }}'
|
||||
title: !input action2_title
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: TTS
|
||||
data:
|
||||
tts_text: !input announcement_text
|
||||
media_stream: alarm_stream_max
|
||||
- delay: "00:00:05"
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ is_number(alarm_volume_before) }}"
|
||||
then:
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_volume_level
|
||||
data:
|
||||
media_stream: alarm_stream
|
||||
command: "{{ alarm_volume_before | int }}"
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ is_number(notification_volume_before) }}"
|
||||
then:
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_volume_level
|
||||
data:
|
||||
media_stream: notification_stream
|
||||
command: "{{ notification_volume_before | int }}"
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ is_number(ringer_volume_before) }}"
|
||||
then:
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_volume_level
|
||||
data:
|
||||
media_stream: ring_stream
|
||||
command: "{{ ringer_volume_before | int }}"
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ ringer_mode_before in ['normal', 'vibrate', 'silent'] }}"
|
||||
then:
|
||||
- action: !input notify_dev
|
||||
metadata: {}
|
||||
data:
|
||||
message: command_ringer_mode
|
||||
data:
|
||||
command: "{{ ringer_mode_before }}"
|
||||
- alias: Wait for a response
|
||||
wait_for_trigger:
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: '{{ action_1 }}'
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: '{{ action_2 }}'
|
||||
timeout: !input delay
|
||||
continue_on_timeout: true
|
||||
- alias: Perform the action
|
||||
choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ wait.trigger.event.data.action == action_1 }}'
|
||||
sequence: !input action1
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ wait.trigger.event.data.action == action_2 }}'
|
||||
sequence: !input action2
|
||||
Reference in New Issue
Block a user