Use DataUpdateCoordinator for mikrotik (#72954)

This commit is contained in:
Rami Mosleh 2022-06-29 16:32:29 +03:00 committed by GitHub
parent 329ecc74c4
commit 8905e6f726
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 81 additions and 194 deletions

View file

@ -9,7 +9,7 @@ from librouteros.login import plain as login_plain, token as login_token
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, CONF_VERIFY_SSL
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import slugify
import homeassistant.util.dt as dt_util
@ -25,13 +25,13 @@ from .const import (
CONF_FORCE_DHCP,
DEFAULT_DETECTION_TIME,
DHCP,
DOMAIN,
IDENTITY,
INFO,
IS_CAPSMAN,
IS_WIRELESS,
MIKROTIK_SERVICES,
NAME,
PLATFORMS,
WIRELESS,
)
from .errors import CannotConnect, LoginError
@ -154,10 +154,8 @@ class MikrotikData:
"""Connect to hub."""
try:
self.api = get_api(self.hass, self.config_entry.data)
self.available = True
return True
except (LoginError, CannotConnect):
self.available = False
return False
def get_list_from_interface(self, interface):
@ -194,9 +192,8 @@ class MikrotikData:
# get new hub firmware version if updated
self.firmware = self.get_info(ATTR_FIRMWARE)
except (CannotConnect, socket.timeout, OSError):
self.available = False
return
except (CannotConnect, socket.timeout, OSError) as err:
raise UpdateFailed from err
if not device_list:
return
@ -263,7 +260,8 @@ class MikrotikData:
socket.timeout,
) as api_error:
_LOGGER.error("Mikrotik %s connection error %s", self._host, api_error)
raise CannotConnect from api_error
if not self.connect_to_hub():
raise CannotConnect from api_error
except librouteros.exceptions.ProtocolError as api_error:
_LOGGER.warning(
"Mikrotik %s failed to retrieve data. cmd=[%s] Error: %s",
@ -275,15 +273,8 @@ class MikrotikData:
return response if response else None
def update(self):
"""Update device_tracker from Mikrotik API."""
if (not self.available or not self.api) and not self.connect_to_hub():
return
_LOGGER.debug("updating network devices for host: %s", self._host)
self.update_devices()
class MikrotikHub:
class MikrotikDataUpdateCoordinator(DataUpdateCoordinator):
"""Mikrotik Hub Object."""
def __init__(self, hass, config_entry):
@ -291,7 +282,13 @@ class MikrotikHub:
self.hass = hass
self.config_entry = config_entry
self._mk_data = None
self.progress = None
super().__init__(
self.hass,
_LOGGER,
name=f"{DOMAIN} - {self.host}",
update_method=self.async_update,
update_interval=timedelta(seconds=10),
)
@property
def host(self):
@ -328,11 +325,6 @@ class MikrotikHub:
"""Config entry option defining number of seconds from last seen to away."""
return timedelta(seconds=self.config_entry.options[CONF_DETECTION_TIME])
@property
def signal_update(self):
"""Event specific per Mikrotik entry to signal updates."""
return f"mikrotik-update-{self.host}"
@property
def api(self):
"""Represent Mikrotik data object."""
@ -354,21 +346,9 @@ class MikrotikHub:
self.config_entry, data=data, options=options
)
async def request_update(self):
"""Request an update."""
if self.progress is not None:
await self.progress
return
self.progress = self.hass.async_create_task(self.async_update())
await self.progress
self.progress = None
async def async_update(self):
"""Update Mikrotik devices information."""
await self.hass.async_add_executor_job(self._mk_data.update)
async_dispatcher_send(self.hass, self.signal_update)
await self.hass.async_add_executor_job(self._mk_data.update_devices)
async def async_setup(self):
"""Set up the Mikrotik hub."""
@ -384,9 +364,7 @@ class MikrotikHub:
self._mk_data = MikrotikData(self.hass, self.config_entry, api)
await self.async_add_options()
await self.hass.async_add_executor_job(self._mk_data.get_hub_details)
await self.hass.async_add_executor_job(self._mk_data.update)
self.hass.config_entries.async_setup_platforms(self.config_entry, PLATFORMS)
return True