Suche Add-On / Integration welches Dateien nach n-Tagen löscht oder umkopiert.

HaUsr23

Member
Da ich meine Kamera Bilder nun erfolgreich auf einer zusätzlichen Platte speichere möchte ich die Dateien, in unterschiedlichen Ordner gerne nur eine bestimmte Anzahl an Tagen aufbewahren und dann löschen oder ggf. verschieben.
Gibt es ein Add-On oder eine Integration die soetwas in Home Assistant machen kann ?
 
Moin,

keine Ahnung, ob es da etwas HA-spezifisches gibt, aber mit einem einfachen Bash-Script und dem Befehl "find" sollte sich sowas auch realisieren lassen.

Halt irgendwas in diese Richtung:

find /Pfad/zu/den/Dateien/ -name "<Platzhalter-Bildname>" -mtime +14 -delete

Ich würde aber vorher testen, bevor man sowas losrattern lässt.... Mittels "find" kannst Du halt suchen und auch eine Löschung vornehmen lassen. Als Trockenlauf würde es sich eher anbieten, dass man das "-delete" erstmal aussen vor lässt.

Alles nachfolgende findet im HomeAssistant-Terminal statt!

Vielleicht erstellst Du Dir auch erstmal ein paar Testdateien mit "touch". Zunächst mal einen Test-Ordner erstellen: mkdir /root/config/www/date-test und dann in diesen wechseln: cd /root/config/www/date-test. Unter Debian z.B. sind da ein paar Test-Dateien recht flott erstellt:

Bash:
touch -d "1 year ago" 1y.txt
touch -d "3 months ago" 3m.txt
touch -d "2 months ago" 2m.txt
touch -d "1 month ago" 1m.txt
touch -d "14 days ago" 14d.txt
touch -d "7 days ago" 7d.txt
touch -d "3 days ago" 3d.txt
touch -d "1 day ago" 1d.txt

Hab das grade mal unter HA getestet... funktioniert natürlich nicht. Im folgenden Format funktioniert es allerdings: "touch -t <YYYYMMDDHHSS> <Dateiname>", also z.B.:

touch -t 202412241800 frohe_weihnachten.txt oder touch -t 202501010000 frohes_neues.txt

Weisst schon... 😄 Das ganze natürlich in Einheiten, welche für Dich zum testen auch Sinn machen (wie z.B. die o.g. Beispiele). Mitunter auch einfach mit entsprechend klaren Dateinamen:

Bash:
touch -t 202505160000 20250516.txt
touch -t 202505130000 20250513.txt
touch -t 202505090000 20250509.txt
touch -t 202505020000 20250502.txt
touch -t 202504160000 20250416.txt

Und so weiter... halt so wie Du es brauchst... Prinzip sollte ja bis hier soweit klar sein (falls nicht, einfach fragen!) :)

In der Konsole kannst Du jetzt auch nochmal kurz einen Blick über die erstellten Dateien werfen. Um bei allen Dateien das vollständige Datum inkl. Uhrzeit sehen zu können (vor allem bei älteren!), braucht der Befehl "ls" allerdings noch einen Zusatz in Form von "--full-time", womit der konkrete Befehl dann ls --full-time lautet. Ansonsten werden bei älteren Dateien nur die Datumsangaben angezeigt - hier mal ein entsprechender Screenshot:

1747385500479.png

So... nun haben wir vermutlich schon einen Haufen Dateien zum testen erzeugt - nun geht es an die Filterung. Wie gesagt, lassen wir die Löschung erstmal aussen vor und schauen erstmal nur, dass wir auch die korrekten Ergebnisse bekommen. Das könnte dann z.B. so aussehen:

find /root/config/www/date-test/ -name "*.txt" -mtime +7 (älter als X-Tage)

Das sieht dann beim testen halt so aus:

1747386108919.png

Musste halt mal schauen, wie es dann für Dich passt. Danach kannst Du auch mal einen Lösch-Testlauf starten indem Du noch ein "-delete" hinter den Befehl hängst:

1747386346621.png

Wenn es dann wunschgemäß für Dich filtert, änderst Du den Befehl einfach mal auf das gewünschte Verzeichnis ab, gleiches dann eben auch für den Zeitraum z.B.:

find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14

