Aufnehmen mit ffmpeg als Automation / shell_command nutzen

Guten Abend!

Ich arbeite mich von einem Problem zum nächsten :slight_smile:
Es soll eine Möglichkeit in Home Assistant eingebaut werden mit der ich Streams starten und stoppen kann - das zum Hintergrund (Link).

Aktueller Versuch ist eine Automation mit eigenem shell command.

Davor soll zuerst einmal die Aufnahme mit ffmpeg grundsätzlich funktionieren.
Das funktioniert mit einer Tapo Kamera von Home Assistant SSH mit:
docker exec -it homeassistant /bin/bash -c “ffmpeg -y -i rtsp://user:pass@ip:554/stream2 -c:v copy -c:a aac /media/output_stopable.mp4”

Dazu muss man zuvor im SSH Addon den Protection Mode deaktivieren.

Damit eine vorhandene Datei überschrieben werden darf wird die Option -y verwendet.

Weiter:
ein shell_command soll nun in der configuration.yaml erstellt werden.
Das Versuche ich so:

ffmpeg:

start_recording:
  command: docker exec -it homeassistant /bin/bash -c "ffmpeg -y -i rtsp://user:pass@ip:554/stream2 -c:v copy -c:a aac /media/output_stopable.mp4"
stop_recording:
  command: docker exec -it homeassistant /bin/bash -c "pkill ffmpeg"
  1. Benötige ich das “ffmpeg:” in der yaml überhaupt?
  2. grundsätzlich richtig das Vorgehen oder besser nach diesem Schema:
shell_command:
  start_recording: ...
  stop_recording: ...

So oder so erhalte ich immer:

Fehler beim Ausführen einer Aktion
Action shell_command.start_recording not found

Nun habe ich das ganze System über Erweiterte Optionen neu startet, es scheint zu funktionieren :slight_smile: Nach dem zweiten Schema.
Es kommt aber nur keine Fehlermeldung mehr. Aufgenommen wird noch nichts.

Error running command / return code: 127

'Shell Command - Home Assistant

Von SSH aus muss ich es mit dem Befehl “docker” ausführen.

  1. Muss ich das aber auch so im shell_command eintragen oder bin ich da schon im container?
  2. soll es in Klammern stehen oder spielt das keine Rolle?

Entwicklerwerkzeug Aktionen funktioniert (Shell Command: start_recording)
Jedoch kommt:

Zeitüberschreitung beim Ausführen des Befehls: … , nach: 60 Sekunden
Die Datei ist dann unbrauchbar!

Stoppe ich davor mit “Shell Command: stop_recording” erhalte ich eine lange Fehlermeldung, aber es funktioniert, returncode 255

Muss ich das aber auch so im shell_command eintragen oder bin ich da schon im container?

Es darf nicht mit dem Befehl “docker” ausgeführt werden da wir offensichtlich schon im Container sind.

soll es in Klammern stehen oder spielt das keine Rolle?

Habe es nun ohne Klammern, aber vermutlich spielt es keine Rolle

Es bleibt nur noch das Problem mit der Zeitüberschreitung nach 60 Sekunden.
Dadurch wird die Datei unbrauchbar.
Über SSH konnte länger aufgenommen werden ohne Fehler.

:crayon:by HarryP: Zusammenführung Mehrfachpost (bitte “bearbeiten” Funktion nutzen)

Etwas mehr Hintergründe, ungefähr 2000 wurde das als “Feature” eingeführt ohne Möglichkeit selbst zu entscheiden wie lange ein Skript ausgeführt werden darf.

Es gibt Möglichkeiten das Problem zu umgehen.

  1. das Addon addon_stdin nutzt eine Verbindung zur ssh-shell, da es dort keinen Timeout gibt. sieht `Shell_command running into timeout - #12 by blavak68 - Configuration - Home Assistant Community
  2. eine andere Lösung ist, den Befehl in den Hintergrund zu verschieben, damit ihr das SIGINT nicht trifft
  3. man kann den Befehl irgendwie als Daemon laufen lassen mit diesem Addon: `Allow running long lasting commands from Home Assistant - Home Assistant Community
  4. Die Datei direkt im Container bearbeiten und das Timeout hochsetzen: getestet, funktioniert wird aber bei einem Update evtl. überschrieben:
    vi /usr/src/homeassistant/homeassistant/components/shell_command/__init__.py
  5. und vermutlich das Beste: jemand hat shell_command kopiert, verändert und neu log_shell_commands daraus gemacht unter custom components:
    `GitHub - Hofferic/HomeAssistantLongRunningShellCommand: Copy of Home Assistant shell command, but with more lenient timeout

Damit ist das Problem gelöst