diff --git a/homeassistant/components/fritz/binary_sensor.py b/homeassistant/components/fritz/binary_sensor.py index a54390cf260..0197fd9b379 100644 --- a/homeassistant/components/fritz/binary_sensor.py +++ b/homeassistant/components/fritz/binary_sensor.py @@ -1,6 +1,7 @@ """AVM FRITZ!Box connectivity sensor.""" from __future__ import annotations +from dataclasses import dataclass import logging from homeassistant.components.binary_sensor import ( @@ -14,29 +15,37 @@ from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddEntitiesCallback from .common import FritzBoxBaseEntity, FritzBoxTools -from .const import DOMAIN +from .const import DOMAIN, MeshRoles _LOGGER = logging.getLogger(__name__) -SENSOR_TYPES: tuple[BinarySensorEntityDescription, ...] = ( - BinarySensorEntityDescription( +@dataclass +class FritzBinarySensorEntityDescription(BinarySensorEntityDescription): + """Describes Fritz sensor entity.""" + + exclude_mesh_role: MeshRoles = MeshRoles.SLAVE + + +SENSOR_TYPES: tuple[FritzBinarySensorEntityDescription, ...] = ( + FritzBinarySensorEntityDescription( key="is_connected", name="Connection", device_class=BinarySensorDeviceClass.CONNECTIVITY, entity_category=EntityCategory.DIAGNOSTIC, ), - BinarySensorEntityDescription( + FritzBinarySensorEntityDescription( key="is_linked", name="Link", device_class=BinarySensorDeviceClass.PLUG, entity_category=EntityCategory.DIAGNOSTIC, ), - BinarySensorEntityDescription( + FritzBinarySensorEntityDescription( key="firmware_update", name="Firmware Update", device_class=BinarySensorDeviceClass.UPDATE, entity_category=EntityCategory.DIAGNOSTIC, + exclude_mesh_role=MeshRoles.NONE, ), ) @@ -48,16 +57,10 @@ async def async_setup_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 + if (description.exclude_mesh_role != fritzbox_tools.mesh_role) ] async_add_entities(entities, True) @@ -82,13 +85,13 @@ class FritzBoxBinarySensor(FritzBoxBaseEntity, BinarySensorEntity): """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": + if 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, } + 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) diff --git a/homeassistant/components/fritz/sensor.py b/homeassistant/components/fritz/sensor.py index 9f3bc0fd7c1..1fa9c91ac5d 100644 --- a/homeassistant/components/fritz/sensor.py +++ b/homeassistant/components/fritz/sensor.py @@ -35,7 +35,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.dt import utcnow from .common import FritzBoxBaseEntity, FritzBoxTools -from .const import DOMAIN, DSL_CONNECTION, UPTIME_DEVIATION +from .const import DOMAIN, DSL_CONNECTION, UPTIME_DEVIATION, MeshRoles _LOGGER = logging.getLogger(__name__) @@ -152,6 +152,7 @@ class FritzSensorEntityDescription(SensorEntityDescription, FritzRequireKeysMixi """Describes Fritz sensor entity.""" connection_type: Literal["dsl"] | None = None + exclude_mesh_role: MeshRoles = MeshRoles.SLAVE SENSOR_TYPES: tuple[FritzSensorEntityDescription, ...] = ( @@ -167,6 +168,7 @@ SENSOR_TYPES: tuple[FritzSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.TIMESTAMP, entity_category=EntityCategory.DIAGNOSTIC, value_fn=_retrieve_device_uptime_state, + exclude_mesh_role=MeshRoles.NONE, ), FritzSensorEntityDescription( key="connection_uptime", @@ -281,13 +283,6 @@ async def async_setup_entry( _LOGGER.debug("Setting up FRITZ!Box 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 - dsl: bool = False try: dslinterface = await hass.async_add_executor_job( @@ -307,7 +302,8 @@ async def async_setup_entry( entities = [ FritzBoxSensor(fritzbox_tools, entry.title, description) for description in SENSOR_TYPES - if dsl or description.connection_type != DSL_CONNECTION + if (dsl or description.connection_type != DSL_CONNECTION) + and description.exclude_mesh_role != fritzbox_tools.mesh_role ] async_add_entities(entities, True) diff --git a/homeassistant/components/fritz/switch.py b/homeassistant/components/fritz/switch.py index e9cbd80b133..2d0f9743d72 100644 --- a/homeassistant/components/fritz/switch.py +++ b/homeassistant/components/fritz/switch.py @@ -39,6 +39,7 @@ from .const import ( SWITCH_TYPE_DEFLECTION, SWITCH_TYPE_PORTFORWARD, SWITCH_TYPE_WIFINETWORK, + MeshRoles, ) _LOGGER = logging.getLogger(__name__) @@ -310,6 +311,10 @@ def all_entities_list( local_ip: str, ) -> list[Entity]: """Get a list of all entities.""" + + if fritzbox_tools.mesh_role == MeshRoles.SLAVE: + return [] + return [ *deflection_entities_list(fritzbox_tools, device_friendly_name), *port_entities_list(fritzbox_tools, device_friendly_name, local_ip),