2026.6.28 - Snapshot storage and alert images for motion events
Please read before upgrading, as this release includes important and potentially breaking changes for notification automations.
Snapshot services now save to protected local media by default
The snapshot services now save their primary image under Home Assistant local media:
/media/blueiris/...
and return a Home Assistant media URL:
/media/local/blueiris/...
This affects:
blueiris.latest_motion_event_snapshot
blueiris.current_camera_snapshotThis is more secure than saving everything under /config/www, because /local/... files can be accessed without Home Assistant authentication.
Optional public copy for legacy /local/... URLs
Both snapshot services now support:
create_public_copy: trueWhen enabled, the service still saves the protected media copy, but also saves a second copy under:
/config/www/blueiris/...
and returns:
public_snapshot_url: /local/blueiris/...
public_saved_path: /config/www/blueiris/...This is intended for legacy/custom Companion App clickAction, url, or other raw image URL use cases.
Public copies are disabled by default because /local/... files are accessible without Home Assistant authentication.
Latest motion event snapshots now use Blue Iris alert images
Thanks to tankdeer for calling this out.
blueiris.latest_motion_event_snapshot now fetches the latest Blue Iris alert image for the selected camera instead of simply grabbing a current live still.
This should make motion notifications better match the actual Blue Iris alert.
The service now prefers saved Blue Iris alert JPEG files and requests the full JPEG image when available. If a saved alert JPEG is not available, it falls back to the Blue Iris alert record reference.
To get hi-res alert images, make sure Blue Iris is configured to save alert JPEGs for the camera.
Existing alerts will not be retroactively upgraded. Test with a new alert after changing Blue Iris alert/JPEG settings.
Important note for custom automations
If you have custom automations that hardcoded the old public snapshot path:
/local/blueiris/...
you should update them to use the service response instead.
Companion App:
image: "{{ bi_snapshot.snapshot_url }}?v={{ now().timestamp() }}"Telegram:
file: "{{ bi_snapshot.saved_path }}"If you specifically need the old public /local/... behavior, enable the public copy:
- action: blueiris.latest_motion_event_snapshot
target:
entity_id: camera.driveway
data:
create_public_copy: true
response_variable: bi_snapshotThen use:
clickAction: "{{ bi_snapshot.public_snapshot_url }}?v={{ now().timestamp() }}"
url: "{{ bi_snapshot.public_snapshot_url }}?v={{ now().timestamp() }}"The mobile device must be able to reach Home Assistant to load images when using Companion App notifications. Otherwise, the notification should arrive but the image may not display.
Blueprint users
If you use the Blue Iris notification blueprints, re-import/update them so they use the latest snapshot-service response behavior.
The blueprints do not need create_public_copy for normal use. That option is mainly for custom automations or legacy Companion App clickAction/raw image URL workflows. If enough users are using the blueprints and want public copy as an option, I can add it.
Upgrade checklist
- Update the integration.
- Restart Home Assistant.
- Re-import/update the Blue Iris notification blueprints if you use them.
- Review any custom automations that hardcoded
/local/blueiris/.... - Use
snapshot_url/saved_pathfrom the service response instead of hardcoded paths. - Use
create_public_copy: trueonly if you need a public/local/blueiris/...URL. - Trigger a new Blue Iris alert and confirm the service response includes the expected image path and alert metadata.
Example updated automation
alias: Blue Iris - Example Automation
description: ""
mode: queued
triggers:
- trigger: state
entity_id:
- sensor.driveway_last_motion_event
attribute: last_detection
conditions:
- condition: template
value_template: >
{{ trigger.to_state.state not in ['unknown', 'unavailable', 'none', 'idle', 'No event'] }}
actions:
- action: blueiris.latest_motion_event_snapshot
target:
entity_id: camera.driveway
response_variable: bi_snapshot
- action: notify.mobile_app_your_phone
data:
title: "Blue Iris: Driveway"
message: "{{ states('sensor.driveway_last_motion_event') }}"
data:
image: "{{ bi_snapshot.snapshot_url }}?v={{ now().timestamp() }}"Example with public clickAction
alias: Blue Iris - Example Automation with Public ClickAction
description: ""
mode: queued
triggers:
- trigger: state
entity_id:
- sensor.driveway_last_motion_event
attribute: last_detection
conditions:
- condition: template
value_template: >
{{ trigger.to_state.state not in ['unknown', 'unavailable', 'none', 'idle', 'No event'] }}
actions:
- action: blueiris.latest_motion_event_snapshot
target:
entity_id: camera.driveway
data:
create_public_copy: true
response_variable: bi_snapshot
- action: notify.mobile_app_your_phone
data:
title: "Blue Iris: Driveway"
message: "{{ states('sensor.driveway_last_motion_event') }}"
data:
image: "{{ bi_snapshot.snapshot_url }}?v={{ now().timestamp() }}"
clickAction: "{{ bi_snapshot.public_snapshot_url }}?v={{ now().timestamp() }}"
url: "{{ bi_snapshot.public_snapshot_url }}?v={{ now().timestamp() }}"