From 3978ce22034f7ac9b32f4ce94b553a8450d5843e Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 29 Jan 2021 09:08:34 +0300 Subject: [PATCH] fix 1-wire updating while busy --- custom_components/mega/__init__.py | 1 + custom_components/mega/hub.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/custom_components/mega/__init__.py b/custom_components/mega/__init__.py index 06afa0b..4dff83f 100644 --- a/custom_components/mega/__init__.py +++ b/custom_components/mega/__init__.py @@ -161,6 +161,7 @@ async def async_remove_entry(hass, entry) -> None: return _LOGGER.debug(f'remove {id}') _hubs.pop(id, None) + hass.data[DOMAIN].pop(id, None) task: asyncio.Task = _POLL_TASKS.pop(id, None) if task is not None: task.cancel() diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index 347f847..a089115 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -209,6 +209,8 @@ class MegaD: def parse_response(self, ret): if ret is None: raise NoPort() + if 'busy' in ret: + return None if ':' in ret: ret = PATT_SPLIT.split(ret) ret = {'value': dict([ @@ -229,13 +231,16 @@ class MegaD: """ self.lg.debug(f'get port %s', port) if self.mqtt is None or force_http: - ret = await self.request(pt=port, cmd=http_cmd) - ret = self.parse_response(ret) - self.lg.debug('parsed: %s', ret) - if http_cmd == 'list' and isinstance(ret, dict) and 'value' in ret: + if http_cmd == 'list': + await self.request(pt=port, cmd='conv') await asyncio.sleep(1) - ret = await self.request(pt=port, cmd=http_cmd) - ret = self.parse_response(ret) + ret = self.parse_response(await self.request(pt=port, cmd=http_cmd)) + ntry = 0 + while http_cmd == 'list' and ret is None and ntry < 3: + await asyncio.sleep(1) + ret = self.parse_response(await self.request(pt=port, cmd=http_cmd)) + ntry += 1 + self.lg.debug('parsed: %s', ret) self.values[port] = ret return ret