Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for Shelly."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from typing import Final, cast
7 
8 from aioshelly.block_device import Block
9 from aioshelly.const import RPC_GENERATIONS
10 
12  DOMAIN as SENSOR_PLATFORM,
13  RestoreSensor,
14  SensorDeviceClass,
15  SensorEntity,
16  SensorEntityDescription,
17  SensorExtraStoredData,
18  SensorStateClass,
19 )
20 from homeassistant.const import (
21  CONCENTRATION_PARTS_PER_MILLION,
22  DEGREE,
23  LIGHT_LUX,
24  PERCENTAGE,
25  SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
26  EntityCategory,
27  UnitOfApparentPower,
28  UnitOfElectricCurrent,
29  UnitOfElectricPotential,
30  UnitOfEnergy,
31  UnitOfFrequency,
32  UnitOfPower,
33  UnitOfTemperature,
34 )
35 from homeassistant.core import HomeAssistant
36 from homeassistant.helpers.entity_platform import AddEntitiesCallback
37 from homeassistant.helpers.entity_registry import RegistryEntry
38 from homeassistant.helpers.typing import StateType
39 
40 from .const import CONF_SLEEP_PERIOD, SHAIR_MAX_WORK_HOURS
41 from .coordinator import ShellyBlockCoordinator, ShellyConfigEntry, ShellyRpcCoordinator
42 from .entity import (
43  BlockEntityDescription,
44  RestEntityDescription,
45  RpcEntityDescription,
46  ShellyBlockAttributeEntity,
47  ShellyRestAttributeEntity,
48  ShellyRpcAttributeEntity,
49  ShellySleepingBlockAttributeEntity,
50  ShellySleepingRpcAttributeEntity,
51  async_setup_entry_attribute_entities,
52  async_setup_entry_rest,
53  async_setup_entry_rpc,
54 )
55 from .utils import (
56  async_remove_orphaned_entities,
57  get_device_entry_gen,
58  get_device_uptime,
59  get_virtual_component_ids,
60  is_rpc_wifi_stations_disabled,
61 )
62 
63 
64 @dataclass(frozen=True, kw_only=True)
66  """Class to describe a BLOCK sensor."""
67 
68 
69 @dataclass(frozen=True, kw_only=True)
71  """Class to describe a RPC sensor."""
72 
73 
74 @dataclass(frozen=True, kw_only=True)
76  """Class to describe a REST sensor."""
77 
78 
79 SENSORS: dict[tuple[str, str], BlockSensorDescription] = {
80  ("device", "battery"): BlockSensorDescription(
81  key="device|battery",
82  name="Battery",
83  native_unit_of_measurement=PERCENTAGE,
84  device_class=SensorDeviceClass.BATTERY,
85  state_class=SensorStateClass.MEASUREMENT,
86  removal_condition=lambda settings, _: settings.get("external_power") == 1,
87  available=lambda block: cast(int, block.battery) != -1,
88  entity_category=EntityCategory.DIAGNOSTIC,
89  ),
90  ("device", "deviceTemp"): BlockSensorDescription(
91  key="device|deviceTemp",
92  name="Device temperature",
93  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
94  suggested_display_precision=1,
95  device_class=SensorDeviceClass.TEMPERATURE,
96  state_class=SensorStateClass.MEASUREMENT,
97  entity_registry_enabled_default=False,
98  entity_category=EntityCategory.DIAGNOSTIC,
99  ),
100  ("emeter", "current"): BlockSensorDescription(
101  key="emeter|current",
102  name="Current",
103  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
104  device_class=SensorDeviceClass.CURRENT,
105  state_class=SensorStateClass.MEASUREMENT,
106  ),
107  ("device", "neutralCurrent"): BlockSensorDescription(
108  key="device|neutralCurrent",
109  name="Neutral current",
110  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
111  device_class=SensorDeviceClass.CURRENT,
112  state_class=SensorStateClass.MEASUREMENT,
113  entity_registry_enabled_default=False,
114  ),
115  ("light", "power"): BlockSensorDescription(
116  key="light|power",
117  name="Power",
118  native_unit_of_measurement=UnitOfPower.WATT,
119  suggested_display_precision=1,
120  device_class=SensorDeviceClass.POWER,
121  state_class=SensorStateClass.MEASUREMENT,
122  entity_registry_enabled_default=False,
123  ),
124  ("device", "power"): BlockSensorDescription(
125  key="device|power",
126  name="Power",
127  native_unit_of_measurement=UnitOfPower.WATT,
128  suggested_display_precision=1,
129  device_class=SensorDeviceClass.POWER,
130  state_class=SensorStateClass.MEASUREMENT,
131  ),
132  ("emeter", "power"): BlockSensorDescription(
133  key="emeter|power",
134  name="Power",
135  native_unit_of_measurement=UnitOfPower.WATT,
136  suggested_display_precision=1,
137  device_class=SensorDeviceClass.POWER,
138  state_class=SensorStateClass.MEASUREMENT,
139  ),
140  ("device", "voltage"): BlockSensorDescription(
141  key="device|voltage",
142  name="Voltage",
143  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
144  suggested_display_precision=1,
145  device_class=SensorDeviceClass.VOLTAGE,
146  state_class=SensorStateClass.MEASUREMENT,
147  entity_registry_enabled_default=False,
148  ),
149  ("emeter", "voltage"): BlockSensorDescription(
150  key="emeter|voltage",
151  name="Voltage",
152  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
153  suggested_display_precision=1,
154  device_class=SensorDeviceClass.VOLTAGE,
155  state_class=SensorStateClass.MEASUREMENT,
156  ),
157  ("emeter", "powerFactor"): BlockSensorDescription(
158  key="emeter|powerFactor",
159  name="Power factor",
160  suggested_display_precision=2,
161  device_class=SensorDeviceClass.POWER_FACTOR,
162  state_class=SensorStateClass.MEASUREMENT,
163  ),
164  ("relay", "power"): BlockSensorDescription(
165  key="relay|power",
166  name="Power",
167  native_unit_of_measurement=UnitOfPower.WATT,
168  suggested_display_precision=1,
169  device_class=SensorDeviceClass.POWER,
170  state_class=SensorStateClass.MEASUREMENT,
171  ),
172  ("roller", "rollerPower"): BlockSensorDescription(
173  key="roller|rollerPower",
174  name="Power",
175  native_unit_of_measurement=UnitOfPower.WATT,
176  suggested_display_precision=1,
177  device_class=SensorDeviceClass.POWER,
178  state_class=SensorStateClass.MEASUREMENT,
179  ),
180  ("device", "energy"): BlockSensorDescription(
181  key="device|energy",
182  name="Energy",
183  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
184  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
185  value=lambda value: value / 60,
186  suggested_display_precision=2,
187  device_class=SensorDeviceClass.ENERGY,
188  state_class=SensorStateClass.TOTAL_INCREASING,
189  ),
190  ("emeter", "energy"): BlockSensorDescription(
191  key="emeter|energy",
192  name="Energy",
193  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
194  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
195  suggested_display_precision=2,
196  device_class=SensorDeviceClass.ENERGY,
197  state_class=SensorStateClass.TOTAL_INCREASING,
198  available=lambda block: cast(int, block.energy) != -1,
199  ),
200  ("emeter", "energyReturned"): BlockSensorDescription(
201  key="emeter|energyReturned",
202  name="Energy returned",
203  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
204  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
205  suggested_display_precision=2,
206  device_class=SensorDeviceClass.ENERGY,
207  state_class=SensorStateClass.TOTAL_INCREASING,
208  available=lambda block: cast(int, block.energyReturned) != -1,
209  ),
210  ("light", "energy"): BlockSensorDescription(
211  key="light|energy",
212  name="Energy",
213  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
214  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
215  value=lambda value: value / 60,
216  suggested_display_precision=2,
217  device_class=SensorDeviceClass.ENERGY,
218  state_class=SensorStateClass.TOTAL_INCREASING,
219  entity_registry_enabled_default=False,
220  ),
221  ("relay", "energy"): BlockSensorDescription(
222  key="relay|energy",
223  name="Energy",
224  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
225  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
226  value=lambda value: value / 60,
227  suggested_display_precision=2,
228  device_class=SensorDeviceClass.ENERGY,
229  state_class=SensorStateClass.TOTAL_INCREASING,
230  ),
231  ("roller", "rollerEnergy"): BlockSensorDescription(
232  key="roller|rollerEnergy",
233  name="Energy",
234  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
235  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
236  value=lambda value: value / 60,
237  suggested_display_precision=2,
238  device_class=SensorDeviceClass.ENERGY,
239  state_class=SensorStateClass.TOTAL_INCREASING,
240  ),
241  ("sensor", "concentration"): BlockSensorDescription(
242  key="sensor|concentration",
243  name="Gas concentration",
244  native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
245  translation_key="gas_concentration",
246  state_class=SensorStateClass.MEASUREMENT,
247  ),
248  ("sensor", "temp"): BlockSensorDescription(
249  key="sensor|temp",
250  name="Temperature",
251  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
252  suggested_display_precision=1,
253  device_class=SensorDeviceClass.TEMPERATURE,
254  state_class=SensorStateClass.MEASUREMENT,
255  entity_category=EntityCategory.DIAGNOSTIC,
256  ),
257  ("sensor", "extTemp"): BlockSensorDescription(
258  key="sensor|extTemp",
259  name="Temperature",
260  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
261  suggested_display_precision=1,
262  device_class=SensorDeviceClass.TEMPERATURE,
263  state_class=SensorStateClass.MEASUREMENT,
264  available=lambda block: cast(int, block.extTemp) != 999
265  and not getattr(block, "sensorError", False),
266  ),
267  ("sensor", "humidity"): BlockSensorDescription(
268  key="sensor|humidity",
269  name="Humidity",
270  native_unit_of_measurement=PERCENTAGE,
271  suggested_display_precision=1,
272  device_class=SensorDeviceClass.HUMIDITY,
273  state_class=SensorStateClass.MEASUREMENT,
274  available=lambda block: cast(int, block.humidity) != 999
275  and not getattr(block, "sensorError", False),
276  ),
277  ("sensor", "luminosity"): BlockSensorDescription(
278  key="sensor|luminosity",
279  name="Luminosity",
280  native_unit_of_measurement=LIGHT_LUX,
281  device_class=SensorDeviceClass.ILLUMINANCE,
282  state_class=SensorStateClass.MEASUREMENT,
283  available=lambda block: cast(int, block.luminosity) != -1,
284  ),
285  ("sensor", "tilt"): BlockSensorDescription(
286  key="sensor|tilt",
287  name="Tilt",
288  native_unit_of_measurement=DEGREE,
289  translation_key="tilt",
290  state_class=SensorStateClass.MEASUREMENT,
291  ),
292  ("relay", "totalWorkTime"): BlockSensorDescription(
293  key="relay|totalWorkTime",
294  name="Lamp life",
295  native_unit_of_measurement=PERCENTAGE,
296  translation_key="lamp_life",
297  value=lambda value: 100 - (value / 3600 / SHAIR_MAX_WORK_HOURS),
298  suggested_display_precision=1,
299  extra_state_attributes=lambda block: {
300  "Operational hours": round(cast(int, block.totalWorkTime) / 3600, 1)
301  },
302  entity_category=EntityCategory.DIAGNOSTIC,
303  ),
304  ("adc", "adc"): BlockSensorDescription(
305  key="adc|adc",
306  name="ADC",
307  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
308  suggested_display_precision=2,
309  device_class=SensorDeviceClass.VOLTAGE,
310  state_class=SensorStateClass.MEASUREMENT,
311  ),
312  ("sensor", "sensorOp"): BlockSensorDescription(
313  key="sensor|sensorOp",
314  name="Operation",
315  device_class=SensorDeviceClass.ENUM,
316  options=["unknown", "warmup", "normal", "fault"],
317  translation_key="operation",
318  value=lambda value: value,
319  extra_state_attributes=lambda block: {"self_test": block.selfTest},
320  ),
321  ("valve", "valve"): BlockSensorDescription(
322  key="valve|valve",
323  name="Valve status",
324  translation_key="valve_status",
325  device_class=SensorDeviceClass.ENUM,
326  options=[
327  "checking",
328  "closed",
329  "closing",
330  "failure",
331  "opened",
332  "opening",
333  "unknown",
334  ],
335  entity_category=EntityCategory.DIAGNOSTIC,
336  removal_condition=lambda _, block: block.valve == "not_connected",
337  ),
338 }
339 
340 REST_SENSORS: Final = {
341  "rssi": RestSensorDescription(
342  key="rssi",
343  name="RSSI",
344  native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
345  value=lambda status, _: status["wifi_sta"]["rssi"],
346  device_class=SensorDeviceClass.SIGNAL_STRENGTH,
347  state_class=SensorStateClass.MEASUREMENT,
348  entity_registry_enabled_default=False,
349  entity_category=EntityCategory.DIAGNOSTIC,
350  ),
351  "uptime": RestSensorDescription(
352  key="uptime",
353  name="Uptime",
354  value=lambda status, last: get_device_uptime(status["uptime"], last),
355  device_class=SensorDeviceClass.TIMESTAMP,
356  entity_registry_enabled_default=False,
357  entity_category=EntityCategory.DIAGNOSTIC,
358  ),
359 }
360 
361 
362 RPC_SENSORS: Final = {
363  "power": RpcSensorDescription(
364  key="switch",
365  sub_key="apower",
366  name="Power",
367  native_unit_of_measurement=UnitOfPower.WATT,
368  device_class=SensorDeviceClass.POWER,
369  state_class=SensorStateClass.MEASUREMENT,
370  ),
371  "power_em1": RpcSensorDescription(
372  key="em1",
373  sub_key="act_power",
374  name="Power",
375  native_unit_of_measurement=UnitOfPower.WATT,
376  device_class=SensorDeviceClass.POWER,
377  state_class=SensorStateClass.MEASUREMENT,
378  ),
379  "power_light": RpcSensorDescription(
380  key="light",
381  sub_key="apower",
382  name="Power",
383  native_unit_of_measurement=UnitOfPower.WATT,
384  device_class=SensorDeviceClass.POWER,
385  state_class=SensorStateClass.MEASUREMENT,
386  ),
387  "power_pm1": RpcSensorDescription(
388  key="pm1",
389  sub_key="apower",
390  name="Power",
391  native_unit_of_measurement=UnitOfPower.WATT,
392  device_class=SensorDeviceClass.POWER,
393  state_class=SensorStateClass.MEASUREMENT,
394  ),
395  "power_cct": RpcSensorDescription(
396  key="cct",
397  sub_key="apower",
398  name="Power",
399  native_unit_of_measurement=UnitOfPower.WATT,
400  device_class=SensorDeviceClass.POWER,
401  state_class=SensorStateClass.MEASUREMENT,
402  ),
403  "power_rgb": RpcSensorDescription(
404  key="rgb",
405  sub_key="apower",
406  name="Power",
407  native_unit_of_measurement=UnitOfPower.WATT,
408  device_class=SensorDeviceClass.POWER,
409  state_class=SensorStateClass.MEASUREMENT,
410  ),
411  "power_rgbw": RpcSensorDescription(
412  key="rgbw",
413  sub_key="apower",
414  name="Power",
415  native_unit_of_measurement=UnitOfPower.WATT,
416  device_class=SensorDeviceClass.POWER,
417  state_class=SensorStateClass.MEASUREMENT,
418  ),
419  "a_act_power": RpcSensorDescription(
420  key="em",
421  sub_key="a_act_power",
422  name="Phase A active power",
423  native_unit_of_measurement=UnitOfPower.WATT,
424  device_class=SensorDeviceClass.POWER,
425  state_class=SensorStateClass.MEASUREMENT,
426  ),
427  "b_act_power": RpcSensorDescription(
428  key="em",
429  sub_key="b_act_power",
430  name="Phase B active power",
431  native_unit_of_measurement=UnitOfPower.WATT,
432  device_class=SensorDeviceClass.POWER,
433  state_class=SensorStateClass.MEASUREMENT,
434  ),
435  "c_act_power": RpcSensorDescription(
436  key="em",
437  sub_key="c_act_power",
438  name="Phase C active power",
439  native_unit_of_measurement=UnitOfPower.WATT,
440  device_class=SensorDeviceClass.POWER,
441  state_class=SensorStateClass.MEASUREMENT,
442  ),
443  "total_act_power": RpcSensorDescription(
444  key="em",
445  sub_key="total_act_power",
446  name="Total active power",
447  native_unit_of_measurement=UnitOfPower.WATT,
448  device_class=SensorDeviceClass.POWER,
449  state_class=SensorStateClass.MEASUREMENT,
450  ),
451  "a_aprt_power": RpcSensorDescription(
452  key="em",
453  sub_key="a_aprt_power",
454  name="Phase A apparent power",
455  native_unit_of_measurement=UnitOfApparentPower.VOLT_AMPERE,
456  device_class=SensorDeviceClass.APPARENT_POWER,
457  state_class=SensorStateClass.MEASUREMENT,
458  ),
459  "b_aprt_power": RpcSensorDescription(
460  key="em",
461  sub_key="b_aprt_power",
462  name="Phase B apparent power",
463  native_unit_of_measurement=UnitOfApparentPower.VOLT_AMPERE,
464  device_class=SensorDeviceClass.APPARENT_POWER,
465  state_class=SensorStateClass.MEASUREMENT,
466  ),
467  "c_aprt_power": RpcSensorDescription(
468  key="em",
469  sub_key="c_aprt_power",
470  name="Phase C apparent power",
471  native_unit_of_measurement=UnitOfApparentPower.VOLT_AMPERE,
472  device_class=SensorDeviceClass.APPARENT_POWER,
473  state_class=SensorStateClass.MEASUREMENT,
474  ),
475  "aprt_power_em1": RpcSensorDescription(
476  key="em1",
477  sub_key="aprt_power",
478  name="Apparent power",
479  native_unit_of_measurement=UnitOfApparentPower.VOLT_AMPERE,
480  device_class=SensorDeviceClass.APPARENT_POWER,
481  state_class=SensorStateClass.MEASUREMENT,
482  ),
483  "total_aprt_power": RpcSensorDescription(
484  key="em",
485  sub_key="total_aprt_power",
486  name="Total apparent power",
487  native_unit_of_measurement=UnitOfApparentPower.VOLT_AMPERE,
488  device_class=SensorDeviceClass.APPARENT_POWER,
489  state_class=SensorStateClass.MEASUREMENT,
490  ),
491  "pf_em1": RpcSensorDescription(
492  key="em1",
493  sub_key="pf",
494  name="Power factor",
495  device_class=SensorDeviceClass.POWER_FACTOR,
496  state_class=SensorStateClass.MEASUREMENT,
497  ),
498  "a_pf": RpcSensorDescription(
499  key="em",
500  sub_key="a_pf",
501  name="Phase A power factor",
502  device_class=SensorDeviceClass.POWER_FACTOR,
503  state_class=SensorStateClass.MEASUREMENT,
504  ),
505  "b_pf": RpcSensorDescription(
506  key="em",
507  sub_key="b_pf",
508  name="Phase B power factor",
509  device_class=SensorDeviceClass.POWER_FACTOR,
510  state_class=SensorStateClass.MEASUREMENT,
511  ),
512  "c_pf": RpcSensorDescription(
513  key="em",
514  sub_key="c_pf",
515  name="Phase C power factor",
516  device_class=SensorDeviceClass.POWER_FACTOR,
517  state_class=SensorStateClass.MEASUREMENT,
518  ),
519  "voltage": RpcSensorDescription(
520  key="switch",
521  sub_key="voltage",
522  name="Voltage",
523  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
524  value=lambda status, _: None if status is None else float(status),
525  suggested_display_precision=1,
526  device_class=SensorDeviceClass.VOLTAGE,
527  state_class=SensorStateClass.MEASUREMENT,
528  entity_registry_enabled_default=False,
529  ),
530  "voltage_em1": RpcSensorDescription(
531  key="em1",
532  sub_key="voltage",
533  name="Voltage",
534  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
535  value=lambda status, _: None if status is None else float(status),
536  suggested_display_precision=1,
537  device_class=SensorDeviceClass.VOLTAGE,
538  state_class=SensorStateClass.MEASUREMENT,
539  entity_registry_enabled_default=False,
540  ),
541  "voltage_light": RpcSensorDescription(
542  key="light",
543  sub_key="voltage",
544  name="Voltage",
545  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
546  value=lambda status, _: None if status is None else float(status),
547  suggested_display_precision=1,
548  device_class=SensorDeviceClass.VOLTAGE,
549  state_class=SensorStateClass.MEASUREMENT,
550  entity_registry_enabled_default=False,
551  ),
552  "voltage_pm1": RpcSensorDescription(
553  key="pm1",
554  sub_key="voltage",
555  name="Voltage",
556  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
557  value=lambda status, _: None if status is None else float(status),
558  suggested_display_precision=1,
559  device_class=SensorDeviceClass.VOLTAGE,
560  state_class=SensorStateClass.MEASUREMENT,
561  entity_registry_enabled_default=False,
562  ),
563  "voltage_cct": RpcSensorDescription(
564  key="cct",
565  sub_key="voltage",
566  name="Voltage",
567  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
568  value=lambda status, _: None if status is None else float(status),
569  suggested_display_precision=1,
570  device_class=SensorDeviceClass.VOLTAGE,
571  state_class=SensorStateClass.MEASUREMENT,
572  entity_registry_enabled_default=False,
573  ),
574  "voltage_rgb": RpcSensorDescription(
575  key="rgb",
576  sub_key="voltage",
577  name="Voltage",
578  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
579  value=lambda status, _: None if status is None else float(status),
580  suggested_display_precision=1,
581  device_class=SensorDeviceClass.VOLTAGE,
582  state_class=SensorStateClass.MEASUREMENT,
583  entity_registry_enabled_default=False,
584  ),
585  "voltage_rgbw": RpcSensorDescription(
586  key="rgbw",
587  sub_key="voltage",
588  name="Voltage",
589  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
590  value=lambda status, _: None if status is None else float(status),
591  suggested_display_precision=1,
592  device_class=SensorDeviceClass.VOLTAGE,
593  state_class=SensorStateClass.MEASUREMENT,
594  entity_registry_enabled_default=False,
595  ),
596  "a_voltage": RpcSensorDescription(
597  key="em",
598  sub_key="a_voltage",
599  name="Phase A voltage",
600  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
601  device_class=SensorDeviceClass.VOLTAGE,
602  state_class=SensorStateClass.MEASUREMENT,
603  entity_registry_enabled_default=False,
604  ),
605  "b_voltage": RpcSensorDescription(
606  key="em",
607  sub_key="b_voltage",
608  name="Phase B voltage",
609  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
610  device_class=SensorDeviceClass.VOLTAGE,
611  state_class=SensorStateClass.MEASUREMENT,
612  entity_registry_enabled_default=False,
613  ),
614  "c_voltage": RpcSensorDescription(
615  key="em",
616  sub_key="c_voltage",
617  name="Phase C voltage",
618  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
619  device_class=SensorDeviceClass.VOLTAGE,
620  state_class=SensorStateClass.MEASUREMENT,
621  entity_registry_enabled_default=False,
622  ),
623  "current": RpcSensorDescription(
624  key="switch",
625  sub_key="current",
626  name="Current",
627  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
628  value=lambda status, _: None if status is None else float(status),
629  device_class=SensorDeviceClass.CURRENT,
630  state_class=SensorStateClass.MEASUREMENT,
631  entity_registry_enabled_default=False,
632  ),
633  "current_em1": RpcSensorDescription(
634  key="em1",
635  sub_key="current",
636  name="Current",
637  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
638  value=lambda status, _: None if status is None else float(status),
639  device_class=SensorDeviceClass.CURRENT,
640  state_class=SensorStateClass.MEASUREMENT,
641  entity_registry_enabled_default=False,
642  ),
643  "current_light": RpcSensorDescription(
644  key="light",
645  sub_key="current",
646  name="Current",
647  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
648  value=lambda status, _: None if status is None else float(status),
649  device_class=SensorDeviceClass.CURRENT,
650  state_class=SensorStateClass.MEASUREMENT,
651  entity_registry_enabled_default=False,
652  ),
653  "current_pm1": RpcSensorDescription(
654  key="pm1",
655  sub_key="current",
656  name="Current",
657  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
658  value=lambda status, _: None if status is None else float(status),
659  device_class=SensorDeviceClass.CURRENT,
660  state_class=SensorStateClass.MEASUREMENT,
661  entity_registry_enabled_default=False,
662  ),
663  "current_cct": RpcSensorDescription(
664  key="cct",
665  sub_key="current",
666  name="Current",
667  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
668  value=lambda status, _: None if status is None else float(status),
669  device_class=SensorDeviceClass.CURRENT,
670  state_class=SensorStateClass.MEASUREMENT,
671  entity_registry_enabled_default=False,
672  ),
673  "current_rgb": RpcSensorDescription(
674  key="rgb",
675  sub_key="current",
676  name="Current",
677  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
678  value=lambda status, _: None if status is None else float(status),
679  device_class=SensorDeviceClass.CURRENT,
680  state_class=SensorStateClass.MEASUREMENT,
681  entity_registry_enabled_default=False,
682  ),
683  "current_rgbw": RpcSensorDescription(
684  key="rgbw",
685  sub_key="current",
686  name="Current",
687  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
688  value=lambda status, _: None if status is None else float(status),
689  device_class=SensorDeviceClass.CURRENT,
690  state_class=SensorStateClass.MEASUREMENT,
691  entity_registry_enabled_default=False,
692  ),
693  "a_current": RpcSensorDescription(
694  key="em",
695  sub_key="a_current",
696  name="Phase A current",
697  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
698  device_class=SensorDeviceClass.CURRENT,
699  state_class=SensorStateClass.MEASUREMENT,
700  entity_registry_enabled_default=False,
701  ),
702  "b_current": RpcSensorDescription(
703  key="em",
704  sub_key="b_current",
705  name="Phase B current",
706  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
707  device_class=SensorDeviceClass.CURRENT,
708  state_class=SensorStateClass.MEASUREMENT,
709  entity_registry_enabled_default=False,
710  ),
711  "c_current": RpcSensorDescription(
712  key="em",
713  sub_key="c_current",
714  name="Phase C current",
715  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
716  device_class=SensorDeviceClass.CURRENT,
717  state_class=SensorStateClass.MEASUREMENT,
718  entity_registry_enabled_default=False,
719  ),
720  "n_current": RpcSensorDescription(
721  key="em",
722  sub_key="n_current",
723  name="Phase N current",
724  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
725  device_class=SensorDeviceClass.CURRENT,
726  state_class=SensorStateClass.MEASUREMENT,
727  available=lambda status: (status and status["n_current"]) is not None,
728  removal_condition=lambda _config, status, _key: "n_current" not in status,
729  entity_registry_enabled_default=False,
730  ),
731  "total_current": RpcSensorDescription(
732  key="em",
733  sub_key="total_current",
734  name="Total current",
735  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
736  device_class=SensorDeviceClass.CURRENT,
737  state_class=SensorStateClass.MEASUREMENT,
738  entity_registry_enabled_default=False,
739  ),
740  "energy": RpcSensorDescription(
741  key="switch",
742  sub_key="aenergy",
743  name="Energy",
744  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
745  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
746  value=lambda status, _: status["total"],
747  suggested_display_precision=2,
748  device_class=SensorDeviceClass.ENERGY,
749  state_class=SensorStateClass.TOTAL_INCREASING,
750  ),
751  "energy_light": RpcSensorDescription(
752  key="light",
753  sub_key="aenergy",
754  name="Energy",
755  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
756  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
757  value=lambda status, _: status["total"],
758  suggested_display_precision=2,
759  device_class=SensorDeviceClass.ENERGY,
760  state_class=SensorStateClass.TOTAL_INCREASING,
761  ),
762  "energy_pm1": RpcSensorDescription(
763  key="pm1",
764  sub_key="aenergy",
765  name="Energy",
766  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
767  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
768  value=lambda status, _: status["total"],
769  suggested_display_precision=2,
770  device_class=SensorDeviceClass.ENERGY,
771  state_class=SensorStateClass.TOTAL_INCREASING,
772  ),
773  "energy_cct": RpcSensorDescription(
774  key="cct",
775  sub_key="aenergy",
776  name="Energy",
777  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
778  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
779  value=lambda status, _: status["total"],
780  suggested_display_precision=2,
781  device_class=SensorDeviceClass.ENERGY,
782  state_class=SensorStateClass.TOTAL_INCREASING,
783  ),
784  "energy_rgb": RpcSensorDescription(
785  key="rgb",
786  sub_key="aenergy",
787  name="Energy",
788  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
789  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
790  value=lambda status, _: status["total"],
791  suggested_display_precision=2,
792  device_class=SensorDeviceClass.ENERGY,
793  state_class=SensorStateClass.TOTAL_INCREASING,
794  ),
795  "energy_rgbw": RpcSensorDescription(
796  key="rgbw",
797  sub_key="aenergy",
798  name="Energy",
799  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
800  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
801  value=lambda status, _: status["total"],
802  suggested_display_precision=2,
803  device_class=SensorDeviceClass.ENERGY,
804  state_class=SensorStateClass.TOTAL_INCREASING,
805  ),
806  "total_act": RpcSensorDescription(
807  key="emdata",
808  sub_key="total_act",
809  name="Total active energy",
810  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
811  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
812  value=lambda status, _: float(status),
813  suggested_display_precision=2,
814  device_class=SensorDeviceClass.ENERGY,
815  state_class=SensorStateClass.TOTAL_INCREASING,
816  ),
817  "total_act_energy": RpcSensorDescription(
818  key="em1data",
819  sub_key="total_act_energy",
820  name="Total active energy",
821  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
822  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
823  value=lambda status, _: float(status),
824  suggested_display_precision=2,
825  device_class=SensorDeviceClass.ENERGY,
826  state_class=SensorStateClass.TOTAL_INCREASING,
827  entity_registry_enabled_default=False,
828  ),
829  "a_total_act_energy": RpcSensorDescription(
830  key="emdata",
831  sub_key="a_total_act_energy",
832  name="Phase A total active energy",
833  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
834  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
835  value=lambda status, _: float(status),
836  suggested_display_precision=2,
837  device_class=SensorDeviceClass.ENERGY,
838  state_class=SensorStateClass.TOTAL_INCREASING,
839  entity_registry_enabled_default=False,
840  ),
841  "b_total_act_energy": RpcSensorDescription(
842  key="emdata",
843  sub_key="b_total_act_energy",
844  name="Phase B total active energy",
845  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
846  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
847  value=lambda status, _: float(status),
848  suggested_display_precision=2,
849  device_class=SensorDeviceClass.ENERGY,
850  state_class=SensorStateClass.TOTAL_INCREASING,
851  entity_registry_enabled_default=False,
852  ),
853  "c_total_act_energy": RpcSensorDescription(
854  key="emdata",
855  sub_key="c_total_act_energy",
856  name="Phase C total active energy",
857  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
858  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
859  value=lambda status, _: float(status),
860  suggested_display_precision=2,
861  device_class=SensorDeviceClass.ENERGY,
862  state_class=SensorStateClass.TOTAL_INCREASING,
863  entity_registry_enabled_default=False,
864  ),
865  "total_act_ret": RpcSensorDescription(
866  key="emdata",
867  sub_key="total_act_ret",
868  name="Total active returned energy",
869  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
870  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
871  value=lambda status, _: float(status),
872  suggested_display_precision=2,
873  device_class=SensorDeviceClass.ENERGY,
874  state_class=SensorStateClass.TOTAL_INCREASING,
875  ),
876  "total_act_ret_energy": RpcSensorDescription(
877  key="em1data",
878  sub_key="total_act_ret_energy",
879  name="Total active returned energy",
880  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
881  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
882  value=lambda status, _: float(status),
883  suggested_display_precision=2,
884  device_class=SensorDeviceClass.ENERGY,
885  state_class=SensorStateClass.TOTAL_INCREASING,
886  entity_registry_enabled_default=False,
887  ),
888  "a_total_act_ret_energy": RpcSensorDescription(
889  key="emdata",
890  sub_key="a_total_act_ret_energy",
891  name="Phase A total active returned energy",
892  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
893  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
894  value=lambda status, _: float(status),
895  suggested_display_precision=2,
896  device_class=SensorDeviceClass.ENERGY,
897  state_class=SensorStateClass.TOTAL_INCREASING,
898  entity_registry_enabled_default=False,
899  ),
900  "b_total_act_ret_energy": RpcSensorDescription(
901  key="emdata",
902  sub_key="b_total_act_ret_energy",
903  name="Phase B total active returned energy",
904  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
905  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
906  value=lambda status, _: float(status),
907  suggested_display_precision=2,
908  device_class=SensorDeviceClass.ENERGY,
909  state_class=SensorStateClass.TOTAL_INCREASING,
910  entity_registry_enabled_default=False,
911  ),
912  "c_total_act_ret_energy": RpcSensorDescription(
913  key="emdata",
914  sub_key="c_total_act_ret_energy",
915  name="Phase C total active returned energy",
916  native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
917  suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
918  value=lambda status, _: float(status),
919  suggested_display_precision=2,
920  device_class=SensorDeviceClass.ENERGY,
921  state_class=SensorStateClass.TOTAL_INCREASING,
922  entity_registry_enabled_default=False,
923  ),
924  "freq": RpcSensorDescription(
925  key="switch",
926  sub_key="freq",
927  name="Frequency",
928  native_unit_of_measurement=UnitOfFrequency.HERTZ,
929  suggested_display_precision=0,
930  device_class=SensorDeviceClass.FREQUENCY,
931  state_class=SensorStateClass.MEASUREMENT,
932  entity_registry_enabled_default=False,
933  ),
934  "freq_em1": RpcSensorDescription(
935  key="em1",
936  sub_key="freq",
937  name="Frequency",
938  native_unit_of_measurement=UnitOfFrequency.HERTZ,
939  suggested_display_precision=0,
940  device_class=SensorDeviceClass.FREQUENCY,
941  state_class=SensorStateClass.MEASUREMENT,
942  entity_registry_enabled_default=False,
943  ),
944  "freq_pm1": RpcSensorDescription(
945  key="pm1",
946  sub_key="freq",
947  name="Frequency",
948  native_unit_of_measurement=UnitOfFrequency.HERTZ,
949  suggested_display_precision=0,
950  device_class=SensorDeviceClass.FREQUENCY,
951  state_class=SensorStateClass.MEASUREMENT,
952  entity_registry_enabled_default=False,
953  ),
954  "a_freq": RpcSensorDescription(
955  key="em",
956  sub_key="a_freq",
957  name="Phase A frequency",
958  native_unit_of_measurement=UnitOfFrequency.HERTZ,
959  suggested_display_precision=0,
960  device_class=SensorDeviceClass.FREQUENCY,
961  state_class=SensorStateClass.MEASUREMENT,
962  entity_registry_enabled_default=False,
963  ),
964  "b_freq": RpcSensorDescription(
965  key="em",
966  sub_key="b_freq",
967  name="Phase B frequency",
968  native_unit_of_measurement=UnitOfFrequency.HERTZ,
969  suggested_display_precision=0,
970  device_class=SensorDeviceClass.FREQUENCY,
971  state_class=SensorStateClass.MEASUREMENT,
972  entity_registry_enabled_default=False,
973  ),
974  "c_freq": RpcSensorDescription(
975  key="em",
976  sub_key="c_freq",
977  name="Phase C frequency",
978  native_unit_of_measurement=UnitOfFrequency.HERTZ,
979  suggested_display_precision=0,
980  device_class=SensorDeviceClass.FREQUENCY,
981  state_class=SensorStateClass.MEASUREMENT,
982  entity_registry_enabled_default=False,
983  ),
984  "illuminance": RpcSensorDescription(
985  key="illuminance",
986  sub_key="lux",
987  name="Illuminance",
988  native_unit_of_measurement=LIGHT_LUX,
989  device_class=SensorDeviceClass.ILLUMINANCE,
990  state_class=SensorStateClass.MEASUREMENT,
991  ),
992  "temperature": RpcSensorDescription(
993  key="switch",
994  sub_key="temperature",
995  name="Device temperature",
996  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
997  value=lambda status, _: status["tC"],
998  suggested_display_precision=1,
999  device_class=SensorDeviceClass.TEMPERATURE,
1000  state_class=SensorStateClass.MEASUREMENT,
1001  entity_registry_enabled_default=False,
1002  entity_category=EntityCategory.DIAGNOSTIC,
1003  use_polling_coordinator=True,
1004  ),
1005  "temperature_light": RpcSensorDescription(
1006  key="light",
1007  sub_key="temperature",
1008  name="Device temperature",
1009  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
1010  value=lambda status, _: status["tC"],
1011  suggested_display_precision=1,
1012  device_class=SensorDeviceClass.TEMPERATURE,
1013  state_class=SensorStateClass.MEASUREMENT,
1014  entity_registry_enabled_default=False,
1015  entity_category=EntityCategory.DIAGNOSTIC,
1016  use_polling_coordinator=True,
1017  ),
1018  "temperature_cct": RpcSensorDescription(
1019  key="cct",
1020  sub_key="temperature",
1021  name="Device temperature",
1022  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
1023  value=lambda status, _: status["tC"],
1024  suggested_display_precision=1,
1025  device_class=SensorDeviceClass.TEMPERATURE,
1026  state_class=SensorStateClass.MEASUREMENT,
1027  entity_registry_enabled_default=False,
1028  entity_category=EntityCategory.DIAGNOSTIC,
1029  use_polling_coordinator=True,
1030  ),
1031  "temperature_rgb": RpcSensorDescription(
1032  key="rgb",
1033  sub_key="temperature",
1034  name="Device temperature",
1035  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
1036  value=lambda status, _: status["tC"],
1037  suggested_display_precision=1,
1038  device_class=SensorDeviceClass.TEMPERATURE,
1039  state_class=SensorStateClass.MEASUREMENT,
1040  entity_registry_enabled_default=False,
1041  entity_category=EntityCategory.DIAGNOSTIC,
1042  use_polling_coordinator=True,
1043  ),
1044  "temperature_rgbw": RpcSensorDescription(
1045  key="rgbw",
1046  sub_key="temperature",
1047  name="Device temperature",
1048  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
1049  value=lambda status, _: status["tC"],
1050  suggested_display_precision=1,
1051  device_class=SensorDeviceClass.TEMPERATURE,
1052  state_class=SensorStateClass.MEASUREMENT,
1053  entity_registry_enabled_default=False,
1054  entity_category=EntityCategory.DIAGNOSTIC,
1055  use_polling_coordinator=True,
1056  ),
1057  "temperature_0": RpcSensorDescription(
1058  key="temperature",
1059  sub_key="tC",
1060  name="Temperature",
1061  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
1062  suggested_display_precision=1,
1063  device_class=SensorDeviceClass.TEMPERATURE,
1064  state_class=SensorStateClass.MEASUREMENT,
1065  ),
1066  "rssi": RpcSensorDescription(
1067  key="wifi",
1068  sub_key="rssi",
1069  name="RSSI",
1070  native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
1071  device_class=SensorDeviceClass.SIGNAL_STRENGTH,
1072  state_class=SensorStateClass.MEASUREMENT,
1073  entity_registry_enabled_default=False,
1074  removal_condition=is_rpc_wifi_stations_disabled,
1075  entity_category=EntityCategory.DIAGNOSTIC,
1076  use_polling_coordinator=True,
1077  ),
1078  "uptime": RpcSensorDescription(
1079  key="sys",
1080  sub_key="uptime",
1081  name="Uptime",
1082  value=get_device_uptime,
1083  device_class=SensorDeviceClass.TIMESTAMP,
1084  entity_registry_enabled_default=False,
1085  entity_category=EntityCategory.DIAGNOSTIC,
1086  use_polling_coordinator=True,
1087  ),
1088  "humidity_0": RpcSensorDescription(
1089  key="humidity",
1090  sub_key="rh",
1091  name="Humidity",
1092  native_unit_of_measurement=PERCENTAGE,
1093  suggested_display_precision=1,
1094  device_class=SensorDeviceClass.HUMIDITY,
1095  state_class=SensorStateClass.MEASUREMENT,
1096  ),
1097  "battery": RpcSensorDescription(
1098  key="devicepower",
1099  sub_key="battery",
1100  name="Battery",
1101  native_unit_of_measurement=PERCENTAGE,
1102  value=lambda status, _: status["percent"],
1103  device_class=SensorDeviceClass.BATTERY,
1104  state_class=SensorStateClass.MEASUREMENT,
1105  entity_category=EntityCategory.DIAGNOSTIC,
1106  removal_condition=lambda _config, status, key: (status[key]["battery"] is None),
1107  ),
1108  "voltmeter": RpcSensorDescription(
1109  key="voltmeter",
1110  sub_key="voltage",
1111  name="Voltmeter",
1112  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
1113  value=lambda status, _: float(status),
1114  suggested_display_precision=2,
1115  device_class=SensorDeviceClass.VOLTAGE,
1116  state_class=SensorStateClass.MEASUREMENT,
1117  available=lambda status: status is not None,
1118  ),
1119  "analoginput": RpcSensorDescription(
1120  key="input",
1121  sub_key="percent",
1122  name="analog",
1123  native_unit_of_measurement=PERCENTAGE,
1124  state_class=SensorStateClass.MEASUREMENT,
1125  removal_condition=lambda config, _, key: (
1126  config[key]["type"] != "analog" or config[key]["enable"] is False
1127  ),
1128  ),
1129  "analoginput_xpercent": RpcSensorDescription(
1130  key="input",
1131  sub_key="xpercent",
1132  name="analog value",
1133  removal_condition=lambda config, status, key: (
1134  config[key]["type"] != "analog"
1135  or config[key]["enable"] is False
1136  or status[key].get("xpercent") is None
1137  ),
1138  unit=lambda config: config["xpercent"]["unit"] or None,
1139  ),
1140  "pulse_counter": RpcSensorDescription(
1141  key="input",
1142  sub_key="counts",
1143  name="pulse counter",
1144  native_unit_of_measurement="pulse",
1145  state_class=SensorStateClass.TOTAL,
1146  value=lambda status, _: status["total"],
1147  removal_condition=lambda config, _status, key: (
1148  config[key]["type"] != "count" or config[key]["enable"] is False
1149  ),
1150  ),
1151  "counter_value": RpcSensorDescription(
1152  key="input",
1153  sub_key="counts",
1154  name="counter value",
1155  value=lambda status, _: status["xtotal"],
1156  removal_condition=lambda config, status, key: (
1157  config[key]["type"] != "count"
1158  or config[key]["enable"] is False
1159  or status[key]["counts"].get("xtotal") is None
1160  ),
1161  unit=lambda config: config["xcounts"]["unit"] or None,
1162  ),
1163  "counter_frequency": RpcSensorDescription(
1164  key="input",
1165  sub_key="freq",
1166  name="pulse counter frequency",
1167  native_unit_of_measurement=UnitOfFrequency.HERTZ,
1168  state_class=SensorStateClass.MEASUREMENT,
1169  removal_condition=lambda config, _, key: (
1170  config[key]["type"] != "count" or config[key]["enable"] is False
1171  ),
1172  ),
1173  "counter_frequency_value": RpcSensorDescription(
1174  key="input",
1175  sub_key="xfreq",
1176  name="pulse counter frequency value",
1177  removal_condition=lambda config, status, key: (
1178  config[key]["type"] != "count"
1179  or config[key]["enable"] is False
1180  or status[key].get("xfreq") is None
1181  ),
1182  unit=lambda config: config["xfreq"]["unit"] or None,
1183  ),
1184  "text": RpcSensorDescription(
1185  key="text",
1186  sub_key="value",
1187  has_entity_name=True,
1188  ),
1189  "number": RpcSensorDescription(
1190  key="number",
1191  sub_key="value",
1192  has_entity_name=True,
1193  unit=lambda config: config["meta"]["ui"]["unit"]
1194  if config["meta"]["ui"]["unit"]
1195  else None,
1196  ),
1197  "enum": RpcSensorDescription(
1198  key="enum",
1199  sub_key="value",
1200  has_entity_name=True,
1201  options_fn=lambda config: config["options"],
1202  device_class=SensorDeviceClass.ENUM,
1203  ),
1204 }
1205 
1206 
1208  hass: HomeAssistant,
1209  config_entry: ShellyConfigEntry,
1210  async_add_entities: AddEntitiesCallback,
1211 ) -> None:
1212  """Set up sensors for device."""
1213  if get_device_entry_gen(config_entry) in RPC_GENERATIONS:
1214  if config_entry.data[CONF_SLEEP_PERIOD]:
1216  hass,
1217  config_entry,
1218  async_add_entities,
1219  RPC_SENSORS,
1220  RpcSleepingSensor,
1221  )
1222  else:
1223  coordinator = config_entry.runtime_data.rpc
1224  assert coordinator
1225 
1227  hass, config_entry, async_add_entities, RPC_SENSORS, RpcSensor
1228  )
1229 
1231  hass,
1232  config_entry.entry_id,
1233  coordinator.mac,
1234  SENSOR_PLATFORM,
1235  coordinator.device.status,
1236  )
1237 
1238  # the user can remove virtual components from the device configuration, so
1239  # we need to remove orphaned entities
1240  virtual_component_ids = get_virtual_component_ids(
1241  coordinator.device.config, SENSOR_PLATFORM
1242  )
1243  for component in ("enum", "number", "text"):
1245  hass,
1246  config_entry.entry_id,
1247  coordinator.mac,
1248  SENSOR_PLATFORM,
1249  virtual_component_ids,
1250  component,
1251  )
1252  return
1253 
1254  if config_entry.data[CONF_SLEEP_PERIOD]:
1256  hass,
1257  config_entry,
1258  async_add_entities,
1259  SENSORS,
1260  BlockSleepingSensor,
1261  )
1262  else:
1264  hass,
1265  config_entry,
1266  async_add_entities,
1267  SENSORS,
1268  BlockSensor,
1269  )
1271  hass, config_entry, async_add_entities, REST_SENSORS, RestSensor
1272  )
1273 
1274 
1276  """Represent a block sensor."""
1277 
1278  entity_description: BlockSensorDescription
1279 
1281  self,
1282  coordinator: ShellyBlockCoordinator,
1283  block: Block,
1284  attribute: str,
1285  description: BlockSensorDescription,
1286  ) -> None:
1287  """Initialize sensor."""
1288  super().__init__(coordinator, block, attribute, description)
1289 
1290  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = description.native_unit_of_measurement
1291 
1292  @property
1293  def native_value(self) -> StateType:
1294  """Return value of sensor."""
1295  return self.attribute_valueattribute_value
1296 
1297 
1299  """Represent a REST sensor."""
1300 
1301  entity_description: RestSensorDescription
1302 
1303  @property
1304  def native_value(self) -> StateType:
1305  """Return value of sensor."""
1306  return self.attribute_valueattribute_value
1307 
1308 
1310  """Represent a RPC sensor."""
1311 
1312  entity_description: RpcSensorDescription
1313 
1315  self,
1316  coordinator: ShellyRpcCoordinator,
1317  key: str,
1318  attribute: str,
1319  description: RpcSensorDescription,
1320  ) -> None:
1321  """Initialize select."""
1322  super().__init__(coordinator, key, attribute, description)
1323 
1324  if self.option_mapoption_map:
1325  self._attr_options_attr_options = list(self.option_mapoption_map.values())
1326 
1327  @property
1328  def native_value(self) -> StateType:
1329  """Return value of sensor."""
1330  attribute_value = self.attribute_valueattribute_value
1331 
1332  if not self.option_mapoption_map:
1333  return attribute_value
1334 
1335  if not isinstance(attribute_value, str):
1336  return None
1337 
1338  return self.option_mapoption_map[attribute_value]
1339 
1340 
1342  """Represent a block sleeping sensor."""
1343 
1344  entity_description: BlockSensorDescription
1345 
1347  self,
1348  coordinator: ShellyBlockCoordinator,
1349  block: Block | None,
1350  attribute: str,
1351  description: BlockSensorDescription,
1352  entry: RegistryEntry | None = None,
1353  ) -> None:
1354  """Initialize the sleeping sensor."""
1355  super().__init__(coordinator, block, attribute, description, entry)
1356  self.restored_datarestored_data: SensorExtraStoredData | None = None
1357 
1358  async def async_added_to_hass(self) -> None:
1359  """Handle entity which will be added."""
1360  await super().async_added_to_hass()
1361  self.restored_datarestored_data = await self.async_get_last_sensor_dataasync_get_last_sensor_data()
1362 
1363  @property
1364  def native_value(self) -> StateType:
1365  """Return value of sensor."""
1366  if self.blockblockblock is not None:
1367  return self.attribute_valueattribute_value
1368 
1369  if self.restored_datarestored_data is None:
1370  return None
1371 
1372  return cast(StateType, self.restored_datarestored_data.native_value)
1373 
1374  @property
1375  def native_unit_of_measurement(self) -> str | None:
1376  """Return the unit of measurement of the sensor, if any."""
1377  if self.blockblockblock is not None:
1378  return self.entity_descriptionentity_descriptionentity_description.native_unit_of_measurement
1379 
1380  if self.restored_datarestored_data is None:
1381  return None
1382 
1383  return self.restored_datarestored_data.native_unit_of_measurement
1384 
1385 
1387  """Represent a RPC sleeping sensor."""
1388 
1389  entity_description: RpcSensorDescription
1390 
1392  self,
1393  coordinator: ShellyRpcCoordinator,
1394  key: str,
1395  attribute: str,
1396  description: RpcEntityDescription,
1397  entry: RegistryEntry | None = None,
1398  ) -> None:
1399  """Initialize the sleeping sensor."""
1400  super().__init__(coordinator, key, attribute, description, entry)
1401  self.restored_datarestored_data: SensorExtraStoredData | None = None
1402 
1403  async def async_added_to_hass(self) -> None:
1404  """Handle entity which will be added."""
1405  await super().async_added_to_hass()
1406  self.restored_datarestored_data = await self.async_get_last_sensor_dataasync_get_last_sensor_data()
1407 
1408  @property
1409  def native_value(self) -> StateType:
1410  """Return value of sensor."""
1411  if self.coordinatorcoordinator.device.initialized:
1412  return self.attribute_valueattribute_value
1413 
1414  if self.restored_datarestored_data is None:
1415  return None
1416 
1417  return cast(StateType, self.restored_datarestored_data.native_value)
1418 
1419  @property
1420  def native_unit_of_measurement(self) -> str | None:
1421  """Return the unit of measurement of the sensor, if any."""
1422  return self.entity_descriptionentity_descriptionentity_description.native_unit_of_measurement
SensorExtraStoredData|None async_get_last_sensor_data(self)
Definition: __init__.py:934
None __init__(self, ShellyBlockCoordinator coordinator, Block block, str attribute, BlockSensorDescription description)
Definition: sensor.py:1286
None __init__(self, ShellyBlockCoordinator coordinator, Block|None block, str attribute, BlockSensorDescription description, RegistryEntry|None entry=None)
Definition: sensor.py:1353
None __init__(self, ShellyRpcCoordinator coordinator, str key, str attribute, RpcSensorDescription description)
Definition: sensor.py:1320
None __init__(self, ShellyRpcCoordinator coordinator, str key, str attribute, RpcEntityDescription description, RegistryEntry|None entry=None)
Definition: sensor.py:1398
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry_rpc(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities, Mapping[str, RpcEntityDescription] sensors, Callable sensor_class)
Definition: entity.py:142
None async_setup_entry_rest(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities, Mapping[str, RestEntityDescription] sensors, Callable sensor_class)
Definition: entity.py:251
None async_setup_entry_attribute_entities(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities, Mapping[tuple[str, str], BlockEntityDescription] sensors, Callable sensor_class)
Definition: entity.py:39
None async_setup_entry(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:1211
list[str] get_virtual_component_ids(dict[str, Any] config, str platform)
Definition: utils.py:528
datetime get_device_uptime(float uptime, datetime|None last_uptime)
Definition: utils.py:176
None async_remove_orphaned_entities(HomeAssistant hass, str config_entry_id, str mac, str platform, Iterable[str] keys, str|None key_suffix=None)
Definition: utils.py:555
int get_device_entry_gen(ConfigEntry entry)
Definition: utils.py:353