mirror of https://github.com/home-assistant/core
109 lines
3.4 KiB
Python
109 lines
3.4 KiB
Python
"""Represent the Netgear router and its devices."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from abc import abstractmethod
|
|
|
|
from homeassistant.const import CONF_HOST
|
|
from homeassistant.core import callback
|
|
from homeassistant.helpers import device_registry as dr
|
|
from homeassistant.helpers.device_registry import DeviceInfo
|
|
from homeassistant.helpers.entity import Entity
|
|
from homeassistant.helpers.update_coordinator import (
|
|
CoordinatorEntity,
|
|
DataUpdateCoordinator,
|
|
)
|
|
|
|
from .const import DOMAIN
|
|
from .router import NetgearRouter
|
|
|
|
|
|
class NetgearDeviceEntity(CoordinatorEntity):
|
|
"""Base class for a device connected to a Netgear router."""
|
|
|
|
_attr_has_entity_name = True
|
|
|
|
def __init__(
|
|
self, coordinator: DataUpdateCoordinator, router: NetgearRouter, device: dict
|
|
) -> None:
|
|
"""Initialize a Netgear device."""
|
|
super().__init__(coordinator)
|
|
self._router = router
|
|
self._device = device
|
|
self._mac = device["mac"]
|
|
self._device_name = self.get_device_name()
|
|
self._active = device["active"]
|
|
self._attr_unique_id = self._mac
|
|
self._attr_device_info = DeviceInfo(
|
|
connections={(dr.CONNECTION_NETWORK_MAC, self._mac)},
|
|
default_name=self._device_name,
|
|
default_model=device["device_model"],
|
|
via_device=(DOMAIN, router.unique_id),
|
|
)
|
|
|
|
def get_device_name(self):
|
|
"""Return the name of the given device or the MAC if we don't know."""
|
|
name = self._device["name"]
|
|
if not name or name == "--":
|
|
name = self._mac
|
|
|
|
return name
|
|
|
|
@abstractmethod
|
|
@callback
|
|
def async_update_device(self) -> None:
|
|
"""Update the Netgear device."""
|
|
|
|
@callback
|
|
def _handle_coordinator_update(self) -> None:
|
|
"""Handle updated data from the coordinator."""
|
|
self.async_update_device()
|
|
super()._handle_coordinator_update()
|
|
|
|
|
|
class NetgearRouterEntity(Entity):
|
|
"""Base class for a Netgear router entity without coordinator."""
|
|
|
|
_attr_has_entity_name = True
|
|
|
|
def __init__(self, router: NetgearRouter) -> None:
|
|
"""Initialize a Netgear device."""
|
|
self._router = router
|
|
|
|
configuration_url = None
|
|
if host := router.entry.data[CONF_HOST]:
|
|
configuration_url = f"http://{host}/"
|
|
|
|
self._attr_unique_id = router.serial_number
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, router.unique_id)},
|
|
manufacturer="Netgear",
|
|
name=router.device_name,
|
|
model=router.model,
|
|
sw_version=router.firmware_version,
|
|
hw_version=router.hardware_version,
|
|
configuration_url=configuration_url,
|
|
)
|
|
|
|
|
|
class NetgearRouterCoordinatorEntity(NetgearRouterEntity, CoordinatorEntity):
|
|
"""Base class for a Netgear router entity."""
|
|
|
|
def __init__(
|
|
self, coordinator: DataUpdateCoordinator, router: NetgearRouter
|
|
) -> None:
|
|
"""Initialize a Netgear device."""
|
|
CoordinatorEntity.__init__(self, coordinator)
|
|
NetgearRouterEntity.__init__(self, router)
|
|
|
|
@abstractmethod
|
|
@callback
|
|
def async_update_device(self) -> None:
|
|
"""Update the Netgear device."""
|
|
|
|
@callback
|
|
def _handle_coordinator_update(self) -> None:
|
|
"""Handle updated data from the coordinator."""
|
|
self.async_update_device()
|
|
super()._handle_coordinator_update()
|