1 """Support for Radarr."""
3 from __future__
import annotations
5 from collections.abc
import Callable
7 from datetime
import UTC, datetime
8 from typing
import Any, Generic
10 from aiopyarr
import Diskspace, RootFolder, SystemStatus
15 SensorEntityDescription,
22 from .
import RadarrConfigEntry
23 from .coordinator
import RadarrDataUpdateCoordinator, T
24 from .entity
import RadarrEntity
27 def get_space(data: list[Diskspace], name: str) -> str:
30 mount.freeSpace / 1024 ** BYTE_SIZES.index(UnitOfInformation.GIGABYTES)
34 return f
"{space[0]:.2f}"
38 description: RadarrSensorEntityDescription[T], mount: RootFolder
39 ) -> tuple[RadarrSensorEntityDescription[T], str]:
40 """Return modified description and folder name."""
41 name = mount.path.rsplit(
"/")[-1].rsplit(
"\\")[-1]
42 desc = dataclasses.replace(
44 key=f
"{description.key}_{name}",
45 name=f
"{description.name} {name}".capitalize(),
50 @dataclasses.dataclass(frozen=True)
52 """Mixin for required keys."""
54 value_fn: Callable[[T, str], str | int | datetime]
57 @dataclasses.dataclass(frozen=True)
59 SensorEntityDescription, RadarrSensorEntityDescriptionMixIn[T], Generic[T]
61 """Class to describe a Radarr sensor."""
65 [RadarrSensorEntityDescription[T], RootFolder],
66 tuple[RadarrSensorEntityDescription[T], str] |
None,
72 SENSOR_TYPES: dict[str, RadarrSensorEntityDescription[Any]] = {
76 native_unit_of_measurement=UnitOfInformation.GIGABYTES,
77 device_class=SensorDeviceClass.DATA_SIZE,
80 description_fn=get_modified_description,
82 "movie": RadarrSensorEntityDescription[int](
84 translation_key=
"movies",
85 native_unit_of_measurement=
"Movies",
86 entity_registry_enabled_default=
False,
87 value_fn=
lambda data, _: data,
89 "queue": RadarrSensorEntityDescription[int](
91 translation_key=
"queue",
92 native_unit_of_measurement=
"Movies",
93 entity_registry_enabled_default=
False,
94 state_class=SensorStateClass.TOTAL,
95 value_fn=
lambda data, _: data,
97 "status": RadarrSensorEntityDescription[SystemStatus](
99 translation_key=
"start_time",
100 device_class=SensorDeviceClass.TIMESTAMP,
101 entity_category=EntityCategory.DIAGNOSTIC,
102 entity_registry_enabled_default=
False,
103 value_fn=
lambda data, _: data.startTime.replace(tzinfo=UTC),
108 UnitOfInformation.BYTES,
109 UnitOfInformation.KILOBYTES,
110 UnitOfInformation.MEGABYTES,
111 UnitOfInformation.GIGABYTES,
119 entry: RadarrConfigEntry,
120 async_add_entities: AddEntitiesCallback,
122 """Set up Radarr sensors based on a config entry."""
123 entities: list[RadarrSensor[Any]] = []
124 for coordinator_type, description
in SENSOR_TYPES.items():
125 coordinator = getattr(entry.runtime_data, coordinator_type)
126 if coordinator_type !=
"disk_space":
131 for mount
in coordinator.data
132 if description.description_fn
138 """Implementation of the Radarr sensor."""
140 coordinator: RadarrDataUpdateCoordinator[T]
141 entity_description: RadarrSensorEntityDescription[T]
145 coordinator: RadarrDataUpdateCoordinator[T],
146 description: RadarrSensorEntityDescription[T],
147 folder_name: str =
"",
149 """Create Radarr entity."""
150 super().
__init__(coordinator, description)
155 """Return the state of the sensor."""
str|int|datetime native_value(self)
None __init__(self, RadarrDataUpdateCoordinator[T] coordinator, RadarrSensorEntityDescription[T] description, str folder_name="")
str get_space(list[Diskspace] data, str name)
tuple[RadarrSensorEntityDescription[T], str] get_modified_description(RadarrSensorEntityDescription[T] description, RootFolder mount)
None async_setup_entry(HomeAssistant hass, RadarrConfigEntry entry, AddEntitiesCallback async_add_entities)