168 lines
5.1 KiB
Python
168 lines
5.1 KiB
Python
"""Support for the RNSA pollens service."""
|
|
|
|
import logging
|
|
from warnings import catch_warnings
|
|
|
|
from yaml import KeyToken
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.components.sensor import SensorEntity, SensorDeviceClass, SensorStateClass
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from .const import (
|
|
DOMAIN,
|
|
LIST_RISK,
|
|
ATTR_URL,
|
|
ATTR_COUNTY_NAME,
|
|
ATTR_POLLEN_NAME,
|
|
ATTR_LITERAL_STATE,
|
|
KEY_TO_ATTR,
|
|
COORDINATOR,
|
|
CONF_POLLENSLIST,
|
|
CONF_LITERAL,
|
|
)
|
|
from . import PollensEntity, PollensUpdateCoordinator
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
ICONS = {
|
|
0: "mdi:decagram-outline",
|
|
1: "mdi:decagram-check",
|
|
2: "mdi:alert-decagram-outline",
|
|
3: "mdi:alert-decagram",
|
|
}
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
|
) -> None:
|
|
"""Setup Sensor Plateform"""
|
|
coordinator = hass.data[DOMAIN][entry.entry_id][COORDINATOR]
|
|
sensors = []
|
|
try:
|
|
enabled_pollens = entry.data[CONF_POLLENSLIST]
|
|
except KeyError:
|
|
enabled_pollens = [pollen for pollen in KEY_TO_ATTR]
|
|
for risk in coordinator.api.risks:
|
|
name = risk
|
|
icon = KEY_TO_ATTR[risk.lower()][1]
|
|
sensors.append(PollenSensor(coordinator, name=name, icon=icon, entry=entry, enabled=name.lower() in enabled_pollens))
|
|
|
|
name = f"pollens_{coordinator.county}"
|
|
icon = ICONS[0]
|
|
sensors.append(
|
|
RiskSensor(coordinator=coordinator, name=name, icon=icon, entry=entry, numeric=False)
|
|
)
|
|
sensors.append(
|
|
RiskSensor(coordinator=coordinator, name=name + "_risklevel", icon=icon, entry=entry, numeric=True)
|
|
)
|
|
|
|
async_add_entities(sensors, True)
|
|
|
|
|
|
class PollenSensor(PollensEntity, SensorEntity):
|
|
"""Implementation of a Pollens sensor."""
|
|
|
|
def __init__(
|
|
self,
|
|
coordinator: PollensUpdateCoordinator,
|
|
name: str,
|
|
icon: str,
|
|
entry: ConfigEntry,
|
|
enabled: bool
|
|
) -> None:
|
|
super().__init__(coordinator, name, icon, entry)
|
|
self._name = f"pollens_{coordinator.county}_{KEY_TO_ATTR[name.lower()][0]}"
|
|
self._state = coordinator.api.risks[name]
|
|
self._unique_id = f"{entry.entry_id}_{self._name}"
|
|
self._attr_name = name
|
|
self._attr_unique_id = self._unique_id
|
|
self._attr_entity_registry_enabled_default = enabled
|
|
|
|
try:
|
|
self._literal_state = entry.data[CONF_LITERAL]
|
|
# Setup DeviceClass in AQI and stateClass in numeric (Issue #15)
|
|
if not self._literal_state:
|
|
self._attr_device_class = SensorDeviceClass.AQI
|
|
self._attr_state_class = SensorStateClass.MEASUREMENT
|
|
|
|
except KeyError:
|
|
self._literal_state = True
|
|
self._attr_icon = icon
|
|
self._friendly_name = f"{name}"
|
|
|
|
@property
|
|
def name(self):
|
|
return self._name
|
|
|
|
@property
|
|
def native_value(self):
|
|
value = self.coordinator.api.risks[self._attr_name]
|
|
if self._literal_state:
|
|
return LIST_RISK[value]
|
|
else:
|
|
return value
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return the unique id."""
|
|
return self._unique_id
|
|
|
|
@property
|
|
def extra_state_attributes(self):
|
|
"""Return the state attributes of the last update."""
|
|
attrs = {}
|
|
attrs[ATTR_POLLEN_NAME] = self._friendly_name
|
|
if self.coordinator.api.risks is not None:
|
|
if not self._literal_state:
|
|
value = self.coordinator.api.risks[self._attr_name]
|
|
attrs[ATTR_LITERAL_STATE] = LIST_RISK[value]
|
|
return attrs
|
|
|
|
|
|
class RiskSensor(PollensEntity, SensorEntity):
|
|
"""Implementation of Risk Sensor"""
|
|
|
|
def __init__(
|
|
self,
|
|
coordinator: PollensUpdateCoordinator,
|
|
name: str,
|
|
icon: str,
|
|
entry: ConfigEntry,
|
|
numeric: bool
|
|
) -> None:
|
|
super().__init__(coordinator, name, icon, entry)
|
|
self._risk_level = coordinator.api.risk_level
|
|
self._attr_unique_id = f"{entry.entry_id}_{coordinator.county}"
|
|
self._attr_icon = icon
|
|
self._name = name
|
|
self._numeric = numeric
|
|
if numeric:
|
|
self._attr_unique_id += "_risklevel"
|
|
self._attr_device_class = SensorDeviceClass.AQI
|
|
self._attr_state_class = SensorStateClass.MEASUREMENT
|
|
|
|
@property
|
|
def native_value(self):
|
|
value = self.coordinator.api.risk_level
|
|
if self._numeric:
|
|
return value
|
|
else:
|
|
return LIST_RISK[value]
|
|
|
|
@property
|
|
def icon(self):
|
|
return ICONS[self._risk_level]
|
|
|
|
@property
|
|
def name(self):
|
|
return self._name
|
|
|
|
@property
|
|
def extra_state_attributes(self):
|
|
attrs = {}
|
|
attrs[ATTR_URL] = "https://pollens.fr"
|
|
attrs[ATTR_COUNTY_NAME] = self.coordinator.api.county_name
|
|
return attrs
|