Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for monitoring pyLoad."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from enum import StrEnum
8 
9 import voluptuous as vol
10 
12  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
13  SensorDeviceClass,
14  SensorEntity,
15  SensorEntityDescription,
16  SensorStateClass,
17 )
18 from homeassistant.config_entries import SOURCE_IMPORT
19 from homeassistant.const import (
20  CONF_HOST,
21  CONF_MONITORED_VARIABLES,
22  CONF_NAME,
23  CONF_PASSWORD,
24  CONF_PORT,
25  CONF_SSL,
26  CONF_USERNAME,
27  UnitOfDataRate,
28  UnitOfInformation,
29 )
30 from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
31 from homeassistant.data_entry_flow import FlowResultType
33 from homeassistant.helpers.entity_platform import AddEntitiesCallback
34 from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
35 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType
36 
37 from . import PyLoadConfigEntry
38 from .const import (
39  DEFAULT_HOST,
40  DEFAULT_NAME,
41  DEFAULT_PORT,
42  DOMAIN,
43  ISSUE_PLACEHOLDER,
44  UNIT_DOWNLOADS,
45 )
46 from .coordinator import PyLoadData
47 from .entity import BasePyLoadEntity
48 
49 
50 class PyLoadSensorEntity(StrEnum):
51  """pyLoad Sensor Entities."""
52 
53  ACTIVE = "active"
54  FREE_SPACE = "free_space"
55  QUEUE = "queue"
56  SPEED = "speed"
57  TOTAL = "total"
58 
59 
60 @dataclass(kw_only=True, frozen=True)
62  """Describes pyLoad switch entity."""
63 
64  value_fn: Callable[[PyLoadData], StateType]
65 
66 
67 SENSOR_DESCRIPTIONS: tuple[PyLoadSensorEntityDescription, ...] = (
69  key=PyLoadSensorEntity.SPEED,
70  translation_key=PyLoadSensorEntity.SPEED,
71  device_class=SensorDeviceClass.DATA_RATE,
72  native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
73  suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
74  suggested_display_precision=1,
75  value_fn=lambda data: data.speed,
76  ),
78  key=PyLoadSensorEntity.ACTIVE,
79  translation_key=PyLoadSensorEntity.ACTIVE,
80  native_unit_of_measurement=UNIT_DOWNLOADS,
81  state_class=SensorStateClass.MEASUREMENT,
82  value_fn=lambda data: data.active,
83  ),
85  key=PyLoadSensorEntity.QUEUE,
86  translation_key=PyLoadSensorEntity.QUEUE,
87  native_unit_of_measurement=UNIT_DOWNLOADS,
88  state_class=SensorStateClass.MEASUREMENT,
89  value_fn=lambda data: data.queue,
90  ),
92  key=PyLoadSensorEntity.TOTAL,
93  translation_key=PyLoadSensorEntity.TOTAL,
94  native_unit_of_measurement=UNIT_DOWNLOADS,
95  state_class=SensorStateClass.MEASUREMENT,
96  value_fn=lambda data: data.total,
97  ),
99  key=PyLoadSensorEntity.FREE_SPACE,
100  translation_key=PyLoadSensorEntity.FREE_SPACE,
101  device_class=SensorDeviceClass.DATA_SIZE,
102  native_unit_of_measurement=UnitOfInformation.BYTES,
103  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
104  suggested_display_precision=1,
105  value_fn=lambda data: data.free_space,
106  ),
107 )
108 
109 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
110  {
111  vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
112  vol.Optional(CONF_MONITORED_VARIABLES, default=["speed"]): vol.All(
113  cv.ensure_list, [vol.In(PyLoadSensorEntity)]
114  ),
115  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
116  vol.Optional(CONF_PASSWORD): cv.string,
117  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
118  vol.Optional(CONF_SSL, default=False): cv.boolean,
119  vol.Optional(CONF_USERNAME): cv.string,
120  }
121 )
122 
123 
125  hass: HomeAssistant,
126  config: ConfigType,
127  add_entities: AddEntitiesCallback,
128  discovery_info: DiscoveryInfoType | None = None,
129 ) -> None:
130  """Import config from yaml."""
131 
132  result = await hass.config_entries.flow.async_init(
133  DOMAIN, context={"source": SOURCE_IMPORT}, data=config
134  )
135  if (
136  result.get("type") == FlowResultType.CREATE_ENTRY
137  or result.get("reason") == "already_configured"
138  ):
140  hass,
141  HOMEASSISTANT_DOMAIN,
142  f"deprecated_yaml_{DOMAIN}",
143  is_fixable=False,
144  issue_domain=DOMAIN,
145  breaks_in_ha_version="2025.1.0",
146  severity=IssueSeverity.WARNING,
147  translation_key="deprecated_yaml",
148  translation_placeholders={
149  "domain": DOMAIN,
150  "integration_title": "pyLoad",
151  },
152  )
153  elif error := result.get("reason"):
155  hass,
156  DOMAIN,
157  f"deprecated_yaml_import_issue_{error}",
158  breaks_in_ha_version="2025.1.0",
159  is_fixable=False,
160  issue_domain=DOMAIN,
161  severity=IssueSeverity.WARNING,
162  translation_key=f"deprecated_yaml_import_issue_{error}",
163  translation_placeholders=ISSUE_PLACEHOLDER,
164  )
165 
166 
168  hass: HomeAssistant,
169  entry: PyLoadConfigEntry,
170  async_add_entities: AddEntitiesCallback,
171 ) -> None:
172  """Set up the pyLoad sensors."""
173 
174  coordinator = entry.runtime_data
175 
177  (
178  PyLoadSensor(
179  coordinator=coordinator,
180  entity_description=description,
181  )
182  for description in SENSOR_DESCRIPTIONS
183  ),
184  )
185 
186 
188  """Representation of a pyLoad sensor."""
189 
190  entity_description: PyLoadSensorEntityDescription
191 
192  @property
193  def native_value(self) -> StateType:
194  """Return the state of the sensor."""
195  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
None async_create_issue(HomeAssistant hass, str entry_id)
Definition: repairs.py:69
None async_setup_entry(HomeAssistant hass, PyLoadConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:171
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:129