Natürlich zum testen erstmal ohne "-delete". Ich möchte an dieser Stelle nochmal darauf hinweisen, dass wir hier grade "nur" Dateien suchen, die dann auch "gelöscht" werden - nicht, dass noch die falschen Dinge gelöscht werden.

Wir wissen ja nun, dass ein "-delete" die gefundenen Dateien entfernt und müssen das "jetzt" auch erstmal nicht weiter testen. Vielmehr muss man sich jetzt darum kümmern, dass ein entsprechendes Script erstellt wird. Am Anfang eines jeden Bash-Scripts steht die Shebang und diese sieht bei Bash dann einfach so aus: #!/bin/bash. Ansonsten kann man im Script dann auch einfach die Konsolenbefehle nutzen, womit das "Script" dann eigentlich auch nur aus 2 Zeilen besteht:

Bash:
#!/bin/bash
find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14

Kannst Du mittels irgendeinem Editor erstellen, oder dem Kram einfach direkt aus der Shell in eine Datei pumpen. Hier beispielhaft mal der Dateiname "script.sh", kannst Du aber nennen wie Du lustig bist.

echo '#!/bin/bash' > script.sh
echo 'find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14' >> script.sh

Danach muss das Script noch ausführbar gemacht werden:

chmod +x script.sh

Dann das Script auch einmal testen mittels ./script.sh. Wenn alles läuft, wie Du es Dir vorgestellt hast, packst Du im Script (ggf. in HA über den Editor) noch kurz das "-delete" hinten an den find-Befehl und das Script ist einsatzbereit.

Alles weiter dann "vermutlich" (weisst ja, bin nicht so der HA-Crack) einfach via HomeAssistant - Shell Command, wobei Du vermutlich auch einfach den find-Befehl darüber starten könntest, aber warum einfach, wenn es auch kompliziert geht und die Shell-Scripte kannst Du auch abseits von HomeAssistant nutzen (wer weiss schon, was die Zukunft noch so bringt) 🙃
 
Hallo @blurrrr,
(y) super Anleitung.
@HaUsr23 und damit Du das nicht händig machen musst startest Du das Script am besten mit Crontab.
Z.B. "* 13 * * * /scripts/./meinscript.sh" das passiert dann automatisch jeden Tag um 13:00 Uhr.
 
Glaube das ist unter HA garnicht mal so einfach, ggf. eher in Kombi mit time-trigger. Der Zugriff auf das HA-System ist ja schon ziemlich verrammelt, so wie ich das mitbekommen habe. Auf jedem anderen System wäre Cron auch mein Vorschlag gewesen 🙃
 
Stopp, stopp, bevor es zu viel Informationen gibt...

Ich habe mir in der configuration.yaml mal folgendes angelegt:
YAML:
shell_command:
  delete_jpg: find /root/media/ -name "*.jpg" -mtime +1 -delete
  delete_mp4: find /root/media/ -name "*.mp4" -mtime +1 -delete
(testweise nur 1 Tag alte löschen)

In einer Automation, die ich um 0:05 triggere, werden beide Befehle ausgeführt.

Ich habe die find's im Terminal mal entsprechend mutig ausgeführt und es war von Erfolg gekrönt !

Wenn das mit den configuration Shell Commands nun genau so gut funktioniert, bin ich vollkommen zufrieden !

Stellt sich mir nur die Frage: Arbeitet find rekursiv durch alle Unterverzeichnisse von /root/media/ ? Oder muss da noch ein Parameter dran ?

Genaueres morgen, theoretisch :)
 
Das ist rekursiv, durchsucht also auch Unterverzeichnisse (steht aber auch alles im z.B. Ubuntu-Wiki). Insofern wäre ich also schon extrem vorsichtig, was die Pfadauswahl angeht. Im besten Fall wandern die Aufnahmen in ein eigenes Verzeichnis und auch nur dieses wird mit dem Befehl beackert. Ansonsten gehen vielleicht auch Bilder verloren, die eigentlich ganz anderen Dingen zugeordnet sind (aber halt älter als X Tage sind).
 
Danke für die Warnung blurrrr, aber in meinem Fall passt es wenn der alle unterhalb des Verzeichnisses entsorgt, dass sind nur temporäre Aufnahmen.
Ich glaub dafür muss ich das +1 dann doch durch +0 ersetzen.
Dann bin ich nun mal gespannt ob das morgen gelöscht wurde...
 
