From 493a271d0eaded34ca2acf18b4afb55534101aad Mon Sep 17 00:00:00 2001 From: void Date: Sat, 24 Jan 2026 07:21:24 +0100 Subject: [PATCH] =?UTF-8?q?Weckerfunktoin=20vollst=C3=A4ndig=20implementie?= =?UTF-8?q?rt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/timer_control.cpython-310.pyc | Bin 2917 -> 2917 bytes __pycache__/wecker_control.cpython-310.pyc | Bin 0 -> 3381 bytes main.py | 70 +++++++++- wecker_control.py | 147 +++++++++++++++++++++ 4 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 __pycache__/wecker_control.cpython-310.pyc create mode 100644 wecker_control.py diff --git a/__pycache__/timer_control.cpython-310.pyc b/__pycache__/timer_control.cpython-310.pyc index bd6f71c97c2db1f64d48ed10ee4cfc24a0b6ee80..35954e504fa7642f9b0717b3fd652c8e5c299e46 100644 GIT binary patch delta 18 YcmaDV_Ed~BpO=@50SNjwa>j52054PoLI3~& delta 18 YcmaDV_Ed~BpO=@50SJONa>j5204^v51^@s6 diff --git a/__pycache__/wecker_control.cpython-310.pyc b/__pycache__/wecker_control.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6820b1fcc8714c0355ecfc0b9be2465d699ea32 GIT binary patch literal 3381 zcma)8&2Jn@74Pb%ASsU zx~-}jOsw%KIT9gp4J+BlJ?#Z?{*wA_A`GNbb}%9@?qEw8O;S* zG^}-NZp^cI7)a7~6z}J-VW+bM>^b6j-AZ8%jl;=0Om=$y2yd}F#;^owFqETLZ#m&7vqOX9M)f__=NEv}-!EZDl&ZXMyY-da1bv5|i;H}lcZ)>GX> zzaf>K(lR$P?@O9!Gh5%ul4rUY<)ZD|SR_W8bSQ0|S|Kx&Se}YZ+WB4C-6pCV-I-mW+1f^U2J z9{OmTtNTtv=ycb+3OIsq9t!^^NT6x+Zn3h!AGS6kca&(d8 ze}cva-@hqdv)k?1hFP(TXoT9RbjSKi+DOYp^#?ZGQpIRT(f+paNs^7^1EmUx?x-|3 z?Z|Qps||;VfpmRPj1Uy!G>2(EGO{E%@oiMHKKIlWZ1?($&Y&2|j!E;P^Fh%c4FLt+ z>75MM`-4#?JMXq0r`bSe!`4U1vyG%bXjKz8-+#E;`gt-?t(%?u8@fNpMq2Nv;;Gy= z9V4}AC0eK2B)RGIvm%%GC*=JsTg`u&%g(P7{c+m+q)7X+cRYLJ#^cqGI~BtEMQ&7) zt?WFr=XMgMaUy`NSI*Aj9Qxa6ru-?NGtL@*gZV+sF0d&Uvxxa`<~V0_m|5^+rmjL% zEmLzDjg6EvBbE2byOSTsfY9rZ`z{8iM6EyepZa6qRM6jl$@hbCF!r~ZS{w%^5P{$? z*)5N_Ku);k(9q_mwP}gN2#QQ!6(ymlW+CsmK-xi?G}|CAc5O{bXxDM& zgGKMaNB%Ms9B}f(vUf-&#$P+S1F3fCtS`-*Hib#DUU^7uIp8_4yf4$N?K_ROR?U6& z1k)u*b#IiLH2Wbo)?~~aELJx#u+6WlIcMy?3sHj-zwN6?AeRjz+mYK|g4&ayunYcz z&cdIDI7=v^mwpnN=%7YYBE-3BYY4(9&(nPC!#=h<{!yL>_}201+h|O+JscEJfg6)z zPt6F1V#g0clscxD1u3WrS7NC6(AVZAP;9)J=BXY?v3IV7b}QM~l36m^lzBT=b!a(p zuWEy|%_>8*DRwO1O;Tg0k6DQsX|({cHdEiD#gy`=fD+(j55Us6D&gGNH?wdlw$cG;dW=*g_eTS!O;2VBzN-DIOsi-J!|5<;epr%_-}h zt6e%aX-(zG-$7hYp^2Th%QGm#>3`Tx;BvN8m8xv7qxVJd7hqX1oWqR>K4f!QY<%1r z#s!{y3fDR_9du5je`4I^4lmdA(tNXcigi_yKpo{ii{7aBz&lePLNJc+_J4q=;66R} zUcp8K`Z;^$eFh)X%q3(Q^$Q-|?IJ*8+#371i%|&1ki!bR0*+Ul;RxLS)t-nO_N>uM z!6nxR|81?)7LWwAarX-F)u-dY?cvk=p|a}?2U>V#2cKvmG+e{kUbEH_Rn78p4_kN{ zweXl~metGMuIduaFQGvRq+GMLs)kt(F>OP-eW?hhxjqFGhmhILLZLYJ#7HG3#a)N> znr2X@f%DjX^XwbwCp1y&XAn6P6)H*-%zrrt!bPR3euQ_z3Z2A8AGw!-t(AT5O!}Nz zR*p&w$pm+>KVtADZ9K;u{k2NfDuj-e)Yj!Td?jsM4XVw5LHnMd(WxP*|B3i()DZQ5 zDv8#O(@`t?|Dl4S^XFp~E>>6YbizwQ-2&S-CXZtw-CIjh3M#sIY~%Pz{Ei~%mt~l4 zWkvN!U8m;9Xl(f4_jp3Nl5moGcDC0`@*LM8g;)1_?h#@Gyxz+Dmo7C|!dxwI>E@za z!iv1%uyx95Cn+4?85RO>w7V32O 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"