108 lines
3.3 KiB
Python
108 lines
3.3 KiB
Python
"""Platform for sensor integration."""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from homeassistant.components.sensor import SensorEntity, SensorStateClass
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.const import CONF_ID, POWER_WATT
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
from homeassistant.helpers.update_coordinator import (
|
|
CoordinatorEntity,
|
|
DataUpdateCoordinator,
|
|
)
|
|
|
|
from .const import DATA_COORDINATOR, DOMAIN, SENSOR_TYPE_RATE, SENSORS_INFO
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
config_entry: ConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
"""Set up the sensor platform."""
|
|
coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR]
|
|
user_id = config_entry.data[CONF_ID]
|
|
|
|
async_add_entities(
|
|
HuisbaasjeSensor(coordinator, user_id=user_id, **sensor_info)
|
|
for sensor_info in SENSORS_INFO
|
|
)
|
|
|
|
|
|
class HuisbaasjeSensor(CoordinatorEntity, SensorEntity):
|
|
"""Defines a Huisbaasje sensor."""
|
|
|
|
def __init__(
|
|
self,
|
|
coordinator: DataUpdateCoordinator,
|
|
user_id: str,
|
|
name: str,
|
|
source_type: str,
|
|
device_class: str = None,
|
|
sensor_type: str = SENSOR_TYPE_RATE,
|
|
unit_of_measurement: str = POWER_WATT,
|
|
icon: str = "mdi:lightning-bolt",
|
|
precision: int = 0,
|
|
state_class: str | None = SensorStateClass.MEASUREMENT,
|
|
) -> None:
|
|
"""Initialize the sensor."""
|
|
super().__init__(coordinator)
|
|
self._user_id = user_id
|
|
self._name = name
|
|
self._device_class = device_class
|
|
self._unit_of_measurement = unit_of_measurement
|
|
self._source_type = source_type
|
|
self._sensor_type = sensor_type
|
|
self._icon = icon
|
|
self._precision = precision
|
|
self._attr_state_class = state_class
|
|
|
|
@property
|
|
def unique_id(self) -> str:
|
|
"""Return an unique id for the sensor."""
|
|
return f"{DOMAIN}_{self._user_id}_{self._source_type}_{self._sensor_type}"
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
"""Return the name of the sensor."""
|
|
return self._name
|
|
|
|
@property
|
|
def device_class(self) -> str | None:
|
|
"""Return the device class of the sensor."""
|
|
return self._device_class
|
|
|
|
@property
|
|
def icon(self) -> str:
|
|
"""Return the icon to use for the sensor."""
|
|
return self._icon
|
|
|
|
@property
|
|
def native_value(self):
|
|
"""Return the state of the sensor."""
|
|
if self.coordinator.data[self._source_type][self._sensor_type] is not None:
|
|
return round(
|
|
self.coordinator.data[self._source_type][self._sensor_type],
|
|
self._precision,
|
|
)
|
|
return None
|
|
|
|
@property
|
|
def native_unit_of_measurement(self) -> str:
|
|
"""Return the unit of measurement."""
|
|
return self._unit_of_measurement
|
|
|
|
@property
|
|
def available(self) -> bool:
|
|
"""Return if entity is available."""
|
|
return (
|
|
super().available
|
|
and self.coordinator.data
|
|
and self._source_type in self.coordinator.data
|
|
and self.coordinator.data[self._source_type]
|
|
)
|