diff --git a/homeassistant/components/netgear/__init__.py b/homeassistant/components/netgear/__init__.py index 679a93f8da1..953008ae9f5 100644 --- a/homeassistant/components/netgear/__init__.py +++ b/homeassistant/components/netgear/__init__.py @@ -15,6 +15,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import ( DOMAIN, KEY_COORDINATOR, + KEY_COORDINATOR_LINK, KEY_COORDINATOR_SPEED, KEY_COORDINATOR_TRAFFIC, KEY_ROUTER, @@ -83,6 +84,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Fetch data from the router.""" return await router.async_get_speed_test() + async def async_check_link_status() -> dict[str, Any] | None: + """Fetch data from the router.""" + return await router.async_get_link_status() + # Create update coordinators coordinator = DataUpdateCoordinator( hass, @@ -105,16 +110,25 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: update_method=async_update_speed_test, update_interval=SPEED_TEST_INTERVAL, ) + coordinator_link = DataUpdateCoordinator( + hass, + _LOGGER, + name=f"{router.device_name} Ethernet Link Status", + update_method=async_check_link_status, + update_interval=SCAN_INTERVAL, + ) if router.track_devices: await coordinator.async_config_entry_first_refresh() await coordinator_traffic_meter.async_config_entry_first_refresh() + await coordinator_link.async_config_entry_first_refresh() hass.data[DOMAIN][entry.entry_id] = { KEY_ROUTER: router, KEY_COORDINATOR: coordinator, KEY_COORDINATOR_TRAFFIC: coordinator_traffic_meter, KEY_COORDINATOR_SPEED: coordinator_speed_test, + KEY_COORDINATOR_LINK: coordinator_link, } hass.config_entries.async_setup_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/netgear/const.py b/homeassistant/components/netgear/const.py index 936777a7961..c8939208047 100644 --- a/homeassistant/components/netgear/const.py +++ b/homeassistant/components/netgear/const.py @@ -13,6 +13,7 @@ KEY_ROUTER = "router" KEY_COORDINATOR = "coordinator" KEY_COORDINATOR_TRAFFIC = "coordinator_traffic" KEY_COORDINATOR_SPEED = "coordinator_speed" +KEY_COORDINATOR_LINK = "coordinator_link" DEFAULT_CONSIDER_HOME = timedelta(seconds=180) DEFAULT_NAME = "Netgear router" diff --git a/homeassistant/components/netgear/router.py b/homeassistant/components/netgear/router.py index 67e573d0e92..6284c6f4ac2 100644 --- a/homeassistant/components/netgear/router.py +++ b/homeassistant/components/netgear/router.py @@ -228,6 +228,11 @@ class NetgearRouter: self._api.get_new_speed_test_result ) + async def async_get_link_status(self) -> dict[str, Any] | None: + """Check the ethernet link status of the router.""" + async with self._api_lock: + return await self.hass.async_add_executor_job(self._api.check_ethernet_link) + async def async_allow_block_device(self, mac: str, allow_block: str) -> None: """Allow or block a device connected to the router.""" async with self._api_lock: diff --git a/homeassistant/components/netgear/sensor.py b/homeassistant/components/netgear/sensor.py index a1cf134beda..f860b65e10f 100644 --- a/homeassistant/components/netgear/sensor.py +++ b/homeassistant/components/netgear/sensor.py @@ -29,6 +29,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import ( DOMAIN, KEY_COORDINATOR, + KEY_COORDINATOR_LINK, KEY_COORDINATOR_SPEED, KEY_COORDINATOR_TRAFFIC, KEY_ROUTER, @@ -244,6 +245,15 @@ SENSOR_SPEED_TYPES = [ ), ] +SENSOR_LINK_TYPES = [ + NetgearSensorEntityDescription( + key="NewEthernetLinkStatus", + name="Ethernet Link Status", + entity_category=EntityCategory.DIAGNOSTIC, + icon="mdi:ethernet", + ), +] + async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback @@ -253,6 +263,7 @@ async def async_setup_entry( coordinator = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR] coordinator_traffic = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR_TRAFFIC] coordinator_speed = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR_SPEED] + coordinator_link = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR_LINK] # Router entities router_entities = [] @@ -267,6 +278,11 @@ async def async_setup_entry( NetgearRouterSensorEntity(coordinator_speed, router, description) ) + for description in SENSOR_LINK_TYPES: + router_entities.append( + NetgearRouterSensorEntity(coordinator_link, router, description) + ) + async_add_entities(router_entities) # Entities per network device