diff --git a/homeassistant/components/nest/sensor_sdm.py b/homeassistant/components/nest/sensor_sdm.py index 0034acff3af..52d81ab7dd9 100644 --- a/homeassistant/components/nest/sensor_sdm.py +++ b/homeassistant/components/nest/sensor_sdm.py @@ -7,7 +7,7 @@ from google_nest_sdm.device import Device from google_nest_sdm.device_traits import HumidityTrait, TemperatureTrait from google_nest_sdm.exceptions import GoogleNestException -from homeassistant.components.sensor import SensorEntity +from homeassistant.components.sensor import STATE_CLASS_MEASUREMENT, SensorEntity from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( DEVICE_CLASS_HUMIDITY, @@ -17,7 +17,6 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant from homeassistant.exceptions import PlatformNotReady -from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DATA_SUBSCRIBER, DOMAIN @@ -58,26 +57,15 @@ async def async_setup_sdm_entry( class SensorBase(SensorEntity): """Representation of a dynamically updated Sensor.""" + _attr_shoud_poll = False + _attr_state_class = STATE_CLASS_MEASUREMENT + def __init__(self, device: Device) -> None: """Initialize the sensor.""" self._device = device self._device_info = NestDeviceInfo(device) - - @property - def should_poll(self) -> bool: - """Disable polling since entities have state pushed via pubsub.""" - return False - - @property - def unique_id(self) -> str | None: - """Return a unique ID.""" - # The API "name" field is a unique device identifier. - return f"{self._device.name}-{self.device_class}" - - @property - def device_info(self) -> DeviceInfo: - """Return device specific attributes.""" - return self._device_info.device_info + self._attr_unique_id = f"{device.name}-{self.device_class}" + self._attr_device_info = self._device_info.device_info async def async_added_to_hass(self) -> None: """Run when entity is added to register update signal handler.""" @@ -89,6 +77,9 @@ class SensorBase(SensorEntity): class TemperatureSensor(SensorBase): """Representation of a Temperature Sensor.""" + _attr_device_class = DEVICE_CLASS_TEMPERATURE + _attr_native_unit_of_measurement = TEMP_CELSIUS + @property def name(self) -> str: """Return the name of the sensor.""" @@ -100,25 +91,12 @@ class TemperatureSensor(SensorBase): trait: TemperatureTrait = self._device.traits[TemperatureTrait.NAME] return trait.ambient_temperature_celsius - @property - def native_unit_of_measurement(self) -> str: - """Return the unit of measurement.""" - return TEMP_CELSIUS - - @property - def device_class(self) -> str: - """Return the class of this device.""" - return DEVICE_CLASS_TEMPERATURE - class HumiditySensor(SensorBase): """Representation of a Humidity Sensor.""" - @property - def unique_id(self) -> str | None: - """Return a unique ID.""" - # The API returns the identifier under the name field. - return f"{self._device.name}-humidity" + _attr_device_class = DEVICE_CLASS_HUMIDITY + _attr_native_unit_of_measurement = PERCENTAGE @property def name(self) -> str: @@ -130,13 +108,3 @@ class HumiditySensor(SensorBase): """Return the state of the sensor.""" trait: HumidityTrait = self._device.traits[HumidityTrait.NAME] return trait.ambient_humidity_percent - - @property - def native_unit_of_measurement(self) -> str: - """Return the unit of measurement.""" - return PERCENTAGE - - @property - def device_class(self) -> str: - """Return the class of this device.""" - return DEVICE_CLASS_HUMIDITY diff --git a/tests/components/nest/sensor_sdm_test.py b/tests/components/nest/sensor_sdm_test.py index dfdfd58d546..bfac288742d 100644 --- a/tests/components/nest/sensor_sdm_test.py +++ b/tests/components/nest/sensor_sdm_test.py @@ -8,6 +8,15 @@ pubsub subscriber. from google_nest_sdm.device import Device from google_nest_sdm.event import EventMessage +from homeassistant.components.sensor import ATTR_STATE_CLASS, STATE_CLASS_MEASUREMENT +from homeassistant.const import ( + ATTR_DEVICE_CLASS, + ATTR_UNIT_OF_MEASUREMENT, + DEVICE_CLASS_HUMIDITY, + DEVICE_CLASS_TEMPERATURE, + PERCENTAGE, + TEMP_CELSIUS, +) from homeassistant.helpers import device_registry as dr, entity_registry as er from .common import async_setup_sdm_platform @@ -49,10 +58,16 @@ async def test_thermostat_device(hass): temperature = hass.states.get("sensor.my_sensor_temperature") assert temperature is not None assert temperature.state == "25.1" + assert temperature.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS + assert temperature.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE + assert temperature.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT humidity = hass.states.get("sensor.my_sensor_humidity") assert humidity is not None assert humidity.state == "35.0" + assert humidity.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE + assert humidity.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY + assert humidity.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT registry = er.async_get(hass) entry = registry.async_get("sensor.my_sensor_temperature") @@ -60,6 +75,11 @@ async def test_thermostat_device(hass): assert entry.original_name == "My Sensor Temperature" assert entry.domain == "sensor" + entry = registry.async_get("sensor.my_sensor_humidity") + assert entry.unique_id == "some-device-id-humidity" + assert entry.original_name == "My Sensor Humidity" + assert entry.domain == "sensor" + device_registry = dr.async_get(hass) device = device_registry.async_get(entry.device_id) assert device.name == "My Sensor"