3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from datetime
import datetime
7 from typing
import TYPE_CHECKING, cast
9 from chip.clusters
import Objects
as clusters
10 from chip.clusters.Types
import Nullable, NullValue
11 from matter_server.common.custom_clusters
import (
14 ThirdRealityMeteringCluster,
20 SensorEntityDescription,
25 CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
26 CONCENTRATION_PARTS_PER_MILLION,
31 UnitOfElectricCurrent,
32 UnitOfElectricPotential,
43 from .entity
import MatterEntity, MatterEntityDescription
44 from .helpers
import get_matter
45 from .models
import MatterDiscoverySchema
48 clusters.AirQuality.Enums.AirQualityEnum.kExtremelyPoor:
"extremely_poor",
49 clusters.AirQuality.Enums.AirQualityEnum.kVeryPoor:
"very_poor",
50 clusters.AirQuality.Enums.AirQualityEnum.kPoor:
"poor",
51 clusters.AirQuality.Enums.AirQualityEnum.kFair:
"fair",
52 clusters.AirQuality.Enums.AirQualityEnum.kGood:
"good",
53 clusters.AirQuality.Enums.AirQualityEnum.kModerate:
"moderate",
54 clusters.AirQuality.Enums.AirQualityEnum.kUnknown:
None,
55 clusters.AirQuality.Enums.AirQualityEnum.kUnknownEnumValue:
None,
58 CONTAMINATION_STATE_MAP = {
59 clusters.SmokeCoAlarm.Enums.ContaminationStateEnum.kNormal:
"normal",
60 clusters.SmokeCoAlarm.Enums.ContaminationStateEnum.kLow:
"low",
61 clusters.SmokeCoAlarm.Enums.ContaminationStateEnum.kWarning:
"warning",
62 clusters.SmokeCoAlarm.Enums.ContaminationStateEnum.kCritical:
"critical",
66 OPERATIONAL_STATE_MAP = {
68 clusters.OperationalState.Enums.OperationalStateEnum.kStopped:
"stopped",
69 clusters.OperationalState.Enums.OperationalStateEnum.kRunning:
"running",
70 clusters.OperationalState.Enums.OperationalStateEnum.kPaused:
"paused",
71 clusters.OperationalState.Enums.OperationalStateEnum.kError:
"error",
77 config_entry: ConfigEntry,
78 async_add_entities: AddEntitiesCallback,
80 """Set up Matter sensors from Config Entry."""
82 matter.register_platform_handler(Platform.SENSOR, async_add_entities)
85 @dataclass(frozen=True)
87 """Describe Matter sensor entities."""
91 """Representation of a Matter sensor."""
93 entity_description: MatterSensorEntityDescription
97 """Update from device."""
98 value: Nullable | float |
None
100 if value
in (
None, NullValue):
103 value = value_convert(value)
108 """Representation of a sensor for Matter Operational State."""
110 states_map: dict[int, str]
114 """Update from device."""
120 clusters.OperationalState.Attributes.OperationalStateList
123 operational_state_list = cast(
124 list[clusters.OperationalState.Structs.OperationalStateStruct],
125 operational_state_list,
127 states_map: dict[int, str] = {}
128 for state
in operational_state_list:
131 states_map[state.operationalStateID] = OPERATIONAL_STATE_MAP.get(
132 state.operationalStateID,
slugify(state.operationalStateLabel)
138 clusters.OperationalState.Attributes.OperationalState
144 DISCOVERY_SCHEMAS = [
146 platform=Platform.SENSOR,
148 key=
"TemperatureSensor",
149 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
150 device_class=SensorDeviceClass.TEMPERATURE,
151 measurement_to_ha=
lambda x: x / 100,
152 state_class=SensorStateClass.MEASUREMENT,
154 entity_class=MatterSensor,
155 required_attributes=(clusters.TemperatureMeasurement.Attributes.MeasuredValue,),
158 platform=Platform.SENSOR,
160 key=
"PressureSensor",
161 native_unit_of_measurement=UnitOfPressure.KPA,
162 device_class=SensorDeviceClass.PRESSURE,
163 measurement_to_ha=
lambda x: x / 10,
164 state_class=SensorStateClass.MEASUREMENT,
166 entity_class=MatterSensor,
167 required_attributes=(clusters.PressureMeasurement.Attributes.MeasuredValue,),
170 platform=Platform.SENSOR,
173 native_unit_of_measurement=UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
174 translation_key=
"flow",
175 measurement_to_ha=
lambda x: x / 10,
176 state_class=SensorStateClass.MEASUREMENT,
178 entity_class=MatterSensor,
179 required_attributes=(clusters.FlowMeasurement.Attributes.MeasuredValue,),
182 platform=Platform.SENSOR,
184 key=
"HumiditySensor",
185 native_unit_of_measurement=PERCENTAGE,
186 device_class=SensorDeviceClass.HUMIDITY,
187 measurement_to_ha=
lambda x: x / 100,
188 state_class=SensorStateClass.MEASUREMENT,
190 entity_class=MatterSensor,
191 required_attributes=(
192 clusters.RelativeHumidityMeasurement.Attributes.MeasuredValue,
196 platform=Platform.SENSOR,
199 native_unit_of_measurement=LIGHT_LUX,
200 device_class=SensorDeviceClass.ILLUMINANCE,
201 measurement_to_ha=
lambda x: round(pow(10, ((x - 1) / 10000)), 1),
202 state_class=SensorStateClass.MEASUREMENT,
204 entity_class=MatterSensor,
205 required_attributes=(clusters.IlluminanceMeasurement.Attributes.MeasuredValue,),
208 platform=Platform.SENSOR,
211 native_unit_of_measurement=PERCENTAGE,
212 device_class=SensorDeviceClass.BATTERY,
213 entity_category=EntityCategory.DIAGNOSTIC,
215 measurement_to_ha=
lambda x:
int(x / 2),
216 state_class=SensorStateClass.MEASUREMENT,
218 entity_class=MatterSensor,
219 required_attributes=(clusters.PowerSource.Attributes.BatPercentRemaining,),
222 platform=Platform.SENSOR,
224 key=
"PowerSourceBatVoltage",
225 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
226 device_class=SensorDeviceClass.VOLTAGE,
227 entity_category=EntityCategory.DIAGNOSTIC,
228 measurement_to_ha=
lambda x: x / 1000,
229 state_class=SensorStateClass.MEASUREMENT,
231 entity_class=MatterSensor,
232 required_attributes=(clusters.PowerSource.Attributes.BatVoltage,),
235 platform=Platform.SENSOR,
237 key=
"EveEnergySensorWatt",
238 device_class=SensorDeviceClass.POWER,
239 entity_category=EntityCategory.DIAGNOSTIC,
240 native_unit_of_measurement=UnitOfPower.WATT,
241 suggested_display_precision=2,
242 state_class=SensorStateClass.MEASUREMENT,
244 entity_class=MatterSensor,
245 required_attributes=(EveCluster.Attributes.Watt,),
246 absent_clusters=(clusters.ElectricalPowerMeasurement,),
249 platform=Platform.SENSOR,
251 key=
"EveEnergySensorVoltage",
252 device_class=SensorDeviceClass.VOLTAGE,
253 entity_category=EntityCategory.DIAGNOSTIC,
254 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
255 suggested_display_precision=0,
256 state_class=SensorStateClass.MEASUREMENT,
258 entity_class=MatterSensor,
259 required_attributes=(EveCluster.Attributes.Voltage,),
260 absent_clusters=(clusters.ElectricalPowerMeasurement,),
263 platform=Platform.SENSOR,
265 key=
"EveEnergySensorWattAccumulated",
266 device_class=SensorDeviceClass.ENERGY,
267 entity_category=EntityCategory.DIAGNOSTIC,
268 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
269 suggested_display_precision=3,
270 state_class=SensorStateClass.TOTAL_INCREASING,
272 entity_class=MatterSensor,
273 required_attributes=(EveCluster.Attributes.WattAccumulated,),
274 absent_clusters=(clusters.ElectricalEnergyMeasurement,),
277 platform=Platform.SENSOR,
279 key=
"EveEnergySensorWattCurrent",
280 device_class=SensorDeviceClass.CURRENT,
281 entity_category=EntityCategory.DIAGNOSTIC,
282 native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
283 suggested_display_precision=2,
284 state_class=SensorStateClass.MEASUREMENT,
286 entity_class=MatterSensor,
287 required_attributes=(EveCluster.Attributes.Current,),
288 absent_clusters=(clusters.ElectricalPowerMeasurement,),
291 platform=Platform.SENSOR,
293 key=
"EveThermoValvePosition",
294 translation_key=
"valve_position",
295 native_unit_of_measurement=PERCENTAGE,
297 entity_class=MatterSensor,
298 required_attributes=(EveCluster.Attributes.ValvePosition,),
301 platform=Platform.SENSOR,
303 key=
"EveWeatherPressure",
304 device_class=SensorDeviceClass.PRESSURE,
305 native_unit_of_measurement=UnitOfPressure.HPA,
306 suggested_display_precision=1,
307 state_class=SensorStateClass.MEASUREMENT,
309 entity_class=MatterSensor,
310 required_attributes=(EveCluster.Attributes.Pressure,),
313 platform=Platform.SENSOR,
315 key=
"CarbonDioxideSensor",
316 native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
317 device_class=SensorDeviceClass.CO2,
318 state_class=SensorStateClass.MEASUREMENT,
320 entity_class=MatterSensor,
321 required_attributes=(
322 clusters.CarbonDioxideConcentrationMeasurement.Attributes.MeasuredValue,
326 platform=Platform.SENSOR,
328 key=
"TotalVolatileOrganicCompoundsSensor",
329 native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
330 device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS_PARTS,
331 state_class=SensorStateClass.MEASUREMENT,
333 entity_class=MatterSensor,
334 required_attributes=(
335 clusters.TotalVolatileOrganicCompoundsConcentrationMeasurement.Attributes.MeasuredValue,
339 platform=Platform.SENSOR,
342 native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
343 device_class=SensorDeviceClass.PM1,
344 state_class=SensorStateClass.MEASUREMENT,
346 entity_class=MatterSensor,
347 required_attributes=(
348 clusters.Pm1ConcentrationMeasurement.Attributes.MeasuredValue,
352 platform=Platform.SENSOR,
355 native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
356 device_class=SensorDeviceClass.PM25,
357 state_class=SensorStateClass.MEASUREMENT,
359 entity_class=MatterSensor,
360 required_attributes=(
361 clusters.Pm25ConcentrationMeasurement.Attributes.MeasuredValue,
365 platform=Platform.SENSOR,
368 native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
369 device_class=SensorDeviceClass.PM10,
370 state_class=SensorStateClass.MEASUREMENT,
372 entity_class=MatterSensor,
373 required_attributes=(
374 clusters.Pm10ConcentrationMeasurement.Attributes.MeasuredValue,
378 platform=Platform.SENSOR,
381 translation_key=
"air_quality",
382 device_class=SensorDeviceClass.ENUM,
385 options=[x
for x
in AIR_QUALITY_MAP.values()
if x
is not None],
386 measurement_to_ha=
lambda x: AIR_QUALITY_MAP[x],
388 entity_class=MatterSensor,
389 required_attributes=(clusters.AirQuality.Attributes.AirQuality,),
392 platform=Platform.SENSOR,
394 key=
"CarbonMonoxideSensor",
395 native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
396 device_class=SensorDeviceClass.CO,
397 state_class=SensorStateClass.MEASUREMENT,
399 entity_class=MatterSensor,
400 required_attributes=(
401 clusters.CarbonMonoxideConcentrationMeasurement.Attributes.MeasuredValue,
405 platform=Platform.SENSOR,
407 key=
"NitrogenDioxideSensor",
408 native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
409 device_class=SensorDeviceClass.NITROGEN_DIOXIDE,
410 state_class=SensorStateClass.MEASUREMENT,
412 entity_class=MatterSensor,
413 required_attributes=(
414 clusters.NitrogenDioxideConcentrationMeasurement.Attributes.MeasuredValue,
418 platform=Platform.SENSOR,
420 key=
"OzoneConcentrationSensor",
421 native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
422 device_class=SensorDeviceClass.OZONE,
423 state_class=SensorStateClass.MEASUREMENT,
425 entity_class=MatterSensor,
426 required_attributes=(
427 clusters.OzoneConcentrationMeasurement.Attributes.MeasuredValue,
431 platform=Platform.SENSOR,
433 key=
"HepaFilterCondition",
434 native_unit_of_measurement=PERCENTAGE,
436 state_class=SensorStateClass.MEASUREMENT,
437 translation_key=
"hepa_filter_condition",
439 entity_class=MatterSensor,
440 required_attributes=(clusters.HepaFilterMonitoring.Attributes.Condition,),
443 platform=Platform.SENSOR,
445 key=
"ActivatedCarbonFilterCondition",
446 native_unit_of_measurement=PERCENTAGE,
448 state_class=SensorStateClass.MEASUREMENT,
449 translation_key=
"activated_carbon_filter_condition",
451 entity_class=MatterSensor,
452 required_attributes=(
453 clusters.ActivatedCarbonFilterMonitoring.Attributes.Condition,
457 platform=Platform.SENSOR,
459 key=
"ThirdRealityEnergySensorWatt",
460 device_class=SensorDeviceClass.POWER,
461 entity_category=EntityCategory.DIAGNOSTIC,
462 native_unit_of_measurement=UnitOfPower.WATT,
463 suggested_display_precision=2,
464 state_class=SensorStateClass.MEASUREMENT,
465 measurement_to_ha=
lambda x: x / 1000,
467 entity_class=MatterSensor,
468 required_attributes=(
469 ThirdRealityMeteringCluster.Attributes.InstantaneousDemand,
471 absent_clusters=(clusters.ElectricalPowerMeasurement,),
474 platform=Platform.SENSOR,
476 key=
"ThirdRealityEnergySensorWattAccumulated",
477 device_class=SensorDeviceClass.ENERGY,
478 entity_category=EntityCategory.DIAGNOSTIC,
479 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
480 suggested_display_precision=3,
481 state_class=SensorStateClass.TOTAL_INCREASING,
482 measurement_to_ha=
lambda x: x / 1000,
484 entity_class=MatterSensor,
485 required_attributes=(
486 ThirdRealityMeteringCluster.Attributes.CurrentSummationDelivered,
488 absent_clusters=(clusters.ElectricalEnergyMeasurement,),
491 platform=Platform.SENSOR,
493 key=
"NeoEnergySensorWatt",
494 device_class=SensorDeviceClass.POWER,
495 entity_category=EntityCategory.DIAGNOSTIC,
496 native_unit_of_measurement=UnitOfPower.WATT,
497 suggested_display_precision=2,
498 state_class=SensorStateClass.MEASUREMENT,
499 measurement_to_ha=
lambda x: x / 10,
501 entity_class=MatterSensor,
502 required_attributes=(NeoCluster.Attributes.Watt,),
503 absent_clusters=(clusters.ElectricalPowerMeasurement,),
506 platform=Platform.SENSOR,
508 key=
"NeoEnergySensorWattAccumulated",
509 device_class=SensorDeviceClass.ENERGY,
510 entity_category=EntityCategory.DIAGNOSTIC,
511 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
512 suggested_display_precision=1,
513 state_class=SensorStateClass.TOTAL_INCREASING,
515 entity_class=MatterSensor,
516 required_attributes=(NeoCluster.Attributes.WattAccumulated,),
517 absent_clusters=(clusters.ElectricalEnergyMeasurement,),
520 platform=Platform.SENSOR,
522 key=
"NeoEnergySensorVoltage",
523 device_class=SensorDeviceClass.VOLTAGE,
524 entity_category=EntityCategory.DIAGNOSTIC,
525 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
526 suggested_display_precision=0,
527 state_class=SensorStateClass.MEASUREMENT,
528 measurement_to_ha=
lambda x: x / 10,
530 entity_class=MatterSensor,
531 required_attributes=(NeoCluster.Attributes.Voltage,),
532 absent_clusters=(clusters.ElectricalPowerMeasurement,),
535 platform=Platform.SENSOR,
537 key=
"NeoEnergySensorWattCurrent",
538 device_class=SensorDeviceClass.CURRENT,
539 entity_category=EntityCategory.DIAGNOSTIC,
540 native_unit_of_measurement=UnitOfElectricCurrent.MILLIAMPERE,
541 suggested_display_precision=0,
542 state_class=SensorStateClass.MEASUREMENT,
544 entity_class=MatterSensor,
545 required_attributes=(NeoCluster.Attributes.Current,),
546 absent_clusters=(clusters.ElectricalPowerMeasurement,),
549 platform=Platform.SENSOR,
551 key=
"SwitchCurrentPosition",
552 native_unit_of_measurement=
None,
554 state_class=SensorStateClass.MEASUREMENT,
555 translation_key=
"switch_current_position",
556 entity_category=EntityCategory.DIAGNOSTIC,
557 entity_registry_enabled_default=
False,
559 entity_class=MatterSensor,
560 required_attributes=(clusters.Switch.Attributes.CurrentPosition,),
564 platform=Platform.SENSOR,
566 key=
"ElectricalPowerMeasurementWatt",
567 device_class=SensorDeviceClass.POWER,
568 entity_category=EntityCategory.DIAGNOSTIC,
569 native_unit_of_measurement=UnitOfPower.WATT,
570 suggested_display_precision=2,
571 state_class=SensorStateClass.MEASUREMENT,
572 measurement_to_ha=
lambda x: x / 1000,
574 entity_class=MatterSensor,
575 required_attributes=(
576 clusters.ElectricalPowerMeasurement.Attributes.ActivePower,
580 platform=Platform.SENSOR,
582 key=
"ElectricalPowerMeasurementVoltage",
583 device_class=SensorDeviceClass.VOLTAGE,
584 entity_category=EntityCategory.DIAGNOSTIC,
585 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
586 suggested_display_precision=0,
587 state_class=SensorStateClass.MEASUREMENT,
588 measurement_to_ha=
lambda x: x / 1000,
590 entity_class=MatterSensor,
591 required_attributes=(clusters.ElectricalPowerMeasurement.Attributes.Voltage,),
594 platform=Platform.SENSOR,
596 key=
"ElectricalPowerMeasurementActiveCurrent",
597 device_class=SensorDeviceClass.CURRENT,
598 entity_category=EntityCategory.DIAGNOSTIC,
599 native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
600 suggested_display_precision=2,
601 state_class=SensorStateClass.MEASUREMENT,
602 measurement_to_ha=
lambda x: x / 1000,
604 entity_class=MatterSensor,
605 required_attributes=(
606 clusters.ElectricalPowerMeasurement.Attributes.ActiveCurrent,
610 platform=Platform.SENSOR,
612 key=
"ElectricalEnergyMeasurementCumulativeEnergyImported",
613 device_class=SensorDeviceClass.ENERGY,
614 entity_category=EntityCategory.DIAGNOSTIC,
615 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
616 suggested_display_precision=3,
617 state_class=SensorStateClass.TOTAL_INCREASING,
619 measurement_to_ha=
lambda x: x.energy / 1000000,
621 entity_class=MatterSensor,
622 required_attributes=(
623 clusters.ElectricalEnergyMeasurement.Attributes.CumulativeEnergyImported,
627 platform=Platform.SENSOR,
629 key=
"SmokeCOAlarmContaminationState",
630 translation_key=
"contamination_state",
631 device_class=SensorDeviceClass.ENUM,
632 options=
list(CONTAMINATION_STATE_MAP.values()),
633 measurement_to_ha=CONTAMINATION_STATE_MAP.get,
635 entity_class=MatterSensor,
636 required_attributes=(clusters.SmokeCoAlarm.Attributes.ContaminationState,),
639 platform=Platform.SENSOR,
641 key=
"SmokeCOAlarmExpiryDate",
642 translation_key=
"expiry_date",
643 device_class=SensorDeviceClass.TIMESTAMP,
645 measurement_to_ha=datetime.fromtimestamp,
647 entity_class=MatterSensor,
648 required_attributes=(clusters.SmokeCoAlarm.Attributes.ExpiryDate,),
651 platform=Platform.SENSOR,
653 key=
"OperationalState",
654 device_class=SensorDeviceClass.ENUM,
655 translation_key=
"operational_state",
657 entity_class=MatterOperationalStateSensor,
658 required_attributes=(
659 clusters.OperationalState.Attributes.OperationalState,
660 clusters.OperationalState.Attributes.OperationalStateList,
Any get_matter_attribute_value(self, type[ClusterAttributeDescriptor] attribute, bool null_as_none=True)
None _update_from_device(self)
None _update_from_device(self)
MatterAdapter get_matter(HomeAssistant hass)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)