diff --git a/homeassistant/components/nam/const.py b/homeassistant/components/nam/const.py index 8171914b832..1c191019c04 100644 --- a/homeassistant/components/nam/const.py +++ b/homeassistant/components/nam/const.py @@ -4,6 +4,7 @@ from __future__ import annotations from datetime import timedelta from typing import Final +from homeassistant.components.sensor import ATTR_STATE_CLASS, STATE_CLASS_MEASUREMENT from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_ICON, @@ -59,6 +60,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_BME280_PRESSURE: { ATTR_LABEL: f"{DEFAULT_NAME} BME280 Pressure", @@ -66,6 +68,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_BME280_TEMPERATURE: { ATTR_LABEL: f"{DEFAULT_NAME} BME280 Temperature", @@ -73,6 +76,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_BMP280_PRESSURE: { ATTR_LABEL: f"{DEFAULT_NAME} BMP280 Pressure", @@ -80,6 +84,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_BMP280_TEMPERATURE: { ATTR_LABEL: f"{DEFAULT_NAME} BMP280 Temperature", @@ -87,6 +92,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_HECA_HUMIDITY: { ATTR_LABEL: f"{DEFAULT_NAME} HECA Humidity", @@ -94,6 +100,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_HECA_TEMPERATURE: { ATTR_LABEL: f"{DEFAULT_NAME} HECA Temperature", @@ -101,6 +108,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_SHT3X_HUMIDITY: { ATTR_LABEL: f"{DEFAULT_NAME} SHT3X Humidity", @@ -108,6 +116,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_SHT3X_TEMPERATURE: { ATTR_LABEL: f"{DEFAULT_NAME} SHT3X Temperature", @@ -115,6 +124,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_SPS30_P0: { ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 1.0", @@ -122,6 +132,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: None, ATTR_ICON: "mdi:blur", ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_SPS30_P4: { ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 4.0", @@ -129,6 +140,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: None, ATTR_ICON: "mdi:blur", ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_DHT22_HUMIDITY: { ATTR_LABEL: f"{DEFAULT_NAME} DHT22 Humidity", @@ -136,6 +148,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_DHT22_TEMPERATURE: { ATTR_LABEL: f"{DEFAULT_NAME} DHT22 Temperature", @@ -143,6 +156,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, ATTR_ICON: None, ATTR_ENABLED: True, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_SIGNAL_STRENGTH: { ATTR_LABEL: f"{DEFAULT_NAME} Signal Strength", @@ -150,6 +164,7 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_SIGNAL_STRENGTH, ATTR_ICON: None, ATTR_ENABLED: False, + ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT, }, ATTR_UPTIME: { ATTR_LABEL: f"{DEFAULT_NAME} Uptime", @@ -157,5 +172,6 @@ SENSORS: Final[dict[str, SensorDescription]] = { ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP, ATTR_ICON: None, ATTR_ENABLED: False, + ATTR_STATE_CLASS: None, }, } diff --git a/homeassistant/components/nam/model.py b/homeassistant/components/nam/model.py index 8d1bfe29a4a..0cadaad647e 100644 --- a/homeassistant/components/nam/model.py +++ b/homeassistant/components/nam/model.py @@ -12,3 +12,4 @@ class SensorDescription(TypedDict): device_class: str | None icon: str | None enabled: bool + state_class: str | None diff --git a/homeassistant/components/nam/sensor.py b/homeassistant/components/nam/sensor.py index 2774d87f2d3..30982d8571d 100644 --- a/homeassistant/components/nam/sensor.py +++ b/homeassistant/components/nam/sensor.py @@ -4,7 +4,7 @@ from __future__ import annotations from datetime import timedelta from typing import Any -from homeassistant.components.sensor import SensorEntity +from homeassistant.components.sensor import ATTR_STATE_CLASS, SensorEntity from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_DEVICE_CLASS, ATTR_ICON from homeassistant.core import HomeAssistant @@ -45,7 +45,8 @@ class NAMSensor(CoordinatorEntity, SensorEntity): """Initialize.""" super().__init__(coordinator) self.sensor_type = sensor_type - self._description = SENSORS[self.sensor_type] + self._description = SENSORS[sensor_type] + self._attr_state_class = SENSORS[sensor_type][ATTR_STATE_CLASS] @property def name(self) -> str: diff --git a/tests/components/nam/test_sensor.py b/tests/components/nam/test_sensor.py index 2dfdc8987bc..b4c92c92e67 100644 --- a/tests/components/nam/test_sensor.py +++ b/tests/components/nam/test_sensor.py @@ -5,7 +5,11 @@ from unittest.mock import patch from nettigo_air_monitor import ApiError from homeassistant.components.nam.const import DOMAIN -from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN +from homeassistant.components.sensor import ( + ATTR_STATE_CLASS, + DOMAIN as SENSOR_DOMAIN, + STATE_CLASS_MEASUREMENT, +) from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_ENTITY_ID, @@ -57,6 +61,7 @@ async def test_sensor(hass): assert state assert state.state == "45.7" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE entry = registry.async_get("sensor.nettigo_air_monitor_bme280_humidity") @@ -67,6 +72,7 @@ async def test_sensor(hass): assert state assert state.state == "7.6" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS entry = registry.async_get("sensor.nettigo_air_monitor_bme280_temperature") @@ -77,6 +83,7 @@ async def test_sensor(hass): assert state assert state.state == "1011" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_PRESSURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_HPA entry = registry.async_get("sensor.nettigo_air_monitor_bme280_pressure") @@ -87,6 +94,7 @@ async def test_sensor(hass): assert state assert state.state == "5.6" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS entry = registry.async_get("sensor.nettigo_air_monitor_bmp280_temperature") @@ -97,6 +105,7 @@ async def test_sensor(hass): assert state assert state.state == "1022" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_PRESSURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_HPA entry = registry.async_get("sensor.nettigo_air_monitor_bmp280_pressure") @@ -107,6 +116,7 @@ async def test_sensor(hass): assert state assert state.state == "34.7" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE entry = registry.async_get("sensor.nettigo_air_monitor_sht3x_humidity") @@ -117,6 +127,7 @@ async def test_sensor(hass): assert state assert state.state == "6.3" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS entry = registry.async_get("sensor.nettigo_air_monitor_sht3x_temperature") @@ -127,6 +138,7 @@ async def test_sensor(hass): assert state assert state.state == "46.2" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE entry = registry.async_get("sensor.nettigo_air_monitor_dht22_humidity") @@ -137,6 +149,7 @@ async def test_sensor(hass): assert state assert state.state == "6.3" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS entry = registry.async_get("sensor.nettigo_air_monitor_dht22_temperature") @@ -147,6 +160,7 @@ async def test_sensor(hass): assert state assert state.state == "50.0" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE entry = registry.async_get("sensor.nettigo_air_monitor_heca_humidity") @@ -157,6 +171,7 @@ async def test_sensor(hass): assert state assert state.state == "8.0" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS entry = registry.async_get("sensor.nettigo_air_monitor_heca_temperature") @@ -167,6 +182,7 @@ async def test_sensor(hass): assert state assert state.state == "-72" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_SIGNAL_STRENGTH + assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT assert ( state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == SIGNAL_STRENGTH_DECIBELS_MILLIWATT @@ -183,6 +199,7 @@ async def test_sensor(hass): == (utcnow() - timedelta(seconds=456987)).replace(microsecond=0).isoformat() ) assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TIMESTAMP + assert state.attributes.get(ATTR_STATE_CLASS) is None entry = registry.async_get("sensor.nettigo_air_monitor_uptime") assert entry