From c0387a655c888175dd09225ade78f0b13db98f3d Mon Sep 17 00:00:00 2001
From: Michael <35783820+mib1185@users.noreply.github.com>
Date: Tue, 28 Mar 2023 08:39:34 +0200
Subject: [PATCH] Turn AVM FRITZ!Box Tools binary sensors into coordinator
 entities (#89955)

make binary sensors coordinator entities
---
 .../components/fritz/binary_sensor.py         | 44 +++++++++----------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/homeassistant/components/fritz/binary_sensor.py b/homeassistant/components/fritz/binary_sensor.py
index 918a114fdf2..228b7d5935c 100644
--- a/homeassistant/components/fritz/binary_sensor.py
+++ b/homeassistant/components/fritz/binary_sensor.py
@@ -15,14 +15,21 @@ from homeassistant.const import EntityCategory
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
-from .common import AvmWrapper, ConnectionInfo, FritzBoxBaseEntity
+from .common import (
+    AvmWrapper,
+    ConnectionInfo,
+    FritzBoxBaseCoordinatorEntity,
+    FritzEntityDescription,
+)
 from .const import DOMAIN
 
 _LOGGER = logging.getLogger(__name__)
 
 
 @dataclass
-class FritzBinarySensorEntityDescription(BinarySensorEntityDescription):
+class FritzBinarySensorEntityDescription(
+    BinarySensorEntityDescription, FritzEntityDescription
+):
     """Describes Fritz sensor entity."""
 
     is_suitable: Callable[[ConnectionInfo], bool] = lambda info: info.wan_enabled
@@ -34,12 +41,14 @@ SENSOR_TYPES: tuple[FritzBinarySensorEntityDescription, ...] = (
         name="Connection",
         device_class=BinarySensorDeviceClass.CONNECTIVITY,
         entity_category=EntityCategory.DIAGNOSTIC,
+        value_fn=lambda status, _: bool(status.is_connected),
     ),
     FritzBinarySensorEntityDescription(
         key="is_linked",
         name="Link",
         device_class=BinarySensorDeviceClass.PLUG,
         entity_category=EntityCategory.DIAGNOSTIC,
+        value_fn=lambda status, _: bool(status.is_linked),
     ),
 )
 
@@ -62,25 +71,16 @@ async def async_setup_entry(
     async_add_entities(entities, True)
 
 
-class FritzBoxBinarySensor(FritzBoxBaseEntity, BinarySensorEntity):
+class FritzBoxBinarySensor(FritzBoxBaseCoordinatorEntity, BinarySensorEntity):
     """Define FRITZ!Box connectivity class."""
 
-    def __init__(
-        self,
-        avm_wrapper: AvmWrapper,
-        device_friendly_name: str,
-        description: BinarySensorEntityDescription,
-    ) -> None:
-        """Init FRITZ!Box connectivity class."""
-        self.entity_description = description
-        self._attr_name = f"{device_friendly_name} {description.name}"
-        self._attr_unique_id = f"{avm_wrapper.unique_id}-{description.key}"
-        super().__init__(avm_wrapper, device_friendly_name)
-
-    def update(self) -> None:
-        """Update data."""
-        _LOGGER.debug("Updating FRITZ!Box binary sensors")
-        if self.entity_description.key == "is_connected":
-            self._attr_is_on = bool(self._avm_wrapper.fritz_status.is_connected)
-        elif self.entity_description.key == "is_linked":
-            self._attr_is_on = bool(self._avm_wrapper.fritz_status.is_linked)
+    entity_description: FritzBinarySensorEntityDescription
+
+    @property
+    def is_on(self) -> bool | None:
+        """Return true if the binary sensor is on."""
+        if isinstance(
+            state := self.coordinator.data.get(self.entity_description.key), bool
+        ):
+            return state
+        return None
-- 
GitLab