Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Matter sensors."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from datetime import datetime
7 from typing import TYPE_CHECKING, cast
8 
9 from chip.clusters import Objects as clusters
10 from chip.clusters.Types import Nullable, NullValue
11 from matter_server.common.custom_clusters import (
12  EveCluster,
13  NeoCluster,
14  ThirdRealityMeteringCluster,
15 )
16 
18  SensorDeviceClass,
19  SensorEntity,
20  SensorEntityDescription,
21  SensorStateClass,
22 )
23 from homeassistant.config_entries import ConfigEntry
24 from homeassistant.const import (
25  CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
26  CONCENTRATION_PARTS_PER_MILLION,
27  LIGHT_LUX,
28  PERCENTAGE,
29  EntityCategory,
30  Platform,
31  UnitOfElectricCurrent,
32  UnitOfElectricPotential,
33  UnitOfEnergy,
34  UnitOfPower,
35  UnitOfPressure,
36  UnitOfTemperature,
37  UnitOfVolumeFlowRate,
38 )
39 from homeassistant.core import HomeAssistant, callback
40 from homeassistant.helpers.entity_platform import AddEntitiesCallback
41 from homeassistant.util import slugify
42 
43 from .entity import MatterEntity, MatterEntityDescription
44 from .helpers import get_matter
45 from .models import MatterDiscoverySchema
46 
47 AIR_QUALITY_MAP = {
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,
56 }
57 
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",
63 }
64 
65 
66 OPERATIONAL_STATE_MAP = {
67  # enum with known Operation state values which we can translate
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",
72 }
73 
74 
76  hass: HomeAssistant,
77  config_entry: ConfigEntry,
78  async_add_entities: AddEntitiesCallback,
79 ) -> None:
80  """Set up Matter sensors from Config Entry."""
81  matter = get_matter(hass)
82  matter.register_platform_handler(Platform.SENSOR, async_add_entities)
83 
84 
85 @dataclass(frozen=True)
87  """Describe Matter sensor entities."""
88 
89 
91  """Representation of a Matter sensor."""
92 
93  entity_description: MatterSensorEntityDescription
94 
95  @callback
96  def _update_from_device(self) -> None:
97  """Update from device."""
98  value: Nullable | float | None
99  value = self.get_matter_attribute_valueget_matter_attribute_value(self._entity_info_entity_info.primary_attribute)
100  if value in (None, NullValue):
101  value = None
102  elif value_convert := self.entity_descriptionentity_description.measurement_to_ha:
103  value = value_convert(value)
104  self._attr_native_value_attr_native_value = value
105 
106 
108  """Representation of a sensor for Matter Operational State."""
109 
110  states_map: dict[int, str]
111 
112  @callback
113  def _update_from_device(self) -> None:
114  """Update from device."""
115  # the operational state list is a list of the possible operational states
116  # this is a dynamic list and is condition, device and manufacturer specific
117  # therefore it is not possible to provide a fixed list of options
118  # or to provide a mapping to a translateable string for all options
119  operational_state_list = self.get_matter_attribute_valueget_matter_attribute_value(
120  clusters.OperationalState.Attributes.OperationalStateList
121  )
122  if TYPE_CHECKING:
123  operational_state_list = cast(
124  list[clusters.OperationalState.Structs.OperationalStateStruct],
125  operational_state_list,
126  )
127  states_map: dict[int, str] = {}
128  for state in operational_state_list:
129  # prefer translateable (known) state from mapping,
130  # fallback to the raw state label as given by the device/manufacturer
131  states_map[state.operationalStateID] = OPERATIONAL_STATE_MAP.get(
132  state.operationalStateID, slugify(state.operationalStateLabel)
133  )
134  self.states_mapstates_map = states_map
135  self._attr_options_attr_options = list(states_map.values())
136  self._attr_native_value_attr_native_value_attr_native_value = states_map.get(
137  self.get_matter_attribute_valueget_matter_attribute_value(
138  clusters.OperationalState.Attributes.OperationalState
139  )
140  )
141 
142 
143 # Discovery schema(s) to map Matter Attributes to HA entities
144 DISCOVERY_SCHEMAS = [
146  platform=Platform.SENSOR,
147  entity_description=MatterSensorEntityDescription(
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,
153  ),
154  entity_class=MatterSensor,
155  required_attributes=(clusters.TemperatureMeasurement.Attributes.MeasuredValue,),
156  ),
158  platform=Platform.SENSOR,
159  entity_description=MatterSensorEntityDescription(
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,
165  ),
166  entity_class=MatterSensor,
167  required_attributes=(clusters.PressureMeasurement.Attributes.MeasuredValue,),
168  ),
170  platform=Platform.SENSOR,
171  entity_description=MatterSensorEntityDescription(
172  key="FlowSensor",
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,
177  ),
178  entity_class=MatterSensor,
179  required_attributes=(clusters.FlowMeasurement.Attributes.MeasuredValue,),
180  ),
182  platform=Platform.SENSOR,
183  entity_description=MatterSensorEntityDescription(
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,
189  ),
190  entity_class=MatterSensor,
191  required_attributes=(
192  clusters.RelativeHumidityMeasurement.Attributes.MeasuredValue,
193  ),
194  ),
196  platform=Platform.SENSOR,
197  entity_description=MatterSensorEntityDescription(
198  key="LightSensor",
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,
203  ),
204  entity_class=MatterSensor,
205  required_attributes=(clusters.IlluminanceMeasurement.Attributes.MeasuredValue,),
206  ),
208  platform=Platform.SENSOR,
209  entity_description=MatterSensorEntityDescription(
210  key="PowerSource",
211  native_unit_of_measurement=PERCENTAGE,
212  device_class=SensorDeviceClass.BATTERY,
213  entity_category=EntityCategory.DIAGNOSTIC,
214  # value has double precision
215  measurement_to_ha=lambda x: int(x / 2),
216  state_class=SensorStateClass.MEASUREMENT,
217  ),
218  entity_class=MatterSensor,
219  required_attributes=(clusters.PowerSource.Attributes.BatPercentRemaining,),
220  ),
222  platform=Platform.SENSOR,
223  entity_description=MatterSensorEntityDescription(
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,
230  ),
231  entity_class=MatterSensor,
232  required_attributes=(clusters.PowerSource.Attributes.BatVoltage,),
233  ),
235  platform=Platform.SENSOR,
236  entity_description=MatterSensorEntityDescription(
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,
243  ),
244  entity_class=MatterSensor,
245  required_attributes=(EveCluster.Attributes.Watt,),
246  absent_clusters=(clusters.ElectricalPowerMeasurement,),
247  ),
249  platform=Platform.SENSOR,
250  entity_description=MatterSensorEntityDescription(
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,
257  ),
258  entity_class=MatterSensor,
259  required_attributes=(EveCluster.Attributes.Voltage,),
260  absent_clusters=(clusters.ElectricalPowerMeasurement,),
261  ),
263  platform=Platform.SENSOR,
264  entity_description=MatterSensorEntityDescription(
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,
271  ),
272  entity_class=MatterSensor,
273  required_attributes=(EveCluster.Attributes.WattAccumulated,),
274  absent_clusters=(clusters.ElectricalEnergyMeasurement,),
275  ),
277  platform=Platform.SENSOR,
278  entity_description=MatterSensorEntityDescription(
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,
285  ),
286  entity_class=MatterSensor,
287  required_attributes=(EveCluster.Attributes.Current,),
288  absent_clusters=(clusters.ElectricalPowerMeasurement,),
289  ),
291  platform=Platform.SENSOR,
292  entity_description=MatterSensorEntityDescription(
293  key="EveThermoValvePosition",
294  translation_key="valve_position",
295  native_unit_of_measurement=PERCENTAGE,
296  ),
297  entity_class=MatterSensor,
298  required_attributes=(EveCluster.Attributes.ValvePosition,),
299  ),
301  platform=Platform.SENSOR,
302  entity_description=MatterSensorEntityDescription(
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,
308  ),
309  entity_class=MatterSensor,
310  required_attributes=(EveCluster.Attributes.Pressure,),
311  ),
313  platform=Platform.SENSOR,
314  entity_description=MatterSensorEntityDescription(
315  key="CarbonDioxideSensor",
316  native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
317  device_class=SensorDeviceClass.CO2,
318  state_class=SensorStateClass.MEASUREMENT,
319  ),
320  entity_class=MatterSensor,
321  required_attributes=(
322  clusters.CarbonDioxideConcentrationMeasurement.Attributes.MeasuredValue,
323  ),
324  ),
326  platform=Platform.SENSOR,
327  entity_description=MatterSensorEntityDescription(
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,
332  ),
333  entity_class=MatterSensor,
334  required_attributes=(
335  clusters.TotalVolatileOrganicCompoundsConcentrationMeasurement.Attributes.MeasuredValue,
336  ),
337  ),
339  platform=Platform.SENSOR,
340  entity_description=MatterSensorEntityDescription(
341  key="PM1Sensor",
342  native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
343  device_class=SensorDeviceClass.PM1,
344  state_class=SensorStateClass.MEASUREMENT,
345  ),
346  entity_class=MatterSensor,
347  required_attributes=(
348  clusters.Pm1ConcentrationMeasurement.Attributes.MeasuredValue,
349  ),
350  ),
352  platform=Platform.SENSOR,
353  entity_description=MatterSensorEntityDescription(
354  key="PM25Sensor",
355  native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
356  device_class=SensorDeviceClass.PM25,
357  state_class=SensorStateClass.MEASUREMENT,
358  ),
359  entity_class=MatterSensor,
360  required_attributes=(
361  clusters.Pm25ConcentrationMeasurement.Attributes.MeasuredValue,
362  ),
363  ),
365  platform=Platform.SENSOR,
366  entity_description=MatterSensorEntityDescription(
367  key="PM10Sensor",
368  native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
369  device_class=SensorDeviceClass.PM10,
370  state_class=SensorStateClass.MEASUREMENT,
371  ),
372  entity_class=MatterSensor,
373  required_attributes=(
374  clusters.Pm10ConcentrationMeasurement.Attributes.MeasuredValue,
375  ),
376  ),
378  platform=Platform.SENSOR,
379  entity_description=MatterSensorEntityDescription(
380  key="AirQuality",
381  translation_key="air_quality",
382  device_class=SensorDeviceClass.ENUM,
383  state_class=None,
384  # convert to set first to remove the duplicate unknown value
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],
387  ),
388  entity_class=MatterSensor,
389  required_attributes=(clusters.AirQuality.Attributes.AirQuality,),
390  ),
392  platform=Platform.SENSOR,
393  entity_description=MatterSensorEntityDescription(
394  key="CarbonMonoxideSensor",
395  native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
396  device_class=SensorDeviceClass.CO,
397  state_class=SensorStateClass.MEASUREMENT,
398  ),
399  entity_class=MatterSensor,
400  required_attributes=(
401  clusters.CarbonMonoxideConcentrationMeasurement.Attributes.MeasuredValue,
402  ),
403  ),
405  platform=Platform.SENSOR,
406  entity_description=MatterSensorEntityDescription(
407  key="NitrogenDioxideSensor",
408  native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
409  device_class=SensorDeviceClass.NITROGEN_DIOXIDE,
410  state_class=SensorStateClass.MEASUREMENT,
411  ),
412  entity_class=MatterSensor,
413  required_attributes=(
414  clusters.NitrogenDioxideConcentrationMeasurement.Attributes.MeasuredValue,
415  ),
416  ),
418  platform=Platform.SENSOR,
419  entity_description=MatterSensorEntityDescription(
420  key="OzoneConcentrationSensor",
421  native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
422  device_class=SensorDeviceClass.OZONE,
423  state_class=SensorStateClass.MEASUREMENT,
424  ),
425  entity_class=MatterSensor,
426  required_attributes=(
427  clusters.OzoneConcentrationMeasurement.Attributes.MeasuredValue,
428  ),
429  ),
431  platform=Platform.SENSOR,
432  entity_description=MatterSensorEntityDescription(
433  key="HepaFilterCondition",
434  native_unit_of_measurement=PERCENTAGE,
435  device_class=None,
436  state_class=SensorStateClass.MEASUREMENT,
437  translation_key="hepa_filter_condition",
438  ),
439  entity_class=MatterSensor,
440  required_attributes=(clusters.HepaFilterMonitoring.Attributes.Condition,),
441  ),
443  platform=Platform.SENSOR,
444  entity_description=MatterSensorEntityDescription(
445  key="ActivatedCarbonFilterCondition",
446  native_unit_of_measurement=PERCENTAGE,
447  device_class=None,
448  state_class=SensorStateClass.MEASUREMENT,
449  translation_key="activated_carbon_filter_condition",
450  ),
451  entity_class=MatterSensor,
452  required_attributes=(
453  clusters.ActivatedCarbonFilterMonitoring.Attributes.Condition,
454  ),
455  ),
457  platform=Platform.SENSOR,
458  entity_description=MatterSensorEntityDescription(
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,
466  ),
467  entity_class=MatterSensor,
468  required_attributes=(
469  ThirdRealityMeteringCluster.Attributes.InstantaneousDemand,
470  ),
471  absent_clusters=(clusters.ElectricalPowerMeasurement,),
472  ),
474  platform=Platform.SENSOR,
475  entity_description=MatterSensorEntityDescription(
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,
483  ),
484  entity_class=MatterSensor,
485  required_attributes=(
486  ThirdRealityMeteringCluster.Attributes.CurrentSummationDelivered,
487  ),
488  absent_clusters=(clusters.ElectricalEnergyMeasurement,),
489  ),
491  platform=Platform.SENSOR,
492  entity_description=MatterSensorEntityDescription(
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,
500  ),
501  entity_class=MatterSensor,
502  required_attributes=(NeoCluster.Attributes.Watt,),
503  absent_clusters=(clusters.ElectricalPowerMeasurement,),
504  ),
506  platform=Platform.SENSOR,
507  entity_description=MatterSensorEntityDescription(
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,
514  ),
515  entity_class=MatterSensor,
516  required_attributes=(NeoCluster.Attributes.WattAccumulated,),
517  absent_clusters=(clusters.ElectricalEnergyMeasurement,),
518  ),
520  platform=Platform.SENSOR,
521  entity_description=MatterSensorEntityDescription(
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,
529  ),
530  entity_class=MatterSensor,
531  required_attributes=(NeoCluster.Attributes.Voltage,),
532  absent_clusters=(clusters.ElectricalPowerMeasurement,),
533  ),
535  platform=Platform.SENSOR,
536  entity_description=MatterSensorEntityDescription(
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,
543  ),
544  entity_class=MatterSensor,
545  required_attributes=(NeoCluster.Attributes.Current,),
546  absent_clusters=(clusters.ElectricalPowerMeasurement,),
547  ),
549  platform=Platform.SENSOR,
550  entity_description=MatterSensorEntityDescription(
551  key="SwitchCurrentPosition",
552  native_unit_of_measurement=None,
553  device_class=None,
554  state_class=SensorStateClass.MEASUREMENT,
555  translation_key="switch_current_position",
556  entity_category=EntityCategory.DIAGNOSTIC,
557  entity_registry_enabled_default=False,
558  ),
559  entity_class=MatterSensor,
560  required_attributes=(clusters.Switch.Attributes.CurrentPosition,),
561  allow_multi=True, # also used for event entity
562  ),
564  platform=Platform.SENSOR,
565  entity_description=MatterSensorEntityDescription(
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,
573  ),
574  entity_class=MatterSensor,
575  required_attributes=(
576  clusters.ElectricalPowerMeasurement.Attributes.ActivePower,
577  ),
578  ),
580  platform=Platform.SENSOR,
581  entity_description=MatterSensorEntityDescription(
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,
589  ),
590  entity_class=MatterSensor,
591  required_attributes=(clusters.ElectricalPowerMeasurement.Attributes.Voltage,),
592  ),
594  platform=Platform.SENSOR,
595  entity_description=MatterSensorEntityDescription(
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,
603  ),
604  entity_class=MatterSensor,
605  required_attributes=(
606  clusters.ElectricalPowerMeasurement.Attributes.ActiveCurrent,
607  ),
608  ),
610  platform=Platform.SENSOR,
611  entity_description=MatterSensorEntityDescription(
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,
618  # id 0 of the EnergyMeasurementStruct is the cumulative energy (in mWh)
619  measurement_to_ha=lambda x: x.energy / 1000000,
620  ),
621  entity_class=MatterSensor,
622  required_attributes=(
623  clusters.ElectricalEnergyMeasurement.Attributes.CumulativeEnergyImported,
624  ),
625  ),
627  platform=Platform.SENSOR,
628  entity_description=MatterSensorEntityDescription(
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,
634  ),
635  entity_class=MatterSensor,
636  required_attributes=(clusters.SmokeCoAlarm.Attributes.ContaminationState,),
637  ),
639  platform=Platform.SENSOR,
640  entity_description=MatterSensorEntityDescription(
641  key="SmokeCOAlarmExpiryDate",
642  translation_key="expiry_date",
643  device_class=SensorDeviceClass.TIMESTAMP,
644  # raw value is epoch seconds
645  measurement_to_ha=datetime.fromtimestamp,
646  ),
647  entity_class=MatterSensor,
648  required_attributes=(clusters.SmokeCoAlarm.Attributes.ExpiryDate,),
649  ),
651  platform=Platform.SENSOR,
652  entity_description=MatterSensorEntityDescription(
653  key="OperationalState",
654  device_class=SensorDeviceClass.ENUM,
655  translation_key="operational_state",
656  ),
657  entity_class=MatterOperationalStateSensor,
658  required_attributes=(
659  clusters.OperationalState.Attributes.OperationalState,
660  clusters.OperationalState.Attributes.OperationalStateList,
661  ),
662  ),
663 ]
Any get_matter_attribute_value(self, type[ClusterAttributeDescriptor] attribute, bool null_as_none=True)
Definition: entity.py:206
MatterAdapter get_matter(HomeAssistant hass)
Definition: helpers.py:35
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:79