58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
|
"""Support for Broadlink devices."""
|
||
|
from functools import partial
|
||
|
import logging
|
||
|
|
||
|
from broadlink.exceptions import (
|
||
|
AuthorizationError,
|
||
|
BroadlinkException,
|
||
|
ConnectionClosedError,
|
||
|
DeviceOfflineError,
|
||
|
)
|
||
|
|
||
|
from .const import DEFAULT_RETRY
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class BroadlinkDevice:
|
||
|
"""Manages a Broadlink device."""
|
||
|
|
||
|
def __init__(self, hass, api):
|
||
|
"""Initialize the device."""
|
||
|
self.hass = hass
|
||
|
self.api = api
|
||
|
self.available = None
|
||
|
|
||
|
async def async_connect(self):
|
||
|
"""Connect to the device."""
|
||
|
try:
|
||
|
await self.hass.async_add_executor_job(self.api.auth)
|
||
|
except BroadlinkException as err_msg:
|
||
|
if self.available:
|
||
|
self.available = False
|
||
|
_LOGGER.warning(
|
||
|
"Disconnected from device at %s: %s", self.api.host[0], err_msg
|
||
|
)
|
||
|
return False
|
||
|
else:
|
||
|
if not self.available:
|
||
|
if self.available is not None:
|
||
|
_LOGGER.warning("Connected to device at %s", self.api.host[0])
|
||
|
self.available = True
|
||
|
return True
|
||
|
|
||
|
async def async_request(self, function, *args, **kwargs):
|
||
|
"""Send a request to the device."""
|
||
|
partial_function = partial(function, *args, **kwargs)
|
||
|
for attempt in range(DEFAULT_RETRY):
|
||
|
try:
|
||
|
result = await self.hass.async_add_executor_job(partial_function)
|
||
|
except (AuthorizationError, ConnectionClosedError, DeviceOfflineError):
|
||
|
if attempt == DEFAULT_RETRY - 1 or not await self.async_connect():
|
||
|
raise
|
||
|
else:
|
||
|
if not self.available:
|
||
|
self.available = True
|
||
|
_LOGGER.warning("Connected to device at %s", self.api.host[0])
|
||
|
return result
|