diff --git a/homeassistant/components/matter/sensor.py b/homeassistant/components/matter/sensor.py index 4e2644a1ff7..d91d4d33471 100644 --- a/homeassistant/components/matter/sensor.py +++ b/homeassistant/components/matter/sensor.py @@ -37,6 +37,17 @@ from .entity import MatterEntity, MatterEntityDescription from .helpers import get_matter from .models import MatterDiscoverySchema +AIR_QUALITY_MAP = { + clusters.AirQuality.Enums.AirQualityEnum.kExtremelyPoor: "extremely_poor", + clusters.AirQuality.Enums.AirQualityEnum.kVeryPoor: "very_poor", + clusters.AirQuality.Enums.AirQualityEnum.kPoor: "poor", + clusters.AirQuality.Enums.AirQualityEnum.kFair: "fair", + clusters.AirQuality.Enums.AirQualityEnum.kGood: "good", + clusters.AirQuality.Enums.AirQualityEnum.kModerate: "moderate", + clusters.AirQuality.Enums.AirQualityEnum.kUnknown: "unknown", + clusters.AirQuality.Enums.AirQualityEnum.kUnknownEnumValue: "unknown", +} + async def async_setup_entry( hass: HomeAssistant, @@ -271,4 +282,86 @@ DISCOVERY_SCHEMAS = [ clusters.Pm10ConcentrationMeasurement.Attributes.MeasuredValue, ), ), + MatterDiscoverySchema( + platform=Platform.SENSOR, + entity_description=MatterSensorEntityDescription( + key="AirQuality", + translation_key="air_quality", + device_class=SensorDeviceClass.ENUM, + state_class=None, + # convert to set first to remove the duplicate unknown value + options=list(set(AIR_QUALITY_MAP.values())), + measurement_to_ha=lambda x: AIR_QUALITY_MAP[x], + icon="mdi:air-filter", + ), + entity_class=MatterSensor, + required_attributes=(clusters.AirQuality.Attributes.AirQuality,), + ), + MatterDiscoverySchema( + platform=Platform.SENSOR, + entity_description=MatterSensorEntityDescription( + key="CarbonMonoxideSensor", + native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, + device_class=SensorDeviceClass.CO, + state_class=SensorStateClass.MEASUREMENT, + ), + entity_class=MatterSensor, + required_attributes=( + clusters.CarbonMonoxideConcentrationMeasurement.Attributes.MeasuredValue, + ), + ), + MatterDiscoverySchema( + platform=Platform.SENSOR, + entity_description=MatterSensorEntityDescription( + key="NitrogenDioxideSensor", + native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, + device_class=SensorDeviceClass.NITROGEN_DIOXIDE, + state_class=SensorStateClass.MEASUREMENT, + ), + entity_class=MatterSensor, + required_attributes=( + clusters.NitrogenDioxideConcentrationMeasurement.Attributes.MeasuredValue, + ), + ), + MatterDiscoverySchema( + platform=Platform.SENSOR, + entity_description=MatterSensorEntityDescription( + key="OzoneConcentrationSensor", + native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, + device_class=SensorDeviceClass.OZONE, + state_class=SensorStateClass.MEASUREMENT, + ), + entity_class=MatterSensor, + required_attributes=( + clusters.OzoneConcentrationMeasurement.Attributes.MeasuredValue, + ), + ), + MatterDiscoverySchema( + platform=Platform.SENSOR, + entity_description=MatterSensorEntityDescription( + key="HepaFilterCondition", + native_unit_of_measurement=PERCENTAGE, + device_class=None, + state_class=SensorStateClass.MEASUREMENT, + translation_key="hepa_filter_condition", + icon="mdi:filter-check", + ), + entity_class=MatterSensor, + required_attributes=(clusters.HepaFilterMonitoring.Attributes.Condition,), + ), + MatterDiscoverySchema( + platform=Platform.SENSOR, + entity_description=MatterSensorEntityDescription( + key="ActivatedCarbonFilterCondition", + native_unit_of_measurement=PERCENTAGE, + device_class=None, + state_class=SensorStateClass.MEASUREMENT, + translation_key="activated_carbon_filter_condition", + icon="mdi:filter-check", + ), + entity_class=MatterSensor, + required_attributes=( + clusters.ActivatedCarbonFilterMonitoring.Attributes.Condition, + ), + ), ] diff --git a/homeassistant/components/matter/strings.json b/homeassistant/components/matter/strings.json index c6c2d779255..a3f26a5865a 100644 --- a/homeassistant/components/matter/strings.json +++ b/homeassistant/components/matter/strings.json @@ -79,8 +79,26 @@ } }, "sensor": { + "activated_carbon_filter_condition": { + "name": "Activated carbon filter condition" + }, + "air_quality": { + "name": "Air quality", + "state": { + "extremely_poor": "Extremely poor", + "very_poor": "Very poor", + "poor": "Poor", + "fair": "Fair", + "good": "Good", + "moderate": "Moderate", + "unknown": "Unknown" + } + }, "flow": { "name": "Flow" + }, + "hepa_filter_condition": { + "name": "Hepa filter condition" } } }, diff --git a/tests/components/matter/test_sensor.py b/tests/components/matter/test_sensor.py index 42b13e24c9e..2c9bfae94ce 100644 --- a/tests/components/matter/test_sensor.py +++ b/tests/components/matter/test_sensor.py @@ -391,3 +391,62 @@ async def test_air_purifier_sensor( assert state.attributes["unit_of_measurement"] == "ppm" assert state.attributes["device_class"] == "volatile_organic_compounds_parts" assert state.attributes["friendly_name"] == "Air Purifier VOCs" + + # Air Quality + state = hass.states.get("sensor.air_purifier_air_quality") + assert state + assert state.state == "good" + expected_options = [ + "extremely_poor", + "very_poor", + "poor", + "fair", + "good", + "moderate", + "unknown", + ] + assert set(state.attributes["options"]) == set(expected_options) + assert state.attributes["device_class"] == "enum" + assert state.attributes["friendly_name"] == "Air Purifier Air quality" + + # Carbon MonoOxide + state = hass.states.get("sensor.air_purifier_carbon_monoxide") + assert state + assert state.state == "2.0" + assert state.attributes["state_class"] == "measurement" + assert state.attributes["unit_of_measurement"] == "ppm" + assert state.attributes["device_class"] == "carbon_monoxide" + assert state.attributes["friendly_name"] == "Air Purifier Carbon monoxide" + + # Nitrogen Dioxide + state = hass.states.get("sensor.air_purifier_nitrogen_dioxide") + assert state + assert state.state == "2.0" + assert state.attributes["state_class"] == "measurement" + assert state.attributes["unit_of_measurement"] == "ppm" + assert state.attributes["device_class"] == "nitrogen_dioxide" + assert state.attributes["friendly_name"] == "Air Purifier Nitrogen dioxide" + + # Ozone Concentration + state = hass.states.get("sensor.air_purifier_ozone") + assert state + assert state.state == "2.0" + assert state.attributes["state_class"] == "measurement" + assert state.attributes["unit_of_measurement"] == "ppm" + assert state.attributes["device_class"] == "ozone" + assert state.attributes["friendly_name"] == "Air Purifier Ozone" + + # Hepa Filter Condition + state = hass.states.get("sensor.air_purifier_hepa_filter_condition") + assert state + assert state.state == "100" + assert state.attributes["state_class"] == "measurement" + assert state.attributes["unit_of_measurement"] == "%" + assert state.attributes["friendly_name"] == "Air Purifier Hepa filter condition" + + # Activated Carbon Filter Condition + state = hass.states.get("sensor.air_purifier_activated_carbon_filter_condition") + assert state + assert state.state == "100" + assert state.attributes["state_class"] == "measurement" + assert state.attributes["unit_of_measurement"] == "%"