diff --git a/homeassistant/components/zha/sensor.py b/homeassistant/components/zha/sensor.py index bb62494396a..4986742c63d 100644 --- a/homeassistant/components/zha/sensor.py +++ b/homeassistant/components/zha/sensor.py @@ -319,7 +319,7 @@ class ElectricalMeasurement(PollableSensor): _attr_device_class: SensorDeviceClass = SensorDeviceClass.POWER _attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT _attr_native_unit_of_measurement: str = UnitOfPower.WATT - _div_mul_prefix = "ac_power" + _div_mul_prefix: str | None = "ac_power" @property def extra_state_attributes(self) -> dict[str, Any]: @@ -342,10 +342,14 @@ class ElectricalMeasurement(PollableSensor): def formatter(self, value: int) -> int | float: """Return 'normalized' value.""" - multiplier = getattr( - self._cluster_handler, f"{self._div_mul_prefix}_multiplier" - ) - divisor = getattr(self._cluster_handler, f"{self._div_mul_prefix}_divisor") + if self._div_mul_prefix: + multiplier = getattr( + self._cluster_handler, f"{self._div_mul_prefix}_multiplier" + ) + divisor = getattr(self._cluster_handler, f"{self._div_mul_prefix}_divisor") + else: + multiplier = self._multiplier + divisor = self._divisor value = float(value * multiplier) / divisor if value < 100 and divisor > 1: return round(value, self._decimals) @@ -419,13 +423,14 @@ class ElectricalMeasurementFrequency(PolledElectricalMeasurement): @MULTI_MATCH(cluster_handler_names=CLUSTER_HANDLER_ELECTRICAL_MEASUREMENT) # pylint: disable-next=hass-invalid-inheritance # needs fixing class ElectricalMeasurementPowerFactor(PolledElectricalMeasurement): - """Frequency measurement.""" + """Power Factor measurement.""" _attribute_name = "power_factor" _unique_id_suffix = "power_factor" _use_custom_polling = False # Poll indirectly by ElectricalMeasurementSensor _attr_device_class: SensorDeviceClass = SensorDeviceClass.POWER_FACTOR _attr_native_unit_of_measurement = PERCENTAGE + _div_mul_prefix = None @MULTI_MATCH( diff --git a/tests/components/zha/test_sensor.py b/tests/components/zha/test_sensor.py index 48651df082d..e25430a293b 100644 --- a/tests/components/zha/test_sensor.py +++ b/tests/components/zha/test_sensor.py @@ -259,6 +259,24 @@ async def async_test_em_apparent_power(hass: HomeAssistant, cluster, entity_id): assert_state(hass, entity_id, "9.9", UnitOfApparentPower.VOLT_AMPERE) +async def async_test_em_power_factor(hass: HomeAssistant, cluster, entity_id): + """Test electrical measurement Power Factor sensor.""" + # update divisor cached value + await send_attributes_report(hass, cluster, {"ac_power_divisor": 1}) + await send_attributes_report(hass, cluster, {0: 1, 0x0510: 100, 10: 1000}) + assert_state(hass, entity_id, "100", PERCENTAGE) + + await send_attributes_report(hass, cluster, {0: 1, 0x0510: 99, 10: 1000}) + assert_state(hass, entity_id, "99", PERCENTAGE) + + await send_attributes_report(hass, cluster, {"ac_power_divisor": 10}) + await send_attributes_report(hass, cluster, {0: 1, 0x0510: 100, 10: 5000}) + assert_state(hass, entity_id, "100", PERCENTAGE) + + await send_attributes_report(hass, cluster, {0: 1, 0x0510: 99, 10: 5000}) + assert_state(hass, entity_id, "99", PERCENTAGE) + + async def async_test_em_rms_current(hass: HomeAssistant, cluster, entity_id): """Test electrical measurement RMS Current sensor.""" @@ -428,6 +446,14 @@ async def async_test_device_temperature(hass: HomeAssistant, cluster, entity_id) {"ac_power_divisor": 1000, "ac_power_multiplier": 1}, {"active_power", "rms_current", "rms_voltage"}, ), + ( + homeautomation.ElectricalMeasurement.cluster_id, + "power_factor", + async_test_em_power_factor, + 7, + {"ac_power_divisor": 1000, "ac_power_multiplier": 1}, + {"active_power", "apparent_power", "rms_current", "rms_voltage"}, + ), ( homeautomation.ElectricalMeasurement.cluster_id, "current",