[Tuto] envoyer les images notifs des caméras en ram ( testé sur Pi5 HAOS)

Hello,

étant donné que je vois la durée de vie de mon SSD « fondre » comme neige au soleil, je me suis posé la question sur comment faire… Je n’ai semble t’il pas vu passer de sujets similaires.

Et j’ai trouvé une solution qui me convient et qui semble totalement fonctionnelle sur mon pi5

Alors vu qu’il faut intervenir sur la configuration.yaml; on fait une sauvegarde, et on la déporte sur un support externe ( au moins une copie ) avant de faire quoi que ce soit.

Je me suis rendu compte que mon SSD récent est en souffrance, et vu que les caméras ( avant frigate que je viens de mettre en prod il y a quelques jours ) n’étaient pas avares en faux positifs directement dans les cams, et en envoi de fichiers photos, envoyés dans mon
/homeassistant/www/photos_cameras

Vu que tout est stocké ailleurs, pourquoi aller écrire sur le SSD et écraser la photo pour envoyer la notification suivantes ( 12 objectifs 12 photos ).

Du coup, « Et si on envoyait tout en ram? » la ram, c’est rapide, et à l’inverse d’un SSD ça ne s’use pas avec les cycles de lecture / écriture et vu que je ne fais que stocker le fichier pour l’envoyer en notification, il sera tjs aussi bien en ram ( il n’est pas stocké et un shutdown de la machine purgera de toute façon son contenu ).

Donc à vos marques, prêt, SAUVEZ !!!

et on commence directement avec la commande pour localiser la ram dans terminal et SSH

df -h /dev/shm

on va voir ce qui se passe dans configuration.yaml et on ajoute, attention si vous en avez déjà et attention à l’indentation.

homeassistant:
  allowlist_external_dirs:
    - "/dev/shm"

On sauvegarde, on teste

Et on redémarre home assistant

Pour optimiser la réactivité et préserver votre SSD/Carte SD, la modification majeure consiste à déplacer le chemin de stockage des captures temporaires.

Au lieu de pointer vers le stockage physique de Home Assistant :

:cross_mark: Ancienne méthode (SSD) : filename: /config/www/snapshots/entree.jpg

On pointe désormais vers la mémoire vive (RAM) du système :

:white_check_mark: Nouvelle méthode (RAM) : filename: /dev/shm/entree.jpg

Pourquoi c’est mieux ?

  1. Zéro usure : Le fichier est écrit dans les puces RAM, pas sur les cellules du SSD.
  2. Vitesse : L’accès à /dev/shm est quasi instantané, ce qui réduit le délai entre le mouvement et l’envoi du message.
  3. Auto-nettoyage : Pas besoin de gérer la suppression des photos, elles s’effacent d’elles-mêmes à chaque redémarrage du Raspberry Pi.

Je vous met en exemple une de mes automations ( attention c’est factorisé plus ou moins à l’extrême pour avoir le code le moins gros possible, attention aussi je me base sur un timer d’affichage de mes cartes conditionnelles sur mon dashboard, pour qu’elles restent affichées 1 minute ).

Voici comment intégrer le chemin dynamique dans votre flux de surveillance, le code est commenté.

alias: "Surveillance : Snapshots en RAM"
description: "Envoi de photos via Telegram sans usure SSD"
mode: parallel
max: 15

triggers:
  - trigger: state
    entity_id: 
      - timer.1min_sonette
      - timer.1min_entree_gauche
    to: "active"

actions:
  - variables:
      # On définit les correspondances Timer <> Caméra
      mapping:
        timer.1min_sonette: camera.sonette
        timer.1min_entree_gauche: camera.entree1
      
      camera_entity: "{{ mapping[trigger.entity_id] }}"
      # On génère le nom du fichier à partir du nom du timer
      camera_file: "{{ trigger.entity_id.split('1min_')[1] | trim }}.jpg"
      # CHEMIN CRUCIAL : On pointe vers la RAM
      full_path: "/dev/shm/{{ camera_file }}"

  # 1. Prise du snapshot en RAM
  - action: camera.snapshot
    target:
      entity_id: "{{ camera_entity }}"
    data:
      filename: "{{ full_path }}"

  # 2. Envoi de la notification (Exemple Telegram)
  - action: telegram_bot.send_photo
    data:
      file: "{{ full_path }}"
      caption: "📷 Mouvement détecté sur {{ camera_file | replace('.jpg', '') }}"

Et voilà plus rien stocké sur le SSD HA :slight_smile:

et ça envoie les notifs, c’est garanti

On peut aussi vérifier en ajoutant une notif persistante après le snopshot

