1 """Sensor for Shelly."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from typing
import Final, cast
8 from aioshelly.block_device
import Block
9 from aioshelly.const
import RPC_GENERATIONS
12 DOMAIN
as SENSOR_PLATFORM,
16 SensorEntityDescription,
17 SensorExtraStoredData,
21 CONCENTRATION_PARTS_PER_MILLION,
25 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
28 UnitOfElectricCurrent,
29 UnitOfElectricPotential,
40 from .const
import CONF_SLEEP_PERIOD, SHAIR_MAX_WORK_HOURS
41 from .coordinator
import ShellyBlockCoordinator, ShellyConfigEntry, ShellyRpcCoordinator
43 BlockEntityDescription,
44 RestEntityDescription,
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,
56 async_remove_orphaned_entities,
59 get_virtual_component_ids,
60 is_rpc_wifi_stations_disabled,
64 @dataclass(frozen=True, kw_only=True)
66 """Class to describe a BLOCK sensor."""
69 @dataclass(frozen=
True, kw_only=
True)
71 """Class to describe a RPC sensor."""
74 @dataclass(frozen=
True, kw_only=
True)
76 """Class to describe a REST sensor."""
79 SENSORS: dict[tuple[str, str], BlockSensorDescription] = {
80 (
"device",
"battery"): BlockSensorDescription(
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,
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,
101 key=
"emeter|current",
103 native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
104 device_class=SensorDeviceClass.CURRENT,
105 state_class=SensorStateClass.MEASUREMENT,
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,
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,
127 native_unit_of_measurement=UnitOfPower.WATT,
128 suggested_display_precision=1,
129 device_class=SensorDeviceClass.POWER,
130 state_class=SensorStateClass.MEASUREMENT,
135 native_unit_of_measurement=UnitOfPower.WATT,
136 suggested_display_precision=1,
137 device_class=SensorDeviceClass.POWER,
138 state_class=SensorStateClass.MEASUREMENT,
141 key=
"device|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,
150 key=
"emeter|voltage",
152 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
153 suggested_display_precision=1,
154 device_class=SensorDeviceClass.VOLTAGE,
155 state_class=SensorStateClass.MEASUREMENT,
158 key=
"emeter|powerFactor",
160 suggested_display_precision=2,
161 device_class=SensorDeviceClass.POWER_FACTOR,
162 state_class=SensorStateClass.MEASUREMENT,
167 native_unit_of_measurement=UnitOfPower.WATT,
168 suggested_display_precision=1,
169 device_class=SensorDeviceClass.POWER,
170 state_class=SensorStateClass.MEASUREMENT,
173 key=
"roller|rollerPower",
175 native_unit_of_measurement=UnitOfPower.WATT,
176 suggested_display_precision=1,
177 device_class=SensorDeviceClass.POWER,
178 state_class=SensorStateClass.MEASUREMENT,
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,
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,
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,
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,
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,
232 key=
"roller|rollerEnergy",
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,
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,
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,
258 key=
"sensor|extTemp",
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),
268 key=
"sensor|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),
278 key=
"sensor|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,
288 native_unit_of_measurement=DEGREE,
289 translation_key=
"tilt",
290 state_class=SensorStateClass.MEASUREMENT,
293 key=
"relay|totalWorkTime",
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)
302 entity_category=EntityCategory.DIAGNOSTIC,
307 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
308 suggested_display_precision=2,
309 device_class=SensorDeviceClass.VOLTAGE,
310 state_class=SensorStateClass.MEASUREMENT,
313 key=
"sensor|sensorOp",
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},
324 translation_key=
"valve_status",
325 device_class=SensorDeviceClass.ENUM,
335 entity_category=EntityCategory.DIAGNOSTIC,
336 removal_condition=
lambda _, block: block.valve ==
"not_connected",
340 REST_SENSORS: Final = {
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,
355 device_class=SensorDeviceClass.TIMESTAMP,
356 entity_registry_enabled_default=
False,
357 entity_category=EntityCategory.DIAGNOSTIC,
362 RPC_SENSORS: Final = {
367 native_unit_of_measurement=UnitOfPower.WATT,
368 device_class=SensorDeviceClass.POWER,
369 state_class=SensorStateClass.MEASUREMENT,
375 native_unit_of_measurement=UnitOfPower.WATT,
376 device_class=SensorDeviceClass.POWER,
377 state_class=SensorStateClass.MEASUREMENT,
383 native_unit_of_measurement=UnitOfPower.WATT,
384 device_class=SensorDeviceClass.POWER,
385 state_class=SensorStateClass.MEASUREMENT,
391 native_unit_of_measurement=UnitOfPower.WATT,
392 device_class=SensorDeviceClass.POWER,
393 state_class=SensorStateClass.MEASUREMENT,
399 native_unit_of_measurement=UnitOfPower.WATT,
400 device_class=SensorDeviceClass.POWER,
401 state_class=SensorStateClass.MEASUREMENT,
407 native_unit_of_measurement=UnitOfPower.WATT,
408 device_class=SensorDeviceClass.POWER,
409 state_class=SensorStateClass.MEASUREMENT,
415 native_unit_of_measurement=UnitOfPower.WATT,
416 device_class=SensorDeviceClass.POWER,
417 state_class=SensorStateClass.MEASUREMENT,
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,
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,
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,
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,
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,
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,
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,
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,
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,
495 device_class=SensorDeviceClass.POWER_FACTOR,
496 state_class=SensorStateClass.MEASUREMENT,
501 name=
"Phase A power factor",
502 device_class=SensorDeviceClass.POWER_FACTOR,
503 state_class=SensorStateClass.MEASUREMENT,
508 name=
"Phase B power factor",
509 device_class=SensorDeviceClass.POWER_FACTOR,
510 state_class=SensorStateClass.MEASUREMENT,
515 name=
"Phase C power factor",
516 device_class=SensorDeviceClass.POWER_FACTOR,
517 state_class=SensorStateClass.MEASUREMENT,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
988 native_unit_of_measurement=LIGHT_LUX,
989 device_class=SensorDeviceClass.ILLUMINANCE,
990 state_class=SensorStateClass.MEASUREMENT,
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,
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,
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,
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,
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,
1061 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
1062 suggested_display_precision=1,
1063 device_class=SensorDeviceClass.TEMPERATURE,
1064 state_class=SensorStateClass.MEASUREMENT,
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,
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,
1092 native_unit_of_measurement=PERCENTAGE,
1093 suggested_display_precision=1,
1094 device_class=SensorDeviceClass.HUMIDITY,
1095 state_class=SensorStateClass.MEASUREMENT,
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),
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,
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
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
1138 unit=
lambda config: config[
"xpercent"][
"unit"]
or None,
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
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
1161 unit=
lambda config: config[
"xcounts"][
"unit"]
or None,
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
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
1182 unit=
lambda config: config[
"xfreq"][
"unit"]
or None,
1187 has_entity_name=
True,
1192 has_entity_name=
True,
1193 unit=
lambda config: config[
"meta"][
"ui"][
"unit"]
1194 if config[
"meta"][
"ui"][
"unit"]
1200 has_entity_name=
True,
1201 options_fn=
lambda config: config[
"options"],
1202 device_class=SensorDeviceClass.ENUM,
1208 hass: HomeAssistant,
1209 config_entry: ShellyConfigEntry,
1210 async_add_entities: AddEntitiesCallback,
1212 """Set up sensors for device."""
1214 if config_entry.data[CONF_SLEEP_PERIOD]:
1223 coordinator = config_entry.runtime_data.rpc
1227 hass, config_entry, async_add_entities, RPC_SENSORS, RpcSensor
1232 config_entry.entry_id,
1235 coordinator.device.status,
1241 coordinator.device.config, SENSOR_PLATFORM
1243 for component
in (
"enum",
"number",
"text"):
1246 config_entry.entry_id,
1249 virtual_component_ids,
1254 if config_entry.data[CONF_SLEEP_PERIOD]:
1260 BlockSleepingSensor,
1271 hass, config_entry, async_add_entities, REST_SENSORS, RestSensor
1276 """Represent a block sensor."""
1278 entity_description: BlockSensorDescription
1282 coordinator: ShellyBlockCoordinator,
1285 description: BlockSensorDescription,
1287 """Initialize sensor."""
1288 super().
__init__(coordinator, block, attribute, description)
1294 """Return value of sensor."""
1299 """Represent a REST sensor."""
1301 entity_description: RestSensorDescription
1305 """Return value of sensor."""
1310 """Represent a RPC sensor."""
1312 entity_description: RpcSensorDescription
1316 coordinator: ShellyRpcCoordinator,
1319 description: RpcSensorDescription,
1321 """Initialize select."""
1322 super().
__init__(coordinator, key, attribute, description)
1329 """Return value of sensor."""
1333 return attribute_value
1335 if not isinstance(attribute_value, str):
1338 return self.
option_mapoption_map[attribute_value]
1342 """Represent a block sleeping sensor."""
1344 entity_description: BlockSensorDescription
1348 coordinator: ShellyBlockCoordinator,
1349 block: Block |
None,
1351 description: BlockSensorDescription,
1352 entry: RegistryEntry |
None =
None,
1354 """Initialize the sleeping sensor."""
1355 super().
__init__(coordinator, block, attribute, description, entry)
1356 self.
restored_datarestored_data: SensorExtraStoredData |
None =
None
1359 """Handle entity which will be added."""
1365 """Return value of sensor."""
1372 return cast(StateType, self.
restored_datarestored_data.native_value)
1376 """Return the unit of measurement of the sensor, if any."""
1383 return self.
restored_datarestored_data.native_unit_of_measurement
1387 """Represent a RPC sleeping sensor."""
1389 entity_description: RpcSensorDescription
1393 coordinator: ShellyRpcCoordinator,
1396 description: RpcEntityDescription,
1397 entry: RegistryEntry |
None =
None,
1399 """Initialize the sleeping sensor."""
1400 super().
__init__(coordinator, key, attribute, description, entry)
1401 self.
restored_datarestored_data: SensorExtraStoredData |
None =
None
1404 """Handle entity which will be added."""
1410 """Return value of sensor."""
1411 if self.
coordinatorcoordinator.device.initialized:
1417 return cast(StateType, self.
restored_datarestored_data.native_value)
1421 """Return the unit of measurement of the sensor, if any."""
SensorExtraStoredData|None async_get_last_sensor_data(self)
StateType attribute_value(self)
StateType attribute_value(self)
StateType attribute_value(self)
StateType native_value(self)
_attr_native_unit_of_measurement
None __init__(self, ShellyBlockCoordinator coordinator, Block block, str attribute, BlockSensorDescription description)
None async_added_to_hass(self)
StateType native_value(self)
None __init__(self, ShellyBlockCoordinator coordinator, Block|None block, str attribute, BlockSensorDescription description, RegistryEntry|None entry=None)
str|None native_unit_of_measurement(self)
StateType native_value(self)
StateType native_value(self)
None __init__(self, ShellyRpcCoordinator coordinator, str key, str attribute, RpcSensorDescription description)
None __init__(self, ShellyRpcCoordinator coordinator, str key, str attribute, RpcEntityDescription description, RegistryEntry|None entry=None)
StateType native_value(self)
str|None native_unit_of_measurement(self)
None async_added_to_hass(self)
web.Response get(self, web.Request request, str config_key)
None async_setup_entry_rpc(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities, Mapping[str, RpcEntityDescription] sensors, Callable sensor_class)
None async_setup_entry_rest(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities, Mapping[str, RestEntityDescription] sensors, Callable sensor_class)
None async_setup_entry_attribute_entities(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities, Mapping[tuple[str, str], BlockEntityDescription] sensors, Callable sensor_class)
None async_setup_entry(HomeAssistant hass, ShellyConfigEntry config_entry, AddEntitiesCallback async_add_entities)
list[str] get_virtual_component_ids(dict[str, Any] config, str platform)
datetime get_device_uptime(float uptime, datetime|None last_uptime)
None async_remove_orphaned_entities(HomeAssistant hass, str config_entry_id, str mac, str platform, Iterable[str] keys, str|None key_suffix=None)
int get_device_entry_gen(ConfigEntry entry)