core/homeassistant/components/vegehub/sensor.py

95 lines
2.9 KiB
Python

"""Sensor configuration for VegeHub integration."""
from itertools import count
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.const import UnitOfElectricPotential
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import VegeHubConfigEntry, VegeHubCoordinator
from .entity import VegeHubEntity
SENSOR_TYPES: dict[str, SensorEntityDescription] = {
"analog_sensor": SensorEntityDescription(
key="analog_sensor",
translation_key="analog_sensor",
device_class=SensorDeviceClass.VOLTAGE,
native_unit_of_measurement=UnitOfElectricPotential.VOLT,
suggested_display_precision=2,
),
"battery_volts": SensorEntityDescription(
key="battery_volts",
translation_key="battery_volts",
device_class=SensorDeviceClass.VOLTAGE,
native_unit_of_measurement=UnitOfElectricPotential.VOLT,
suggested_display_precision=1,
),
}
async def async_setup_entry(
hass: HomeAssistant,
config_entry: VegeHubConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up Vegetronix sensors from a config entry."""
sensors: list[VegeHubSensor] = []
coordinator = config_entry.runtime_data
sensor_index = count(0)
# Add each analog sensor input
for _i in range(coordinator.vegehub.num_sensors):
sensor = VegeHubSensor(
index=next(sensor_index),
coordinator=coordinator,
description=SENSOR_TYPES["analog_sensor"],
)
sensors.append(sensor)
# Add the battery sensor
if not coordinator.vegehub.is_ac:
sensors.append(
VegeHubSensor(
index=next(sensor_index),
coordinator=coordinator,
description=SENSOR_TYPES["battery_volts"],
)
)
async_add_entities(sensors)
class VegeHubSensor(VegeHubEntity, SensorEntity):
"""Class for VegeHub Analog Sensors."""
def __init__(
self,
index: int,
coordinator: VegeHubCoordinator,
description: SensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self.entity_description = description
# Set data key for pulling data from the coordinator
if description.key == "battery_volts":
self.data_key = "battery"
else:
self.data_key = f"analog_{index}"
self._attr_translation_placeholders = {"index": str(index + 1)}
self._attr_unique_id = f"{self._mac_address}_{self.data_key}"
self._attr_available = False
@property
def native_value(self) -> float | None:
"""Return the sensor's current value."""
if self.coordinator.data is None:
return None
return self.coordinator.data.get(self.data_key)