Add consumed energy sensor for Shelly pm1 and switch components (#153053)

This commit is contained in:
Maciej Bieniek
2025-09-29 12:06:07 +02:00
committed by GitHub
parent 289546ef6d
commit 1289a031ab
4 changed files with 486 additions and 189 deletions

View File

@@ -122,6 +122,23 @@ class RpcSensor(ShellyRpcAttributeEntity, SensorEntity):
return self.option_map[attribute_value] return self.option_map[attribute_value]
class RpcConsumedEnergySensor(RpcSensor):
"""Represent a RPC sensor."""
@property
def native_value(self) -> StateType:
"""Return value of sensor."""
total_energy = self.status["aenergy"]["total"]
if not isinstance(total_energy, float):
return None
if not isinstance(self.attribute_value, float):
return None
return total_energy - self.attribute_value
class RpcPresenceSensor(RpcSensor): class RpcPresenceSensor(RpcSensor):
"""Represent a RPC presence sensor.""" """Represent a RPC presence sensor."""
@@ -885,7 +902,7 @@ RPC_SENSORS: Final = {
"energy": RpcSensorDescription( "energy": RpcSensorDescription(
key="switch", key="switch",
sub_key="aenergy", sub_key="aenergy",
name="Energy", name="Total energy",
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR, suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
value=lambda status, _: status["total"], value=lambda status, _: status["total"],
@@ -903,7 +920,22 @@ RPC_SENSORS: Final = {
suggested_display_precision=2, suggested_display_precision=2,
device_class=SensorDeviceClass.ENERGY, device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
removal_condition=lambda _config, status, key: (
status[key].get("ret_aenergy") is None
),
),
"consumed_energy_switch": RpcSensorDescription(
key="switch",
sub_key="ret_aenergy",
name="Consumed energy",
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
value=lambda status, _: status["total"],
suggested_display_precision=2,
device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING,
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
entity_class=RpcConsumedEnergySensor,
removal_condition=lambda _config, status, key: ( removal_condition=lambda _config, status, key: (
status[key].get("ret_aenergy") is None status[key].get("ret_aenergy") is None
), ),
@@ -922,7 +954,7 @@ RPC_SENSORS: Final = {
"energy_pm1": RpcSensorDescription( "energy_pm1": RpcSensorDescription(
key="pm1", key="pm1",
sub_key="aenergy", sub_key="aenergy",
name="Energy", name="Total energy",
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR, suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
value=lambda status, _: status["total"], value=lambda status, _: status["total"],
@@ -933,7 +965,18 @@ RPC_SENSORS: Final = {
"ret_energy_pm1": RpcSensorDescription( "ret_energy_pm1": RpcSensorDescription(
key="pm1", key="pm1",
sub_key="ret_aenergy", sub_key="ret_aenergy",
name="Total active returned energy", name="Returned energy",
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
value=lambda status, _: status["total"],
suggested_display_precision=2,
device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING,
),
"consumed_energy_pm1": RpcSensorDescription(
key="pm1",
sub_key="ret_aenergy",
name="Consumed energy",
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR, suggested_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
value=lambda status, _: status["total"], value=lambda status, _: status["total"],
@@ -941,6 +984,7 @@ RPC_SENSORS: Final = {
device_class=SensorDeviceClass.ENERGY, device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
entity_class=RpcConsumedEnergySensor,
), ),
"energy_cct": RpcSensorDescription( "energy_cct": RpcSensorDescription(
key="cct", key="cct",

View File

@@ -546,65 +546,6 @@
'state': '0.0', 'state': '0.0',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_cover[sensor.test_name_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-cover:0-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_cover[sensor.test_name_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_cover[sensor.test_name_frequency-entry] # name: test_shelly_2pm_gen3_cover[sensor.test_name_frequency-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -826,6 +767,65 @@
'state': '36.4', 'state': '36.4',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_cover[sensor.test_name_total_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_total_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Total energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-cover:0-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_cover[sensor.test_name_total_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Total energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_total_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_cover[sensor.test_name_uptime-entry] # name: test_shelly_2pm_gen3_cover[sensor.test_name_uptime-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -1743,6 +1743,65 @@
'state': '-52', 'state': '-52',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_consumed_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_switch_0_consumed_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Consumed energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:0-consumed_energy_switch',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_consumed_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Switch 0 Consumed energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_switch_0_consumed_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_current-entry] # name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_current-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -1799,65 +1858,6 @@
'state': '0.0', 'state': '0.0',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_switch_0_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:0-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Switch 0 Energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_switch_0_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_frequency-entry] # name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_frequency-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -2085,6 +2085,65 @@
'state': '40.6', 'state': '40.6',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_total_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_switch_0_total_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Total energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:0-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_total_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Switch 0 Total energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_switch_0_total_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_voltage-entry] # name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_0_voltage-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -2141,6 +2200,65 @@
'state': '216.2', 'state': '216.2',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_consumed_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_switch_1_consumed_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Consumed energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:1-consumed_energy_switch',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_consumed_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Switch 1 Consumed energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_switch_1_consumed_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_current-entry] # name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_current-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -2197,65 +2315,6 @@
'state': '0.0', 'state': '0.0',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_switch_1_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:1-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Switch 1 Energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_switch_1_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_frequency-entry] # name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_frequency-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
@@ -2483,6 +2542,65 @@
'state': '40.6', 'state': '40.6',
}) })
# --- # ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_total_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_switch_1_total_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Total energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:1-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_total_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name Switch 1 Total energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_switch_1_total_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_voltage-entry] # name: test_shelly_2pm_gen3_no_relay_names[sensor.test_name_switch_1_voltage-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({

View File

@@ -339,7 +339,7 @@
'state': '5.0', 'state': '5.0',
}) })
# --- # ---
# name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_energy-entry] # name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_consumed_energy-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@@ -354,7 +354,7 @@
'disabled_by': None, 'disabled_by': None,
'domain': 'sensor', 'domain': 'sensor',
'entity_category': None, 'entity_category': None,
'entity_id': 'sensor.test_name_test_switch_0_energy', 'entity_id': 'sensor.test_name_test_switch_0_consumed_energy',
'has_entity_name': True, 'has_entity_name': True,
'hidden_by': None, 'hidden_by': None,
'icon': None, 'icon': None,
@@ -372,30 +372,30 @@
}), }),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>, 'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None, 'original_icon': None,
'original_name': 'test switch_0 energy', 'original_name': 'test switch_0 consumed energy',
'platform': 'shelly', 'platform': 'shelly',
'previous_unique_id': None, 'previous_unique_id': None,
'suggested_object_id': None, 'suggested_object_id': None,
'supported_features': 0, 'supported_features': 0,
'translation_key': None, 'translation_key': None,
'unique_id': '123456789ABC-switch:0-energy', 'unique_id': '123456789ABC-switch:0-consumed_energy_switch',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>, 'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}) })
# --- # ---
# name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_energy-state] # name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_consumed_energy-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'device_class': 'energy', 'device_class': 'energy',
'friendly_name': 'Test name test switch_0 energy', 'friendly_name': 'Test name test switch_0 consumed energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>, 'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>, 'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}), }),
'context': <ANY>, 'context': <ANY>,
'entity_id': 'sensor.test_name_test_switch_0_energy', 'entity_id': 'sensor.test_name_test_switch_0_consumed_energy',
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1234.56789', 'state': '1135.80246',
}) })
# --- # ---
# name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_returned_energy-entry] # name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_returned_energy-entry]
@@ -457,3 +457,62 @@
'state': '98.76543', 'state': '98.76543',
}) })
# --- # ---
# name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_total_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_name_test_switch_0_total_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'test switch_0 total energy',
'platform': 'shelly',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '123456789ABC-switch:0-energy',
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
# name: test_rpc_switch_energy_sensors[sensor.test_name_test_switch_0_total_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Test name test switch_0 total energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_name_test_switch_0_total_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1234.56789',
})
# ---

View File

@@ -1640,7 +1640,7 @@ async def test_rpc_switch_energy_sensors(
monkeypatch.setattr(mock_rpc_device, "status", status) monkeypatch.setattr(mock_rpc_device, "status", status)
await init_integration(hass, 3) await init_integration(hass, 3)
for entity in ("energy", "returned_energy"): for entity in ("total_energy", "returned_energy", "consumed_energy"):
entity_id = f"{SENSOR_DOMAIN}.test_name_test_switch_0_{entity}" entity_id = f"{SENSOR_DOMAIN}.test_name_test_switch_0_{entity}"
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
@@ -1670,6 +1670,7 @@ async def test_rpc_switch_no_returned_energy_sensor(
await init_integration(hass, 3) await init_integration(hass, 3)
assert hass.states.get("sensor.test_name_test_switch_0_returned_energy") is None assert hass.states.get("sensor.test_name_test_switch_0_returned_energy") is None
assert hass.states.get("sensor.test_name_test_switch_0_consumed_energy") is None
async def test_rpc_shelly_ev_sensors( async def test_rpc_shelly_ev_sensors(
@@ -1864,3 +1865,78 @@ async def test_rpc_presencezone_component(
assert (state := hass.states.get(entity_id)) assert (state := hass.states.get(entity_id))
assert state.state == STATE_UNAVAILABLE assert state.state == STATE_UNAVAILABLE
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_rpc_pm1_consumed_energy_sensor(
hass: HomeAssistant,
mock_rpc_device: Mock,
entity_registry: EntityRegistry,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test energy sensors for switch component."""
status = {
"sys": {},
"pm1:0": {
"id": 0,
"voltage": 235.0,
"current": 0.957,
"apower": -220.3,
"freq": 50.0,
"aenergy": {"total": 3000.000},
"ret_aenergy": {"total": 1000.000},
},
}
monkeypatch.setattr(mock_rpc_device, "status", status)
await init_integration(hass, 3)
assert (state := hass.states.get(f"{SENSOR_DOMAIN}.test_name_total_energy"))
assert state.state == "3.0"
assert (state := hass.states.get(f"{SENSOR_DOMAIN}.test_name_returned_energy"))
assert state.state == "1.0"
entity_id = f"{SENSOR_DOMAIN}.test_name_consumed_energy"
# consumed energy = total energy - returned energy
assert (state := hass.states.get(entity_id))
assert state.state == "2.0"
assert (entry := entity_registry.async_get(entity_id))
assert entry.unique_id == "123456789ABC-pm1:0-consumed_energy_pm1"
@pytest.mark.parametrize(("key"), ["aenergy", "ret_aenergy"])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_rpc_pm1_consumed_energy_sensor_non_float_value(
hass: HomeAssistant,
mock_rpc_device: Mock,
monkeypatch: pytest.MonkeyPatch,
key: str,
) -> None:
"""Test energy sensors for switch component."""
entity_id = f"{SENSOR_DOMAIN}.test_name_consumed_energy"
status = {
"sys": {},
"pm1:0": {
"id": 0,
"voltage": 235.0,
"current": 0.957,
"apower": -220.3,
"freq": 50.0,
"aenergy": {"total": 3000.000},
"ret_aenergy": {"total": 1000.000},
},
}
monkeypatch.setattr(mock_rpc_device, "status", status)
await init_integration(hass, 3)
assert (state := hass.states.get(entity_id))
assert state.state == "2.0"
mutate_rpc_device_status(
monkeypatch, mock_rpc_device, "pm1:0", key, {"total": None}
)
mock_rpc_device.mock_update()
assert (state := hass.states.get(entity_id))
assert state.state == STATE_UNKNOWN