From 052b8a7a0acbd0c62f6a69cb6f90e719fb8f1033 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 10 Jun 2025 16:55:35 +0000 Subject: [PATCH] Add sensor platform to Amazon Devices --- .../components/alexa_devices/__init__.py | 1 + .../components/alexa_devices/sensor.py | 86 ++++++++++++ .../components/amazon_devices/manifest.json | 122 ++++++++++++++++++ 3 files changed, 209 insertions(+) create mode 100644 homeassistant/components/alexa_devices/sensor.py create mode 100644 homeassistant/components/amazon_devices/manifest.json diff --git a/homeassistant/components/alexa_devices/__init__.py b/homeassistant/components/alexa_devices/__init__.py index 7a4139a65da..aff4c1bb391 100644 --- a/homeassistant/components/alexa_devices/__init__.py +++ b/homeassistant/components/alexa_devices/__init__.py @@ -8,6 +8,7 @@ from .coordinator import AmazonConfigEntry, AmazonDevicesCoordinator PLATFORMS = [ Platform.BINARY_SENSOR, Platform.NOTIFY, + Platform.SENSOR, Platform.SWITCH, ] diff --git a/homeassistant/components/alexa_devices/sensor.py b/homeassistant/components/alexa_devices/sensor.py new file mode 100644 index 00000000000..9a36264a520 --- /dev/null +++ b/homeassistant/components/alexa_devices/sensor.py @@ -0,0 +1,86 @@ +"""Support for sensors.""" + +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +from typing import Final, cast + +from aioamazondevices.api import AmazonDevice + +from homeassistant.components.sensor import ( + SensorDeviceClass, + SensorEntity, + SensorEntityDescription, +) +from homeassistant.const import LIGHT_LUX, UnitOfTemperature +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback +from homeassistant.helpers.typing import StateType + +from .coordinator import AmazonConfigEntry +from .entity import AmazonEntity + +# Coordinator is used to centralize the data updates +PARALLEL_UPDATES = 0 + + +@dataclass(frozen=True, kw_only=True) +class AmazonSensorEntityDescription(SensorEntityDescription): + """Amazon Devices sensor entity description.""" + + is_supported: Callable[[AmazonDevice, str], bool] = lambda _device, _key: True + + +SENSORS: Final = ( + AmazonSensorEntityDescription( + key="temperature", + device_class=SensorDeviceClass.TEMPERATURE, + is_supported=lambda _device, _key: _device.sensors.get(_key) is not None, + ), + AmazonSensorEntityDescription( + key="illuminance", + device_class=SensorDeviceClass.ILLUMINANCE, + native_unit_of_measurement=LIGHT_LUX, + is_supported=lambda _device, _key: _device.sensors.get(_key) is not None, + ), +) + + +async def async_setup_entry( + hass: HomeAssistant, + entry: AmazonConfigEntry, + async_add_entities: AddConfigEntryEntitiesCallback, +) -> None: + """Set up Amazon Devices sensors based on a config entry.""" + + coordinator = entry.runtime_data + + async_add_entities( + AmazonSensorEntity(coordinator, serial_num, sensor_desc) + for sensor_desc in SENSORS + for serial_num in coordinator.data + if sensor_desc.is_supported(coordinator.data[serial_num], sensor_desc.key) + ) + + +class AmazonSensorEntity(AmazonEntity, SensorEntity): + """Sensor device.""" + + entity_description: AmazonSensorEntityDescription + + @property + def native_unit_of_measurement(self) -> str | None: + """Return the unit of measurement of the sensor.""" + if self.entity_description.key == "temperature": + # Temperature sensor can have different scales + if self.device.sensors[self.entity_description.key].scale == "CELSIUS": + return UnitOfTemperature.CELSIUS + return UnitOfTemperature.FAHRENHEIT + + return self.entity_description.native_unit_of_measurement + + @property + def native_value(self) -> StateType: + """Return the state of the sensor.""" + return cast("StateType", self.device.sensors[self.entity_description.key].value) diff --git a/homeassistant/components/amazon_devices/manifest.json b/homeassistant/components/amazon_devices/manifest.json new file mode 100644 index 00000000000..1069290b668 --- /dev/null +++ b/homeassistant/components/amazon_devices/manifest.json @@ -0,0 +1,122 @@ +{ + "domain": "amazon_devices", + "name": "Amazon Devices", + "codeowners": ["@chemelli74"], + "config_flow": true, + "dhcp": [ + { "macaddress": "007147*" }, + { "macaddress": "00FC8B*" }, + { "macaddress": "0812A5*" }, + { "macaddress": "086AE5*" }, + { "macaddress": "08849D*" }, + { "macaddress": "089115*" }, + { "macaddress": "08A6BC*" }, + { "macaddress": "08C224*" }, + { "macaddress": "0CDC91*" }, + { "macaddress": "0CEE99*" }, + { "macaddress": "1009F9*" }, + { "macaddress": "109693*" }, + { "macaddress": "10BF67*" }, + { "macaddress": "10CE02*" }, + { "macaddress": "140AC5*" }, + { "macaddress": "149138*" }, + { "macaddress": "1848BE*" }, + { "macaddress": "1C12B0*" }, + { "macaddress": "1C4D66*" }, + { "macaddress": "1C93C4*" }, + { "macaddress": "1CFE2B*" }, + { "macaddress": "244CE3*" }, + { "macaddress": "24CE33*" }, + { "macaddress": "2873F6*" }, + { "macaddress": "2C71FF*" }, + { "macaddress": "34AFB3*" }, + { "macaddress": "34D270*" }, + { "macaddress": "38F73D*" }, + { "macaddress": "3C5CC4*" }, + { "macaddress": "3CE441*" }, + { "macaddress": "440049*" }, + { "macaddress": "40A2DB*" }, + { "macaddress": "40A9CF*" }, + { "macaddress": "40B4CD*" }, + { "macaddress": "443D54*" }, + { "macaddress": "44650D*" }, + { "macaddress": "485F2D*" }, + { "macaddress": "48785E*" }, + { "macaddress": "48B423*" }, + { "macaddress": "4C1744*" }, + { "macaddress": "4CEFC0*" }, + { "macaddress": "5007C3*" }, + { "macaddress": "50D45C*" }, + { "macaddress": "50DCE7*" }, + { "macaddress": "50F5DA*" }, + { "macaddress": "5C415A*" }, + { "macaddress": "6837E9*" }, + { "macaddress": "6854FD*" }, + { "macaddress": "689A87*" }, + { "macaddress": "68B691*" }, + { "macaddress": "68DBF5*" }, + { "macaddress": "68F63B*" }, + { "macaddress": "6C0C9A*" }, + { "macaddress": "6C5697*" }, + { "macaddress": "7458F3*" }, + { "macaddress": "74C246*" }, + { "macaddress": "74D637*" }, + { "macaddress": "74E20C*" }, + { "macaddress": "74ECB2*" }, + { "macaddress": "786C84*" }, + { "macaddress": "78A03F*" }, + { "macaddress": "7C6166*" }, + { "macaddress": "7C6305*" }, + { "macaddress": "7CD566*" }, + { "macaddress": "8871E5*" }, + { "macaddress": "901195*" }, + { "macaddress": "90235B*" }, + { "macaddress": "90A822*" }, + { "macaddress": "90F82E*" }, + { "macaddress": "943A91*" }, + { "macaddress": "98226E*" }, + { "macaddress": "98CCF3*" }, + { "macaddress": "9CC8E9*" }, + { "macaddress": "A002DC*" }, + { "macaddress": "A0D2B1*" }, + { "macaddress": "A40801*" }, + { "macaddress": "A8E621*" }, + { "macaddress": "AC416A*" }, + { "macaddress": "AC63BE*" }, + { "macaddress": "ACCCFC*" }, + { "macaddress": "B0739C*" }, + { "macaddress": "B0CFCB*" }, + { "macaddress": "B0F7C4*" }, + { "macaddress": "B85F98*" }, + { "macaddress": "C091B9*" }, + { "macaddress": "C095CF*" }, + { "macaddress": "C49500*" }, + { "macaddress": "C86C3D*" }, + { "macaddress": "CC9EA2*" }, + { "macaddress": "CCF735*" }, + { "macaddress": "DC54D7*" }, + { "macaddress": "D8BE65*" }, + { "macaddress": "D8FBD6*" }, + { "macaddress": "DC91BF*" }, + { "macaddress": "DCA0D0*" }, + { "macaddress": "E0F728*" }, + { "macaddress": "EC2BEB*" }, + { "macaddress": "EC8AC4*" }, + { "macaddress": "ECA138*" }, + { "macaddress": "F02F9E*" }, + { "macaddress": "F0272D*" }, + { "macaddress": "F0F0A4*" }, + { "macaddress": "F4032A*" }, + { "macaddress": "F854B8*" }, + { "macaddress": "FC492D*" }, + { "macaddress": "FC65DE*" }, + { "macaddress": "FCA183*" }, + { "macaddress": "FCE9D8*" } + ], + "documentation": "https://www.home-assistant.io/integrations/amazon_devices", + "integration_type": "hub", + "iot_class": "cloud_polling", + "loggers": ["aioamazondevices"], + "quality_scale": "bronze", + "requirements": ["aioamazondevices==3.1.0rc1"] +}