text: """AVM FRITZ!Box connectivity sensor."""
  from __future__ import annotations
  
  import logging
  
  from homeassistant.components.binary_sensor import (
      DEVICE_CLASS_CONNECTIVITY,
      DEVICE_CLASS_PLUG,
      DEVICE_CLASS_UPDATE,
      BinarySensorEntity,
      BinarySensorEntityDescription,
  )
  from homeassistant.config_entries import ConfigEntry
  from homeassistant.const import ENTITY_CATEGORY_DIAGNOSTIC
  from homeassistant.core import HomeAssistant
  from homeassistant.helpers.entity_platform import AddEntitiesCallback
  
  from .common import FritzBoxBaseEntity, FritzBoxTools
  from .const import DOMAIN
  
  _LOGGER = logging.getLogger(__name__)
  
  
  SENSOR_TYPES: tuple[BinarySensorEntityDescription, ...] = (
      BinarySensorEntityDescription(
          key="is_connected",
          name="Connection",
          device_class=DEVICE_CLASS_CONNECTIVITY,
          entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
      ),
      BinarySensorEntityDescription(
          key="is_linked",
          name="Link",
          device_class=DEVICE_CLASS_PLUG,
          entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
      ),
      BinarySensorEntityDescription(
          key="firmware_update",
          name="Firmware Update",
          device_class=DEVICE_CLASS_UPDATE,
          entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
      ),
  )
  
  
  async def async_setup_entry(
      hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
  ) -> None:
      """Set up entry."""
      _LOGGER.debug("Setting up FRITZ!Box binary sensors")
      fritzbox_tools: FritzBoxTools = hass.data[DOMAIN][entry.entry_id]
  
      if (
          not fritzbox_tools.connection
          or "WANIPConn1" not in fritzbox_tools.connection.services
      ):
          # Only routers are supported at the moment
          return
  
      entities = [
          FritzBoxBinarySensor(fritzbox_tools, entry.title, description)
          for description in SENSOR_TYPES
      ]
  
      async_add_entities(entities, True)
  
  
  class FritzBoxBinarySensor(FritzBoxBaseEntity, BinarySensorEntity):
      """Define FRITZ!Box connectivity class."""
  
      def __init__(
          self,
          fritzbox_tools: FritzBoxTools,
          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"{fritzbox_tools.unique_id}-{description.key}"
          super().__init__(fritzbox_tools, 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._fritzbox_tools.fritz_status.is_connected)
          elif self.entity_description.key == "is_linked":
              self._attr_is_on = bool(self._fritzbox_tools.fritz_status.is_linked)
          elif self.entity_description.key == "firmware_update":
              self._attr_is_on = self._fritzbox_tools.update_available
              self._attr_extra_state_attributes = {
                  "installed_version": self._fritzbox_tools.current_firmware,
                  "latest_available_version:": self._fritzbox_tools.latest_firmware,
              }
  