- action: camera.snapshot
    target:
      entity_id: "{{ camera_entity }}"
    data:
      filename: "{{ full_path }}"
  - action: persistent_notification.create
    data:
      title: 📸 Snapshot RAM
      message: |
        Fichier créé : {{ full_path }}
        Caméra : {{ camera_nom }}
        Heure : {{ now().strftime('%H:%M:%S') }}
      notification_id: snapshot_{{ camera_file }}

Je suis allé bcp plus loin pour info avec l’envoi de lien direct vers le review de frigate (déporté sur un debian/docker local) notif telegram/discord avec accès local et zerotier ( sans doute adaptable mais c’est ce que j’utilise ). il envoie les 2 liens on clique suivant le besoin ( pour le moment ).

Je bosse dessus.

Note : on ne peut pas créer de bouton dans telegram avec des adresses http, c’est dans la doc :sweat_smile:

Je met l’automation quasi complète qui tourne ici avec tout ce dont j’ai parlé, charge à vous de modifier les entités et de changer les xxx

alias: Surveillance cameras v3
description: Notifications de mouvement avec snapshots en RAM
triggers:
  - trigger: state
    entity_id:
      - timer.1min_sonette
      - timer.1min_entree_gauche
      - timer.1min_entree_droit
      - timer.1min_garage_gauche
      - timer.1min_garage_droit
    to: active
actions:
  - variables:
      mapping:
        timer.1min_sonette: camera.sonette
        timer.1min_entree_gauche: camera.entree1
        timer.1min_entree_droit: camera.entree2
        timer.1min_garage_gauche: camera.garage1
        timer.1min_garage_droit: camera.garage2
      camera_entity: "{{ mapping[trigger.entity_id] }}"
      camera_nom: >-
        {{ trigger.entity_id.split('1min_')[1] | replace('_', ' ') | capitalize
        }}
      camera_file: "{{ trigger.entity_id.split('1min_')[1] | trim }}.jpg"
      full_path: /dev/shm/{{ camera_file }}
      fri_id: "{{ camera_entity.split('.')[1] }}"
      url_local: http://xxx_ip_locale:5000/review?cameras={{ fri_id }}
      url_zt: http://xxx_ip_zerotier:5000/review?cameras={{ fri_id }}
  - parallel:
      - action: telegram_bot.send_message
        data:
          parse_mode: html
          message: >
            <b>📷 Mvt {{ camera_nom }}</b> ({{ now().strftime('%Hh%M') }})

            🔗 <a href="{{ url_local }}">🏠 Local</a> | 🔗 <a href="{{ url_zt
            }}">🌍 ZeroTier</a>
      - action: notify.xxxbot
        data:
          message: |
            **📷 {{ camera_nom }}** ({{ now().strftime('%Hh%M') }})
            🏠 <{{ url_local }}> — 🌍 <{{ url_zt }}>
          target:
            - "xxx_channel_discord"
  - action: camera.snapshot
    target:
      entity_id: "{{ camera_entity }}"
    data:
      filename: "{{ full_path }}"
  - parallel:
      - action: telegram_bot.send_photo
        data:
          authentication: digest
          file: "{{ full_path }}"
      - action: notify.xxxbot
        data:
          message: ""
          target:
            - "xxx_channel_discord"
          data:
            images:
              - "{{ full_path }}"
mode: parallel
max: 15

cdt

4 « J'aime »

Salut

Je vais essayer de l’utiliser pour récupérer un Snapshot de la sonnette, quand quelqu’un sonne.

Par contre j’ai pas compris les triggers timer dans l’automatisme.

Hello,

tu mets l’entité de déclenchement que tu veux, moi je me base sur un timer qui lance l’affichage de mes cartes conditionnelles ( c’est pour ça que j’ai précisé )

Donc en gros

frigate détecte, il envoie l’info à HA via l’automation d’analyse, qui déclenche un timer et ça affiche ma carte pendant 1 minute.

du coup je réutilise ce top départ du timer pour lancer ma notif via l’automation de notification

c’est plus clair ?

cdt

1 « J'aime »

Re,

J’ai ajouté l’automation quasi complète qui tourne ici avec tout ce dont j’ai parlé, charge à vous de modifier les entités et de changer les xxx

  • factorisation pour 2 ou xcams
  • envoi des photos en ram
  • double notification messages ( avec les 2 liens pour accéder aux review ( frigate pour moi, en exterieur frigate devra évidement être dans le réseau Zerotier pour pouvoir y acéder ))
  • double notification photos discord telegram

Comment mettre frigate dans le réseau zerotier?

je tourne sous debian avec frigate en conteneur, j’ai suivi les vidéos de @Howmation pour ne pas le citer (vu que c’est du bon boulot :sign_of_the_horns: ), et bien galéré avec le CORAL USB :smiley: www.youtube.com/watch?v=Ncr8tsNYtjQ

Et donc directement dans debian on installe zerotier

curl -s https://install.zerotier.com | sudo bash

