1 """Sensor entities for the madVR integration."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
11 SensorEntityDescription,
19 from .
import MadVRConfigEntry
25 INCOMING_ASPECT_RATIO,
27 INCOMING_BLACK_LEVELS,
37 OUTGOING_BLACK_LEVELS,
48 from .coordinator
import MadVRCoordinator
49 from .entity
import MadVREntity
53 """Check if the temperature value is valid."""
54 return value
is not None and value > 0
58 """Get temperature value if valid, otherwise return None."""
60 temp =
float(coordinator.data.get(key, 0))
61 except (AttributeError, ValueError):
67 @dataclass(frozen=True, kw_only=True)
69 """Describe madVR sensor entity."""
71 value_fn: Callable[[MadVRCoordinator], StateType]
74 SENSORS: tuple[MadvrSensorEntityDescription, ...] = (
77 device_class=SensorDeviceClass.TEMPERATURE,
78 state_class=SensorStateClass.MEASUREMENT,
79 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
81 translation_key=TEMP_GPU,
82 entity_registry_enabled_default=
False,
86 device_class=SensorDeviceClass.TEMPERATURE,
87 state_class=SensorStateClass.MEASUREMENT,
88 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
90 translation_key=TEMP_HDMI,
91 entity_registry_enabled_default=
False,
95 device_class=SensorDeviceClass.TEMPERATURE,
96 state_class=SensorStateClass.MEASUREMENT,
97 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
99 translation_key=TEMP_CPU,
100 entity_registry_enabled_default=
False,
104 device_class=SensorDeviceClass.TEMPERATURE,
105 state_class=SensorStateClass.MEASUREMENT,
106 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
107 value_fn=
lambda coordinator:
get_temperature(coordinator, TEMP_MAINBOARD),
108 translation_key=TEMP_MAINBOARD,
109 entity_registry_enabled_default=
False,
113 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_RES),
114 translation_key=INCOMING_RES,
117 key=INCOMING_SIGNAL_TYPE,
118 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_SIGNAL_TYPE),
119 translation_key=INCOMING_SIGNAL_TYPE,
120 device_class=SensorDeviceClass.ENUM,
121 options=[
"2D",
"3D"],
122 entity_registry_enabled_default=
False,
125 key=INCOMING_FRAME_RATE,
126 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_FRAME_RATE),
127 translation_key=INCOMING_FRAME_RATE,
130 key=INCOMING_COLOR_SPACE,
131 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_COLOR_SPACE),
132 translation_key=INCOMING_COLOR_SPACE,
133 device_class=SensorDeviceClass.ENUM,
134 options=[
"RGB",
"444",
"422",
"420"],
137 key=INCOMING_BIT_DEPTH,
138 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_BIT_DEPTH),
139 translation_key=INCOMING_BIT_DEPTH,
140 device_class=SensorDeviceClass.ENUM,
141 options=[
"8bit",
"10bit",
"12bit"],
144 key=INCOMING_COLORIMETRY,
145 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_COLORIMETRY),
146 translation_key=INCOMING_COLORIMETRY,
147 device_class=SensorDeviceClass.ENUM,
148 options=[
"SDR",
"HDR10",
"HLG 601",
"PAL",
"709",
"DCI",
"2020"],
151 key=INCOMING_BLACK_LEVELS,
152 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_BLACK_LEVELS),
153 translation_key=INCOMING_BLACK_LEVELS,
154 device_class=SensorDeviceClass.ENUM,
155 options=[
"TV",
"PC"],
158 key=INCOMING_ASPECT_RATIO,
159 value_fn=
lambda coordinator: coordinator.data.get(INCOMING_ASPECT_RATIO),
160 translation_key=INCOMING_ASPECT_RATIO,
161 device_class=SensorDeviceClass.ENUM,
162 options=[
"16:9",
"4:3"],
163 entity_registry_enabled_default=
False,
167 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_RES),
168 translation_key=OUTGOING_RES,
171 key=OUTGOING_SIGNAL_TYPE,
172 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_SIGNAL_TYPE),
173 translation_key=OUTGOING_SIGNAL_TYPE,
174 device_class=SensorDeviceClass.ENUM,
175 options=[
"2D",
"3D"],
176 entity_registry_enabled_default=
False,
179 key=OUTGOING_FRAME_RATE,
180 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_FRAME_RATE),
181 translation_key=OUTGOING_FRAME_RATE,
184 key=OUTGOING_COLOR_SPACE,
185 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_COLOR_SPACE),
186 translation_key=OUTGOING_COLOR_SPACE,
187 device_class=SensorDeviceClass.ENUM,
188 options=[
"RGB",
"444",
"422",
"420"],
191 key=OUTGOING_BIT_DEPTH,
192 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_BIT_DEPTH),
193 translation_key=OUTGOING_BIT_DEPTH,
194 device_class=SensorDeviceClass.ENUM,
195 options=[
"8bit",
"10bit",
"12bit"],
198 key=OUTGOING_COLORIMETRY,
199 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_COLORIMETRY),
200 translation_key=OUTGOING_COLORIMETRY,
201 device_class=SensorDeviceClass.ENUM,
202 options=[
"SDR",
"HDR10",
"HLG 601",
"PAL",
"709",
"DCI",
"2020"],
205 key=OUTGOING_BLACK_LEVELS,
206 value_fn=
lambda coordinator: coordinator.data.get(OUTGOING_BLACK_LEVELS),
207 translation_key=OUTGOING_BLACK_LEVELS,
208 device_class=SensorDeviceClass.ENUM,
209 options=[
"TV",
"PC"],
213 value_fn=
lambda coordinator: coordinator.data.get(ASPECT_RES),
214 translation_key=ASPECT_RES,
215 entity_registry_enabled_default=
False,
219 value_fn=
lambda coordinator: coordinator.data.get(ASPECT_DEC),
220 translation_key=ASPECT_DEC,
224 value_fn=
lambda coordinator: coordinator.data.get(ASPECT_INT),
225 translation_key=ASPECT_INT,
226 entity_registry_enabled_default=
False,
230 value_fn=
lambda coordinator: coordinator.data.get(ASPECT_NAME),
231 translation_key=ASPECT_NAME,
232 entity_registry_enabled_default=
False,
236 value_fn=
lambda coordinator: coordinator.data.get(MASKING_RES),
237 translation_key=MASKING_RES,
238 entity_registry_enabled_default=
False,
242 value_fn=
lambda coordinator: coordinator.data.get(MASKING_DEC),
243 translation_key=MASKING_DEC,
247 value_fn=
lambda coordinator: coordinator.data.get(MASKING_INT),
248 translation_key=MASKING_INT,
249 entity_registry_enabled_default=
False,
256 entry: MadVRConfigEntry,
257 async_add_entities: AddEntitiesCallback,
259 """Set up the sensor entities."""
260 coordinator = entry.runtime_data
265 """Base class for madVR sensors."""
269 coordinator: MadVRCoordinator,
270 description: MadvrSensorEntityDescription,
272 """Initialize the sensor."""
274 self.entity_description: MadvrSensorEntityDescription = description
279 """Return the state of the sensor."""
280 val = self.entity_description.
value_fn(self.coordinator)
282 if self.entity_description.device_class == SensorDeviceClass.ENUM:
284 self.entity_description.options
285 and val
in self.entity_description.options
float|str|None native_value(self)
None __init__(self, MadVRCoordinator coordinator, MadvrSensorEntityDescription description)
float|None get_temperature(MadVRCoordinator coordinator, str key)
None async_setup_entry(HomeAssistant hass, MadVRConfigEntry entry, AddEntitiesCallback async_add_entities)
bool is_valid_temperature(float|None value)