Configuration automatisation Frigate et Ntfy

Bonsoir,
Voilà plusieurs semaines que je galère à envoyer des snapshot et des clips vidéos provenant de Frigate via Ntfy.
À titre d’information, j’utilise Frigate installé dans Home Assistant.
Ntfy est hébergé sur une autre machine physique en dehors de mon domicile.

Mon besoin est simple (je pense ^^) : lorsqu’une de mes caméras détecte un mouvement, j’aimerais recevoir une notification via Ntfy contenant un snapshot et un clip vidéo (ou un gif animé).

  1. J’ai déjà testé la blueprint Frigate Mobile App Notifications mais cette dernière ne permet d’envoyer des notifications que sur l’application Android HA ou encore Telegram. Sur la page github du projet, quelqu’un a déjà demandé l’intégration de Ntfy mais… sans succès pour l’instant.

  2. J’ai parcouru plusieurs sujets comme celui ci : Frigate notifications without blueprint, mais je n’arrive pas à mettre en oeuvre les différentes automatisations qui y sont proposées. Elles sont trop complexes pour mon besoin et je n’arrive pas à comprendre la logique.

  3. J’ai également tenté de m’inspirer de la doc officielle homeassistant_integration_ntfy ainsi que Home Assistant notifications, mais sans succès :\

  4. Pour finir avec la documentation que j’ai parcourue, j’ai pris connaissance du projet Frigate-Notify, mais ce dernier requiert d’être installé via Docker, et mon Home Assistant ne pourra pas l’héberger… la description du projet évoque d’ailleurs clairement « Event notifications for a standalone Frigate NVR instance » : mon Frigate n’est pas standalone, ce projet n’est donc pas compatible avec mon architecture.

Parlons (un peu) technique, voici une automatisation qui fonctionne :

alias: Cam_event_snap
triggers:
  - topic: frigate/events
    trigger: mqtt
actions:
  - data:
      title: Caméra
      message: Ça bouge !!!
    action: notify.ntfy_frigate

=> Je reçois une succession de notifications qui contiennent le message que j’ai mis ci-dessus (youpi ^^).

Ce qui ne fonctionne pas :

alias: Cam_event_snap
triggers:
  - topic: frigate/events
    trigger: mqtt
conditions:
  - condition: template
    value_template: "{{ trigger.payload_json[\"type\"] == \"new\" }}"
actions:
  - delay:
      seconds: 3
  - action: notify.ntfy_frigate
    data:
      caption: >-
        A {{trigger.payload_json["after"]["label"]}} was detected on {{
        trigger.payload_json["after"]["camera"] }}
      url: >-
        http://ip_privée_frigate/api/events/{{trigger.payload_json["after"]["id"]}}/snapshot.jpg
mode: single

« ip_privée_frigate » contient l’adresse IP de mon home assistant avec le port frigate.

=> Cette automatisation me génère l’erreur suivante :
Error rendering data template: UndefinedError: ‹ dict object › has no attribute ‹ payload_json ›

Après un peu de recherche, j’ai cru comprendre que le topic frigate/events ne fournissait pas le payload, j’ai donc mis le topic frigate/reviews. Mais là, rien ne fonctionne non plus, et je ne vois rien dans les log.

Bref, beaucoup de lectures, beaucoup de tâtonnement, peu de résultats… si quelqu’un a des suggestions à proposer, je suis preneur :slight_smile:

Bien le bonjour,
ChatGPT m’a permis d’y voir plus clair dans tout ça.

Pour info, je ne souhaite pas que mon HA soit accessible directement sur Internet. Je ne peux donc pas envoyer une notification avec l’URL de l’image vers HA car elle ne pourra pas être téléchargée par mes devices.
Je dois donc utiliser l’option « attach_file » de ntfy, mais… le chemin vers lequel sont stockés les fichiers de notifications de frigate (/api/frigate/notifications/) n’est pas « interprétable » par Ntfy pour des raisons de sécurité :locked_with_key:

Au préalable, il faut donc télécharger le fichier dans un répertoire local de HA. Après cette étape, il est possible d’envoyer la notification avec la pièce jointe qui sera directement affichée dans Ntfy :partying_face:

