Add Netgear ethernet link status (#72582)

This commit is contained in:
starkillerOG 2022-06-28 23:31:15 +02:00 committed by GitHub
parent 4aa8570107
commit ef76073d83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 0 deletions

View File

@ -15,6 +15,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import ( from .const import (
DOMAIN, DOMAIN,
KEY_COORDINATOR, KEY_COORDINATOR,
KEY_COORDINATOR_LINK,
KEY_COORDINATOR_SPEED, KEY_COORDINATOR_SPEED,
KEY_COORDINATOR_TRAFFIC, KEY_COORDINATOR_TRAFFIC,
KEY_ROUTER, KEY_ROUTER,
@ -83,6 +84,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Fetch data from the router.""" """Fetch data from the router."""
return await router.async_get_speed_test() 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 # Create update coordinators
coordinator = DataUpdateCoordinator( coordinator = DataUpdateCoordinator(
hass, hass,
@ -105,16 +110,25 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
update_method=async_update_speed_test, update_method=async_update_speed_test,
update_interval=SPEED_TEST_INTERVAL, 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: if router.track_devices:
await coordinator.async_config_entry_first_refresh() await coordinator.async_config_entry_first_refresh()
await coordinator_traffic_meter.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] = { hass.data[DOMAIN][entry.entry_id] = {
KEY_ROUTER: router, KEY_ROUTER: router,
KEY_COORDINATOR: coordinator, KEY_COORDINATOR: coordinator,
KEY_COORDINATOR_TRAFFIC: coordinator_traffic_meter, KEY_COORDINATOR_TRAFFIC: coordinator_traffic_meter,
KEY_COORDINATOR_SPEED: coordinator_speed_test, KEY_COORDINATOR_SPEED: coordinator_speed_test,
KEY_COORDINATOR_LINK: coordinator_link,
} }
hass.config_entries.async_setup_platforms(entry, PLATFORMS) hass.config_entries.async_setup_platforms(entry, PLATFORMS)

View File

@ -13,6 +13,7 @@ KEY_ROUTER = "router"
KEY_COORDINATOR = "coordinator" KEY_COORDINATOR = "coordinator"
KEY_COORDINATOR_TRAFFIC = "coordinator_traffic" KEY_COORDINATOR_TRAFFIC = "coordinator_traffic"
KEY_COORDINATOR_SPEED = "coordinator_speed" KEY_COORDINATOR_SPEED = "coordinator_speed"
KEY_COORDINATOR_LINK = "coordinator_link"
DEFAULT_CONSIDER_HOME = timedelta(seconds=180) DEFAULT_CONSIDER_HOME = timedelta(seconds=180)
DEFAULT_NAME = "Netgear router" DEFAULT_NAME = "Netgear router"

View File

@ -228,6 +228,11 @@ class NetgearRouter:
self._api.get_new_speed_test_result 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: async def async_allow_block_device(self, mac: str, allow_block: str) -> None:
"""Allow or block a device connected to the router.""" """Allow or block a device connected to the router."""
async with self._api_lock: async with self._api_lock:

View File

@ -29,6 +29,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import ( from .const import (
DOMAIN, DOMAIN,
KEY_COORDINATOR, KEY_COORDINATOR,
KEY_COORDINATOR_LINK,
KEY_COORDINATOR_SPEED, KEY_COORDINATOR_SPEED,
KEY_COORDINATOR_TRAFFIC, KEY_COORDINATOR_TRAFFIC,
KEY_ROUTER, 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( async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback 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 = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR]
coordinator_traffic = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR_TRAFFIC] coordinator_traffic = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR_TRAFFIC]
coordinator_speed = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR_SPEED] 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
router_entities = [] router_entities = []
@ -267,6 +278,11 @@ async def async_setup_entry(
NetgearRouterSensorEntity(coordinator_speed, router, description) NetgearRouterSensorEntity(coordinator_speed, router, description)
) )
for description in SENSOR_LINK_TYPES:
router_entities.append(
NetgearRouterSensorEntity(coordinator_link, router, description)
)
async_add_entities(router_entities) async_add_entities(router_entities)
# Entities per network device # Entities per network device