puis on joint son réseau zerotier

sudo zerotier-cli join (le_nom_du_réseau_zerotier sans les () )

on vérifie que tout est ok

sudo zerotier-cli status

image

Puis on autorise la machine dans l’interface zerotier ( sur leur site )

Il n’y a plus qu’à :slight_smile:

cdt

1 « J'aime »

Oui, c’est plus clair. Dans mon cas j’ai une entité spécifique quand on sonne, donc plus simple normalement.

Pas de frigate chez moi

si tu as une reolink (et je crois que c’est le cas)
j’ai fais un truc tout con comme ça plus qu’a adapter le chemin de la capture en suivant le tuto de @freetronic


alias: envoi image sur sonnette
description: ""
triggers:
  - type: turned_on
    device_id: 77dffe210b6709b06acee3fe8f942038
    entity_id: ea0b9b5566a37e730b18bd5bcd66288f
    domain: binary_sensor
    trigger: device
conditions: []
actions:
  - action: camera.snapshot
    metadata: {}
    data:
      filename: /media/snapshot/sonette {{now().strftime('(%H:%M) [%d-%m-%Y]')}}.jpg
    target:
      entity_id: camera.sonnette_clair
  - action: telegram_bot.send_photo
    metadata: {}
    data:
      config_entry_id: 01K0V4ACGQNKQ67VDV369KBAA1
      file: /media/snapshot/sonette {{now().strftime('(%H:%M) [%d-%m-%Y]')}}.jpg
      caption: "**On sonne à la porte**"
      parse_mode: markdown
      target: XXXXXXXXXXX
  - action: camera.record
    metadata: {}
    data:
      duration: 10
      lookback: 5
      filename: /media/snapshot/sonette {{now().strftime('(%H:%M) [%d-%m-%Y]')}}.mp4
    target:
      entity_id: camera.sonnette_clair
  - action: telegram_bot.send_video
    metadata: {}
    data:
      config_entry_id: 01K0V4ACGQNKQ67VDV369KBAA1
      file: /media/snapshot/sonette {{now().strftime('(%H:%M) [%d-%m-%Y]')}}.mp4
      target:
        - "XXXXXXXXXXX"
mode: single

bon de mon cote j’utilises telegram pour l’envoi des images puis petit clip de 10s

:+1:Super merci

Ton entité de déclenchement c’est l’entité visiteur

binary_sensor.sonnette_reolink_visiteur

Telegram aussi pour les notifications

oui c’est bien elle

Salut @freetronic

Je suis entrain de mettre en place la sauvegarde sur le cache

dans mon fichier de configuration j’ai :

##  whitelist_external_dirs:
  allowlist_external_dirs:
    - /config/

je dois remplacer - /config/ par /dev/shm ? (faut il mettre les " " ?

Salut

il te reste du nettoyage à faire :wink:

en tout cas, belle astuce

1 « J'aime »

Hello,

Il faut laisser ce que tu as en place (sinon ça va probablement casser un truc qui fonctionne chez toi), et ajouter le mien, moi ça fonctionne comme sur ma capture

donc ça devrait donner un truc du genre

homeassistant:
  allowlist_external_dirs:
    - /config/
    - "/dev/shm"

et on teste avant de reboot HA

je ne l’avais pas mis dans le 1er message, je vais l’ajouter

cdt

Hello,

Oui les deux tournent encore :slight_smile:

cdt

Alors j’ai fait un essai avec seulement la ligne /dev/shm (je sais plus à quoi sert /config, mais j’ai pas de message d’erreur pour le moment)

J’ai testé avec l’automatisme sonnette de @ddfdom , j’ai bien reçu le Snapshot.

Par contre je suis pas certain que la capture passe par la ram. J’ai pas tout compris au processus de reolink vers la ram, puis vers mon telegram.

Comment je peux vérifier que ça passe bien par la ram ?

Pour ma part, j’ai totalement basculé.

1 « J'aime »

Re,

Le plus simple, tu supprimes les fichiers que tu stocke, si aucun n’est généré, bah, ça passe bien quelque part :smiley:

sinon ajoute une notif persistante après le snapshot

  - action: camera.snapshot
    target:
      entity_id: "{{ camera_entity }}"
    data:
      filename: "{{ full_path }}"
  - action: persistent_notification.create
    data:
      title: 📸 Snapshot RAM
      message: |
        Fichier créé : {{ full_path }}
        Caméra : {{ camera_nom }}
        Heure : {{ now().strftime('%H:%M:%S') }}
      notification_id: snapshot_{{ camera_file }}

c’est trop rapide en ram, j’ai pas trouvé comment faire en ligne de commande

de mon côté je n’ai plus que ça parce que c’est une autre automation et que j’ai du jus de neurones à la place du cerveau, pas encore regardé :wink:

cdt

1 « J'aime »