Frigate: Envoi snapshot sur Discord

Bonjour la communauté,

Je souhaite recevoir sur Discord une photo lorsque la caméra détecte une personne.

Ma configuration est la suivante:

  • Home Assistant sur un serveur,
  • Frigate sur un second serveur.

Les deux applications sont des conteneurs docker.
Je joindrai des fichiers de configuration si vous en avez besoin.

Sur Home Assistant, j’obtiens bien une image en cas de détection d’une personne.
Je ne sais par contre par comment envoyer cette image sur Discord.

J’ai lu des choses par-ci, par-là mais je ne comprends pas bien ce qu’il faut faire.
J’ai essayé d’utiliser un blueprint, mais pas de notification possible vers Discord (ou du moins, je n’ai pas trouvé.

Ci-dessous, un exemple d’automatisation. Réception d’une image, pour test: OK
Désolé pour la mise en forme.

  • id: ‘1749497212344’
    alias: Test caméra
    triggers:
    • trigger: state
      entity_id:
      • binary_sensor.cam_1_all_occupancy
        from: ‘off’
        to: ‘on’
        conditions:
        actions:
    • action: notify.agent_notifier
      data:
      message: ‘personne détectée’
      target: ‘1412200009025454110’
      data:
      images:
      • /config/www/pics.jpg
        mode: single

Vous l’aurez compris, c’est le chemin “/config/www/pics.jpg” que je souhaite modifier pour récupérer la photo prise par la caméra.

Faut-il passer par l’API Frigate ?

En vous remerciant,

bonsoir, le mqtt est activé dans frigate ?c’est ce que j’utilise comme trigger de mon automatisation.As tu l’integration frigate, et donc l’accés au snapshot depuis HA ?

voici mon automatisation

# ==========================================
# AUTOMATISATION HOME ASSISTANT
# ==========================================
# Envoie les détections Frigate vers Discord avec descriptions IA

alias: 🤖 Frigate → Discord + HA
description: Détections Frigate avec GenAI, identification auto et horodatage

# ==========================================
# DÉCLENCHEUR
# ==========================================
# Se déclenche à chaque mise à jour d'objet tracké par Frigate
triggers:
  - topic: frigate/tracked_object_update  # Topic MQTT surveillé
    trigger: mqtt

# ==========================================
# CONDITION
# ==========================================
# N'exécute l'action que si le payload contient une description IA
conditions:
  - condition: template
    value_template: |-
      {{ trigger.payload_json.type is defined and 
         trigger.payload_json.type == 'description' }}

# ==========================================
# ACTIONS
# ==========================================
actions:
  # ACTION 1 : Envoi notification Discord
  - action: script.notification_discord
    data:
      nom: "{{ identity }}"      # Nom identifié (Gaël, Chat, Inconnu)
      description: |
        📷 **Caméra:** {{ camera }}
        ⏰ **Détection:** {{ timestamp }}

        **🤖 Description IA:**
        {{ description }}

        [📹 Voir la vidéo]({{ clip_url }}) • [📊 Détails]({{ details_url }})
      image_url: "{{ snapshot_url }}"   # URL du snapshot
      images: "{{ snapshot_url }}"
  
  # ACTION 2 : Notification persistante dans Home Assistant
  - action: persistent_notification.create
    data:
      notification_id: frigate_{{ event_id }}  # ID unique pour chaque événement
      title: "{{ identity }} - {{ camera }}"
      message: >
        ⏰ **{{ timestamp }}**


        **🤖 Description IA:**

        {{ description }}


        **Event ID:** {{ event_id }}


        **Liens:**

        [📸 Snapshot]({{ snapshot_url }}) • [📹 Vidéo]({{ clip_url }}) • [📊
        Détails]({{ details_url }})

# ==========================================
# CONFIGURATION EXÉCUTION
# ==========================================
mode: queued                    # File d'attente : exécute les déclenchements successifs
max: 10                         # Maximum 10 notifications en attente

# ==========================================
# VARIABLES
# ==========================================
# Traitement des données de l'événement Frigate
variables:
  # Récupération des données brutes depuis MQTT
  event_id: "{{ trigger.payload_json.id }}"
  camera: "{{ trigger.payload_json.camera }}"
  description: "{{ trigger.payload_json.description }}"
  
  # Identification automatique basée sur le contenu de la description IA
  identity: >
    {% if 'Gaël' in description %}
      🏠 Gaël                    # Personne identifiée (reconnaissance faciale)
    {% elif 'Personne non identifiée' in description or 'Personne inconnue' in
    description %}
      ⚠️ Personne inconnue       # Personne détectée mais non reconnue
    {% elif 'Chat' in description or 'chat' in description %}
      🐱 Chat                    # Animal détecté
    {% else %}
      🔍 Détection               # Détection générique
    {% endif %}
  
  # Horodatage français (JJ/MM/AA à HHhMM)
  timestamp: "{{ now().strftime('%d/%m/%y à %Hh%M') }}"
  
  # URLs des médias (via nom de domaine public Frigate)
  snapshot_url: https://frigate.DOMAIN.TLD/api/events/{{ event_id }}/snapshot.jpg  # Image capture (anonymisée)
  clip_url: https://frigate.DOMAIN.TLD/api/events/{{ event_id }}/clip.mp4          # Vidéo courte (anonymisée)
  details_url: >-
    https://frigate.DOMAIN.TLD/events?camera={{ camera }}&id={{ event_id }}       # Détails complets (anonymisé)

et le script que j’appel :

# ==========================================
# SCRIPT HOME ASSISTANT - NOTIFICATION DISCORD
# ==========================================
# Envoie des notifications enrichies (embed) vers Discord via webhook

sequence:
  # Action d'envoi via le service notify configuré
  - action: notify.bot_ha           # Service de notification Discord configuré dans HA
    metadata: {}
    data:
      # ID du channel Discord cible (anonymisé)
      target:
        - "DISCORD_CHANNEL_ID"      # Remplacer par l'ID de votre channel Discord
      
      # Message vide (le contenu est dans l'embed)
      message: " "
      
      # Configuration de l'embed Discord (message enrichi)
      data:
        embed:
          # En-tête de l'embed avec le nom (personne/objet détecté)
          author:
            name: "{{nom}}"         # Variable : nom de l'entité détectée
          
          # Titre de la notification
          title: Notification Home Assistant
          
          # Corps du message (description de l'événement)
          description: "{{description}}"  # Variable : texte descriptif
          
          # Image intégrée (snapshot de la caméra)
          image:
            url: "{{image_url}}"    # Variable : URL du snapshot
          
          # Pied de page avec horodatage
          footer:
            text: le {{ now().strftime('%d/%m/%y %Hh%M') }}  # Format français JJ/MM/AA HHhMM
            icon_url: https://YOUR_IMAGE_HOST/home-assistant-icon.png  # Logo Home Assistant (anonymisé)

# ==========================================
# MÉTADONNÉES DU SCRIPT
# ==========================================
alias: Notification Discord
description: ""

# ==========================================
# CHAMPS D'ENTRÉE (paramètres du script)
# ==========================================
fields:
  # Champ 1 : Nom de l'entité détectée
  nom:
    selector:
      text: null                    # Sélecteur texte simple
    name: nom
    required: true                  # Obligatoire
    default: à remplacer            # Valeur par défaut si non fournie
  
  # Champ 2 : Description détaillée de l'événement
  description:
    selector:
      text: null                    # Sélecteur texte simple
    name: description
    required: true                  # Obligatoire
    default: test de notif embed    # Valeur par défaut pour tests
  
  # Champ 3 : URL de l'image à afficher
  image_url:
    selector:
      text: null                    # Sélecteur texte simple
    required: false                 # Optionnel
    default: https://YOUR_IMAGE_HOST/home-assistant-icon.png  # Logo HA par défaut (anonymisé)
    name: image_url

Bonjour et merci @Gael pour ton retour.
Désolé pour la réponse quelque peu tardive.

Alors oui, j’ai bien activé MQTT et oui, je vois le snapshot côté home-assistant.
Je ne connais pas OpenAI; donc pour l’instant, je n’ai pas essayé de l’utiliser.

J’ai fait une config la plus minimaliste (enfin je crois).
Un seul fichier utilisé pour le moment: automation.yml

Lorsqu’une personne est détectée, je reçois une alerte sur l’application Discord.
Mais je ne sais toujours pas comment envoyer un snapshot.

Dans le code ci-dessous, j’ai une section “variables”.
J’ai fait un copier/coller sans trop comprendre …

Lors de la notification Discord, j’ai affiché le chemin vers le snapshot (pour test).
Exemple: /media/frigate/clips/review/thumb-cam-1-xxxx.webp.

Sauf que le répertoire “/media” se trouve physiquement sur le serveur dédié à Frigate.
Alors que HA est installé sur un autre serveur.

Du coup, à part faire un montage NFS entre les deux serveurs, je ne comprends pas comment dire à HA de récupérer le snapshot qui se trouve sur un serveur distant.

- alias: Test Frigate Discord
  triggers:
  - trigger: mqtt
    topic: frigate/reviews
    id: frigate-event
  variables:
    camera: '{{trigger.payload_json[''after''][''camera''] if trigger.id == ''frigate-event''}}'
    thumb: '{{trigger.payload_json[''after''][''thumb_path''] if trigger.id == ''frigate-event''}}'

  actions:
  - action: notify.agent_notifier
    metadata: {}
    data:
      message: "Porte d'entrée ({{ camera }}) -- {{ thumb }}"
      target: '1412200008021454310'
      data:
        images:
        - "{{ thumb }}"
        - /config/www/pics.jpg # pour test
        #url: "http://192.168.0.10/ISAPI/Streaming/channels/101/picture"
  mode: single

bonsoir,

je te propose 2 liens qui devrait te permettre de trouver réponse a tes interrogation.
Le 1er la doc frigate pour le partage réseau home assistant :

le 2eme, une petite vidéo de Makernix sur l’install et la conf frigate :

YouTube

J’espère que ça t’aideras, sinon, explique ou ça coince.

1 « J'aime »

Merci pour les solutions proposées Gaël.

Alors je ne veux pas déplacer les données, mais bien récupérer les snapshots présents sur le serveur frigate vers home assistant qui se trouve sur un autre serveur.

Avec la configuration actuelle, il n’est pas possible d’ajouter un point de montage.
J’utilise un conteneur docker et donc, les options attendues ne sont pas disponibles.

Pour le moment, j’ai mis en place un partage NFS sur le serveur frigate.
Pas sûr que ce soit la meilleure configuration, mais en l’état, ça fonctionne.