Voici la marche à suivre :

:one:
Commencer par ajouter des « shell_command » au sein même du fichier /homeassistant/configuration.yaml :

shell_command:
  frigate_create_dir: >
    mkdir -p /media/frigate/ntfy_attach/{{ year }}/{{ month }}/{{ day }}
  frigate_download_snapshot: >
    curl -s "http://127.0.0.1:8123/api/frigate/notifications/{{ event_id }}/snapshot.jpg" -o "/media/frigate/ntfy_attach/{{ year }}/{{ month }}/{{ day }}/{{ filename }}"

frigate_create_dir va créer une succession de répertoires contenant l’année, le mois et le jour du déclenchement. Ces variables seront envoyées par l’automatisation.
frigate_download_snapshot va télécharger le snapshot lié à l’event du déclenchement dans le répertoire correspondant à la date du jour. Là encore, toutes les variables seront fournies par l’automatisation.

:two:
Créer une nouvelle automatisation puis l’éditer en yaml afin d’ajouter le code suivant :

alias: Camera_event_snapshot
triggers:
  - topic: frigate/events
    trigger: mqtt
conditions:
  - condition: template
    value_template: |
      {{ trigger.payload_json.type == 'new' }}
actions:
  - variables:
      event_id: "{{ trigger.payload_json.after.id }}"
      camera: "{{ trigger.payload_json.after.camera }}"
      label: "{{ trigger.payload_json.after.label }}"
      year: "{{ now().strftime('%Y') }}"
      month: "{{ now().strftime('%m') }}"
      day: "{{ now().strftime('%d') }}"
      filename: "{{ now().strftime('%Y%m%d_%H%M%S') }}.{{ event_id }}.jpg"
  - data:
      year: "{{ year }}"
      month: "{{ month }}"
      day: "{{ day }}"
    action: shell_command.frigate_create_dir
  - delay: "00:00:05"
  - data:
      event_id: "{{ event_id }}"
      year: "{{ year }}"
      month: "{{ month }}"
      day: "{{ day }}"
      filename: "{{ filename }}"
    action: shell_command.frigate_download_snapshot
  - delay: "00:00:05"
  - data:
      title: "{{ label | capitalize }} détectée"
      message: |
        Caméra : {{ camera }}
        📸 Snapshot joint
      data:
        attach_file: >-
          /media/frigate/ntfy_attach/{{ year }}/{{ month }}/{{ day }}/{{ filename }}
        attachment_filename: "{{ filename }}"
    action: notify.ntfy_test_notif_cam

Cette automatisation va :

  1. s’activer sur apparition d’un événement frigate envoyé via mqtt
  2. récupérer les informations uniques liées au déclenchement
  3. créer de multiples variables en lien avec le déclenchement
  4. créer des variables pour identifier la date du jour
  5. créer une variable filename pour modifier le nom du snapshot afin d’ajouter la date et l’heure
  6. appeler la commande shell frigate_create_dir pour créer les répertoires à la date du jour
  7. patienter 5 secondes le temps de la création des répertoires :hourglass_done:
  8. appeler la commande shell frigate_download_snapshot pour télécharger le snapshot dans l’arborescence du jour
  9. patienter 5 secondes le temps que le téléchargement s’effectue :hourglass_done:
  10. Et pour finir, faire appel à Ntfy pour envoyer la notification qui contiendra un titre, un message et l’image en pièce jointe :victory_hand:

Le code n’est finalement pas complexe, le plus dur était de réussir à trouver les bonnes informations.

C’est bien sûr déclinable pour envoyer le gif animé et le clip vidéo en mp4.

Reste à automatiser le nettoyage du répertoire /media/frigate/ntfy_attach/ pour éviter les accumulations de fichiers.

:warning:
Les images et gif animés apparaîtront automatiquement sur votre IHM Ntfy et sur l’application Android.
Cependant, ils n’apparaissent pas via l’application iOS. La notification ne contient que le titre et le message…
Un case est ouvert depuis le 30/11/2024, ça ne semble pas bcp bouger depuis…
https://github.com/binwiederhier/ntfy/issues/1226

Enjoy :waving_hand: