Extend Matter sensor discovery schemas for Air Purifier / Air Quality devices (#118483)

Co-authored-by: Franck Nijhof <git@frenck.dev>
This commit is contained in:
Marcel van der Veldt 2024-05-30 16:59:45 +02:00 committed by GitHub
parent 56e4fa86b0
commit a95c074ab8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 170 additions and 0 deletions

View file

@ -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,
),
),
]

View file

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

View file

@ -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"] == "%"