Versteh ich nicht so ganz, liegt Dir nichts an den Aufnahmen bzw. wofür nimmst Du dann überhaupt auf, wenn sowieso alles direkt gelöscht wird? Normalerweise hält man Aufnahmen doch zumindestens eine gewisse Zeit vor (ein paar Tage/Wochen)?

Wenn es Dir so brandeilig ist, dass die Aufnahmen entsorgt werden... es gäbe z.B. auch noch mmin (Minuten) statt mtime (Tage). Weiss nur nicht, ob das unbedingt Sinn und Zweck der Sache ist? :unsure:
 
Allsooo, ich habe das +0 nur um zu testen ob es geht, ich habe z.Zt. noch keine Aufnahmen von mehreren Tagen. Und, ich gebe zu, ich hatte auch keine Lust Demodateien zu erzeugen bzw. alte pseudodateien rüber zu kopieren.
Wenn das morgen von Erfolg ist, dann erhöhe ich die Zeit auf 2-4 Wochen, mal sehen was die Kameras so speichern und die Platte dann noch frei hat. Das mit den Minuten habe ich eben auch gesehen, aber ich habe noch so viel Geduld bis morgen zu warten :cool:
Irgendwie beschleicht mich das Gefühl, dass ich mich bei Dir rechtfertigen muss warum und wann ich die Bilder lösche :ROFLMAO::ROFLMAO::ROFLMAO:
Ich sage schon mal Danke für die anhaltende Unterstützung !
Werde mich jetzt vor meinen Home Assistant setzen und schauen ob der in 4 h die Files löscht 🤪
Schönen Abend noch, werde berichten.
 
Und, ich gebe zu, ich hatte auch keine Lust Demodateien zu erzeugen bzw. alte pseudodateien rüber zu kopieren.
:eek:🤫😄

Irgendwie beschleicht mich das Gefühl, dass ich mich bei Dir rechtfertigen muss warum und wann ich die Bilder lösche :ROFLMAO::ROFLMAO::ROFLMAO:
Nicht wirklich, die kurze Aufbewahrungsdauer kam mir nur etwas komisch vor 😅

Ich sage schon mal Danke für die anhaltende Unterstützung !
Klar doch, immer gern 😊
 
Tja, leider hat es nicht funktioniert, da werde ich mich wohl besser in die Shell Commands einarbeiten müssen..

HA.jpg

Wird also noch was dauern.
 
Tja, leider hat es nicht funktioniert
"Ich habe <irgendwas> gemacht, nun geht nicht und hier ist der Fehler" hilft beim Troubleshooting nur bedingt... 😜 find nicht gefunden? Ordner nicht gefunden? Unsinn beim Befehl geschrieben (vermutlich eher nicht, hat ja mal funktioniert)? Den shell_command verhauen?

Also wenn ich das richtig in Erinnerung habe, sollte es ja eigentlich so aussehen:

YAML:
shell_command:
  <beliebiger Name>: <Shell-Befehl>

Übersetzt würde das für mich bedeuten:

Code:
shell_command:
  media-loeschen: find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14
oder alternativ
YAML:
shell_command:
  media-loeschen-script: /Pfad/zum/Script/script.sh

Wie genau sieht denn nun Dein Eintrag bzgl. shell_command aus? :)

EDIT: Vielleicht sind auch die Anführungszeichen ein Problem, da hilft es evtl. wenn Du den kompletten Befehl nochmal in einfache Anführungszeichen packst:

Code:
shell_command:
  media-loeschen: 'find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14'

Wenn ich Dich richtig verstanden habe, hat auf der Shell ja soweit alles funktioniert, allerdings bist Du da auch als User "root" unterwegs. Ich weiss nicht, ob die Scripte via shell_command ggf. nicht noch mit einem anderen User ausgeführt werden. Eventuell musst Du auch noch ein "sudo" vor den Befehl beim shell_command packen. Könntest aber auch hingehen und nochmal etwas via shell_command laufen lassen, z.B. in Form von:

Code:
shell_command:
  media-loeschen: echo $(whoami) > /root/config/www/wer-bin-ich.txt

