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