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 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,
},
}

View file

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

View file

@ -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:

View file

@ -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