#!/usr/bin/env python3 """ Scheduler für CameraSave - läuft zur exakten 5-Minuten-Grenze """ import time import subprocess import sys from datetime import datetime INTERVAL_MINUTES = 5 def seconds_until_next_interval(): """Berechnet die Sekunden bis zur nächsten 5-Minuten-Grenze.""" now = datetime.now() current_minute = now.minute current_second = now.second current_microsecond = now.microsecond # Nächste 5-Minuten-Grenze berechnen next_minute = ((current_minute // INTERVAL_MINUTES) + 1) * INTERVAL_MINUTES # Minuten bis zur nächsten Grenze minutes_to_wait = next_minute - current_minute if minutes_to_wait <= 0: minutes_to_wait += INTERVAL_MINUTES # In Sekunden umrechnen und aktuelle Sekunden abziehen seconds = (minutes_to_wait * 60) - current_second - (current_microsecond / 1_000_000) return max(1, int(seconds)) # Mindestens 1 Sekunde warten def run_main(): """Führt main.py aus.""" try: result = subprocess.run( [sys.executable, "main.py"], capture_output=True, text=True ) print(result.stdout, end='') if result.stderr: print(result.stderr, end='', file=sys.stderr) return result.returncode except Exception as e: print(f"❌ Fehler beim Ausführen von main.py: {e}", file=sys.stderr) return 1 def main(): """Hauptschleife - wartet auf 5-Minuten-Grenzen.""" print(f"🕐 CameraSave Scheduler gestartet (Intervall: {INTERVAL_MINUTES} Minuten)") print(f" Läuft zur exakten {INTERVAL_MINUTES}-Minuten-Grenze der Uhrzeit") print() while True: try: # Warte bis zur nächsten 5-Minuten-Grenze wait_seconds = seconds_until_next_interval() now = datetime.now() # Berechne die nächste Ausführungszeit next_minute = ((now.minute // INTERVAL_MINUTES) + 1) * INTERVAL_MINUTES if next_minute >= 60: # Überlauf zur nächsten Stunde next_run = now.replace(hour=(now.hour + 1) % 24, minute=next_minute % 60, second=0, microsecond=0) if now.hour == 23 and next_minute >= 60: # Überlauf zum nächsten Tag next_run = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0) else: next_run = now.replace(minute=next_minute, second=0, microsecond=0) print(f"⏰ Warte {wait_seconds}s bis {next_run.strftime('%H:%M:%S')}") time.sleep(wait_seconds) # Führe main.py aus timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(f"\n▶️ [{timestamp}] CameraSave wird ausgeführt...") returncode = run_main() if returncode == 0: print(f"✅ [{timestamp}] Erfolgreich abgeschlossen\n") else: print(f"⚠️ [{timestamp}] Beendet mit Code {returncode}\n", file=sys.stderr) except KeyboardInterrupt: print("\n🛑 Scheduler gestoppt") break except Exception as e: print(f"❌ Unerwarteter Fehler: {e}", file=sys.stderr) time.sleep(60) # Bei Fehler 1 Minute warten if __name__ == "__main__": main()