Simplify requests in the Broadlink integration (#58850)
This commit is contained in:
parent
f0bd6acd48
commit
93bc88be16
4 changed files with 50 additions and 40 deletions
|
@ -213,10 +213,11 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
kwargs[ATTR_COMMAND] = command
|
||||
kwargs = SERVICE_SEND_SCHEMA(kwargs)
|
||||
commands = kwargs[ATTR_COMMAND]
|
||||
device = kwargs.get(ATTR_DEVICE)
|
||||
subdevice = kwargs.get(ATTR_DEVICE)
|
||||
repeat = kwargs[ATTR_NUM_REPEATS]
|
||||
delay = kwargs[ATTR_DELAY_SECS]
|
||||
service = f"{RM_DOMAIN}.{SERVICE_SEND_COMMAND}"
|
||||
device = self._device
|
||||
|
||||
if not self._attr_is_on:
|
||||
_LOGGER.warning(
|
||||
|
@ -228,13 +229,13 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
await self._async_load_storage()
|
||||
|
||||
try:
|
||||
code_list = self._extract_codes(commands, device)
|
||||
code_list = self._extract_codes(commands, subdevice)
|
||||
except ValueError as err:
|
||||
_LOGGER.error("Failed to call %s: %s", service, err)
|
||||
raise
|
||||
|
||||
rf_flags = {0xB2, 0xD7}
|
||||
if not hasattr(self._device.api, "sweep_frequency") and any(
|
||||
if not hasattr(device.api, "sweep_frequency") and any(
|
||||
c[0] in rf_flags for codes in code_list for c in codes
|
||||
):
|
||||
err_msg = f"{self.entity_id} doesn't support sending RF commands"
|
||||
|
@ -247,18 +248,18 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
await asyncio.sleep(delay)
|
||||
|
||||
if len(codes) > 1:
|
||||
code = codes[self._flags[device]]
|
||||
code = codes[self._flags[subdevice]]
|
||||
else:
|
||||
code = codes[0]
|
||||
|
||||
try:
|
||||
await self._device.async_request(self._device.api.send_data, code)
|
||||
await device.async_request(device.api.send_data, code)
|
||||
except (BroadlinkException, OSError) as err:
|
||||
_LOGGER.error("Error during %s: %s", service, err)
|
||||
break
|
||||
|
||||
if len(codes) > 1:
|
||||
self._flags[device] ^= 1
|
||||
self._flags[subdevice] ^= 1
|
||||
at_least_one_sent = True
|
||||
|
||||
if at_least_one_sent:
|
||||
|
@ -269,9 +270,10 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
kwargs = SERVICE_LEARN_SCHEMA(kwargs)
|
||||
commands = kwargs[ATTR_COMMAND]
|
||||
command_type = kwargs[ATTR_COMMAND_TYPE]
|
||||
device = kwargs[ATTR_DEVICE]
|
||||
subdevice = kwargs[ATTR_DEVICE]
|
||||
toggle = kwargs[ATTR_ALTERNATIVE]
|
||||
service = f"{RM_DOMAIN}.{SERVICE_LEARN_COMMAND}"
|
||||
device = self._device
|
||||
|
||||
if not self._attr_is_on:
|
||||
_LOGGER.warning(
|
||||
|
@ -286,7 +288,7 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
if command_type == COMMAND_TYPE_IR:
|
||||
learn_command = self._async_learn_ir_command
|
||||
|
||||
elif hasattr(self._device.api, "sweep_frequency"):
|
||||
elif hasattr(device.api, "sweep_frequency"):
|
||||
learn_command = self._async_learn_rf_command
|
||||
|
||||
else:
|
||||
|
@ -310,7 +312,7 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
_LOGGER.error("Failed to learn '%s': %s", command, err)
|
||||
continue
|
||||
|
||||
self._codes.setdefault(device, {}).update({command: code})
|
||||
self._codes.setdefault(subdevice, {}).update({command: code})
|
||||
should_store = True
|
||||
|
||||
if should_store:
|
||||
|
@ -318,8 +320,10 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
|
||||
async def _async_learn_ir_command(self, command):
|
||||
"""Learn an infrared command."""
|
||||
device = self._device
|
||||
|
||||
try:
|
||||
await self._device.async_request(self._device.api.enter_learning)
|
||||
await device.async_request(device.api.enter_learning)
|
||||
|
||||
except (BroadlinkException, OSError) as err:
|
||||
_LOGGER.debug("Failed to enter learning mode: %s", err)
|
||||
|
@ -336,7 +340,7 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
while (dt.utcnow() - start_time) < LEARNING_TIMEOUT:
|
||||
await asyncio.sleep(1)
|
||||
try:
|
||||
code = await self._device.async_request(self._device.api.check_data)
|
||||
code = await device.async_request(device.api.check_data)
|
||||
except (ReadError, StorageError):
|
||||
continue
|
||||
return b64encode(code).decode("utf8")
|
||||
|
@ -353,8 +357,10 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
|
||||
async def _async_learn_rf_command(self, command):
|
||||
"""Learn a radiofrequency command."""
|
||||
device = self._device
|
||||
|
||||
try:
|
||||
await self._device.async_request(self._device.api.sweep_frequency)
|
||||
await device.async_request(device.api.sweep_frequency)
|
||||
|
||||
except (BroadlinkException, OSError) as err:
|
||||
_LOGGER.debug("Failed to sweep frequency: %s", err)
|
||||
|
@ -370,15 +376,11 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
start_time = dt.utcnow()
|
||||
while (dt.utcnow() - start_time) < LEARNING_TIMEOUT:
|
||||
await asyncio.sleep(1)
|
||||
found = await self._device.async_request(
|
||||
self._device.api.check_frequency
|
||||
)
|
||||
found = await device.async_request(device.api.check_frequency)
|
||||
if found:
|
||||
break
|
||||
else:
|
||||
await self._device.async_request(
|
||||
self._device.api.cancel_sweep_frequency
|
||||
)
|
||||
await device.async_request(device.api.cancel_sweep_frequency)
|
||||
raise TimeoutError(
|
||||
"No radiofrequency found within "
|
||||
f"{LEARNING_TIMEOUT.total_seconds()} seconds"
|
||||
|
@ -392,7 +394,7 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
await asyncio.sleep(1)
|
||||
|
||||
try:
|
||||
await self._device.async_request(self._device.api.find_rf_packet)
|
||||
await device.async_request(device.api.find_rf_packet)
|
||||
|
||||
except (BroadlinkException, OSError) as err:
|
||||
_LOGGER.debug("Failed to enter learning mode: %s", err)
|
||||
|
@ -409,7 +411,7 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
while (dt.utcnow() - start_time) < LEARNING_TIMEOUT:
|
||||
await asyncio.sleep(1)
|
||||
try:
|
||||
code = await self._device.async_request(self._device.api.check_data)
|
||||
code = await device.async_request(device.api.check_data)
|
||||
except (ReadError, StorageError):
|
||||
continue
|
||||
return b64encode(code).decode("utf8")
|
||||
|
@ -428,7 +430,7 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
"""Delete a list of commands from a remote."""
|
||||
kwargs = SERVICE_DELETE_SCHEMA(kwargs)
|
||||
commands = kwargs[ATTR_COMMAND]
|
||||
device = kwargs[ATTR_DEVICE]
|
||||
subdevice = kwargs[ATTR_DEVICE]
|
||||
service = f"{RM_DOMAIN}.{SERVICE_DELETE_COMMAND}"
|
||||
|
||||
if not self._attr_is_on:
|
||||
|
@ -443,9 +445,9 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
await self._async_load_storage()
|
||||
|
||||
try:
|
||||
codes = self._codes[device]
|
||||
codes = self._codes[subdevice]
|
||||
except KeyError as err:
|
||||
err_msg = f"Device not found: {repr(device)}"
|
||||
err_msg = f"Device not found: {repr(subdevice)}"
|
||||
_LOGGER.error("Failed to call %s. %s", service, err_msg)
|
||||
raise ValueError(err_msg) from err
|
||||
|
||||
|
@ -470,8 +472,8 @@ class BroadlinkRemote(BroadlinkEntity, RemoteEntity, RestoreEntity):
|
|||
|
||||
# Clean up
|
||||
if not codes:
|
||||
del self._codes[device]
|
||||
if self._flags.pop(device, None) is not None:
|
||||
del self._codes[subdevice]
|
||||
if self._flags.pop(subdevice, None) is not None:
|
||||
self._flag_storage.async_delay_save(self._get_flags, FLAG_SAVE_DELAY)
|
||||
|
||||
self._code_storage.async_delay_save(self._get_codes, CODE_SAVE_DELAY)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue