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 :
Ancienne méthode (SSD) :
filename: /config/www/snapshots/entree.jpg
On pointe désormais vers la mémoire vive (RAM) du système :
Nouvelle méthode (RAM) :
filename: /dev/shm/entree.jpg
Pourquoi c’est mieux ?
- Zéro usure : Le fichier est écrit dans les puces RAM, pas sur les cellules du SSD.
- Vitesse : L’accès à
/dev/shmest quasi instantané, ce qui réduit le délai entre le mouvement et l’envoi du message. - 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 ![]()
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 ![]()
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











