Skip to content

2026.6.28

Latest

Choose a tag to compare

@kramttocs kramttocs released this 28 Jun 15:27
61f2679

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_snapshot

This 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: true

When 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_snapshot

Then 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

  1. Update the integration.
  2. Restart Home Assistant.
  3. Re-import/update the Blue Iris notification blueprints if you use them.
  4. Review any custom automations that hardcoded /local/blueiris/....
  5. Use snapshot_url / saved_path from the service response instead of hardcoded paths.
  6. Use create_public_copy: true only if you need a public /local/blueiris/... URL.
  7. 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() }}"