Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Monitor the NZBGet API."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime, timedelta
6 import logging
7 
9  SensorDeviceClass,
10  SensorEntity,
11  SensorEntityDescription,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import CONF_NAME, UnitOfDataRate, UnitOfInformation
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 from homeassistant.helpers.typing import StateType
18 from homeassistant.util.dt import utcnow
19 
20 from .const import DATA_COORDINATOR, DOMAIN
21 from .coordinator import NZBGetDataUpdateCoordinator
22 from .entity import NZBGetEntity
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
28  key="ArticleCacheMB",
29  translation_key="article_cache",
30  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
31  device_class=SensorDeviceClass.DATA_SIZE,
32  ),
34  key="AverageDownloadRate",
35  translation_key="average_speed",
36  device_class=SensorDeviceClass.DATA_RATE,
37  native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
38  suggested_unit_of_measurement=UnitOfDataRate.MEGABYTES_PER_SECOND,
39  ),
41  key="DownloadPaused",
42  translation_key="download_paused",
43  ),
45  key="DownloadRate",
46  translation_key="speed",
47  device_class=SensorDeviceClass.DATA_RATE,
48  native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
49  suggested_unit_of_measurement=UnitOfDataRate.MEGABYTES_PER_SECOND,
50  ),
52  key="DownloadedSizeMB",
53  translation_key="size",
54  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
55  device_class=SensorDeviceClass.DATA_SIZE,
56  ),
58  key="FreeDiskSpaceMB",
59  translation_key="disk_free",
60  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
61  device_class=SensorDeviceClass.DATA_SIZE,
62  ),
64  key="PostJobCount",
65  translation_key="post_processing_jobs",
66  native_unit_of_measurement="Jobs",
67  ),
69  key="PostPaused",
70  translation_key="post_processing_paused",
71  ),
73  key="RemainingSizeMB",
74  translation_key="queue_size",
75  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
76  device_class=SensorDeviceClass.DATA_SIZE,
77  ),
79  key="UpTimeSec",
80  translation_key="uptime",
81  device_class=SensorDeviceClass.TIMESTAMP,
82  ),
84  key="DownloadLimit",
85  translation_key="speed_limit",
86  device_class=SensorDeviceClass.DATA_RATE,
87  native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
88  suggested_unit_of_measurement=UnitOfDataRate.MEGABYTES_PER_SECOND,
89  ),
90 )
91 
92 
94  hass: HomeAssistant,
95  entry: ConfigEntry,
96  async_add_entities: AddEntitiesCallback,
97 ) -> None:
98  """Set up NZBGet sensor based on a config entry."""
99  coordinator: NZBGetDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
100  DATA_COORDINATOR
101  ]
102  entities = [
103  NZBGetSensor(coordinator, entry.entry_id, entry.data[CONF_NAME], description)
104  for description in SENSOR_TYPES
105  ]
106 
107  async_add_entities(entities)
108 
109 
111  """Representation of a NZBGet sensor."""
112 
113  def __init__(
114  self,
115  coordinator: NZBGetDataUpdateCoordinator,
116  entry_id: str,
117  entry_name: str,
118  description: SensorEntityDescription,
119  ) -> None:
120  """Initialize a new NZBGet sensor."""
121  super().__init__(
122  coordinator=coordinator,
123  entry_id=entry_id,
124  entry_name=entry_name,
125  )
126 
127  self.entity_descriptionentity_description = description
128  self._attr_unique_id_attr_unique_id = f"{entry_id}_{description.key}"
129 
130  @property
131  def native_value(self) -> StateType | datetime:
132  """Return the state of the sensor."""
133  sensor_type = self.entity_descriptionentity_description.key
134  value = self.coordinator.data["status"].get(sensor_type)
135 
136  if value is not None and "UpTimeSec" in sensor_type and value > 0:
137  uptime = utcnow().replace(microsecond=0) - timedelta(seconds=value)
138  if not isinstance(self._attr_native_value, datetime) or abs(
139  uptime - self._attr_native_value
140  ) > timedelta(seconds=5):
141  return uptime
142  return value
None __init__(self, NZBGetDataUpdateCoordinator coordinator, str entry_id, str entry_name, SensorEntityDescription description)
Definition: sensor.py:119
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:97