mirror of
https://github.com/home-assistant/core.git
synced 2025-07-10 14:57:09 +00:00
Change Assist satellite state names (#126926)
* Change state names * Update homeassistant/components/assist_satellite/strings.json --------- Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
This commit is contained in:
parent
ba8e9bc168
commit
02e15a4ce7
@ -41,10 +41,10 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
class AssistSatelliteState(StrEnum):
|
class AssistSatelliteState(StrEnum):
|
||||||
"""Valid states of an Assist satellite entity."""
|
"""Valid states of an Assist satellite entity."""
|
||||||
|
|
||||||
LISTENING_WAKE_WORD = "listening_wake_word"
|
IDLE = "idle"
|
||||||
"""Device is streaming audio for wake word detection to Home Assistant."""
|
"""Device is waiting for user input, such as a wake word or a button press."""
|
||||||
|
|
||||||
LISTENING_COMMAND = "listening_command"
|
LISTENING = "listening"
|
||||||
"""Device is streaming audio with the voice command to Home Assistant."""
|
"""Device is streaming audio with the voice command to Home Assistant."""
|
||||||
|
|
||||||
PROCESSING = "processing"
|
PROCESSING = "processing"
|
||||||
@ -117,7 +117,7 @@ class AssistSatelliteEntity(entity.Entity):
|
|||||||
_attr_tts_options: dict[str, Any] | None = None
|
_attr_tts_options: dict[str, Any] | None = None
|
||||||
_pipeline_task: asyncio.Task | None = None
|
_pipeline_task: asyncio.Task | None = None
|
||||||
|
|
||||||
__assist_satellite_state = AssistSatelliteState.LISTENING_WAKE_WORD
|
__assist_satellite_state = AssistSatelliteState.IDLE
|
||||||
|
|
||||||
@final
|
@final
|
||||||
@property
|
@property
|
||||||
@ -242,7 +242,7 @@ class AssistSatelliteEntity(entity.Entity):
|
|||||||
)
|
)
|
||||||
finally:
|
finally:
|
||||||
self._is_announcing = False
|
self._is_announcing = False
|
||||||
self._set_state(AssistSatelliteState.LISTENING_WAKE_WORD)
|
self._set_state(AssistSatelliteState.IDLE)
|
||||||
|
|
||||||
async def async_announce(self, announcement: AssistSatelliteAnnouncement) -> None:
|
async def async_announce(self, announcement: AssistSatelliteAnnouncement) -> None:
|
||||||
"""Announce media on the satellite.
|
"""Announce media on the satellite.
|
||||||
@ -363,9 +363,9 @@ class AssistSatelliteEntity(entity.Entity):
|
|||||||
def _internal_on_pipeline_event(self, event: PipelineEvent) -> None:
|
def _internal_on_pipeline_event(self, event: PipelineEvent) -> None:
|
||||||
"""Set state based on pipeline stage."""
|
"""Set state based on pipeline stage."""
|
||||||
if event.type is PipelineEventType.WAKE_WORD_START:
|
if event.type is PipelineEventType.WAKE_WORD_START:
|
||||||
self._set_state(AssistSatelliteState.LISTENING_WAKE_WORD)
|
self._set_state(AssistSatelliteState.IDLE)
|
||||||
elif event.type is PipelineEventType.STT_START:
|
elif event.type is PipelineEventType.STT_START:
|
||||||
self._set_state(AssistSatelliteState.LISTENING_COMMAND)
|
self._set_state(AssistSatelliteState.LISTENING)
|
||||||
elif event.type is PipelineEventType.INTENT_START:
|
elif event.type is PipelineEventType.INTENT_START:
|
||||||
self._set_state(AssistSatelliteState.PROCESSING)
|
self._set_state(AssistSatelliteState.PROCESSING)
|
||||||
elif event.type is PipelineEventType.INTENT_END:
|
elif event.type is PipelineEventType.INTENT_END:
|
||||||
@ -379,7 +379,7 @@ class AssistSatelliteEntity(entity.Entity):
|
|||||||
self._set_state(AssistSatelliteState.RESPONDING)
|
self._set_state(AssistSatelliteState.RESPONDING)
|
||||||
elif event.type is PipelineEventType.RUN_END:
|
elif event.type is PipelineEventType.RUN_END:
|
||||||
if not self._run_has_tts:
|
if not self._run_has_tts:
|
||||||
self._set_state(AssistSatelliteState.LISTENING_WAKE_WORD)
|
self._set_state(AssistSatelliteState.IDLE)
|
||||||
|
|
||||||
self.on_pipeline_event(event)
|
self.on_pipeline_event(event)
|
||||||
|
|
||||||
@ -392,7 +392,7 @@ class AssistSatelliteEntity(entity.Entity):
|
|||||||
@callback
|
@callback
|
||||||
def tts_response_finished(self) -> None:
|
def tts_response_finished(self) -> None:
|
||||||
"""Tell entity that the text-to-speech response has finished playing."""
|
"""Tell entity that the text-to-speech response has finished playing."""
|
||||||
self._set_state(AssistSatelliteState.LISTENING_WAKE_WORD)
|
self._set_state(AssistSatelliteState.IDLE)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _resolve_pipeline(self) -> str | None:
|
def _resolve_pipeline(self) -> str | None:
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
"_": {
|
"_": {
|
||||||
"name": "Assist satellite",
|
"name": "Assist satellite",
|
||||||
"state": {
|
"state": {
|
||||||
"listening_wake_word": "Wake word",
|
"idle": "[%key:common::state::idle%]",
|
||||||
"listening_command": "Voice command",
|
"listening": "Listening",
|
||||||
"responding": "Responding",
|
"responding": "Responding",
|
||||||
"processing": "Processing"
|
"processing": "Processing"
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ async def test_entity_state(
|
|||||||
|
|
||||||
state = hass.states.get(ENTITY_ID)
|
state = hass.states.get(ENTITY_ID)
|
||||||
assert state is not None
|
assert state is not None
|
||||||
assert state.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert state.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
context = Context()
|
context = Context()
|
||||||
audio_stream = object()
|
audio_stream = object()
|
||||||
@ -73,18 +73,18 @@ async def test_entity_state(
|
|||||||
assert kwargs["end_stage"] == PipelineStage.TTS
|
assert kwargs["end_stage"] == PipelineStage.TTS
|
||||||
|
|
||||||
for event_type, event_data, expected_state in (
|
for event_type, event_data, expected_state in (
|
||||||
(PipelineEventType.RUN_START, {}, AssistSatelliteState.LISTENING_WAKE_WORD),
|
(PipelineEventType.RUN_START, {}, AssistSatelliteState.IDLE),
|
||||||
(PipelineEventType.RUN_END, {}, AssistSatelliteState.LISTENING_WAKE_WORD),
|
(PipelineEventType.RUN_END, {}, AssistSatelliteState.IDLE),
|
||||||
(
|
(
|
||||||
PipelineEventType.WAKE_WORD_START,
|
PipelineEventType.WAKE_WORD_START,
|
||||||
{},
|
{},
|
||||||
AssistSatelliteState.LISTENING_WAKE_WORD,
|
AssistSatelliteState.IDLE,
|
||||||
),
|
),
|
||||||
(PipelineEventType.WAKE_WORD_END, {}, AssistSatelliteState.LISTENING_WAKE_WORD),
|
(PipelineEventType.WAKE_WORD_END, {}, AssistSatelliteState.IDLE),
|
||||||
(PipelineEventType.STT_START, {}, AssistSatelliteState.LISTENING_COMMAND),
|
(PipelineEventType.STT_START, {}, AssistSatelliteState.LISTENING),
|
||||||
(PipelineEventType.STT_VAD_START, {}, AssistSatelliteState.LISTENING_COMMAND),
|
(PipelineEventType.STT_VAD_START, {}, AssistSatelliteState.LISTENING),
|
||||||
(PipelineEventType.STT_VAD_END, {}, AssistSatelliteState.LISTENING_COMMAND),
|
(PipelineEventType.STT_VAD_END, {}, AssistSatelliteState.LISTENING),
|
||||||
(PipelineEventType.STT_END, {}, AssistSatelliteState.LISTENING_COMMAND),
|
(PipelineEventType.STT_END, {}, AssistSatelliteState.LISTENING),
|
||||||
(PipelineEventType.INTENT_START, {}, AssistSatelliteState.PROCESSING),
|
(PipelineEventType.INTENT_START, {}, AssistSatelliteState.PROCESSING),
|
||||||
(
|
(
|
||||||
PipelineEventType.INTENT_END,
|
PipelineEventType.INTENT_END,
|
||||||
@ -105,7 +105,7 @@ async def test_entity_state(
|
|||||||
|
|
||||||
entity.tts_response_finished()
|
entity.tts_response_finished()
|
||||||
state = hass.states.get(ENTITY_ID)
|
state = hass.states.get(ENTITY_ID)
|
||||||
assert state.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert state.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
|
|
||||||
async def test_new_pipeline_cancels_pipeline(
|
async def test_new_pipeline_cancels_pipeline(
|
||||||
@ -241,7 +241,7 @@ async def test_announce(
|
|||||||
target={"entity_id": "assist_satellite.test_entity"},
|
target={"entity_id": "assist_satellite.test_entity"},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert entity.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert entity.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
assert entity.announcements[0] == expected_params
|
assert entity.announcements[0] == expected_params
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ async def test_pipeline_api_audio(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Wake word
|
# Wake word
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
event_callback(
|
event_callback(
|
||||||
PipelineEvent(
|
PipelineEvent(
|
||||||
@ -242,7 +242,7 @@ async def test_pipeline_api_audio(
|
|||||||
VoiceAssistantEventType.VOICE_ASSISTANT_STT_START,
|
VoiceAssistantEventType.VOICE_ASSISTANT_STT_START,
|
||||||
{},
|
{},
|
||||||
)
|
)
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_COMMAND
|
assert satellite.state == AssistSatelliteState.LISTENING
|
||||||
|
|
||||||
event_callback(
|
event_callback(
|
||||||
PipelineEvent(
|
PipelineEvent(
|
||||||
@ -761,7 +761,7 @@ async def test_pipeline_media_player(
|
|||||||
)
|
)
|
||||||
await tts_finished.wait()
|
await tts_finished.wait()
|
||||||
|
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
|
|
||||||
async def test_timer_events(
|
async def test_timer_events(
|
||||||
@ -1214,7 +1214,7 @@ async def test_announce_message(
|
|||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
await done.wait()
|
await done.wait()
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
|
|
||||||
async def test_announce_media_id(
|
async def test_announce_media_id(
|
||||||
@ -1297,7 +1297,7 @@ async def test_announce_media_id(
|
|||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
await done.wait()
|
await done.wait()
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
mock_async_create_proxy_url.assert_called_once_with(
|
mock_async_create_proxy_url.assert_called_once_with(
|
||||||
hass,
|
hass,
|
||||||
|
@ -199,7 +199,7 @@ async def test_pipeline(
|
|||||||
assert voip_user_id
|
assert voip_user_id
|
||||||
|
|
||||||
# Satellite is muted until a call begins
|
# Satellite is muted until a call begins
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
done = asyncio.Event()
|
done = asyncio.Event()
|
||||||
|
|
||||||
@ -251,7 +251,7 @@ async def test_pipeline(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_COMMAND
|
assert satellite.state == AssistSatelliteState.LISTENING
|
||||||
|
|
||||||
# Fake STT result
|
# Fake STT result
|
||||||
event_callback(
|
event_callback(
|
||||||
@ -345,7 +345,7 @@ async def test_pipeline(
|
|||||||
satellite.transport = Mock()
|
satellite.transport = Mock()
|
||||||
|
|
||||||
satellite.connection_made(satellite.transport)
|
satellite.connection_made(satellite.transport)
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
# Ensure audio queue is cleared before pipeline starts
|
# Ensure audio queue is cleared before pipeline starts
|
||||||
satellite._audio_queue.put_nowait(bad_chunk)
|
satellite._audio_queue.put_nowait(bad_chunk)
|
||||||
@ -370,7 +370,7 @@ async def test_pipeline(
|
|||||||
await done.wait()
|
await done.wait()
|
||||||
|
|
||||||
# Finished speaking
|
# Finished speaking
|
||||||
assert satellite.state == AssistSatelliteState.LISTENING_WAKE_WORD
|
assert satellite.state == AssistSatelliteState.IDLE
|
||||||
|
|
||||||
|
|
||||||
async def test_stt_stream_timeout(
|
async def test_stt_stream_timeout(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user