-
-
Notifications
You must be signed in to change notification settings - Fork 32.2k
/
Copy pathdevices.py
159 lines (133 loc) · 5.94 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
"""Class to manage satellite devices."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from homeassistant.components.assist_pipeline.vad import VadSensitivity
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
vad_sensitivity: VadSensitivity = VadSensitivity.DEFAULT
_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
@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_vad_sensitivity(self, vad_sensitivity: VadSensitivity) -> None:
"""Set VAD sensitivity."""
if vad_sensitivity != self.vad_sensitivity:
self.vad_sensitivity = vad_sensitivity
if self._audio_settings_listener is not None:
self._audio_settings_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_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_vad_sensitivity_entity_id(self, hass: HomeAssistant) -> str | None:
"""Return entity id for VAD sensitivity."""
ent_reg = er.async_get(hass)
return ent_reg.async_get_entity_id(
"select", DOMAIN, f"{self.satellite_id}-vad_sensitivity"
)