Dann solltest Du eigentlich in der Datei sehen, mit welchem Benutzer das ganze ausgeführt wird. Den Befehl whoami kannst Du natürlich auch mal testweise direkt im Terminal ausführen.

Ansonsten fällt mir nur noch ein, dass man ggf. den vollständigen Pfad zum Befehl find angeben muss, so wäre es dann halt ein "/usr/bin/find" statt einfach nur "find".
 
Zuletzt bearbeitet:
So... ich hab dann doch mal in HA getestet... Und ich hab da mal einen ganz blöden Verdacht:

Es scheint so, als würde der ganze Kram einfach nicht funktionieren, sobald der Pfad root beinhaltet.

"find /root/config/www/date-test/ -name "*.txt" -mtime +7" funktioniert nicht
"find /config/www/date-test/ -name "*.txt" -mtime +7" funktioniert

Geh doch bitte mal hin und ändere Deine shell_commands in folgendes ab:

YAML:
shell_command:
  delete_jpg: find /media/ -name "*.jpg" -mtime +1 -delete
  delete_mp4: find /media/ -name "*.mp4" -mtime +1 -delete

Das sollte meiner Meinung nach dann schon funktionieren (also nur "/media/" statt "/root/media/") :)
 
Kleine Beispiele noch für die Vollständigkeit:

hausr_command: find /root/config/www/date-test/ -name "*.txt" -mtime +7
stdout: ""
stderr: "find: /root/config/www/date-test/: No such file or directory"
returncode: 1
vs.
hausr_command2: find /config/www/date-test/ -name "*.txt" -mtime +7
stdout: |-
/config/www/date-test/20250509.txt
/config/www/date-test/20250416.txt
/config/www/date-test/20250401.txt
/config/www/date-test/20240101.txt
/config/www/date-test/20250301.txt
/config/www/date-test/20250502.txt
stderr: ""
returncode: 0
 
Und noch ein Nachtrag (ich lauf grade erstmal warm... ;)😜😄)...

Schaut mal mal unter https://www.home-assistant.io/integrations/media_source/ steht dort:

For Home Assistant OS, Supervised and Container users, this folder is by defaultconfigured in the path /media.

Home Assistant OS and Supervised users can access this folder by using,for example, the Samba add-on. Users of Home Assistant Container canmount a volume of their choice to
For Home Assistant OS, Supervised and Container users, this folder is by defaultconfigured in the path /media.

Home Assistant OS and Supervised users can access this folder by using,for example, the Samba add-on. Users of Home Assistant Container canmount a volume of their choice to /media.

Was dann zusätzliche Datenträger angeht, so fällt das vermutlich unter diesen Punkt: https://www.home-assistant.io/integrations/media_source/#using-custom-or-additional-media-folders, da wird dann auch ein Unterverzeichnis im Ordner /mnt/ genutzt (der genau für solche Dinge existiert) :)

So, nun habe ich aber - glaube ich zumindestens - fertig 😅
 
ALT/E/ER, sag mal hast Du nen Rechner implantiert ???? 😲 :LOL:
Ich muss mir das später mal alles genau durchlesen, bin gerade außerhäusig schwer beschäftigt, mit Dingen die mit HA recht wenig zu tun haben...
Bin recht zuversichtlich, dass es bei deinem Unterstützungsaufwand dann doch noch laufen wird :)(y)
Genieß jetzt bitte erst mal den sonnigen Samstag, melde mich später um genaueres zu berichten.
Also: Langsam wieder kühler laufen..
Danke, Danke !!
 
ALT/E/ER, sag mal hast Du nen Rechner implantiert ???? 😲 :LOL:
Geht, ist ja auch viel Unsinn dabei, aber die letzte Variante (bzgl. /root/media/ und /media/) sollte eigentlich funktionieren. Ich tippe halt nur recht schnell (und viel), wobei man sich den Großteil ja hätte durchaus auch sparen können, da es am Ende ja vermutlich nur an der root-Geschichte liegt 😅

Genieß jetzt bitte erst mal den sonnigen Samstag
Danke ebenso! 😊
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
6.682
Beiträge
64.140
Mitglieder
6.940
Neuestes Mitglied
christoph.weber
Zurück
Oben