Weckerfunktoin vollständig implementiert

This commit is contained in:
2026-01-24 07:21:24 +01:00
parent 3ef9cc21ca
commit 493a271d0e
4 changed files with 212 additions and 5 deletions

147
wecker_control.py Normal file
View File

@@ -0,0 +1,147 @@
import time
import threading
from text2numde import text2num, is_number, sentence2num
from playsound3 import playsound
from datetime import datetime, timedelta
import re
import math
wecker_thread = None
wecker_stop = threading.Event()
wecker_status = "idle"
wecker_target_time: datetime | None = None
def parse_time_wecker(text):
text = text.lower().strip()
match = re.search(r"\b([\w]+)\s*uhr(?:\s*([\w]+))?\b", text)
if not match:
return None
hour_text = match.group(1)
minute_text= match.group(2)
try:
hour = text2num(hour_text)
minute = text2num(minute_text) if minute_text else 0
except ValueError:
print("Konnte die Zahl nicht erkennen.")
return None
if hour < 0 or hour > 23:
return None
if minute < 0 or minute > 59:
return None
print(f"{hour:02d}:{minute:02d}")
return hour, minute
def calculate_target_datetime(hour: int, minute: int) -> datetime:
now = datetime.now()
target = now.replace(hour=hour, minute=minute, second=0, microsecond=0)
if target <= now:
target += timedelta(days=1)
return target
def minutes_until(target: datetime) -> int:
#return int(((target - now)).total_seconds() // 60) hatte das davor aber das hat abgerundet
seconds = (target - datetime.now()).total_seconds()
return math.ceil(seconds / 60)
def start_wecker(target_time: datetime):
global wecker_thread, wecker_status, wecker_target_time
if wecker_status == "running":
return False # wecker läuft bereits
wecker_stop.clear()
wecker_target_time = target_time
wecker_status = "running"
def run():
global wecker_status
seconds = (wecker_target_time - datetime.now()).total_seconds()
if seconds < 0:
seconds = 0
if not wecker_stop.wait(seconds):
wecker_status = "finished"
print("wecker abgelaufen") # """ TTS """
wecker_thread = threading.Thread(target=run, daemon=True)
wecker_thread.start()
return True
"""
print(f"wecker startet für {seconds} Sekunden...")
time.sleep(seconds)
print("wecker abgelaufen!")
playsound("/home/tino/Desktop/Abschlussprojekt/test assistant/cloneAssistantAllInOne/RasPi_Voice_Assistant--WIP/clock-alarm-8761.mp3")
sound.stop()
"""
""" # Beispielnutzung
spoken_input = "eine sekunde" # This could come from a voice assistant
seconds = parse_time(spoken_input)
if seconds:
start_wecker(seconds) """
def stop_wecker():
global wecker_status
if wecker_status != "running":
print("Kein wecker gestellt")
return False
wecker_stop.set()
wecker_status = "stopped"
return True
def wecker_status_info():
if wecker_status != "running":
return {"status": wecker_status, "target_time": 0}
return {
"status": "running",
"target_time": wecker_target_time
}
def format_duration(seconds):
if seconds < 60:
return f"{seconds} {second_text(seconds)}"
minutes = seconds // 60
secs = seconds % 60
if minutes < 10:
if secs == 0:
return f"{minutes} {minute_text(minutes)}"
return f"{minutes} {minute_text(minutes)} und {secs} {second_text(secs)}"
if minutes < 60:
return f"{minutes} {minute_text(minutes)}"
hours = minutes // 60
mins = minutes % 60
if mins == 0:
return f"{hours} {hour_text(hours)}"
return f"{hours} {hour_text(hours)} und {mins} {minute_text(mins)}"
def minute_text(n):
return "Minute" if n == 1 else "Minuten"
def second_text(n):
return "Sekunde" if n == 1 else "Sekunden"
def hour_text(n):
return "Stunde" if n == 1 else "Stunden"