Add production power sensor that is compatible with the energy power dashboard for supported homewizard devices (#159500)

This commit is contained in:
Jan Bouwhuis
2025-12-29 10:46:07 +01:00
committed by GitHub
parent 559d42dc27
commit 7931cb4773
4 changed files with 686 additions and 0 deletions
@@ -7,6 +7,7 @@ from dataclasses import dataclass
from datetime import datetime, timedelta
from typing import Final
from homewizard_energy.const import Model
from homewizard_energy.models import CombinedModels, ExternalDevice
from homeassistant.components.sensor import (
@@ -703,6 +704,44 @@ async def async_setup_entry(
for description in SENSORS
if description.has_fn(entry.runtime_data.data)
]
# Add optional production power sensor for supported energy monitoring devices
# or plug-in battery
if entry.runtime_data.data.device.product_type in (
Model.ENERGY_SOCKET,
Model.ENERGY_METER_1_PHASE,
Model.ENERGY_METER_3_PHASE,
Model.ENERGY_METER_EASTRON_SDM230,
Model.ENERGY_METER_EASTRON_SDM630,
Model.BATTERY,
):
active_prodution_power_sensor_description = HomeWizardSensorEntityDescription(
key="active_production_power_w",
translation_key="active_production_power_w",
native_unit_of_measurement=UnitOfPower.WATT,
device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT,
suggested_display_precision=0,
entity_registry_enabled_default=(
entry.runtime_data.data.device.product_type == Model.BATTERY
or (
(
total_export
:= entry.runtime_data.data.measurement.energy_export_kwh
)
is not None
and total_export > 0
)
),
has_fn=lambda x: True,
value_fn=lambda data: power_w * -1
if (power_w := data.measurement.power_w)
else power_w,
)
entities.append(
HomeWizardSensorEntity(
entry.runtime_data, active_prodution_power_sensor_description
)
)
# Initialize external devices
measurement = entry.runtime_data.data.measurement
@@ -90,6 +90,9 @@
"active_power_phase_w": {
"name": "Power phase {phase}"
},
"active_production_power_w": {
"name": "Production power"
},
"active_reactive_power_phase_var": {
"name": "Reactive power phase {phase}"
},
@@ -540,6 +540,97 @@
'state': '123.0',
})
# ---
# name: test_sensors[HWE-BAT-entity_ids10][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Plug-In Battery',
'model_id': 'HWE-BAT',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '1.00',
'via_device_id': None,
})
# ---
# name: test_sensors[HWE-BAT-entity_ids10][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[HWE-BAT-entity_ids10][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '-123.0',
})
# ---
# name: test_sensors[HWE-BAT-entity_ids10][sensor.device_state_of_charge:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -1610,6 +1701,97 @@
'state': '61.1',
})
# ---
# name: test_sensors[HWE-KWH1-entity_ids7][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Wi-Fi kWh Meter 1-phase',
'model_id': 'HWE-KWH1',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '3.06',
'via_device_id': None,
})
# ---
# name: test_sensors[HWE-KWH1-entity_ids7][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[HWE-KWH1-entity_ids7][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1058.296',
})
# ---
# name: test_sensors[HWE-KWH1-entity_ids7][sensor.device_reactive_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -3591,6 +3773,97 @@
'state': '0.0',
})
# ---
# name: test_sensors[HWE-KWH3-entity_ids8][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Wi-Fi kWh Meter 3-phase',
'model_id': 'HWE-KWH3',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '3.06',
'via_device_id': None,
})
# ---
# name: test_sensors[HWE-KWH3-entity_ids8][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[HWE-KWH3-entity_ids8][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '900.194',
})
# ---
# name: test_sensors[HWE-KWH3-entity_ids8][sensor.device_reactive_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -15525,6 +15798,97 @@
'state': '1457.277',
})
# ---
# name: test_sensors[HWE-SKT-11-entity_ids2][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Wi-Fi Energy Socket',
'model_id': 'HWE-SKT',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '3.03',
'via_device_id': None,
})
# ---
# name: test_sensors[HWE-SKT-11-entity_ids2][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[HWE-SKT-11-entity_ids2][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '-1457.277',
})
# ---
# name: test_sensors[HWE-SKT-11-entity_ids2][sensor.device_wi_fi_ssid:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -16420,6 +16784,97 @@
'state': '543.312',
})
# ---
# name: test_sensors[HWE-SKT-21-entity_ids3][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Wi-Fi Energy Socket',
'model_id': 'HWE-SKT',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '4.07',
'via_device_id': None,
})
# ---
# name: test_sensors[HWE-SKT-21-entity_ids3][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[HWE-SKT-21-entity_ids3][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '-543.312',
})
# ---
# name: test_sensors[HWE-SKT-21-entity_ids3][sensor.device_reactive_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -17754,6 +18209,97 @@
'state': '61.1',
})
# ---
# name: test_sensors[SDM230-entity_ids5][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Wi-Fi kWh Meter 1-phase',
'model_id': 'SDM230-wifi',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '3.06',
'via_device_id': None,
})
# ---
# name: test_sensors[SDM230-entity_ids5][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[SDM230-entity_ids5][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1058.296',
})
# ---
# name: test_sensors[SDM230-entity_ids5][sensor.device_reactive_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -19735,6 +20281,97 @@
'state': '0.0',
})
# ---
# name: test_sensors[SDM630-entity_ids6][sensor.device_production_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'5c:2f:af:ab:cd:ef',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'homewizard',
'5c2fafabcdef',
),
}),
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'Wi-Fi kWh Meter 3-phase',
'model_id': 'SDM630-wifi',
'name': 'Device',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '3.06',
'via_device_id': None,
})
# ---
# name: test_sensors[SDM630-entity_ids6][sensor.device_production_power:entity-registry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'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.device_production_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Production power',
'platform': 'homewizard',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'active_production_power_w',
'unique_id': 'HWE-P1_5c2fafabcdef_active_production_power_w',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[SDM630-entity_ids6][sensor.device_production_power:state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Device Production power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.device_production_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '900.194',
})
# ---
# name: test_sensors[SDM630-entity_ids6][sensor.device_reactive_power:device-registry]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -120,6 +120,7 @@ pytestmark = [
"sensor.device_energy_import",
"sensor.device_power_phase_1",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_wi_fi_ssid",
"sensor.device_wi_fi_strength",
],
@@ -135,6 +136,7 @@ pytestmark = [
"sensor.device_power_factor",
"sensor.device_power_phase_1",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_reactive_power",
"sensor.device_voltage",
"sensor.device_wi_fi_ssid",
@@ -160,6 +162,7 @@ pytestmark = [
"sensor.device_frequency",
"sensor.device_power_factor",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_reactive_power",
"sensor.device_voltage",
"sensor.device_wi_fi_ssid",
@@ -187,6 +190,7 @@ pytestmark = [
"sensor.device_power_phase_2",
"sensor.device_power_phase_3",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_reactive_power_phase_1",
"sensor.device_reactive_power_phase_2",
"sensor.device_reactive_power_phase_3",
@@ -208,6 +212,7 @@ pytestmark = [
"sensor.device_frequency",
"sensor.device_power_factor",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_reactive_power",
"sensor.device_voltage",
"sensor.device_wi_fi_ssid",
@@ -235,6 +240,7 @@ pytestmark = [
"sensor.device_power_phase_2",
"sensor.device_power_phase_3",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_reactive_power_phase_1",
"sensor.device_reactive_power_phase_2",
"sensor.device_reactive_power_phase_3",
@@ -304,6 +310,7 @@ pytestmark = [
"sensor.device_energy_import",
"sensor.device_frequency",
"sensor.device_power",
"sensor.device_production_power",
"sensor.device_state_of_charge",
"sensor.device_uptime",
"sensor.device_voltage",