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:
parent
56e4fa86b0
commit
a95c074ab8
3 changed files with 170 additions and 0 deletions
|
@ -37,6 +37,17 @@ from .entity import MatterEntity, MatterEntityDescription
|
||||||
from .helpers import get_matter
|
from .helpers import get_matter
|
||||||
from .models import MatterDiscoverySchema
|
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(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
|
@ -271,4 +282,86 @@ DISCOVERY_SCHEMAS = [
|
||||||
clusters.Pm10ConcentrationMeasurement.Attributes.MeasuredValue,
|
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,
|
||||||
|
),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -79,8 +79,26 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sensor": {
|
"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": {
|
"flow": {
|
||||||
"name": "Flow"
|
"name": "Flow"
|
||||||
|
},
|
||||||
|
"hepa_filter_condition": {
|
||||||
|
"name": "Hepa filter condition"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -391,3 +391,62 @@ async def test_air_purifier_sensor(
|
||||||
assert state.attributes["unit_of_measurement"] == "ppm"
|
assert state.attributes["unit_of_measurement"] == "ppm"
|
||||||
assert state.attributes["device_class"] == "volatile_organic_compounds_parts"
|
assert state.attributes["device_class"] == "volatile_organic_compounds_parts"
|
||||||
assert state.attributes["friendly_name"] == "Air Purifier VOCs"
|
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"] == "%"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue