-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdevices.py
190 lines (159 loc) · 7.17 KB
/
devices.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
"""Class to manage satellite devices."""
from __future__ import annotations
from typing import Optional
from collections.abc import Callable
from dataclasses import dataclass
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import entity_registry as er
from .const import DOMAIN
@dataclass
class SatelliteDevice:
"""Class to store device."""
satellite_id: str
device_id: str
is_active: bool = False
is_muted: bool = False
pipeline_name: str | None = None
noise_suppression_level: int = 0
auto_gain: int = 0
volume_multiplier: float = 1.0
speaker_volume: float = 1.0
_is_active_listener: Callable[[], None] | None = None
_is_muted_listener: Callable[[], None] | None = None
_pipeline_listener: Callable[[], None] | None = None
_audio_settings_listener: Callable[[], None] | None = None
_play_media_listener: Callable[[str], None] | None = None
_remote_trigger_listener: Callable[[str | None], None] | None = None
@callback
def play_media(self, media_id: str) -> None:
"""Send the media_id to the satellite."""
if self._play_media_listener is not None:
self._play_media_listener(media_id)
@callback
def remote_trigger(self, question_id: Optional[str] = None) -> None:
"""Remote Trigger the Detection and bypass wake word."""
if self._remote_trigger_listener is not None:
self._remote_trigger_listener(question_id)
@callback
def set_is_active(self, active: bool) -> None:
"""Set active state."""
if active != self.is_active:
self.is_active = active
if self._is_active_listener is not None:
self._is_active_listener()
@callback
def set_is_muted(self, muted: bool) -> None:
"""Set muted state."""
if muted != self.is_muted:
self.is_muted = muted
if self._is_muted_listener is not None:
self._is_muted_listener()
@callback
def set_pipeline_name(self, pipeline_name: str) -> None:
"""Inform listeners that pipeline selection has changed."""
if pipeline_name != self.pipeline_name:
self.pipeline_name = pipeline_name
if self._pipeline_listener is not None:
self._pipeline_listener()
@callback
def set_noise_suppression_level(self, noise_suppression_level: int) -> None:
"""Set noise suppression level."""
if noise_suppression_level != self.noise_suppression_level:
self.noise_suppression_level = noise_suppression_level
if self._audio_settings_listener is not None:
self._audio_settings_listener()
@callback
def set_auto_gain(self, auto_gain: int) -> None:
"""Set auto gain amount."""
if auto_gain != self.auto_gain:
self.auto_gain = auto_gain
if self._audio_settings_listener is not None:
self._audio_settings_listener()
@callback
def set_volume_multiplier(self, volume_multiplier: float) -> None:
"""Set auto gain amount."""
if volume_multiplier != self.volume_multiplier:
self.volume_multiplier = volume_multiplier
if self._audio_settings_listener is not None:
self._audio_settings_listener()
@callback
def set_speaker_volume(self, speaker_volume: float) -> None:
"""Set speaker volume."""
if speaker_volume != self.speaker_volume:
self.speaker_volume = speaker_volume
if self._audio_settings_listener is not None:
self._audio_settings_listener()
@callback
def set_play_media_listener(self, play_media_listener: Callable[[str], None]) -> None:
"""Listen for updates to play media."""
self._play_media_listener = play_media_listener
@callback
def set_remote_trigger_listener(self, remote_trigger_listener: Callable[[str | None], None]) -> None:
"""Listen for updates to remote trigger."""
self._remote_trigger_listener = remote_trigger_listener
@callback
def set_is_active_listener(self, is_active_listener: Callable[[], None]) -> None:
"""Listen for updates to is_active."""
self._is_active_listener = is_active_listener
@callback
def set_is_muted_listener(self, is_muted_listener: Callable[[], None]) -> None:
"""Listen for updates to muted status."""
self._is_muted_listener = is_muted_listener
@callback
def set_pipeline_listener(self, pipeline_listener: Callable[[], None]) -> None:
"""Listen for updates to pipeline."""
self._pipeline_listener = pipeline_listener
@callback
def set_audio_settings_listener(
self, audio_settings_listener: Callable[[], None]
) -> None:
"""Listen for updates to audio settings."""
self._audio_settings_listener = audio_settings_listener
def get_play_media_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for satellite media player."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"media_player", DOMAIN, f"{self.satellite_id}-mplayer"
)
def get_assist_in_progress_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for assist in progress binary sensor."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"binary_sensor", DOMAIN, f"{self.satellite_id}-assist_in_progress"
)
def get_muted_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for satellite muted switch."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"switch", DOMAIN, f"{self.satellite_id}-mute"
)
def get_pipeline_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for pipeline select."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"select", DOMAIN, f"{self.satellite_id}-pipeline"
)
def get_noise_suppression_level_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for noise suppression select."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"select", DOMAIN, f"{self.satellite_id}-noise_suppression_level"
)
def get_auto_gain_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for auto gain amount."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"number", DOMAIN, f"{self.satellite_id}-auto_gain"
)
def get_volume_multiplier_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for microphone volume multiplier."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"number", DOMAIN, f"{self.satellite_id}-volume_multiplier"
)
def get_speaker_volume_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for speaker volume."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"number", DOMAIN, f"{self.satellite_id}-speaker_volume"
)