Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for IPMA sensors."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from collections.abc import Callable, Coroutine
7 from dataclasses import dataclass
8 import logging
9 
10 from pyipma.api import IPMA_API
11 from pyipma.location import Location
12 from pyipma.rcm import RCM
13 from pyipma.uv import UV
14 
15 from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.util import Throttle
20 
21 from .const import DATA_API, DATA_LOCATION, DOMAIN, MIN_TIME_BETWEEN_UPDATES
22 from .entity import IPMADevice
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 
27 @dataclass(frozen=True, kw_only=True)
29  """Describes a IPMA sensor entity."""
30 
31  value_fn: Callable[[Location, IPMA_API], Coroutine[Location, IPMA_API, int | None]]
32 
33 
34 async def async_retrieve_rcm(location: Location, api: IPMA_API) -> int | None:
35  """Retrieve RCM."""
36  fire_risk: RCM = await location.fire_risk(api)
37  if fire_risk:
38  return fire_risk.rcm
39  return None
40 
41 
42 async def async_retrieve_uvi(location: Location, api: IPMA_API) -> int | None:
43  """Retrieve UV."""
44  uv_risk: UV = await location.uv_risk(api)
45  if uv_risk:
46  return round(uv_risk.iUv)
47  return None
48 
49 
50 SENSOR_TYPES: tuple[IPMASensorEntityDescription, ...] = (
52  key="rcm",
53  translation_key="fire_risk",
54  value_fn=async_retrieve_rcm,
55  ),
57  key="uvi",
58  translation_key="uv_index",
59  value_fn=async_retrieve_uvi,
60  ),
61 )
62 
63 
65  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
66 ) -> None:
67  """Set up the IPMA sensor platform."""
68  api = hass.data[DOMAIN][entry.entry_id][DATA_API]
69  location = hass.data[DOMAIN][entry.entry_id][DATA_LOCATION]
70 
71  entities = [IPMASensor(api, location, description) for description in SENSOR_TYPES]
72 
73  async_add_entities(entities, True)
74 
75 
77  """Representation of an IPMA sensor."""
78 
79  entity_description: IPMASensorEntityDescription
80  _attr_has_entity_name = True
81 
82  def __init__(
83  self,
84  api: IPMA_API,
85  location: Location,
86  description: IPMASensorEntityDescription,
87  ) -> None:
88  """Initialize the IPMA Sensor."""
89  IPMADevice.__init__(self, api, location)
90  self.entity_descriptionentity_description = description
91  self._attr_unique_id_attr_unique_id = f"{self._location.station_latitude}, {self._location.station_longitude}, {self.entity_description.key}"
92 
93  @Throttle(MIN_TIME_BETWEEN_UPDATES)
94  async def async_update(self) -> None:
95  """Update sensors."""
96  async with asyncio.timeout(10):
97  self._attr_native_value_attr_native_value = await self.entity_descriptionentity_description.value_fn(
98  self._location_location, self._api_api
99  )
None __init__(self, IPMA_API api, Location location, IPMASensorEntityDescription description)
Definition: sensor.py:87
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:66
int|None async_retrieve_rcm(Location location, IPMA_API api)
Definition: sensor.py:34
int|None async_retrieve_uvi(Location location, IPMA_API api)
Definition: sensor.py:42