Mit Scheduler für echte 5min

This commit is contained in:
2025-12-19 17:38:00 +00:00
parent 9d46ba9f46
commit 27f7c5544d
3 changed files with 95 additions and 5 deletions

92
scheduler.py Normal file
View File

@@ -0,0 +1,92 @@
#!/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()