HA_blueprints icon indicating copy to clipboard operation
HA_blueprints copied to clipboard

Snapshot to Telegram

Open Moras360 opened this issue 1 year ago • 3 comments

Describe the problem you are having or the outcome you are trying to achieve.

I am receiving notification messages, but not images are pulling through to Telegram.

Version

0.12.0.2

Automation config file

mode: parallel
trigger_variables:
  input_camera: camera.hq1_test
  camera: '{{ input_camera | replace(''camera.'', '''') }}'
trigger:
  - platform: event
    event_type: mobile_app_notification_action
    event_data:
      action: silence-{{ camera }}
    id: silence
  - platform: mqtt
    topic: frigate/events
    payload: '{{ camera }}/new'
    value_template: >-
      {{ value_json['after']['camera'] | lower | replace('-','_') }}/{{
      value_json['type']}}
    id: frigate-event
variables:
  input_camera: camera.hq1_test
  camera: '{{ input_camera | replace(''camera.'', '''') }}'
  camera_name: '{{ camera | replace(''_'', '' '') | title }}'
  input_base_url: 192.168.0.***:8123
  base_url: '{{ input_base_url.rstrip(''/'')}}'
  attachment: snapshot
  critical_input: 'false'
  critical: '{{ true if critical_input == ''true'' else false }}'
  alert_once: false
  update_thumbnail: false
  ios_live_view: false
  group: telegram
  group_target: '{{ group | lower | replace(''notify.'', '''') | replace('' '',''_'') }}'
  zone_only: false
  input_zones: []
  zones: '{{ input_zones | list | lower }}'
  zone_multi: false
  input_labels: ''
  labels: '{{ input_labels | list | lower }}'
  presence_entity: ''
  disable_times: []
  cooldown: 30
  loitering: false
  loiter_timer: 0
  fps: '{{ states(''sensor.'' + camera + ''_camera_fps'')|int(5) }}'
  state_only: false
  input_entity: ''
  input_states: []
  states_filter: '{{ input_states | list | lower }}'
  color: steelblue
  sound: default
  tv: false
  tv_position: center
  tv_size: large
  tv_duration: 10
  tv_transparency: 0%
  tv_interrupt: false
  debug: false
action:
  - choose:
      - alias: Silence New Object Notifications
        conditions:
          - condition: trigger
            id: silence
        sequence:
          - service: automation.turn_off
            target:
              entity_id: '{{ this.entity_id }}'
            data:
              stop_actions: false
          - delay:
              minutes: 30
          - service: automation.turn_on
            target:
              entity_id: '{{ this.entity_id }}'
      - alias: Frigate Event
        conditions:
          - condition: trigger
            id: frigate-event
          - '{{ is_state(this.entity_id, ''on'') }}'
          - >-
            {{ not this.attributes.last_triggered or (now() -
            this.attributes.last_triggered).seconds > cooldown }}
          - >-
            {{ not disable_times|length or not now().hour in
            disable_times|map('int')|list }}
        sequence:
          - variables:
              id: '{{ trigger.payload_json[''after''][''id''] }}'
              object: '{{ trigger.payload_json[''after''][''label''] }}'
              label: '{{ object | title }}'
              initial_home: >-
                {{ presence_entity != '' and is_state(presence_entity, 'home')
                }}
              initial_entered_zones: '{{ trigger.payload_json[''after''][''entered_zones''] |lower}}'
              zone_multi_filter: >-
                {{zone_only and zone_multi and initial_entered_zones|length and
                zones and zones |reject('in', initial_entered_zones) |list
                |length == 0 }}
              title: ''
              message: Person  detected HQ1 CAM
              tap_action: >-
                http://192.168.0.***:8123/api/frigate/notifications/<event-id>/snapshot.jpg
              button_1: View Snapshot
              button_2: View Snapshot
              button_3: Silence New Notifications
              url_1: >-
                https://192.168.0.***:8123/api/frigate/notifications/<event-id>/snapshot.jpg
              url_2: >-
                https://192.168.0.***:8123/api/frigate/notifications/<event-id>/snapshot.jpg
              url_3: silence-{{ camera }}
              icon: mdi:home-assistant
              channel: ''
          - alias: 'Debug: write to Log'
            choose:
              - conditions:
                  - '{{debug}}'
                sequence:
                  - service: logbook.log
                    data_template:
                      name: Frigate Notification
                      message: |
                        DEBUG: 
                          Info:
                            fps: {{fps}}, 
                            frigate event id: {{id}}, 
                            object (formatted): {{object}} ({{label}}),
                          Config: 
                            camera(formatted): {{camera}}({{camera_name}}), 
                            Base URL: {{base_url}}, 
                            critical: {{critical}}, 
                            alert once: {{alert_once}}, 
                            Update Thumbnails: {{update_thumbnail}}, 
                            Target: {{'group (input/formatted): ' + group + '/' + group_target + ', ' if group else 'Mobile Device'}}
                            cooldown: {{cooldown}}s, 
                            loiter timer: {{loiter_timer}}s,
                            color: {{color}}, 
                            sound: {{sound}},
                            Title: {{title}}, 
                            Message: {{message}},
                            tap_action: {{tap_action}}, 
                            button 1 Text/URL: {{iif(button_1, button_1, 'unset')}} ({{url_1}}), 
                            button 2 Text/URL: {{button_2}} ({{url_2}}), 
                            button 3 Text/URL: {{button_3}} ({{url_3}}), 
                            icon: {{icon}}
                            tv: {{tv}}, 
                            tv_position: {{tv_position}}, 
                            tv_size: {{tv_size}}, 
                            tv_duration: {{tv_duration}}, 
                            tv_transparency: {{tv_transparency}}, 
                            tv_interrupt: {{tv_interrupt}}, 
                          Filters: 
                            Zones: 
                              zone filter toggle on: {{zone_only}}, 
                              Multi Zone toggle on: {{zone_multi}}, 
                              Required zones: {{input_zones}}, 
                              Entered Zones: {{initial_entered_zones}}, 
                              Zone Filter TEST: {{'PASS (Multi)' if zone_multi_filter else 'PASS' if ( not zone_only or not zone_multi and zones|select('in', initial_entered_zones)|list|length ) else 'FAIL (Multi)' if zone_multi else 'FAIL' }}, 
                            Required objects TEST: 
                              Input: {{input_labels}}, 
                              TEST: {{'PASS' if not labels|length or object in labels else 'FAIL'}}
                            presence entity (not home):
                              Entity: {{presence_entity}}
                              TEST:  {{'PASS' if not initial_home else 'FAIL'}}, 
                            disabled times: {{disable_times}}, 
                            State Filter: 
                              state filter toggle on: {{state_only}}, 
                              state filter entity: {{input_entity}}, 
                              required states: {{input_states}}, 
                              State Filter TEST: {{'PASS' if not state_only or states(input_entity) in states_filter else 'FAIL' }},
          - alias: Notifications enabled for object label
            condition: template
            value_template: '{{ not labels|length or object in labels }}'
          - alias: Notify on new object
            choose:
              - conditions:
                  - >-
                    {{ not zone_only or (not zone_multi and zones|select('in',
                    initial_entered_zones)|list|length > 0) or (zone_multi and
                    initial_entered_zones|length > 0 and zones |reject('in',
                    initial_entered_zones) |list |length == 0) }}
                  - '{{ not initial_home }}'
                  - >-
                    {{ not state_only or states(input_entity) in states_filter
                    }}
                sequence:
                  - choose:
                      - conditions: '{{ not group_target }}'
                        sequence:
                          - device_id: 6a18e026f421595f3237bd5f19c57ee2
                            domain: mobile_app
                            type: notify
                            title: '{{title}}'
                            message: '{{message}}'
                            data:
                              tag: '{{ id }}'
                              group: '{{ camera }}-frigate-notification'
                              color: '{{color}}'
                              image: >-
                                /api/frigate/notifications/{{id}}/{{attachment}}.jpg?format=android
                              clickAction: '{{tap_action}}'
                              ttl: '{{ iif(critical, 0, 3600000) }}'
                              priority: '{{ iif(critical, ''high'', ''normal'') }}'
                              notification_icon: '{{icon}}'
                              channel: '{{channel}}'
                              url: '{{tap_action}}'
                              attachment:
                                url: >-
                                  /api/frigate/notifications/{{id}}/{{attachment}}.jpg
                              push:
                                sound: '{{sound}}'
                                interruption-level: '{{ iif(critical, ''critical'', ''active'') }}'
                              entity_id: '{{ iif(ios_live_view, input_camera, '''' ) }}'
                              actions:
                                - action: URI
                                  title: '{{button_1}}'
                                  uri: '{{url_1}}'
                                - action: URI
                                  title: '{{button_2}}'
                                  uri: '{{url_2}}'
                                - action: '{{ ''URI'' if ''/'' in url_3 else url_3 }}'
                                  title: '{{button_3}}'
                                  uri: '{{url_3}}'
                                  destructive: true
                      - conditions: '{{ tv }}'
                        sequence:
                          - service: notify.{{ group_target }}
                            data:
                              title: '{{title}}'
                              message: '{{message}}'
                              data:
                                tag: '{{ id }}'
                                group: '{{ camera }}-frigate-notification'
                                color: '{{color}}'
                                clickAction: '{{tap_action}}'
                                ttl: '{{ iif(critical, 0, 3600000) }}'
                                priority: '{{ iif(critical, ''high'', ''normal'') }}'
                                notification_icon: '{{icon}}'
                                channel: '{{channel}}'
                                image:
                                  url: >-
                                    {{base_url}}/api/frigate/notifications/{{id}}/snapshot.jpg
                                fontsize: '{{tv_size}}'
                                position: '{{tv_position}}'
                                duration: '{{tv_duration}}'
                                transparency: '{{tv_transparency}}'
                                interrupt: '{{tv_interrupt}}'
                                timeout: 30
                                url: '{{tap_action}}'
                                attachment:
                                  url: >-
                                    /api/frigate/notifications/{{id}}/{{attachment}}.jpg
                                push:
                                  sound: '{{sound}}'
                                interruption-level: '{{ iif(critical, ''critical'', ''active'') }}'
                                entity_id: '{{ iif(ios_live_view, input_camera, '''' ) }}'
                                actions:
                                  - action: URI
                                    title: '{{button_1}}'
                                    uri: '{{url_1}}'
                                  - action: URI
                                    title: '{{button_2}}'
                                    uri: '{{url_2}}'
                                  - action: '{{ ''URI'' if ''/'' in url_3 else url_3 }}'
                                    title: '{{button_3}}'
                                    uri: '{{url_3}}'
                                    destructive: true
                    default:
                      - service: notify.{{ group_target }}
                        data:
                          title: '{{title}}'
                          message: '{{message}}'
                          data:
                            tag: '{{ id }}{{''-loitering'' if loitering}}'
                            group: >-
                              {{ camera }}-frigate-notification{{'-loitering' if
                              loitering}}
                            color: '{{color}}'
                            image: >-
                              /api/frigate/notifications/{{id}}/{{attachment}}.jpg?format=android
                            clickAction: '{{tap_action}}'
                            ttl: '{{ iif(critical, 0, 3600000) }}'
                            priority: '{{ iif(critical, ''high'', ''normal'') }}'
                            notification_icon: '{{icon}}'
                            channel: '{{channel}}'
                            fontsize: '{{tv_size}}'
                            position: '{{tv_position}}'
                            duration: '{{tv_duration}}'
                            transparency: '{{tv_transparency}}'
                            interrupt: '{{tv_interrupt}}'
                            url: '{{tap_action}}'
                            attachment:
                              url: >-
                                /api/frigate/notifications/{{id}}/{{attachment}}.jpg
                            push:
                              sound: '{{sound}}'
                              interruption-level: '{{ iif(critical, ''critical'', ''active'') }}'
                            entity_id: '{{ iif(ios_live_view, input_camera, '''' ) }}'
                            actions:
                              - action: URI
                                title: '{{button_1}}'
                                uri: '{{url_1}}'
                              - action: URI
                                title: '{{button_2}}'
                                uri: '{{url_2}}'
                              - action: '{{ ''URI'' if ''/'' in url_3 else url_3 }}'
                                title: '{{button_3}}'
                                uri: '{{url_3}}'
                                destructive: true
          - 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
                - variables:
                    event: '{{ wait.trigger.payload_json }}'
                    loitering: >-
                      {{ loiter_timer and
                      event['before']['motionless_count']/fps/60 < loiter_timer
                      and event['after']['motionless_count']/fps/60 >=
                      loiter_timer }}
                    new_snapshot: >-
                      {{ update_thumbnail and event['before']['snapshot_time']
                      != event['after']['snapshot_time'] }}
                    home: >-
                      {{ presence_entity != '' and is_state(presence_entity,
                      'home') }}
                    presence_changed: >-
                      {{ presence_entity != '' and
                      as_datetime(event['before']['frame_time']) <
                      states[presence_entity].last_changed }}
                    last_zones: '{{ event[''before''][''entered_zones''] |lower}}'
                    entered_zones: '{{ event[''after''][''entered_zones''] |lower}}'
                    zone_filter: >-
                      {{ not zone_only or zones|select('in',
                      entered_zones)|list|length > 0 }}
                    zone_multi_filter: >-
                      {{not zone_only or not zone_multi or (
                      entered_zones|list|length > 0 and zones and
                      zones|reject('in', entered_zones)|list|length == 0 ) }}
                    stationary_moved: >-
                      {{ event['after']['position_changes'] >
                      event['before']['position_changes'] }}
                    zone_only_changed: >-
                      {{ zone_only and (entered_zones|length > 0 and not
                      last_zones|length) }}
                    entered_zones_changed: >-
                      {{ zones|length > 0 and (zones|select('in',
                      entered_zones)|list|length > 0 and not zones|select('in',
                      last_zones)|list|length) }}
                    state_true: >-
                      {{ not state_only or states(input_entity) in states_filter
                      }}
                    sub_label: '{{ event[''after''][''sub_label'']}}'
                    sub_label_changed: '{{ sub_label != event[''before''][''sub_label''] }}'
                    update: >-
                      {{ alert_once or (new_snapshot and not loitering and not
                      presence_changed and not zone_only_changed and not
                      entered_zones_changed and not sub_label_changed) }}
                    title: |
                      {% if sub_label %} 
                        {{title | replace('A Person', sub_label|title) | replace('Person', sub_label|title)}}
                      {%else%}
                        {{title}}
                      {%endif%}
                    message: |
                      {% if sub_label %} 
                        {{message | replace('A Person', sub_label|title) | replace('Person', sub_label|title)}}
                      {%else%}
                        {{message}}
                      {%endif%}
                - alias: 'Debug: write to Log'
                  choose:
                    - conditions:
                        - '{{debug}}'
                      sequence:
                        - service: logbook.log
                          data_template:
                            name: Frigate Notification
                            message: |
                              DEBUG (in loop): 
                                Info: 
                                  Last Zones: {{last_zones}}, 
                                  Current zones: {{entered_zones}}, 
                                  sublabel: {{sub_label}},
                                  iOS sound: {{update if not critical else 'yes due critical notifications'}}, 
                                  Android Sound: {{'disabled by alert once' if alert_once else 'enabled'}}, 
                                Triggers: 
                                  New Snapshot: {{new_snapshot}}, 
                                  Presence Changed: {{presence_changed}}, 
                                  stationary moved: {{stationary_moved}}, 
                                  entered zones changed: {{entered_zones_changed}}, 
                                  sublabel changed: {{sub_label_changed}}, 
                                Conditions: 
                                  Loitering: {{loitering}}
                                    or 
                                  Presence Entity not home: {{'ON' if presence_entity != '' else 'OFF'}} - {{'PASS' if not home else 'FAIL'}}, 
                                  zone filter TEST: {{'ON' if zone_only else 'OFF'}} - {{'PASS' if zone_filter else 'FAIL'}}, 
                                  multi-zone filter: {{'OFF' if not zone_only or not zone_multi else 'ON'}} - {{'PASS' if not zone_only or not zone_multi or ( entered_zones|length and zones and zones |reject('in', entered_zones) |list |length == 0 ) else 'FAIL'}}, 
                                  state filter TEST: {{'ON' if state_only else 'OFF'}} - {{'PASS' if state_true else 'FAIL'}}

                                  image: "/api/frigate/notifications/{{id}}/{{attachment}}.jpg"
                - alias: Notify on loitering or significant change
                  choose:
                    - conditions: >-
                        {{ loitering or (not home and zone_filter and
                        zone_multi_filter and state_true and (new_snapshot or
                        presence_changed or stationary_moved or
                        zone_only_changed or entered_zones_changed or
                        sub_label_changed)) }}
                      sequence:
                        - choose:
                            - conditions: '{{ not group_target }}'
                              sequence:
                                - device_id: 6a18e026f421595f3237bd5f19c57ee2
                                  domain: mobile_app
                                  type: notify
                                  title: '{{title}}'
                                  message: '{{message}}'
                                  data:
                                    tag: '{{ id }}{{''-loitering'' if loitering}}'
                                    group: >-
                                      {{ camera
                                      }}-frigate-notification{{'-loitering' if
                                      loitering}}
                                    color: '{{color}}'
                                    image: >-
                                      /api/frigate/notifications/{{id}}/{{attachment}}.jpg?format=android
                                    clickAction: '{{tap_action}}'
                                    ttl: '{{ iif(critical, 0, 3600000) }}'
                                    priority: '{{ iif(critical, ''high'', ''normal'') }}'
                                    alert_once: '{{ alert_once }}'
                                    notification_icon: '{{icon}}'
                                    channel: '{{channel}}'
                                    url: '{{tap_action}}'
                                    attachment:
                                      url: >-
                                        /api/frigate/notifications/{{id}}/{{attachment}}.jpg
                                    push:
                                      sound: '{{ iif(update, ''none'', sound) }}'
                                      interruption-level: >-
                                        {{ iif(critical, 'critical', 'active')
                                        }}
                                    entity_id: >-
                                      {{ iif(ios_live_view, input_camera, '' )
                                      }}
                                    actions:
                                      - action: URI
                                        title: '{{button_1}}'
                                        uri: '{{url_1}}'
                                      - action: URI
                                        title: '{{button_2}}'
                                        uri: '{{url_2}}'
                                      - action: '{{ ''URI'' if ''/'' in url_3 else url_3 }}'
                                        title: '{{button_3}}'
                                        uri: '{{url_3}}'
                                        destructive: true
                            - conditions: '{{ tv }}'
                              sequence:
                                - service: notify.{{ group_target }}
                                  data:
                                    title: '{{title}}'
                                    message: '{{message}}'
                                    data:
                                      tag: '{{ id }}{{''-loitering'' if loitering}}'
                                      group: >-
                                        {{ camera
                                        }}-frigate-notification{{'-loitering' if
                                        loitering}}
                                      color: '{{color}}'
                                      clickAction: '{{tap_action}}'
                                      ttl: '{{ iif(critical, 0, 3600000) }}'
                                      priority: '{{ iif(critical, ''high'', ''normal'') }}'
                                      alert_once: '{{ alert_once }}'
                                      notification_icon: '{{icon}}'
                                      channel: '{{channel}}'
                                      image:
                                        url: >-
                                          {{base_url}}/api/frigate/notifications/{{id}}/snapshot.jpg
                                      fontsize: '{{tv_size}}'
                                      position: '{{tv_position}}'
                                      duration: '{{tv_duration}}'
                                      transparency: '{{tv_transparency}}'
                                      interrupt: '{{tv_interrupt}}'
                                      timeout: 30
                                      url: '{{tap_action}}'
                                      attachment:
                                        url: >-
                                          /api/frigate/notifications/{{id}}/{{attachment}}.jpg
                                      push:
                                        sound: '{{ iif(update, ''none'', sound) }}'
                                      interruption-level: >-
                                        {{ iif(critical, 'critical', 'active')
                                        }}
                                      entity_id: >-
                                        {{ iif(ios_live_view, input_camera, '' )
                                        }}
                                      actions:
                                        - action: URI
                                          title: '{{button_1}}'
                                          uri: '{{url_1}}'
                                        - action: URI
                                          title: '{{button_2}}'
                                          uri: '{{url_2}}'
                                        - action: '{{ ''URI'' if ''/'' in url_3 else url_3 }}'
                                          title: '{{button_3}}'
                                          uri: '{{url_3}}'
                                          destructive: true
                          default:
                            - service: notify.{{ group_target }}
                              data:
                                title: '{{title}}'
                                message: '{{message}}'
                                data:
                                  tag: '{{ id }}{{''-loitering'' if loitering}}'
                                  group: >-
                                    {{ camera
                                    }}-frigate-notification{{'-loitering' if
                                    loitering}}
                                  color: '{{color}}'
                                  image: >-
                                    /api/frigate/notifications/{{id}}/{{attachment}}.jpg?format=android
                                  clickAction: '{{tap_action}}'
                                  ttl: '{{ iif(critical, 0, 3600000) }}'
                                  priority: '{{ iif(critical, ''high'', ''normal'') }}'
                                  alert_once: '{{ alert_once }}'
                                  notification_icon: '{{icon}}'
                                  channel: '{{channel}}'
                                  fontsize: '{{tv_size}}'
                                  position: '{{tv_position}}'
                                  duration: '{{tv_duration}}'
                                  transparency: '{{tv_transparency}}'
                                  interrupt: '{{tv_interrupt}}'
                                  url: '{{tap_action}}'
                                  attachment:
                                    url: >-
                                      /api/frigate/notifications/{{id}}/{{attachment}}.jpg
                                  push:
                                    sound: '{{ iif(update, ''none'', sound) }}'
                                    interruption-level: '{{ iif(critical, ''critical'', ''active'') }}'
                                  entity_id: '{{ iif(ios_live_view, input_camera, '''' ) }}'
                                  actions:
                                    - action: URI
                                      title: '{{button_1}}'
                                      uri: '{{url_1}}'
                                    - action: URI
                                      title: '{{button_2}}'
                                      uri: '{{url_2}}'
                                    - action: '{{ ''URI'' if ''/'' in url_3 else url_3 }}'
                                      title: '{{button_3}}'
                                      uri: '{{url_3}}'
                                      destructive: true
              until: >-
                {{ not wait.trigger or wait.trigger.payload_json['type'] ==
                'end' }}
id: '1702475305392'
alias: 'Frigate Notifications '
description: Send notifications based on events triggered by camera

Frigate Config

mqtt:
  host: 192.168.0.***
  user: admin
  password: *****

ffmpeg:
  hwaccel_args: preset-vaapi
    
birdseye:
 enabled: true
 restream: true
 quality: 1
 height: 2688
 width: 1520
 mode: continuous 
    
cameras:
  HQ1_TEST:
    ffmpeg:
      inputs:
      #High Res stream for recording:
      #   - path: rtsp://ha:***********@10.1.1.***:554/cam/realmonitor?channel=1&subtype=0
      #     roles:
      #      - record
         
      #Low res stream used for live viewing:
         - path: rtsp://ha:************@10.1.1.***:554/cam/realmonitor?channel=1&subtype=0
           roles:
            - detect
            
    detect:
      enabled:  true
      fps:      20
      width:    2688
      height:   1520

    objects:
      track:
        - person
        - car 
        - bird
        - motorcycle 
           
    snapshots:
      enabled: true
      required_zones:
        - paving
  
    record:
      enabled: false
      retain:
        days: 1
      events:
        retain:
          default: 10    
        required_zones:
        - paving  

    zones:
       paving:
         coordinates: 1827,387,2214,356,2191,234,2652,237,2688,1520,870,1520,880,580,581,525,585,446,766,399,1640,293
         objects:
           - person
           - car                    
       roof:
        coordinates: 0,1520,842,1520,833,604,0,410
        objects:
          - bird
                      
    motion:
      mask:  
         - 2688,0,2688,249,1700,224,1688,0

Any other information that may be helpful

No response

Moras360 avatar Dec 19 '23 06:12 Moras360