so because the devs account is suspended until later this year the blueprint cant be installed? is there no work around for this?
The DEV owns the code so no. It’s not because they were suspended, it’s because they opted to either make the GitHub repo private or took it down altogether.
The dev is having a temper tantrum and nuking all their content. If anyone has the blueprint stored locally, please post it here. Otherwise this thread will be deleted.
@petro i do have the blueprints in yaml still. Do I just upload the contents of the yaml files here?
Yep, that will do. If someone wants to maintain it, they can make a new repo for it. I’ll mark your post as the solution so people have a direct link to it.
So here are the blueprints (split into 3 seperate posts due to error with post size)
Ring Event Notification (notification_ring_event.yaml)
blueprint:
name: UniFi Protect Doorbell Ring Notifications
domain: automation
source_url: https://raw.githubusercontent.com/AngellusMortis/unifiprotect_blueprints/main/blueprints/automation/unifiprotect/notification_ring_event.yaml
description: "## UniFi Protect Doorbell Ring Notifications\n\nThis blueprint will
send push notifications to a Home Assistant mobile app when a doorbell ring is
detected.\n\n### Required Settings\n\n - UniFi Protect Doorbell Sensor\n\n###
Optional Settings\n\n - Notification target for the [mobile app notification
target][1].\n - Cutoff time before ring event for video clips.\n - Time formatting
strings. Timestamp is injected into the notification in case the notification
is delay.\n - Cooldown before sending another notification\n - Silence timer
for muting notifications via Actionable Notification (docs: [Mobile][2])\n -
Configurable lovelace view from notification\n\n### Requirements\n\nTo take full
effect of this automation blueprint, your Home Assistant instance needs some setup
beforehand.\n\n- An UniFi Protect G4 Doorbell or G4 Doorbell Pro.\n- A valid HTTPS
certificate and [properly configured external URL][3]\n - If you are using Home
Assistant Cloud, this is already set up for you.\n - If this is not setup correctly,
the actionable notifications and attachments will not appear in the notifications.\n
\ - You do not need your _whole_ Home Assistant to be publicly accessible. Only
the paths `/api/unifiprotect/*` and\n `/api/webhook/*` need to be accessible
outside of your network.\n\n[1]: https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices\n[2]:
https://companion.home-assistant.io/docs/notifications/actionable-notifications/\n[3]:
https://www.home-assistant.io/docs/configuration/remote/\n"
input:
doorbell_sensor:
name: Doorbell Sensor Entity
description: 'The "Doorbell" sensor(s) to use.
'
selector:
entity:
integration: unifiprotect
domain:
- binary_sensor
device_class:
- occupancy
multiple: true
lock_entity:
name: (Optional) Door Lock or Gate Entity
description: 'The entity to provide an actionable notification to unlock on
doorbell ring. The time interval you have to respond to the unlock action
is controlled by "Cooldown". Short Cooldown timers may prevent you from unlocking
the door.
'
default: ''
selector:
entity:
domain:
- lock
- cover
multiple: false
tts_target:
name: (Optional) TTS Service
description: 'The TTS service you want to use to generate TTS messages https://www.home-assistant.io/integrations/tts/
'
default: ''
selector:
text: {}
lock_tts:
name: (Optional) Unlock TTS message
description: 'TTS Message for play through doorbell when door is unlocked.
'
default: ''
selector:
text: {}
wait_tts:
name: (Optional) TTS message
description: 'Adds actionable notification to play TTS message to respond to
guest. The time interval you have to respond to the TTS action is controlled
by "Cooldown". Short Cooldown timers may prevent you from sending a TTS message
the door.
'
default: ''
selector:
text: {}
notify_target_app:
name: (Optional) Notification Target (Mobile App)
description: 'The notification target for mobile apps notifications. Can be
`notifiy.notify` or any Mobile app notify service (starts with `notify.mobile_app_`).
https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices
'
default: notify.notify
selector:
text: {}
channel:
name: (Optional) Notification Channel
description: 'Notification channel/tag to use. Will automatically be prepended
with "Manual " if action is triggered manually. https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels
'
default: Doorbell
selector:
text: {}
video_cutoff:
name: (Optional) Video Cutoff
description: 'Time before the doorbell ring to generate a video for to send.
Setting to 0 will disable attaching a video clip.
'
default: 0
selector:
number:
max: 30.0
min: 0.0
unit_of_measurement: seconds
mode: slider
step: 1.0
time_format:
name: (Optional) Time Format String
description: 'Python datetime format code string for the event trigger time.
This string is the actual time the doorbell event was triggered in case the
automation or notification is delayed. Manual triggers will cause this to
always be the time of the previous event. https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
'
default: '%I:%M %p'
selector:
entity: {}
cooldown:
name: (Optional) Cooldown
description: 'Delay before sending another notification for this camera after
the last event. Is also the interval you have to respond to actions in notification.
'
default: 120
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: seconds
mode: slider
step: 1.0
silence_timer:
name: (Optional) Silence Notifications
description: 'How long to silence notifications for this camera when requested
as part of the actionable notification. The time interval you have to respond
to the slient action is controlled by "Cooldown". Short Cooldown timers may
prevent you from silencing.
'
default: 30
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: minutes
mode: slider
step: 1.0
lovelace_view:
name: (Optional) Lovelace View
description: 'Home Assistant Lovelace view to open when clicking notification.
If left blank, URI Notification actions will not be generated.
'
default: ''
selector:
text: {}
debug_event_id:
name: (Optional) Debug Event ID
description: 'Debug Event ID for UniFi Protect to use for when manually triggering
automation. Will be used to generate a thumbnail for testing notifications.
'
default: ''
selector:
text: {}
mode: single
max_exceeded: silent
variables:
input_doorbell: !input doorbell_sensor
input_lock_entity: !input lock_entity
input_lock_tts: !input lock_tts
input_wait_tts: !input wait_tts
input_tts_target: !input tts_target
input_channel: !input channel
input_lovelace_view: !input lovelace_view
input_notify_target_app: !input notify_target_app
input_silence_timer: !input silence_timer
input_time_format: !input time_format
input_debug_event_id: !input debug_event_id
input_cooldown: !input cooldown
input_video_cutoff: !input video_cutoff
lovelace_view: '{{ input_lovelace_view | trim }}'
is_manual: '{{ ''from_state'' not in trigger }}'
notification_channel: "{% if is_manual %}\n Manual {{ input_channel }}\n{% else
%}\n {{ input_channel }}\n{% endif %}\n"
entity_id: '{% if is_manual %}{{ input_doorbell[0] }}{% else %}{{ trigger.entity_id
}}{% endif %}'
device_id: '{{ device_id(entity_id) }}'
device_name: '{{ device_attr(device_id, ''name'') }}'
camera_entities: '[{% for eid in device_entities(device_id) %}{%if eid.startswith(''camera'')
and not ''package'' in eid and not is_state(eid, ''unavailable'') %}"{{ eid }}",{%
endif %}{% endfor %}]'
camera_entity_id: '{{ camera_entities | default([None]) | first }}'
lock_entity_id: '{{ input_lock_entity or '''' }}'
media_entities: '[{% for eid in device_entities(device_id) %}{%if eid.startswith(''media_player'')
and not is_state(eid, ''unavailable'') %}"{{ eid }}",{% endif %}{% endfor %}]'
media_entity_id: '{{ media_entities | default([None]) | first }}'
event_id: '{% if is_manual %}{{ input_debug_event_id }}{% else %}{{ state_attr(entity_id,
''event_id'') }}{% endif %}'
video_end: '{{ states[entity_id].last_changed.isoformat() }}'
trigger_time: "{% if states[entity_id] == None %}\n None\n{% else %}\n {{ as_local(states[entity_id].last_changed).strftime(input_time_format)
}}\n{% endif %}\n"
notification_title: '{{ device_name }}: Doorbell Ring'
notification_tag: '{{ notification_channel.lower().replace('' '', ''-'') }}'
notification_message: '{{ device_name }} was rung{% if trigger_time != None %} at
{{ trigger_time }}{% endif %}.'
notification_image: /api/unifiprotect/thumbnail/{{ config_entry_id(entity_id) }}/{{
event_id }}
notification_url: "{% if lovelace_view == \"\" %}\n None\n{% else %}\n {{ lovelace_view
}}\n{% endif %}\n"
unlock_text: '{% if lock_entity_id.startswith(''cover'') %}Open Gate{% else %}Unlock
Door{% endif %}'
unlock_service: '{% if lock_entity_id.startswith(''cover'') %}cover.open_cover{%
else %}lock.unlock{% endif %}'
unlock_action: unlock-ring-{{ lock_entity_id }}
silence_action: silence-ring-{{ entity_id }}
tts_action: tts-ring-{{ input_doorbell }}
lock_tts_enabled: '{{ input_tts_target != '''' and input_lock_tts != '''' and media_entity_id
!= None }}'
wait_tts_enabled: '{{ input_tts_target != '''' and input_wait_tts != '''' and media_entity_id
!= None }}'
trigger:
- platform: state
entity_id: !input doorbell_sensor
from: 'off'
to: 'on'
action:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif %}\n"
time-sensitive: 1
image: '{{ notification_image }}'
entity_id: '{{ camera_entity_id }}'
actions: '[{% if notification_url != None %} { "action": "URI", "title": "Open
Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if lock_entity_id
!= "" %} { "action": "{{ unlock_action }}", "title": "{{ unlock_text }}" },
{% endif %} {% if wait_tts_enabled %} { "action": "{{ tts_action }}", "title":
"Respond" }, {% endif %} {% if input_silence_timer > 0 %} { "action": "{{
silence_action }}", "title": "Silence", "destructive": True }, {% endif %}]
'
- choose:
- conditions:
- condition: template
value_template: '{{ input_video_cutoff > 0 }}'
sequence:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif
%}\n"
time-sensitive: 1
image: '{{ notification_image }}'
video: /api/unifiprotect/video/{{ config_entry_id(entity_id) }}/{{ entity_id
}}/{{ (as_datetime(video_end) - timedelta(seconds=input_video_cutoff)).isoformat()
}}/{{ video_end }}
entity_id: '{{ camera_entity_id }}'
actions: '[{% if notification_url != None %} { "action": "URI", "title":
"Open Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if lock_entity_id
!= "" %} { "action": "{{ unlock_action }}", "title": "{{ unlock_text }}"
}, {% endif %} {% if wait_tts_enabled %} { "action": "{{ tts_action }}",
"title": "Respond" }, {% endif %} {% if input_silence_timer > 0 %} { "action":
"{{ silence_action }}", "title": "Silence", "destructive": True }, {%
endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ silence_action }}'
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ unlock_action }}'
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ tts_action }}'
- platform: event
event_type: mobile_app_notification_cleared
event_data:
message: '{{ notification_message }}'
timeout:
seconds: '{{ input_cooldown }}'
continue_on_timeout: false
- choose:
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' and wait.trigger.event.data.action ==
silence_action }}'
sequence:
- delay:
minutes: '{{ input_silence_timer }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' and wait.trigger.event.data.action ==
unlock_action }}'
sequence:
- service: '{{ unlock_service }}'
data:
entity_id: '{{ lock_entity_id }}'
- choose:
- conditions: '{{ lock_tts_enabled }}'
sequence:
- service: '{{ input_tts_target }}'
data:
entity_id: '{{ media_entity_id }}'
message: '{{ input_lock_tts }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' and wait.trigger.event.data.action ==
tts_action }}'
sequence:
- service: '{{ input_tts_target }}'
data:
entity_id: '{{ media_entity_id }}'
message: '{{ input_wait_tts }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_cleared'' }}'
sequence:
- delay:
seconds: '{{ max([input_cooldown - (wait.trigger.event.time_fired - as_datetime(video_end)).total_seconds(),
5]) }}'
Smart Motion Notification Events (notification_smart_motion_event.yaml):
blueprint:
name: UniFi Protect Motion / Smart Detection Notifications
domain: automation
source_url: https://raw.githubusercontent.com/AngellusMortis/unifiprotect_blueprints/main/blueprints/automation/unifiprotect/notification_smart_motion_event.yaml
description: "## UniFi Protect Motion / Smart Detection Notifications\n\nThis blueprint
will send push notifications to a Home Assistant mobile app when a camera detections
motion or a\nsmart detection.\n\n### Required Settings\n\n - UniFi Protect Detection
Sensor\n\n### Optional Settings\n\n - Notification target for the [mobile app
notification target][1].\n - Presence filter - list of mobile phones or other
entities that should be within the \"home\" zone\n - Alarm entity to check arm
states.\n - Alarm arm states when the notifications should work. Required if
alarm entity is selected.\n - Time formatting strings. Timestamp is injected
into the notification in case the notification is delay.\n - Cooldown before
sending another notification\n - Silence timer for muting notifications via Actionable
Notification (docs: [Mobile][2])\n - Configurable lovelace view from notification\n\n
\ The presence filter works together with the alarm entity (you can choose presence
filter or alarm entity, you can choose both or nothing at all).\n\n### Requirements\n\nTo
take full effect of this automation blueprint, your Home Assistant instance needs
some setup beforehand.\n\n- An UniFi Protect camera. Only cameras that are capable
of smart detections (G4, AI or G5 Series cameras) will have objection detection
sensors.\n- A valid HTTPS certificate and [properly configured external URL][3]\n
\ - If you are using Home Assistant Cloud, this is already set up for you.\n -
If this is not setup correctly, the actionable notifications and attachments will
not appear in the notifications.\n - You do not need your _whole_ Home Assistant
to be publicly accessible. Only the paths `/api/unifiprotect/*` and\n `/api/webhook/*`
need to be accessible outside of your network.\n\n[1]: https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices\n[2]:
https://companion.home-assistant.io/docs/notifications/actionable-notifications/\n[3]:
https://www.home-assistant.io/docs/configuration/remote/\n"
input:
obj_sensor:
name: Detection Sensor
description: 'The "Motion/Person/etc. Detected" sensor(s) to use.
'
selector:
entity:
integration: unifiprotect
domain:
- binary_sensor
multiple: true
presence_filter:
name: (Optional) Presence Filter
description: Only notify if selected presence entity is not "home".
default: ''
selector:
entity:
domain:
- device_tracker
multiple: true
alarm_entity:
name: (Optional) Alarm Entity
default: ''
description: The alarm entity to monitor for state changes.
selector:
entity:
domain:
- alarm_control_panel
multiple: false
alarm_arm_states:
name: Alarm Arm States
description: Select the alarm arm states for which you want to receive notifications.
Required if an Alarm Entity is set.
default:
- armed_away
- armed_home
- armed_night
- armed_vacation
- armed_custom_bypass
selector:
select:
options:
- armed_away
- armed_home
- armed_night
- armed_vacation
- armed_custom_bypass
multiple: true
sort: false
custom_value: false
notify_target_app:
name: (Optional) Notification Target (Mobile App)
description: 'The notification target for mobile apps notifications. Can be
`notifiy.notify` or any Mobile app notify service (starts with `notify.mobile_app_`).
https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices
'
default: notify.notify
selector:
text: {}
channel:
name: (Optional) Notification Channel
description: 'Notification channel/tag to use. Will automatically be prepended
with "Manual " if action is triggered manually. https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels
'
default: Smart Detection
selector:
text: {}
time_format:
name: (Optional) Time Format String
description: 'Python datetime format code string for the event trigger time.
This string is the actual time the doorbell event was triggered in case the
automation or notification is delayed. Manual triggers will cause this to
always be the time of the previous event. https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
'
default: '%I:%M %p'
selector:
entity: {}
cooldown:
name: (Optional) Cooldown
description: 'Delay before sending another notification for this camera after
the last event. Is also the interval you have to respond to actions in notification.
'
default: 120
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: seconds
mode: slider
step: 1.0
silence_timer:
name: (Optional) Silence Notifications
description: 'How long to silence notifications for this camera when requested
as part of the actionable notification. The time interval you have to respond
to the slient action is controlled by "Cooldown". Short Cooldown timers may
prevent you from silencing.
'
default: 30
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: minutes
mode: slider
step: 1.0
lovelace_view:
name: (Optional) Lovelace View
description: 'Home Assistant Lovelace view to open when clicking notification.
If left blank, URI Notification actions will not be generated.
'
default: ''
selector:
text: {}
debug_event_id:
name: (Optional) Debug Event ID
description: 'Debug Event ID for UniFi Protect to use for when manually triggering
automation. Will be used to generate a thumbnail for testing notifications.
'
default: ''
selector:
text: {}
mode: single
max_exceeded: silent
variables:
input_obj: !input obj_sensor
input_channel: !input channel
input_lovelace_view: !input lovelace_view
input_notify_target_app: !input notify_target_app
input_silence_timer: !input silence_timer
input_time_format: !input time_format
input_presence_filter: !input presence_filter
input_alarm_entity: !input alarm_entity
input_alarm_arm_states: !input alarm_arm_states
input_debug_event_id: !input debug_event_id
input_cooldown: !input cooldown
lovelace_view: '{{ input_lovelace_view | trim }}'
is_manual: '{{ ''from_state'' not in trigger }}'
entity_id: '{% if is_manual %}{{ input_obj[0] }}{% else %}{{ trigger.entity_id }}{%
endif %}'
entity_name: '{{ state_attr(entity_id, ''friendly_name'') }}'
device_id: '{{ device_id(entity_id) }}'
camera_entities: '[{% for eid in device_entities(device_id) %}{%if eid.startswith(''camera'')
and not ''package'' in eid and not is_state(eid, ''unavailable'') %}"{{ eid }}",{%
endif %}{% endfor %}]'
camera_entity_id: '{{ camera_entities | default([None]) | first }}'
event_id: '{% if is_manual %}{{ input_debug_event_id }}{% else %}{{ state_attr(entity_id,
''event_id'') }}{% endif %}'
video_start: '{{ states[entity_id].last_changed.isoformat() }}'
trigger_time: "{% if states[entity_id] == None %}\n None\n{% else %}\n {{ as_local(states[entity_id].last_changed).strftime(input_time_format)
}}\n{% endif %}\n"
notification_channel: "{% if is_manual %}\n Manual {{ input_channel }}\n{% else
%}\n {{ input_channel }}\n{% endif %}\n"
notification_title: '{{ entity_name }}'
notification_tag: '{{ notification_channel.lower().replace('' '', ''-'') }}'
notification_message: '{{ entity_name }}{% if trigger_time != None %} at {{ trigger_time
}}{% endif %}.'
notification_image: /api/unifiprotect/thumbnail/{{ config_entry_id(entity_id) }}/{{
event_id }}
notification_url: "{% if lovelace_view == \"\" %}\n None\n{% else %}\n {{ lovelace_view
}}\n{% endif %}\n"
silence_action: silence-smart-{{ entity_id }}
trigger:
- platform: state
entity_id: !input obj_sensor
from: 'off'
to: 'on'
condition:
condition: and
conditions:
- condition: or
conditions:
- condition: template
value_template: '{{ input_alarm_entity is not defined or input_alarm_entity
== '''' }}'
- condition: and
conditions:
- condition: template
value_template: '{{ input_alarm_entity is defined and input_alarm_entity !=
'''' }}'
- condition: template
value_template: '{{ input_alarm_arm_states is defined and input_alarm_arm_states
| length > 0 }}'
- condition: template
value_template: '{{ states(input_alarm_entity) in input_alarm_arm_states }}'
- condition: or
conditions:
- condition: template
value_template: '{{ input_presence_filter is not defined or input_presence_filter
== '''' }}'
- condition: template
value_template: '{{ (input_presence_filter | select(''is_state'', ''home'')
| list | count) == 0 }}'
action:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif %}\n"
time-sensitive: 1
image: '{{ notification_image }}'
entity_id: '{{ camera_entity_id }}'
actions: '[{% if notification_url != None %} { "action": "URI", "title": "Open
Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if input_silence_timer
> 0 %} { "action": "{{ silence_action }}", "title": "Silence", "destructive":
True }, {% endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ silence_action }}'
- platform: event
event_type: mobile_app_notification_cleared
event_data:
message: '{{ notification_message }}'
- platform: state
entity_id: !input obj_sensor
to: 'off'
timeout:
seconds: '{{ input_cooldown }}'
continue_on_timeout: false
- choose:
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''state'' }}'
sequence:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif
%}\n"
time-sensitive: 1
image: '{{ notification_image }}'
video: /api/unifiprotect/video/{{ config_entry_id(entity_id) }}/{{ entity_id
}}/{{ video_start }}/{{ states[entity_id].last_changed.isoformat() }}
actions: '[{% if notification_url != None %} { "action": "URI", "title":
"Open Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if input_silence_timer
> 0 %} { "action": "{{ silence_action }}", "title": "Silence", "destructive":
True }, {% endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ silence_action }}'
timeout:
seconds: '{{ max([input_cooldown - (states[entity_id].last_changed - as_datetime(video_start)).total_seconds(),
5]) }}'
continue_on_timeout: false
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' }}'
sequence:
- delay:
minutes: '{{ input_silence_timer }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_cleared'' }}'
sequence:
- delay:
seconds: '{{ max([input_cooldown - (wait.trigger.event.time_fired - as_datetime(video_start)).total_seconds(),
5]) }}'
License plate smart notifications (notification_smart_licenseplate_event.yaml)
blueprint:
name: UniFi Protect License Plate Notifications
domain: automation
source_url: https://raw.githubusercontent.com/AngellusMortis/unifiprotect_blueprints/main/blueprints/automation/unifiprotect/notification_smart_licenseplate_event.yaml
description:
"## UniFi Protect License Plate Notifications\n\nThis blueprint will
send push notifications to a Home Assistant mobile app when an AI series series
camera detects\na License Plate.\n\n### Required Settings\n\n - UniFi Protect
License Plate Sensor\n\n### Optional Settings\n\n - Notification target for the
[mobile app notification target][1].\n - Time formatting strings. Timestamp is
injected into the notification in case the notification is delay.\n - Cooldown
before sending another notification\n - Silence timer for muting notifications
via Actionable Notification (docs: [Mobile][2])\n - Configurable lovelace view
from notification\n\n### Requirements\n\nTo take full effect of this automation
blueprint, your Home Assistant instance needs some setup beforehand.\n\n- An AI
series UniFi Protect camera capable of detecting license plates (AI Bullet, AI
Theta and AI DSLR).\n- A valid HTTPS certificate and [properly configured external
URL][3]\n - If you are using Home Assistant Cloud, this is already set up for
you.\n - If this is not setup correctly, the actionable notifications and attachments
will not appear in the notifications.\n - You do not need your _whole_ Home Assistant
to be publicly accessible. Only the paths `/api/unifiprotect/*` and\n `/api/webhook/*`
need to be accessible outside of your network.\n\n[1]: https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices\n[2]:
https://companion.home-assistant.io/docs/notifications/actionable-notifications/\n[3]:
https://www.home-assistant.io/docs/configuration/remote/\n"
input:
licenseplate_sensor:
name: License Plate Sensor Entity
description: 'The "License Plate Detected" sensor(s) to use.
'
selector:
entity:
integration: unifiprotect
domain: sensor
multiple: true
presence_filter:
name: (Optional) Presence Filter
description: Only notify if selected presence entity is not "home".
default: ""
selector:
entity:
domain: device_tracker
multiple: true
notify_target_app:
name: (Optional) Notification Target (Mobile App)
description:
"The notification target for mobile apps notifications. Can be
`notifiy.notify` or any Mobile app notify service (starts with `notify.mobile_app_`).
https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices
"
default: notify.notify
selector:
text: {}
channel:
name: (Optional) Notification Channel
description:
'Notification channel/tag to use. Will automatically be prepended
with "Manual " if action is triggered manually. https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels
'
default: License Plate
selector:
text: {}
time_format:
name: (Optional) Time Format String
description:
"Python datetime format code string for the event trigger time.
This string is the actual time the doorbell event was triggered in case the
automation or notification is delayed. Manual triggers will cause this to
always be the time of the previous event. https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
"
default: "%I:%M %p"
selector:
entity: {}
cooldown:
name: (Optional) Cooldown
description:
"Delay before sending another notification for this camera after
the last event. Is also the interval you have to respond to actions in notification.
"
default: 120
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: seconds
step: 1.0
mode: slider
silence_timer:
name: (Optional) Silence Notifications
description:
'How long to silence notifications for this camera when requested
as part of the actionable notification. The time interval you have to respond
to the slient action is controlled by "Cooldown". Short Cooldown timers may
prevent you from silencing.
'
default: 30
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: minutes
step: 1.0
mode: slider
lovelace_view:
name: (Optional) Lovelace View
description:
"Home Assistant Lovelace view to open when clicking notification.
If left blank, URI Notification actions will not be generated.
"
default: ""
selector:
text: {}
debug_license_plate:
name: (Optional) Debug License Plate
description: "License Plate to use when manually triggering automation.
"
default: ABCD1234
selector:
text: {}
debug_event_id:
name: (Optional) Debug Event ID
description:
"Debug Event ID for UniFi Protect to use for when manually triggering
automation. Will be used to generate a thumbnail for testing notifications.
"
default: ""
selector:
text: {}
mode: single
max_exceeded: silent
variables:
input_licenseplate: !input licenseplate_sensor
input_channel: !input channel
input_lovelace_view: !input lovelace_view
input_notify_target_app: !input notify_target_app
input_silence_timer: !input silence_timer
input_time_format: !input time_format
input_presence_filter: !input presence_filter
input_debug_license_plate: !input debug_license_plate
input_debug_event_id: !input debug_event_id
input_cooldown: !input cooldown
lovelace_view: "{{ input_lovelace_view | trim }}"
is_manual: "{{ 'from_state' not in trigger }}"
entity_id:
"{% if is_manual %}{{ input_licenseplate[0] }}{% else %}{{ trigger.entity_id
}}{% endif %}"
device_id: "{{ device_id(entity_id) }}"
device_name: "{{ device_attr(device_id, 'name') }}"
camera_entities:
'[{% for eid in device_entities(device_id) %}{%if eid.startswith(''camera'')
and not ''package'' in eid and not is_state(eid, ''unavailable'') %}"{{ eid }}",{%
endif %}{% endfor %}]'
camera_entity_id: "{{ camera_entities | default([None]) | first }}"
license_plate:
"{% if is_manual %}{{ input_debug_license_plate }}{% else %}{{ states(entity_id)
}}{% endif %}"
event_id:
"{% if is_manual %}{{ input_debug_event_id }}{% else %}{{ state_attr(entity_id,
'event_id') }}{% endif %}"
video_start: "{{ states[entity_id].last_changed.isoformat() }}"
trigger_time:
"{% if states[entity_id] == None %}\n None\n{% else %}\n {{ as_local(states[entity_id].last_changed).strftime(input_time_format)
}}\n{% endif %}\n"
notification_channel:
"{% if is_manual %}\n Manual {{ input_channel }}\n{% else
%}\n {{ input_channel }}\n{% endif %}\n"
notification_title: "{{ device_name }}: License Plate Detected"
notification_tag: "{{ notification_channel.lower().replace(' ', '-') }}"
notification_message:
License Plate {{ license_plate }} detected by {{ device_name
}}{% if trigger_time != None %} at {{ trigger_time }}{% endif %}.
notification_image:
/api/unifiprotect/thumbnail/{{ config_entry_id(entity_id) }}/{{
event_id }}
notification_url:
"{% if lovelace_view == \"\" %}\n None\n{% else %}\n {{ lovelace_view
}}\n{% endif %}\n"
silence_action: silence-smart-licenseplate-{{ entity_id }}
trigger:
- platform: state
entity_id: !input licenseplate_sensor
from: none
not_to: unavailable
condition:
- "{{ not input_presence_filter or (input_presence_filter | select('is_state', 'home')
| list | count) == 0 }}"
action:
- service: "{{ input_notify_target_app }}"
data:
message: "{{ notification_message }}"
title: "{{ notification_title }}"
data:
tag: "{{ notification_tag }}"
channel: "{{ notification_channel }}"
ttl: 0
priority: high
time-sensitive: 1
image: "{{ notification_image }}"
entity_id: "{{ camera_entity_id }}"
actions:
'[{% if notification_url != None %} { "action": "URI", "title": "Open
Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if input_silence_timer
> 0 %} { "action": "{{ silence_action }}", "title": "Silence", "destructive":
True }, {% endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "{{ silence_action }}"
- platform: event
event_type: mobile_app_notification_cleared
event_data:
message: "{{ notification_message }}"
- platform: state
entity_id: !input licenseplate_sensor
to: none
timeout:
seconds: "{{ input_cooldown }}"
continue_on_timeout: false
- choose:
- conditions:
- condition: template
value_template: "{{ wait.trigger.platform == 'state' }}"
sequence:
- service: "{{ input_notify_target_app }}"
data:
message: "{{ notification_message }}"
title: "{{ notification_title }}"
data:
tag: "{{ notification_tag }}"
channel: "{{ notification_channel }}"
ttl: 0
priority: high
time-sensitive: 1
image: "{{ notification_image }}"
video:
/api/unifiprotect/video/{{ config_entry_id(entity_id) }}/{{ entity_id
}}/{{ video_start }}/{{ states[entity_id].last_changed.isoformat() }}
actions:
'[{% if notification_url != None %} { "action": "URI", "title":
"Open Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if input_silence_timer
> 0 %} { "action": "{{ silence_action }}", "title": "Silence", "destructive":
True }, {% endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "{{ silence_action }}"
timeout:
seconds:
"{{ max([input_cooldown - (states[entity_id].last_changed - as_datetime(video_start)).total_seconds(),
5]) }}"
continue_on_timeout: false
- conditions:
- condition: template
value_template:
"{{ wait.trigger.platform == 'event' and wait.trigger.event.event_type
== 'mobile_app_notification_action' }}"
sequence:
- delay:
minutes: "{{ input_silence_timer }}"
- conditions:
- condition: template
value_template:
"{{ wait.trigger.platform == 'event' and wait.trigger.event.event_type
== 'mobile_app_notification_cleared' }}"
sequence:
- delay:
seconds:
"{{ max([input_cooldown - (wait.trigger.event.time_fired - as_datetime(video_start)).total_seconds(),
5]) }}"
Thanks for posting these. So would I just put them as a .ymal file?
Yes, I would suggest putting the individual files into the following location:
/blueprints/automation/AngellusMortis/
I’m not sure the editorialization here is helpful…even with all the public information available on what happened here the high road is always a better choice.
Has anyone been able to get the UniFi Protect Motion / Smart Detection Notifications to send the notification via Telegram? Or have an automation I can re-use?
Hello everyone,
I’ve been getting the following error message for a few days now:
Client error (404): Event thumbnail not found
At first it only happened with the following automation:
blueprint:
name: UniFi Protect Motion / Smart Detection Notifications by Rockhound
domain: automation
source_url: https://raw.githubusercontent.com/AngellusMortis/unifiprotect_blueprints/main/blueprints/automation/unifiprotect/notification_smart_motion_event.yaml
description: "## UniFi Protect Motion / Smart Detection Notifications\n\nThis blueprint
will send push notifications to a Home Assistant mobile app when a camera detections
motion or a\nsmart detection.\n\n### Required Settings\n\n - UniFi Protect Detection
Sensor\n\n### Optional Settings\n\n - Notification target for the [mobile app
notification target][1].\n - Presence filter - list of mobile phones or other
entities that should be within the \"home\" zone\n - Alarm entity to check arm
states.\n - Alarm arm states when the notifications should work. Required if
alarm entity is selected.\n - Time formatting strings. Timestamp is injected
into the notification in case the notification is delay.\n - Cooldown before
sending another notification\n - Silence timer for muting notifications via Actionable
Notification (docs: [Mobile][2])\n - Configurable lovelace view from notification\n\n
\ The presence filter works together with the alarm entity (you can choose presence
filter or alarm entity, you can choose both or nothing at all).\n\n### Requirements\n\nTo
take full effect of this automation blueprint, your Home Assistant instance needs
some setup beforehand.\n\n- An UniFi Protect camera. Only cameras that are capable
of smart detections (G4, AI or G5 Series cameras) will have objection detection
sensors.\n- A valid HTTPS certificate and [properly configured external URL][3]\n
\ - If you are using Home Assistant Cloud, this is already set up for you.\n -
If this is not setup correctly, the actionable notifications and attachments will
not appear in the notifications.\n - You do not need your _whole_ Home Assistant
to be publicly accessible. Only the paths `/api/unifiprotect/*` and\n `/api/webhook/*`
need to be accessible outside of your network.\n\n[1]: https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices\n[2]:
https://companion.home-assistant.io/docs/notifications/actionable-notifications/\n[3]:
https://www.home-assistant.io/docs/configuration/remote/\n"
input:
obj_sensor:
name: Detection Sensor
description: 'The "Motion/Person/etc. Detected" sensor(s) to use.
'
selector:
entity:
integration: unifiprotect
domain:
- binary_sensor
multiple: true
presence_filter:
name: (Optional) Presence Filter
description: Only notify if selected presence entity is not "home".
default: ''
selector:
entity:
domain:
- device_tracker
multiple: true
alarm_entity:
name: (Optional) Alarm Entity
default: ''
description: The alarm entity to monitor for state changes.
selector:
entity:
domain:
- alarm_control_panel
multiple: false
alarm_arm_states:
name: Alarm Arm States
description: Select the alarm arm states for which you want to receive notifications.
Required if an Alarm Entity is set.
default:
- armed_away
- armed_home
- armed_night
- armed_vacation
- armed_custom_bypass
selector:
select:
options:
- armed_away
- armed_home
- armed_night
- armed_vacation
- armed_custom_bypass
multiple: true
sort: false
custom_value: false
notify_target_app:
name: (Optional) Notification Target (Mobile App)
description: 'The notification target for mobile apps notifications. Can be
`notifiy.notify` or any Mobile app notify service (starts with `notify.mobile_app_`).
https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices
'
default: notify.notify
selector:
text: {}
color:
name: Notification Color (Optional)
description:
"Set the color of the notification on your mobile device or TV.
"
default: steelblue
selector:
select:
options:
- steelblue
- grey
- black
- indigo
- green
- red
- cyan
- teal
- amber
- pink
multiple: false
custom_value: false
sort: false
icon:
name: Notification Icon (Optional)
description:
"Change the icon that displays on the notification. You can enter
a single icon or create a template like the example given in the dropdown.
You must include 'mdi:' in the icon name.
"
default: mdi:home-assistant
selector:
icon: {}
channel:
name: (Optional) Notification Channel
description: 'Notification channel/tag to use. Will automatically be prepended
with "Manual " if action is triggered manually. https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels
'
default: Smart Detection
selector:
text: {}
time_format:
name: (Optional) Time Format String
description: 'Python datetime format code string for the event trigger time.
This string is the actual time the doorbell event was triggered in case the
automation or notification is delayed. Manual triggers will cause this to
always be the time of the previous event. https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
'
default: "%H:%M"
selector:
entity: {}
cooldown:
name: (Optional) Cooldown
description: 'Delay before sending another notification for this camera after
the last event. Is also the interval you have to respond to actions in notification.
'
default: 120
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: seconds
mode: slider
step: 1.0
silence_timer:
name: (Optional) Silence Notifications
description: 'How long to silence notifications for this camera when requested
as part of the actionable notification. The time interval you have to respond
to the slient action is controlled by "Cooldown". Short Cooldown timers may
prevent you from silencing.
'
default: 60
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: minutes
mode: slider
step: 1.0
lovelace_view:
name: (Optional) Lovelace View
description: 'Home Assistant Lovelace view to open when clicking notification.
If left blank, URI Notification actions will not be generated.
'
default: ''
selector:
text: {}
debug_event_id:
name: (Optional) Debug Event ID
description: 'Debug Event ID for UniFi Protect to use for when manually triggering
automation. Will be used to generate a thumbnail for testing notifications.
'
default: ''
selector:
text: {}
mode: single
max_exceeded: silent
variables:
input_obj: !input obj_sensor
input_channel: !input channel
input_lovelace_view: !input lovelace_view
input_notify_target_app: !input notify_target_app
color: !input color
icon: !input icon
input_silence_timer: !input silence_timer
input_time_format: !input time_format
input_presence_filter: !input presence_filter
input_alarm_entity: !input alarm_entity
input_alarm_arm_states: !input alarm_arm_states
input_debug_event_id: !input debug_event_id
input_cooldown: !input cooldown
lovelace_view: '{{ input_lovelace_view | trim }}'
is_manual: '{{ ''from_state'' not in trigger }}'
entity_id: '{% if is_manual %}{{ input_obj[0] }}{% else %}{{ trigger.entity_id }}{%
endif %}'
entity_name: '{{ state_attr(entity_id, ''friendly_name'') }}'
device_id: '{{ device_id(entity_id) }}'
camera_entities: '[{% for eid in device_entities(device_id) %}{%if eid.startswith(''camera'')
and not ''package'' in eid and not is_state(eid, ''unavailable'') %}"{{ eid }}",{%
endif %}{% endfor %}]'
camera_entity_id: '{{ camera_entities | default([None]) | first }}'
event_id: '{% if is_manual %}{{ input_debug_event_id }}{% else %}{{ state_attr(entity_id,
''event_id'') }}{% endif %}'
video_start: '{{ states[entity_id].last_changed.isoformat() }}'
trigger_time: "{% if states[entity_id] == None %}\n None\n{% else %}\n {{ as_local(states[entity_id].last_changed).strftime(input_time_format)
}}\n{% endif %}\n"
notification_channel: "{% if is_manual %}\n Manual {{ input_channel }}\n{% else
%}\n {{ input_channel }}\n{% endif %}\n"
notification_title: '{{ entity_name }}'
notification_tag: '{{ notification_channel.lower().replace('' '', ''-'') }}'
notification_message: '{{ entity_name }}{% if trigger_time != None %} at {{ trigger_time
}}{% endif %}.'
notification_image: /api/unifiprotect/thumbnail/{{ config_entry_id(entity_id) }}/{{
event_id }}
notification_url: "{% if lovelace_view == \"\" %}\n None\n{% else %}\n {{ lovelace_view
}}\n{% endif %}\n"
silence_action: silence-smart-{{ entity_id }}
trigger:
- platform: state
entity_id: !input obj_sensor
from: 'off'
to: 'on'
condition:
condition: and
conditions:
- condition: or
conditions:
- condition: template
value_template: '{{ input_alarm_entity is not defined or input_alarm_entity
== '''' }}'
- condition: and
conditions:
- condition: template
value_template: '{{ input_alarm_entity is defined and input_alarm_entity !=
'''' }}'
- condition: template
value_template: '{{ input_alarm_arm_states is defined and input_alarm_arm_states
| length > 0 }}'
- condition: template
value_template: '{{ states(input_alarm_entity) in input_alarm_arm_states }}'
- condition: or
conditions:
- condition: template
value_template: '{{ input_presence_filter is not defined or input_presence_filter
== '''' }}'
- condition: template
value_template: '{{ (input_presence_filter | select(''is_state'', ''home'')
| list | count) == 0 }}'
action:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
color: '{{color}}'
notification_icon: '{{icon}}'
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif %}\n"
time-sensitive: 1
image: '{{ notification_image }}'
entity_id: '{{ camera_entity_id }}'
actions: '[{% if notification_url != None %} { "action": "URI", "title": "Open
Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if input_silence_timer
> 0 %} { "action": "{{ silence_action }}", "title": "Silence", "destructive":
True }, {% endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ silence_action }}'
- platform: event
event_type: mobile_app_notification_cleared
event_data:
message: '{{ notification_message }}'
- platform: state
entity_id: !input obj_sensor
to: 'off'
timeout:
seconds: '{{ input_cooldown }}'
continue_on_timeout: false
- choose:
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''state'' }}'
sequence:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
color: '{{color}}'
notification_icon: '{{icon}}'
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif
%}\n"
time-sensitive: 1
image: '{{ notification_image }}'
video: /api/unifiprotect/video/{{ config_entry_id(entity_id) }}/{{ entity_id
}}/{{ video_start }}/{{ states[entity_id].last_changed.isoformat() }}
actions: '[{% if notification_url != None %} { "action": "URI", "title":
"Open Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if input_silence_timer
> 0 %} { "action": "{{ silence_action }}", "title": "Silence", "destructive":
True }, {% endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ silence_action }}'
timeout:
seconds: '{{ max([input_cooldown - (states[entity_id].last_changed - as_datetime(video_start)).total_seconds(),
5]) }}'
continue_on_timeout: false
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' }}'
sequence:
- delay:
minutes: '{{ input_silence_timer }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_cleared'' }}'
sequence:
- delay:
seconds: '{{ max([input_cooldown - (wait.trigger.event.time_fired - as_datetime(video_start)).total_seconds(),
5]) }}'
After yesterday’s update of Unifi Protect, I no longer have any thumbnail images. The event video still appears with the following automation for the doorbell, but with the first one, neither the thumbnail nor the event video appears:
blueprint:
name: UniFi Protect Doorbell Ring Notifications by Rockhound
domain: automation
source_url: https://raw.githubusercontent.com/AngellusMortis/unifiprotect_blueprints/main/blueprints/automation/unifiprotect/notification_ring_event.yaml
description: "## UniFi Protect Doorbell Ring Notifications\n\nThis blueprint will
send push notifications to a Home Assistant mobile app when a doorbell ring is
detected.\n\n### Required Settings\n\n - UniFi Protect Doorbell Sensor\n\n###
Optional Settings\n\n - Notification target for the [mobile app notification
target][1].\n - Cutoff time before ring event for video clips.\n - Time formatting
strings. Timestamp is injected into the notification in case the notification
is delay.\n - Cooldown before sending another notification\n - Silence timer
for muting notifications via Actionable Notification (docs: [Mobile][2])\n -
Configurable lovelace view from notification\n\n### Requirements\n\nTo take full
effect of this automation blueprint, your Home Assistant instance needs some setup
beforehand.\n\n- An UniFi Protect G4 Doorbell or G4 Doorbell Pro.\n- A valid HTTPS
certificate and [properly configured external URL][3]\n - If you are using Home
Assistant Cloud, this is already set up for you.\n - If this is not setup correctly,
the actionable notifications and attachments will not appear in the notifications.\n
\ - You do not need your _whole_ Home Assistant to be publicly accessible. Only
the paths `/api/unifiprotect/*` and\n `/api/webhook/*` need to be accessible
outside of your network.\n\n[1]: https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices\n[2]:
https://companion.home-assistant.io/docs/notifications/actionable-notifications/\n[3]:
https://www.home-assistant.io/docs/configuration/remote/\n"
input:
doorbell_sensor:
name: Doorbell Sensor Entity
description: 'The "Doorbell" sensor(s) to use.
'
selector:
entity:
integration: unifiprotect
domain:
- binary_sensor
device_class:
- occupancy
multiple: true
lock_entity:
name: (Optional) Door Lock or Gate Entity
description: 'The entity to provide an actionable notification to unlock on
doorbell ring. The time interval you have to respond to the unlock action
is controlled by "Cooldown". Short Cooldown timers may prevent you from unlocking
the door.
'
default: ''
selector:
entity:
domain:
- lock
- cover
multiple: false
tts_target:
name: (Optional) TTS Service
description: 'The TTS service you want to use to generate TTS messages https://www.home-assistant.io/integrations/tts/
'
default: ''
selector:
text: {}
lock_tts:
name: (Optional) Unlock TTS message
description: 'TTS Message for play through doorbell when door is unlocked.
'
default: ''
selector:
text: {}
wait_tts:
name: (Optional) TTS message
description: 'Adds actionable notification to play TTS message to respond to
guest. The time interval you have to respond to the TTS action is controlled
by "Cooldown". Short Cooldown timers may prevent you from sending a TTS message
the door.
'
default: ''
selector:
text: {}
notify_target_app:
name: (Optional) Notification Target (Mobile App)
description: 'The notification target for mobile apps notifications. Can be
`notifiy.notify` or any Mobile app notify service (starts with `notify.mobile_app_`).
https://companion.home-assistant.io/docs/notifications/notifications-basic#sending-notifications-to-multiple-devices
'
default: notify.notify
selector:
text: {}
color:
name: Notification Color (Optional)
description:
"Set the color of the notification on your mobile device or TV.
"
default: steelblue
selector:
select:
options:
- steelblue
- grey
- black
- indigo
- green
- red
- cyan
- teal
- amber
- pink
multiple: false
custom_value: false
sort: false
icon:
name: Notification Icon (Optional)
description:
"Change the icon that displays on the notification. You can enter
a single icon or create a template like the example given in the dropdown.
You must include 'mdi:' in the icon name.
"
default: mdi:home-assistant
selector:
icon: {}
channel:
name: (Optional) Notification Channel
description: 'Notification channel/tag to use. Will automatically be prepended
with "Manual " if action is triggered manually. https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels
'
default: Doorbell
selector:
text: {}
video_cutoff:
name: (Optional) Video Cutoff
description: 'Time before the doorbell ring to generate a video for to send.
Setting to 0 will disable attaching a video clip.
'
default: 0
selector:
number:
max: 30.0
min: 0.0
unit_of_measurement: seconds
mode: slider
step: 1.0
time_format:
name: (Optional) Time Format String
description: 'Python datetime format code string for the event trigger time.
This string is the actual time the doorbell event was triggered in case the
automation or notification is delayed. Manual triggers will cause this to
always be the time of the previous event. https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
'
default: "%H:%M"
selector:
entity: {}
cooldown:
name: (Optional) Cooldown
description: 'Delay before sending another notification for this camera after
the last event. Is also the interval you have to respond to actions in notification.
'
default: 120
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: seconds
mode: slider
step: 1.0
silence_timer:
name: (Optional) Silence Notifications
description: 'How long to silence notifications for this camera when requested
as part of the actionable notification. The time interval you have to respond
to the slient action is controlled by "Cooldown". Short Cooldown timers may
prevent you from silencing.
'
default: 30
selector:
number:
max: 300.0
min: 0.0
unit_of_measurement: minutes
mode: slider
step: 1.0
lovelace_view:
name: (Optional) Lovelace View
description: 'Home Assistant Lovelace view to open when clicking notification.
If left blank, URI Notification actions will not be generated.
'
default: ''
selector:
text: {}
debug_event_id:
name: (Optional) Debug Event ID
description: 'Debug Event ID for UniFi Protect to use for when manually triggering
automation. Will be used to generate a thumbnail for testing notifications.
'
default: ''
selector:
text: {}
mode: single
max_exceeded: silent
variables:
input_doorbell: !input doorbell_sensor
input_lock_entity: !input lock_entity
input_lock_tts: !input lock_tts
input_wait_tts: !input wait_tts
input_tts_target: !input tts_target
input_channel: !input channel
input_lovelace_view: !input lovelace_view
input_notify_target_app: !input notify_target_app
color: !input color
icon: !input icon
input_silence_timer: !input silence_timer
input_time_format: !input time_format
input_debug_event_id: !input debug_event_id
input_cooldown: !input cooldown
input_video_cutoff: !input video_cutoff
lovelace_view: '{{ input_lovelace_view | trim }}'
is_manual: '{{ ''from_state'' not in trigger }}'
notification_channel: "{% if is_manual %}\n Manual {{ input_channel }}\n{% else
%}\n {{ input_channel }}\n{% endif %}\n"
entity_id: '{% if is_manual %}{{ input_doorbell[0] }}{% else %}{{ trigger.entity_id
}}{% endif %}'
device_id: '{{ device_id(entity_id) }}'
device_name: '{{ device_attr(device_id, ''name'') }}'
camera_entities: '[{% for eid in device_entities(device_id) %}{%if eid.startswith(''camera'')
and not ''package'' in eid and not is_state(eid, ''unavailable'') %}"{{ eid }}",{%
endif %}{% endfor %}]'
camera_entity_id: '{{ camera_entities | default([None]) | first }}'
lock_entity_id: '{{ input_lock_entity or '''' }}'
media_entities: '[{% for eid in device_entities(device_id) %}{%if eid.startswith(''media_player'')
and not is_state(eid, ''unavailable'') %}"{{ eid }}",{% endif %}{% endfor %}]'
media_entity_id: '{{ media_entities | default([None]) | first }}'
event_id: '{% if is_manual %}{{ input_debug_event_id }}{% else %}{{ state_attr(entity_id,
''event_id'') }}{% endif %}'
video_end: '{{ states[entity_id].last_changed.isoformat() }}'
trigger_time: "{% if states[entity_id] == None %}\n None\n{% else %}\n {{ as_local(states[entity_id].last_changed).strftime(input_time_format)
}}\n{% endif %}\n"
notification_title: '{{ device_name }}: Doorbell Ring'
notification_tag: '{{ notification_channel.lower().replace('' '', ''-'') }}'
notification_message: '{{ device_name }} was rung{% if trigger_time != None %} at
{{ trigger_time }}{% endif %}.'
notification_image: /api/unifiprotect/thumbnail/{{ config_entry_id(entity_id) }}/{{
event_id }}
notification_url: "{% if lovelace_view == \"\" %}\n None\n{% else %}\n {{ lovelace_view
}}\n{% endif %}\n"
unlock_text: '{% if lock_entity_id.startswith(''cover'') %}Open Gate{% else %}Unlock
Door{% endif %}'
unlock_service: '{% if lock_entity_id.startswith(''cover'') %}cover.open_cover{%
else %}lock.unlock{% endif %}'
unlock_action: unlock-ring-{{ lock_entity_id }}
silence_action: silence-ring-{{ entity_id }}
tts_action: tts-ring-{{ input_doorbell }}
lock_tts_enabled: '{{ input_tts_target != '''' and input_lock_tts != '''' and media_entity_id
!= None }}'
wait_tts_enabled: '{{ input_tts_target != '''' and input_wait_tts != '''' and media_entity_id
!= None }}'
trigger:
- platform: state
entity_id: !input doorbell_sensor
from: 'off'
to: 'on'
action:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
color: "{{color}}"
notification_icon: "{{icon}}"
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif %}\n"
time-sensitive: 1
image: '{{ notification_image }}'
entity_id: '{{ camera_entity_id }}'
actions: '[{% if notification_url != None %} { "action": "URI", "title": "Open
Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if lock_entity_id
!= "" %} { "action": "{{ unlock_action }}", "title": "{{ unlock_text }}" },
{% endif %} {% if wait_tts_enabled %} { "action": "{{ tts_action }}", "title":
"Respond" }, {% endif %} {% if input_silence_timer > 0 %} { "action": "{{
silence_action }}", "title": "Silence", "destructive": True }, {% endif %}]
'
- choose:
- conditions:
- condition: template
value_template: '{{ input_video_cutoff > 0 }}'
sequence:
- service: '{{ input_notify_target_app }}'
data:
message: '{{ notification_message }}'
title: '{{ notification_title }}'
data:
tag: '{{ notification_tag }}'
channel: '{{ notification_channel }}'
color: "{{color}}"
notification_icon: "{{icon}}"
ttl: 0
priority: high
alert_once: "{% if tag != \"\" %}\n true\n{% else %}\n false\n{% endif
%}\n"
time-sensitive: 1
image: '{{ notification_image }}'
video: /api/unifiprotect/video/{{ config_entry_id(entity_id) }}/{{ entity_id
}}/{{ (as_datetime(video_end) - timedelta(seconds=input_video_cutoff)).isoformat()
}}/{{ video_end }}
entity_id: '{{ camera_entity_id }}'
actions: '[{% if notification_url != None %} { "action": "URI", "title":
"Open Camera", "uri": "{{ notification_url }}" }, {% endif %} {% if lock_entity_id
!= "" %} { "action": "{{ unlock_action }}", "title": "{{ unlock_text }}"
}, {% endif %} {% if wait_tts_enabled %} { "action": "{{ tts_action }}",
"title": "Respond" }, {% endif %} {% if input_silence_timer > 0 %} { "action":
"{{ silence_action }}", "title": "Silence", "destructive": True }, {%
endif %}]
'
- wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ silence_action }}'
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ unlock_action }}'
- platform: event
event_type: mobile_app_notification_action
event_data:
action: '{{ tts_action }}'
- platform: event
event_type: mobile_app_notification_cleared
event_data:
message: '{{ notification_message }}'
timeout:
seconds: '{{ input_cooldown }}'
continue_on_timeout: false
- choose:
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' and wait.trigger.event.data.action ==
silence_action }}'
sequence:
- delay:
minutes: '{{ input_silence_timer }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' and wait.trigger.event.data.action ==
unlock_action }}'
sequence:
- service: '{{ unlock_service }}'
data:
entity_id: '{{ lock_entity_id }}'
- choose:
- conditions: '{{ lock_tts_enabled }}'
sequence:
- service: '{{ input_tts_target }}'
data:
entity_id: '{{ media_entity_id }}'
message: '{{ input_lock_tts }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_action'' and wait.trigger.event.data.action ==
tts_action }}'
sequence:
- service: '{{ input_tts_target }}'
data:
entity_id: '{{ media_entity_id }}'
message: '{{ input_wait_tts }}'
- conditions:
- condition: template
value_template: '{{ wait.trigger.platform == ''event'' and wait.trigger.event.event_type
== ''mobile_app_notification_cleared'' }}'
sequence:
- delay:
seconds: '{{ max([input_cooldown - (wait.trigger.event.time_fired - as_datetime(video_end)).total_seconds(),
5]) }}'
Does anyone else have this problem?
can anyone help?
Many thanks and greetings
@Rockhound53 I have had similar. The only thing that worked for me was downgrading Unif Protect back to 4.0.33 by SSHing into Unifi, apt-get update
and then apt-get install --reinstall --allow-downgrades unifi-protect=4.0.33 -y
@Rockhound53 @Townsmcp I haven’t had much time to dig into this myself but I’m also experiencing this issue. The main source of the issue seems to be changes in how the Person detection is working.
The object detection sensor is working like the how the person detection worked before the upgrade i.e. it turns on as soon as an object is detected and turns off shortly after the object is no longer detected.
The person detect sensor no longer turns on when a person is decked…instead…it quickly toggles on and off once the detection STOPS. This might explain why the video notification never works…it’s trying to send a video of 0 length.
I’ll play around once I have more time but hopefully this is enough for @bdraco to start preliminary investigations into why the changes are occurring with the latest Protect update.
There are at least 2 open issues related to this in GitHub.
Edit: I see what I mentioned above was already being discussed in one of the threads. Should have read them both before testing/posting…lol.
This is all working again with Version 5 of Protect.
This blueprint has the people home filter, but what would be great is if there was an alarm filter as an alternative. That would mean you could only get notified if the alarm was “armed away” or something like that. Maybe i should have a go at editing the yaml… its been a while.
There’s already an option for that in the blueprint.
Apologies, I must have an older version. I’ll update with the yaml above
Edit: yep, the versions above were newer than what i already had, updated to those versions
Are the snapshot notifications on iOS working for others still using these Blueprints?
I had this “Failed to load attachment” issue last year with one of my cameras as reported above in this thread, but I have yet to find a fix. It seems to have spread to others, making the push notifications from these Blueprints not nearly as useful. I’m wondering if one of the recent UniFi Protect updates changed something (currently on Protect 5.0.51).
I’ve started this new thread on the topic to see if I can find a fix before reverting to dumb-down automations for push alerts from UniFi cameras.
@ziptbm I do get this a few times a day but sometimes the image does come through. I put it down to using Frigate/Double Take and sharing the stream from Scrypted - the blueprint grabs the image direct from the camera and my thinking is concurrent requests for snapshot is why I get the error