diff --git a/homeassistant/components/aladdin_connect/__init__.py b/homeassistant/components/aladdin_connect/__init__.py index 1a28a03cf05..036f5364ef5 100644 --- a/homeassistant/components/aladdin_connect/__init__.py +++ b/homeassistant/components/aladdin_connect/__init__.py @@ -16,7 +16,7 @@ from .const import DOMAIN _LOGGER: Final = logging.getLogger(__name__) -PLATFORMS: list[Platform] = [Platform.COVER] +PLATFORMS: list[Platform] = [Platform.COVER, Platform.SENSOR] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/homeassistant/components/aladdin_connect/cover.py b/homeassistant/components/aladdin_connect/cover.py index 9c03cd322b6..d06ebebd076 100644 --- a/homeassistant/components/aladdin_connect/cover.py +++ b/homeassistant/components/aladdin_connect/cover.py @@ -24,6 +24,7 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType @@ -87,8 +88,18 @@ class AladdinDevice(CoverEntity): self._device_id = device["device_id"] self._number = device["door_number"] - self._attr_name = device["name"] + self._name = device["name"] self._attr_unique_id = f"{self._device_id}-{self._number}" + self._attr_has_entity_name = True + + @property + def device_info(self) -> DeviceInfo | None: + """Device information for Aladdin Connect cover.""" + return DeviceInfo( + identifiers={(DOMAIN, self._device_id)}, + name=self._name, + manufacturer="Overhead Door", + ) async def async_added_to_hass(self) -> None: """Connect Aladdin Connect to the cloud.""" diff --git a/homeassistant/components/aladdin_connect/sensor.py b/homeassistant/components/aladdin_connect/sensor.py new file mode 100644 index 00000000000..d9783d0f61d --- /dev/null +++ b/homeassistant/components/aladdin_connect/sensor.py @@ -0,0 +1,115 @@ +"""Support for Aladdin Connect Garage Door sensors.""" +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +from typing import cast + +from AIOAladdinConnect import AladdinConnectClient + +from homeassistant.components.sensor import ( + SensorDeviceClass, + SensorEntity, + SensorEntityDescription, + SensorStateClass, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import PERCENTAGE, SIGNAL_STRENGTH_DECIBELS +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import DeviceInfo +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from .const import DOMAIN +from .model import DoorDevice + + +@dataclass +class AccSensorEntityDescriptionMixin: + """Mixin for required keys.""" + + value_fn: Callable + + +@dataclass +class AccSensorEntityDescription( + SensorEntityDescription, AccSensorEntityDescriptionMixin +): + """Describes AladdinConnect sensor entity.""" + + +SENSORS: tuple[AccSensorEntityDescription, ...] = ( + AccSensorEntityDescription( + key="battery_level", + name="Battery level", + device_class=SensorDeviceClass.BATTERY, + native_unit_of_measurement=PERCENTAGE, + state_class=SensorStateClass.MEASUREMENT, + value_fn=AladdinConnectClient.get_battery_status, + ), + AccSensorEntityDescription( + key="rssi", + name="Wi-Fi RSSI", + device_class=SensorDeviceClass.SIGNAL_STRENGTH, + entity_registry_enabled_default=False, + native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS, + state_class=SensorStateClass.MEASUREMENT, + value_fn=AladdinConnectClient.get_rssi_status, + ), +) + + +async def async_setup_entry( + hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback +) -> None: + """Set up Aladdin Connect sensor devices.""" + + acc: AladdinConnectClient = hass.data[DOMAIN][entry.entry_id] + + entities = [] + doors = await acc.get_doors() + + for door in doors: + entities.extend( + [AladdinConnectSensor(acc, door, description) for description in SENSORS] + ) + + async_add_entities(entities) + + +class AladdinConnectSensor(SensorEntity): + """A sensor implementation for Aladdin Connect devices.""" + + _device: AladdinConnectSensor + entity_description: AccSensorEntityDescription + + def __init__( + self, + acc: AladdinConnectClient, + device: DoorDevice, + description: AccSensorEntityDescription, + ) -> None: + """Initialize a sensor for an Abode device.""" + self._device_id = device["device_id"] + self._number = device["door_number"] + self._name = device["name"] + self._acc = acc + self.entity_description = description + self._attr_unique_id = f"{self._device_id}-{self._number}-{description.key}" + self._attr_has_entity_name = True + + @property + def device_info(self) -> DeviceInfo | None: + """Device information for Aladdin Connect sensors.""" + return DeviceInfo( + identifiers={(DOMAIN, self._device_id)}, + name=self._name, + manufacturer="Overhead Door", + ) + + @property + def native_value(self) -> float | None: + """Return the state of the sensor.""" + return cast( + float, + self.entity_description.value_fn(self._acc, self._device_id, self._number), + )