Add maximum seconds for ringing timer (#261)

Auto stop ringing timer if the determined time (default 15 mins) has passed without manually stopping. This max time can be modified using the command `--timer-max-ring-seconds`.
This commit is contained in:
Omar Amin authored and GitHub committed 2026-03-25 01:46:53 +02:00
1 parent ede3785539
commit 4194aa42ec
3 files changed
+28 -1

No files matched your search

+7
View File
@@ -145,6 +145,12 @@ async def main() -> None:
action="store_true",
help="Enable thinking finish sound, when the assistant is done thinking and needed more time to process",
)
parser.add_argument(
"--timer-max-ring-seconds",
type=float,
default=900.0, # 15 minutes
help="Seconds before a ringing timer auto-stops (default: 900)",
)
parser.add_argument(
"--debug",
action="store_true",
@@ -347,6 +353,7 @@ async def main() -> None:
refractory_seconds=args.refractory_seconds,
download_dir=args.download_dir,
volume=initial_volume,
timer_max_ring_seconds=args.timer_max_ring_seconds,
)
if args.enable_thinking_sound:
+1
View File
@@ -97,6 +97,7 @@ class ServerState:
muted: bool = False
connected: bool = False
volume: float = 1.0
timer_max_ring_seconds: float = 900.0
def save_preferences(self) -> None:
"""Save preferences as JSON."""
+20 -1
View File
@@ -152,6 +152,7 @@ class VoiceSatelliteProtocol(APIServer):
self._tts_played = False
self._continue_conversation = False
self._timer_finished = False
self._timer_ring_start: Optional[float] = None
self._processing = False
self._pipeline_active = False
self._external_wake_words: Dict[str, VoiceAssistantExternalWakeWord] = {}
@@ -241,6 +242,7 @@ class VoiceSatelliteProtocol(APIServer):
if not self._timer_finished:
self.state.active_wake_words.add(self.state.stop_word.id)
self._timer_finished = True
self._timer_ring_start = time.monotonic()
self.duck()
self._play_timer_finished()
@@ -416,6 +418,7 @@ class VoiceSatelliteProtocol(APIServer):
if self._timer_finished:
self._timer_finished = False
self._timer_ring_start = None
self.unduck()
self.state.tts_player.stop()
_LOGGER.debug("Stopping timer finished sound")
@@ -462,8 +465,24 @@ class VoiceSatelliteProtocol(APIServer):
if not self._timer_finished:
_LOGGER.debug("Timer finished sound stopped")
self.unduck()
self._timer_ring_start = None
return
# Auto-stop after timer_max_ring_seconds
if self._timer_ring_start is not None:
elapsed = time.monotonic() - self._timer_ring_start
if elapsed >= self.state.timer_max_ring_seconds:
_LOGGER.info(
"Timer auto-stopped after %.0f seconds (max=%.0f)",
elapsed,
self.state.timer_max_ring_seconds,
)
self._timer_finished = False
self._timer_ring_start = None
self.state.active_wake_words.discard(self.state.stop_word.id)
self.unduck()
return
self.state.tts_player.play(
self.state.timer_finished_sound,
done_callback=lambda: call_all(