core/homeassistant/components/airly/sensor.py

115 lines
3.4 KiB
Python

"""Support for the Airly sensor service."""
from __future__ import annotations
from typing import Any, cast
from homeassistant.components.sensor import SensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import AirlyDataUpdateCoordinator
from .const import (
ATTR_API_PM1,
ATTR_API_PRESSURE,
ATTRIBUTION,
DEFAULT_NAME,
DOMAIN,
MANUFACTURER,
SENSOR_TYPES,
)
PARALLEL_UPDATES = 1
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up Airly sensor entities based on a config entry."""
name = entry.data[CONF_NAME]
coordinator = hass.data[DOMAIN][entry.entry_id]
sensors = []
for sensor in SENSOR_TYPES:
# When we use the nearest method, we are not sure which sensors are available
if coordinator.data.get(sensor):
sensors.append(AirlySensor(coordinator, name, sensor))
async_add_entities(sensors, False)
class AirlySensor(CoordinatorEntity, SensorEntity):
"""Define an Airly sensor."""
coordinator: AirlyDataUpdateCoordinator
def __init__(
self, coordinator: AirlyDataUpdateCoordinator, name: str, kind: str
) -> None:
"""Initialize."""
super().__init__(coordinator)
self._name = name
self._description = SENSOR_TYPES[kind]
self.kind = kind
self._state = None
self._unit_of_measurement = None
self._attrs = {ATTR_ATTRIBUTION: ATTRIBUTION}
@property
def name(self) -> str:
"""Return the name."""
return f"{self._name} {self._description['label']}"
@property
def state(self) -> StateType:
"""Return the state."""
self._state = self.coordinator.data[self.kind]
if self.kind in [ATTR_API_PM1, ATTR_API_PRESSURE]:
return round(cast(float, self._state))
return round(cast(float, self._state), 1)
@property
def extra_state_attributes(self) -> dict[str, Any]:
"""Return the state attributes."""
return self._attrs
@property
def icon(self) -> str | None:
"""Return the icon."""
return self._description["icon"]
@property
def device_class(self) -> str | None:
"""Return the device_class."""
return self._description["device_class"]
@property
def unique_id(self) -> str:
"""Return a unique_id for this entity."""
return f"{self.coordinator.latitude}-{self.coordinator.longitude}-{self.kind.lower()}"
@property
def device_info(self) -> DeviceInfo:
"""Return the device info."""
return {
"identifiers": {
(
DOMAIN,
f"{self.coordinator.latitude}-{self.coordinator.longitude}",
)
},
"name": DEFAULT_NAME,
"manufacturer": MANUFACTURER,
"entry_type": "service",
}
@property
def unit_of_measurement(self) -> str | None:
"""Return the unit the value is expressed in."""
return self._description["unit"]