Add state class to Nettigo Air Monitor sensors (#50959)

This commit is contained in:
Maciej Bieniek 2021-05-26 09:36:37 +02:00 committed by GitHub
parent d5a9419fb7
commit 41a940f644
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 3 deletions

View file

@ -4,6 +4,7 @@ from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from typing import Final from typing import Final
from homeassistant.components.sensor import ATTR_STATE_CLASS, STATE_CLASS_MEASUREMENT
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
ATTR_ICON, ATTR_ICON,
@ -59,6 +60,7 @@ SENSORS: Final[dict[str, SensorDescription]] = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_BME280_PRESSURE: { ATTR_BME280_PRESSURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_BME280_TEMPERATURE: { ATTR_BME280_TEMPERATURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_BMP280_PRESSURE: { ATTR_BMP280_PRESSURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_BMP280_TEMPERATURE: { ATTR_BMP280_TEMPERATURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_HECA_HUMIDITY: { ATTR_HECA_HUMIDITY: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_HECA_TEMPERATURE: { ATTR_HECA_TEMPERATURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_SHT3X_HUMIDITY: { ATTR_SHT3X_HUMIDITY: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_SHT3X_TEMPERATURE: { ATTR_SHT3X_TEMPERATURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_SPS30_P0: { ATTR_SPS30_P0: {
ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 1.0", ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 1.0",
@ -122,6 +132,7 @@ SENSORS: Final[dict[str, SensorDescription]] = {
ATTR_DEVICE_CLASS: None, ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:blur", ATTR_ICON: "mdi:blur",
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_SPS30_P4: { ATTR_SPS30_P4: {
ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 4.0", ATTR_LABEL: f"{DEFAULT_NAME} SPS30 Particulate Matter 4.0",
@ -129,6 +140,7 @@ SENSORS: Final[dict[str, SensorDescription]] = {
ATTR_DEVICE_CLASS: None, ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:blur", ATTR_ICON: "mdi:blur",
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_DHT22_HUMIDITY: { ATTR_DHT22_HUMIDITY: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_DHT22_TEMPERATURE: { ATTR_DHT22_TEMPERATURE: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: True, ATTR_ENABLED: True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_SIGNAL_STRENGTH: { ATTR_SIGNAL_STRENGTH: {
ATTR_LABEL: f"{DEFAULT_NAME} 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_DEVICE_CLASS: DEVICE_CLASS_SIGNAL_STRENGTH,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: False, ATTR_ENABLED: False,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
ATTR_UPTIME: { ATTR_UPTIME: {
ATTR_LABEL: f"{DEFAULT_NAME} Uptime", ATTR_LABEL: f"{DEFAULT_NAME} Uptime",
@ -157,5 +172,6 @@ SENSORS: Final[dict[str, SensorDescription]] = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP, ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP,
ATTR_ICON: None, ATTR_ICON: None,
ATTR_ENABLED: False, ATTR_ENABLED: False,
ATTR_STATE_CLASS: None,
}, },
} }

View file

@ -12,3 +12,4 @@ class SensorDescription(TypedDict):
device_class: str | None device_class: str | None
icon: str | None icon: str | None
enabled: bool enabled: bool
state_class: str | None

View file

@ -4,7 +4,7 @@ from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from typing import Any 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.config_entries import ConfigEntry
from homeassistant.const import ATTR_DEVICE_CLASS, ATTR_ICON from homeassistant.const import ATTR_DEVICE_CLASS, ATTR_ICON
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -45,7 +45,8 @@ class NAMSensor(CoordinatorEntity, SensorEntity):
"""Initialize.""" """Initialize."""
super().__init__(coordinator) super().__init__(coordinator)
self.sensor_type = sensor_type 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 @property
def name(self) -> str: def name(self) -> str:

View file

@ -5,7 +5,11 @@ from unittest.mock import patch
from nettigo_air_monitor import ApiError from nettigo_air_monitor import ApiError
from homeassistant.components.nam.const import DOMAIN 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 ( from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
ATTR_ENTITY_ID, ATTR_ENTITY_ID,
@ -57,6 +61,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "45.7" assert state.state == "45.7"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
entry = registry.async_get("sensor.nettigo_air_monitor_bme280_humidity") entry = registry.async_get("sensor.nettigo_air_monitor_bme280_humidity")
@ -67,6 +72,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "7.6" assert state.state == "7.6"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS
entry = registry.async_get("sensor.nettigo_air_monitor_bme280_temperature") entry = registry.async_get("sensor.nettigo_air_monitor_bme280_temperature")
@ -77,6 +83,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "1011" assert state.state == "1011"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_PRESSURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_HPA
entry = registry.async_get("sensor.nettigo_air_monitor_bme280_pressure") entry = registry.async_get("sensor.nettigo_air_monitor_bme280_pressure")
@ -87,6 +94,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "5.6" assert state.state == "5.6"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS
entry = registry.async_get("sensor.nettigo_air_monitor_bmp280_temperature") entry = registry.async_get("sensor.nettigo_air_monitor_bmp280_temperature")
@ -97,6 +105,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "1022" assert state.state == "1022"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_PRESSURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_HPA
entry = registry.async_get("sensor.nettigo_air_monitor_bmp280_pressure") entry = registry.async_get("sensor.nettigo_air_monitor_bmp280_pressure")
@ -107,6 +116,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "34.7" assert state.state == "34.7"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
entry = registry.async_get("sensor.nettigo_air_monitor_sht3x_humidity") entry = registry.async_get("sensor.nettigo_air_monitor_sht3x_humidity")
@ -117,6 +127,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "6.3" assert state.state == "6.3"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS
entry = registry.async_get("sensor.nettigo_air_monitor_sht3x_temperature") entry = registry.async_get("sensor.nettigo_air_monitor_sht3x_temperature")
@ -127,6 +138,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "46.2" assert state.state == "46.2"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
entry = registry.async_get("sensor.nettigo_air_monitor_dht22_humidity") entry = registry.async_get("sensor.nettigo_air_monitor_dht22_humidity")
@ -137,6 +149,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "6.3" assert state.state == "6.3"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS
entry = registry.async_get("sensor.nettigo_air_monitor_dht22_temperature") entry = registry.async_get("sensor.nettigo_air_monitor_dht22_temperature")
@ -147,6 +160,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "50.0" assert state.state == "50.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PERCENTAGE
entry = registry.async_get("sensor.nettigo_air_monitor_heca_humidity") entry = registry.async_get("sensor.nettigo_air_monitor_heca_humidity")
@ -157,6 +171,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "8.0" assert state.state == "8.0"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TEMPERATURE 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 assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS
entry = registry.async_get("sensor.nettigo_air_monitor_heca_temperature") entry = registry.async_get("sensor.nettigo_air_monitor_heca_temperature")
@ -167,6 +182,7 @@ async def test_sensor(hass):
assert state assert state
assert state.state == "-72" assert state.state == "-72"
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_SIGNAL_STRENGTH assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_SIGNAL_STRENGTH
assert state.attributes.get(ATTR_STATE_CLASS) == STATE_CLASS_MEASUREMENT
assert ( assert (
state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) state.attributes.get(ATTR_UNIT_OF_MEASUREMENT)
== SIGNAL_STRENGTH_DECIBELS_MILLIWATT == SIGNAL_STRENGTH_DECIBELS_MILLIWATT
@ -183,6 +199,7 @@ async def test_sensor(hass):
== (utcnow() - timedelta(seconds=456987)).replace(microsecond=0).isoformat() == (utcnow() - timedelta(seconds=456987)).replace(microsecond=0).isoformat()
) )
assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_TIMESTAMP 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") entry = registry.async_get("sensor.nettigo_air_monitor_uptime")
assert entry assert entry