Frigate Telegram notifications, perfected - but with quite some work on your side

Fixed. copy the action part from the blueprint in first post and override it in your blueprint files.
If its not working well, then you need to go into your telegram bot integration and select default parse mode, then select html.
When editting a caption, selecting parse mode seems to be no longer allowed in home assistant 2026.01. But that was not the only fix, some stricter rules in general had to be dealt with.
It’s working for me again now.

EDIT: do not forget to update all variables as well with your own again as you are taking over the example data. such as:

  • message_tag: telegram_notifications_driveway
  • msg_id: “{{ states(‘input_number.telegram_driveway_message_id’) | int }}”
  • the caption itself.
  • the target for the send_video as its different from the normal chat youre using (usually)

Let me know if it worked for you guys.

The first post has been updated for the home assistant march update that depricates the “target” argument and replaced it with “chat_id”.

I’ve done a fresh installation of Frigate and HA integration. Everything is working except I cannot get a notification using Telegram. Stepping through the Traces the animation stops at: '{{ type != ''end'' }}'.

I follow the instructions above and also have the Telegram integration. I’d appreciate suggestions to enabling notifications. (I’m new to Telegram but seemed to sort out bot and chat id.) Here is my yml:

blueprint:
  name: Frigate - Telegram Notification
  description: Create automations to receive Snapshots and Clips from Frigate
  domain: automation
  input:
    camera:
      name: back_patio
      description: The name of the camera as defined in your frigate configuration
        (/conf.yml).
    target_chat:
      name: Target
      description: 'The chat_id to be used by the Telegram bot. !secret chat_id is
        not allowed on Blueprint, you will need the chat_id code.

        '
    notification:
      name: Notification
      description: 'Select "true" to disable notification, lave "false" to receive
        notification. '
      selector:
        select:
          options:
          - 'true'
          - 'false'
          multiple: false
          custom_value: false
          sort: false
      default: 'false'
    base_url:
      name: (Optional) Base URL
      description: The external url for your Home Assistant instance. This will default
        to a relative URL and will open the clips in the app instead of the browser,
        which may cause issues on some devices.
      default: ''
    zone_filter:
      name: (Optional) Zone Filter
      description: Only notify if object has entered a defined zone.
      default: false
      selector:
        boolean: {}
    zones:
      name: (Optional) Trigger Zones
      description: A list (-) of zones you wish to recieve notifications for.
      default: []
      selector:
        object:
          multiple: false
    labels:
      name: (Optional) Trigger Objects
      description: A list (-) of objects you wish to recieve notifications for.
      default: []
      selector:
        object:
          multiple: false
    presence_filter:
      name: (Optional) Presence Filter
      description: Only notify if selected presence entity is not "home".
      default: ''
      selector:
        entity:
          multiple: false
          reorder: false
  source_url: https://gist.github.com/NdR91/5486a1e55101e062c48545395b7dd9a3
mode: single
max_exceeded: silent
trigger:
  platform: mqtt
  topic: frigate/events
  payload: !input camera
  value_template: '{{ value_json[''after''][''camera''] }}'
variables:
  id: '{{ trigger.payload_json[''after''][''id''] }}'
  camera: '{{ trigger.payload_json[''after''][''camera''] }}'
  camera_name: '{{ camera | replace(''_'', '' '') | title }}'
  target_chat: !input target_chat
  object: '{{ trigger.payload_json[''after''][''label''] }}'
  label: '{{ object | title }}'
  entered_zones: '{{ trigger.payload_json[''after''][''entered_zones''] }}'
  type: '{{ trigger.payload_json[''type''] }}'
  base_url: !input base_url
  zone_only: !input zone_filter
  input_zones: !input zones
  zones: '{{ input_zones | list }}'
  input_labels: !input labels
  labels: '{{ input_labels | list }}'
  presence_entity: !input presence_filter
  notification: !input notification
condition:
- '{{ type != ''end'' }}'
- '{{ not zone_only or entered_zones|length > 0 }}'
- '{{ not zones|length or zones|select(''in'', entered_zones)|list|length > 0 }}'
- '{{ not labels|length or object in labels }}'
- '{{ not presence_entity or not is_state(presence_entity, ''home'') }}'
action:
- service: telegram_bot.send_photo
  data:
    chat_id:
      -1234567890 (Not my real id)
    disable_notification: '{{ notification }}'
    caption: 'Movimento rilevato. Telecamera: {{ camera_name }} (ID: {{ id }})

      '
    url: '{{base_url}}/api/frigate/notifications/{{id}}/snapshot.jpg'
- repeat:
    sequence:
    - wait_for_trigger:
      - platform: mqtt
        topic: frigate/events
        payload: '{{ id }}'
        value_template: '{{ value_json[''after''][''id''] }}'
      timeout:
        minutes: 2
      continue_on_timeout: false
    - condition: template
      value_template: '{{ wait.trigger.payload_json[''type''] == ''end'' }}'
    - service: telegram_bot.send_video
      data:
        target: '{{ target_chat }}'
        disable_notification: '{{ notification }}'
        caption: 'Movimento rilevato. Telecamera: {{ camera_name }}'
        url: '{{base_url}}/api/frigate/notifications/{{id}}/{{camera}}/clip.mp4'
    until: '{{ wait.trigger.payload_json[''type''] == ''end'' }}'