* Original work from Quentame * Small adjustments * Add properties and method_version * fix unknown name * add consider_home functionality * fix typo * fix key * swao setup order * use formatted mac * add tracked_list option * add options flow * add config flow * add config flow * clean up registries * only remove if no other integration has that device * tracked_list formatting * convert tracked list * add import * move imports * use new tracked list on update * use update_device instead of remove * add strings * initialize already known devices * Update router.py * Update router.py * Update router.py * small fixes * styling * fix typing * fix spelling * Update router.py * get model of router * add router device info * fix api * add listeners * update router device info * remove method version option * Update __init__.py * fix styling * ignore typing * remove typing * fix mypy config * Update mypy.ini * add options flow tests * Update .coveragerc * fix styling * Update homeassistant/components/netgear/__init__.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/__init__.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/__init__.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/config_flow.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/router.py Co-authored-by: J. Nick Koston <nick@koston.org> * add ConfigEntryNotReady * Update router.py * use entry.async_on_unload * Update homeassistant/components/netgear/device_tracker.py Co-authored-by: J. Nick Koston <nick@koston.org> * use cv.ensure_list_csv * add hostname property * Update device_tracker.py * fix typo * fix isort * add myself to codeowners * clean config flow * further clean config flow * deprecate old netgear discovery * split out _async_remove_untracked_registries * Update homeassistant/components/netgear/config_flow.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/config_flow.py Co-authored-by: J. Nick Koston <nick@koston.org> * cleanup * fix rename * fix typo * remove URL option * fixes * add sensor platform * fixes * fix removing multiple entities * remove extra attributes * initialize sensors correctly * extra sensors disabled by default * fix styling and unused imports * fix tests * Update .coveragerc * fix requirements * remove tracked list * remove tracked registry editing * fix styling * fix discovery test * simplify unload * Update homeassistant/components/netgear/router.py Co-authored-by: J. Nick Koston <nick@koston.org> * add typing Co-authored-by: J. Nick Koston <nick@koston.org> * add typing Co-authored-by: J. Nick Koston <nick@koston.org> * add typing Co-authored-by: J. Nick Koston <nick@koston.org> * condense NetgearSensorEntities Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/router.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/router.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/router.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netgear/router.py Co-authored-by: J. Nick Koston <nick@koston.org> * add typing * styling * add typing * use ForwardRefrence for typing * Update homeassistant/components/netgear/device_tracker.py Co-authored-by: J. Nick Koston <nick@koston.org> * add typing * Apply suggestions from code review Thanks! Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * process review comments * fix styling * fix devicename not available on all models * ensure DeviceName is not needed * Update homeassistant/components/netgear/config_flow.py Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * Update homeassistant/components/netgear/config_flow.py Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * Update __init__.py * fix styling Co-authored-by: J. Nick Koston <nick@koston.org> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
132 lines
3.9 KiB
Python
132 lines
3.9 KiB
Python
"""Support for Netgear routers."""
|
|
import logging
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.device_tracker import (
|
|
PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA,
|
|
SOURCE_TYPE_ROUTER,
|
|
)
|
|
from homeassistant.components.device_tracker.config_entry import ScannerEntity
|
|
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
|
from homeassistant.const import (
|
|
CONF_DEVICES,
|
|
CONF_EXCLUDE,
|
|
CONF_HOST,
|
|
CONF_PASSWORD,
|
|
CONF_PORT,
|
|
CONF_SSL,
|
|
CONF_USERNAME,
|
|
)
|
|
from homeassistant.core import callback
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
from homeassistant.helpers.typing import HomeAssistantType
|
|
|
|
from .const import DEVICE_ICONS, DOMAIN
|
|
from .router import NetgearDeviceEntity, NetgearRouter, async_setup_netgear_entry
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
CONF_APS = "accesspoints"
|
|
|
|
PLATFORM_SCHEMA = PARENT_PLATFORM_SCHEMA.extend(
|
|
{
|
|
vol.Optional(CONF_HOST): cv.string,
|
|
vol.Optional(CONF_SSL): cv.boolean,
|
|
vol.Optional(CONF_USERNAME): cv.string,
|
|
vol.Required(CONF_PASSWORD): cv.string,
|
|
vol.Optional(CONF_PORT): cv.port,
|
|
vol.Optional(CONF_DEVICES, default=[]): vol.All(cv.ensure_list, [cv.string]),
|
|
vol.Optional(CONF_EXCLUDE, default=[]): vol.All(cv.ensure_list, [cv.string]),
|
|
vol.Optional(CONF_APS, default=[]): vol.All(cv.ensure_list, [cv.string]),
|
|
}
|
|
)
|
|
|
|
|
|
async def async_get_scanner(hass, config):
|
|
"""Import Netgear configuration from YAML."""
|
|
hass.async_create_task(
|
|
hass.config_entries.flow.async_init(
|
|
DOMAIN,
|
|
context={"source": SOURCE_IMPORT},
|
|
data=config,
|
|
)
|
|
)
|
|
|
|
_LOGGER.warning(
|
|
"Your Netgear configuration has been imported into the UI, "
|
|
"please remove it from configuration.yaml. "
|
|
"Loading Netgear via platform setup is now deprecated"
|
|
)
|
|
|
|
return None
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
|
) -> None:
|
|
"""Set up device tracker for Netgear component."""
|
|
|
|
def generate_classes(router: NetgearRouter, device: dict):
|
|
return [NetgearScannerEntity(router, device)]
|
|
|
|
async_setup_netgear_entry(hass, entry, async_add_entities, generate_classes)
|
|
|
|
|
|
class NetgearScannerEntity(NetgearDeviceEntity, ScannerEntity):
|
|
"""Representation of a device connected to a Netgear router."""
|
|
|
|
def __init__(self, router: NetgearRouter, device: dict) -> None:
|
|
"""Initialize a Netgear device."""
|
|
super().__init__(router, device)
|
|
self._hostname = self.get_hostname()
|
|
self._icon = DEVICE_ICONS.get(device["device_type"], "mdi:help-network")
|
|
|
|
def get_hostname(self):
|
|
"""Return the hostname of the given device or None if we don't know."""
|
|
hostname = self._device["name"]
|
|
if hostname == "--":
|
|
return None
|
|
|
|
return hostname
|
|
|
|
@callback
|
|
def async_update_device(self) -> None:
|
|
"""Update the Netgear device."""
|
|
self._device = self._router.devices[self._mac]
|
|
self._active = self._device["active"]
|
|
self._icon = DEVICE_ICONS.get(self._device["device_type"], "mdi:help-network")
|
|
|
|
self.async_write_ha_state()
|
|
|
|
@property
|
|
def is_connected(self):
|
|
"""Return true if the device is connected to the router."""
|
|
return self._active
|
|
|
|
@property
|
|
def source_type(self) -> str:
|
|
"""Return the source type."""
|
|
return SOURCE_TYPE_ROUTER
|
|
|
|
@property
|
|
def ip_address(self) -> str:
|
|
"""Return the IP address."""
|
|
return self._device["ip"]
|
|
|
|
@property
|
|
def mac_address(self) -> str:
|
|
"""Return the mac address."""
|
|
return self._mac
|
|
|
|
@property
|
|
def hostname(self) -> str:
|
|
"""Return the hostname."""
|
|
return self._hostname
|
|
|
|
@property
|
|
def icon(self) -> str:
|
|
"""Return the icon."""
|
|
return self._icon
|