From 01f8a22cb0658c50da444293c32280d688f80fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zmek?= Date: Mon, 13 Oct 2025 06:45:28 +0200 Subject: [PATCH] =?UTF-8?q?nastaven=C3=AD=20pro=20zamezen=C3=AD=20opakovan?= =?UTF-8?q?=C3=A9mu=20startu=20zobrazov=C3=A1n=C3=AD=20videa,=20kdy=C5=BE?= =?UTF-8?q?=20video=20u=C5=BE=20je=20p=C5=99ehr=C3=A1v=C3=A1n=C3=A9=20a=20?= =?UTF-8?q?dojde=20k=20zaznamen=C3=A1n=C3=AD=20nov=C3=A9ho=20pohybu.=20P?= =?UTF-8?q?=C5=99id=C3=A1n=C3=AD=20zpo=C5=BEd=C4=9Bn=C3=AD=20mezi=20zaznam?= =?UTF-8?q?en=C3=A1n=C3=AD=20pohybu=20a=20p=C5=99ehr=C3=A1v=C3=A1n=C3=AD?= =?UTF-8?q?=20videa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ghost_trigger.py | 63 +++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/ghost_trigger.py b/ghost_trigger.py index 36d180c..2127c32 100644 --- a/ghost_trigger.py +++ b/ghost_trigger.py @@ -19,17 +19,21 @@ PIR_PIN = config.get('pir_pin', 17) VIDEOS_DIR = os.path.join(os.path.dirname(__file__), config.get('videos_dir', 'videos')) BLACK_IMAGE_PATH = os.path.join(os.path.dirname(__file__), "black.png") VIDEO_EXTENSIONS = tuple(config.get('video_extensions', ['.mp4', '.mkv'])) -MPV_SOCKET_PATH = "/tmp/mpvsocket" # Cesta k ovládacímu socketu +MPV_SOCKET_PATH = "/tmp/mpvsocket" +# <<< NOVINKA: Načtení hodnot ze souboru config.yaml >>> +SURPRISE_DELAY = config.get('surprise_delay', 1.5) +SENSOR_LOCK_DURATION = config.get('sensor_lock_duration', 30) available_videos = [] -# --- Nové funkce pro ovládání mpv --- +is_playing = False + +# --- Funkce pro ovládání mpv --- def send_mpv_command(command_json): """Pošle JSON příkaz do běžícího mpv přes socat.""" full_command = f"echo '{command_json}' | socat - {MPV_SOCKET_PATH}" try: subprocess.run(full_command, shell=True, check=True, capture_output=True, text=True) except subprocess.CalledProcessError: - # Chybu ignorujeme, pokud socket není připraven, další pokus proběhne při příštím pohybu pass # --- Hlavní logika --- @@ -43,47 +47,52 @@ def load_videos(): available_videos = [] def play_random_ghost(): - """Pošle mpv příkaz k přehrání videa JEDNOU a návratu k černé obrazovce.""" - print("Pohyb detekován! Posílám příkaz do mpv...") + """Zpracuje detekci pohybu, počká a přehraje video, pokud již jiné neběží.""" + global is_playing - load_videos() - if not available_videos: + if is_playing: + print("Pohyb ignorován, video již běží.") return - video_to_play = random.choice(available_videos) - try: - # Příkaz č. 1: Načti a přehraj video, ale s vypnutou smyčkou (loop=no) + is_playing = True + + print(f"Pohyb detekován, čekám {SURPRISE_DELAY}s pro moment překvapení...") + # <<< NOVINKA: Použití proměnné ze souboru config.yaml >>> + time.sleep(SURPRISE_DELAY) + + print("Posílám příkaz do mpv...") + load_videos() + if not available_videos: + return + + video_to_play = random.choice(available_videos) + command1 = f'{{"command": ["loadfile", "{video_to_play}", "replace", "loop=no"]}}' send_mpv_command(command1) - # Příkaz č. 2: Po skončení videa se vrať k zobrazení černého obrázku command2 = f'{{"command": ["loadfile", "{BLACK_IMAGE_PATH}", "append-play"]}}' send_mpv_command(command2) - - except Exception: - pass + + finally: + print(f"Senzor bude znovu aktivní za {SENSOR_LOCK_DURATION}s.") + # <<< NOVINKA: Použití proměnné ze souboru config.yaml >>> + time.sleep(SENSOR_LOCK_DURATION) + is_playing = False + print("Senzor je opět aktivní.") + # --- Hlavní spuštění --- -# Ukončíme všechny staré instance mpv pro čistý start os.system("pkill -f mpv") time.sleep(1) - load_videos() -# Spustíme mpv na pozadí s otevřeným ovládacím socketem subprocess.Popen([ - "/usr/bin/mpv", - "--no-audio", - "--fullscreen", - "--loop-file=inf", - "--idle", # Zůstane aktivní, i když nic nehraje - f"--input-ipc-server={MPV_SOCKET_PATH}", # Klíčový parametr pro ovládání - BLACK_IMAGE_PATH + "/usr/bin/mpv", "--no-audio", "--fullscreen", "--loop-file=inf", "--idle", + f"--input-ipc-server={MPV_SOCKET_PATH}", BLACK_IMAGE_PATH ]) -time.sleep(2) # Dáme mpv čas na spuštění a vytvoření socketu +time.sleep(2) -# Nastavení senzoru pohybu pir = MotionSensor(PIR_PIN) pir.when_motion = play_random_ghost @@ -92,4 +101,4 @@ try: pause() except KeyboardInterrupt: print("Ukončuji aplikaci.") - os.system("pkill -f mpv") # Při ukončení uklidíme \ No newline at end of file + os.system("pkill -f mpv") \ No newline at end of file