diff --git a/homeassistant/components/nam/const.py b/homeassistant/components/nam/const.py index e7c6f2532ef..2b6a74383b5 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 +SUFFIX_CAQI: Final = "_caqi" SUFFIX_P0: Final = "_p0" SUFFIX_P1: Final = "_p1" SUFFIX_P2: Final = "_p2" @@ -22,12 +23,16 @@ ATTR_HECA_HUMIDITY: Final = "heca_humidity" ATTR_HECA_TEMPERATURE: Final = "heca_temperature" ATTR_MHZ14A_CARBON_DIOXIDE: Final = "mhz14a_carbon_dioxide" ATTR_SDS011: Final = "sds011" +ATTR_SDS011_CAQI: Final = f"{ATTR_SDS011}{SUFFIX_CAQI}" +ATTR_SDS011_CAQI_LEVEL: Final = f"{ATTR_SDS011}{SUFFIX_CAQI}_level" ATTR_SDS011_P1: Final = f"{ATTR_SDS011}{SUFFIX_P1}" ATTR_SDS011_P2: Final = f"{ATTR_SDS011}{SUFFIX_P2}" ATTR_SHT3X_HUMIDITY: Final = "sht3x_humidity" ATTR_SHT3X_TEMPERATURE: Final = "sht3x_temperature" ATTR_SIGNAL_STRENGTH: Final = "signal" ATTR_SPS30: Final = "sps30" +ATTR_SPS30_CAQI: Final = f"{ATTR_SPS30}{SUFFIX_CAQI}" +ATTR_SPS30_CAQI_LEVEL: Final = f"{ATTR_SPS30}{SUFFIX_CAQI}_level" ATTR_SPS30_P0: Final = f"{ATTR_SPS30}{SUFFIX_P0}" ATTR_SPS30_P1: Final = f"{ATTR_SPS30}{SUFFIX_P1}" ATTR_SPS30_P2: Final = f"{ATTR_SPS30}{SUFFIX_P2}" diff --git a/homeassistant/components/nam/sensor.py b/homeassistant/components/nam/sensor.py index 6229102035e..01107baf31b 100644 --- a/homeassistant/components/nam/sensor.py +++ b/homeassistant/components/nam/sensor.py @@ -43,11 +43,15 @@ from .const import ( ATTR_HECA_HUMIDITY, ATTR_HECA_TEMPERATURE, ATTR_MHZ14A_CARBON_DIOXIDE, + ATTR_SDS011_CAQI, + ATTR_SDS011_CAQI_LEVEL, ATTR_SDS011_P1, ATTR_SDS011_P2, ATTR_SHT3X_HUMIDITY, ATTR_SHT3X_TEMPERATURE, ATTR_SIGNAL_STRENGTH, + ATTR_SPS30_CAQI, + ATTR_SPS30_CAQI_LEVEL, ATTR_SPS30_P0, ATTR_SPS30_P1, ATTR_SPS30_P2, @@ -132,6 +136,17 @@ SENSORS: tuple[SensorEntityDescription, ...] = ( device_class=SensorDeviceClass.CO2, state_class=SensorStateClass.MEASUREMENT, ), + SensorEntityDescription( + key=ATTR_SDS011_CAQI, + name="SDS011 CAQI", + icon="mdi:air-filter", + ), + SensorEntityDescription( + key=ATTR_SDS011_CAQI_LEVEL, + name="SDS011 CAQI level", + icon="mdi:air-filter", + device_class="nam__caqi_level", + ), SensorEntityDescription( key=ATTR_SDS011_P1, name="SDS011 particulate matter 10", @@ -160,6 +175,17 @@ SENSORS: tuple[SensorEntityDescription, ...] = ( device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, ), + SensorEntityDescription( + key=ATTR_SPS30_CAQI, + name="SPS30 CAQI", + icon="mdi:air-filter", + ), + SensorEntityDescription( + key=ATTR_SPS30_CAQI_LEVEL, + name="SPS30 CAQI level", + icon="mdi:air-filter", + device_class="nam__caqi_level", + ), SensorEntityDescription( key=ATTR_SPS30_P0, name="SPS30 particulate matter 1.0", diff --git a/homeassistant/components/nam/strings.sensor.json b/homeassistant/components/nam/strings.sensor.json new file mode 100644 index 00000000000..ee53079d7d0 --- /dev/null +++ b/homeassistant/components/nam/strings.sensor.json @@ -0,0 +1,11 @@ +{ + "state": { + "nam__caqi_level": { + "very low": "Very low", + "low": "Low", + "medium": "Medium", + "high": "High", + "very high": "Very high" + } + } +} diff --git a/tests/components/nam/test_sensor.py b/tests/components/nam/test_sensor.py index 9fbb55a6474..28eaea54186 100644 --- a/tests/components/nam/test_sensor.py +++ b/tests/components/nam/test_sensor.py @@ -239,6 +239,25 @@ async def test_sensor(hass): == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER ) + entry = registry.async_get("sensor.nettigo_air_monitor_sds011_caqi") + assert entry + assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sds011_caqi" + + state = hass.states.get("sensor.nettigo_air_monitor_sds011_caqi") + assert state + assert state.state == "19" + assert state.attributes.get(ATTR_ICON) == "mdi:air-filter" + + entry = registry.async_get("sensor.nettigo_air_monitor_sds011_caqi_level") + assert entry + assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sds011_caqi_level" + + state = hass.states.get("sensor.nettigo_air_monitor_sds011_caqi_level") + assert state + assert state.state == "very low" + assert state.attributes.get(ATTR_DEVICE_CLASS) == "nam__caqi_level" + assert state.attributes.get(ATTR_ICON) == "mdi:air-filter" + entry = registry.async_get( "sensor.nettigo_air_monitor_sds011_particulate_matter_10" ) @@ -271,6 +290,25 @@ async def test_sensor(hass): == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER ) + entry = registry.async_get("sensor.nettigo_air_monitor_sps30_caqi") + assert entry + assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_caqi" + + state = hass.states.get("sensor.nettigo_air_monitor_sps30_caqi") + assert state + assert state.state == "54" + assert state.attributes.get(ATTR_ICON) == "mdi:air-filter" + + entry = registry.async_get("sensor.nettigo_air_monitor_sps30_caqi_level") + assert entry + assert entry.unique_id == "aa:bb:cc:dd:ee:ff-sps30_caqi_level" + + state = hass.states.get("sensor.nettigo_air_monitor_sps30_caqi_level") + assert state + assert state.state == "medium" + assert state.attributes.get(ATTR_DEVICE_CLASS) == "nam__caqi_level" + assert state.attributes.get(ATTR_ICON) == "mdi:air-filter" + entry = registry.async_get( "sensor.nettigo_air_monitor_sps30_particulate_matter_1_0" )