From 3937ac2ca3cb408b67f78519fd6f93adc78de53e Mon Sep 17 00:00:00 2001
From: "David F. Mulcahey" <david.mulcahey@me.com>
Date: Thu, 11 Aug 2022 21:13:27 -0400
Subject: [PATCH] Track code coverage for ZHA sensor entities (#76617)

* Track code coverage for ZHA sensor entities

* remove correct entry
---
 .coveragerc                            |  1 -
 homeassistant/components/zha/sensor.py |  6 +++---
 tests/components/zha/test_sensor.py    | 23 +++++++++++++++++++++++
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/.coveragerc b/.coveragerc
index e326f5f44c8..283adf0d3fc 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -1538,7 +1538,6 @@ omit =
     homeassistant/components/zha/core/registries.py
     homeassistant/components/zha/entity.py
     homeassistant/components/zha/light.py
-    homeassistant/components/zha/sensor.py
     homeassistant/components/zhong_hong/climate.py
     homeassistant/components/ziggo_mediabox_xl/media_player.py
     homeassistant/components/zoneminder/*
diff --git a/homeassistant/components/zha/sensor.py b/homeassistant/components/zha/sensor.py
index f42e88041ef..e0f5bb958cd 100644
--- a/homeassistant/components/zha/sensor.py
+++ b/homeassistant/components/zha/sensor.py
@@ -183,7 +183,7 @@ class Sensor(ZhaEntity, SensorEntity):
         """Handle state update from channel."""
         self.async_write_ha_state()
 
-    def formatter(self, value: int) -> int | float:
+    def formatter(self, value: int) -> int | float | None:
         """Numeric pass-through formatter."""
         if self._decimals > 0:
             return round(
@@ -236,11 +236,11 @@ class Battery(Sensor):
         return cls(unique_id, zha_device, channels, **kwargs)
 
     @staticmethod
-    def formatter(value: int) -> int:  # pylint: disable=arguments-differ
+    def formatter(value: int) -> int | None:  # pylint: disable=arguments-differ
         """Return the state of the entity."""
         # per zcl specs battery percent is reported at 200% ¯\_(ツ)_/¯
         if not isinstance(value, numbers.Number) or value == -1:
-            return value
+            return None
         value = round(value / 2)
         return value
 
diff --git a/tests/components/zha/test_sensor.py b/tests/components/zha/test_sensor.py
index d2fc7c3ca73..0698c07db9e 100644
--- a/tests/components/zha/test_sensor.py
+++ b/tests/components/zha/test_sensor.py
@@ -255,6 +255,17 @@ async def async_test_powerconfiguration(hass, cluster, entity_id):
     assert hass.states.get(entity_id).attributes["battery_voltage"] == 2.0
 
 
+async def async_test_powerconfiguration2(hass, cluster, entity_id):
+    """Test powerconfiguration/battery sensor."""
+    await send_attributes_report(hass, cluster, {33: -1})
+    assert_state(hass, entity_id, STATE_UNKNOWN, "%")
+    assert hass.states.get(entity_id).attributes["battery_voltage"] == 2.9
+    assert hass.states.get(entity_id).attributes["battery_quantity"] == 3
+    assert hass.states.get(entity_id).attributes["battery_size"] == "AAA"
+    await send_attributes_report(hass, cluster, {32: 20})
+    assert hass.states.get(entity_id).attributes["battery_voltage"] == 2.0
+
+
 async def async_test_device_temperature(hass, cluster, entity_id):
     """Test temperature sensor."""
     await send_attributes_report(hass, cluster, {0: 2900})
@@ -370,6 +381,18 @@ async def async_test_device_temperature(hass, cluster, entity_id):
             },
             None,
         ),
+        (
+            general.PowerConfiguration.cluster_id,
+            "battery",
+            async_test_powerconfiguration2,
+            2,
+            {
+                "battery_size": 4,  # AAA
+                "battery_voltage": 29,
+                "battery_quantity": 3,
+            },
+            None,
+        ),
         (
             general.DeviceTemperature.cluster_id,
             "device_temperature",
-- 
GitLab