Compare commits

..

5 Commits

Author SHA1 Message Date
Andrey
f9f97a91b6 add timeouts 2021-04-19 21:46:12 +03:00
Andrey
ad1210d5cc fix some timeouts 2021-03-29 21:43:25 +03:00
Andrey Viktorov
687e80f729 fix empty config while first setup 2021-03-29 19:54:48 +03:00
Andrey Viktorov
7d777c9e82 fix sensors 2021-03-24 18:14:15 +03:00
Andrey Viktorov
c9f0e85f6a edit readme 2021-03-24 17:04:37 +03:00
3 changed files with 47 additions and 26 deletions

View File

@@ -157,11 +157,10 @@ class MegaD:
if force_d is not None: if force_d is not None:
self.customize[CONF_FORCE_D] = force_d self.customize[CONF_FORCE_D] = force_d
try: try:
if allow_hosts is not None: if allow_hosts is not None and DOMAIN in hass.data:
allow_hosts = set(allow_hosts.split(';')) allow_hosts = set(allow_hosts.split(';'))
hass.data[DOMAIN][CONF_HTTP].allowed_hosts |= allow_hosts hass.data[DOMAIN][CONF_HTTP].allowed_hosts |= allow_hosts
hass.data[DOMAIN][CONF_HTTP].protected = protected hass.data[DOMAIN][CONF_HTTP].protected = protected
except Exception: except Exception:
self.lg.exception('while setting allowed hosts') self.lg.exception('while setting allowed hosts')
@@ -186,7 +185,10 @@ class MegaD:
continue continue
if x.port in ports: if x.port in ports:
continue continue
await self.get_port(x.port, force_http=True, http_cmd=x.http_cmd) try:
await self.get_port(x.port, force_http=True, http_cmd=x.http_cmd)
except asyncio.TimeoutError:
continue
ports.append(x.port) ports.append(x.port)
@property @property
@@ -233,12 +235,15 @@ class MegaD:
""" """
for x in self.ds2413_ports: for x in self.ds2413_ports:
self.lg.debug(f'poll ds2413 for %s', x) self.lg.debug(f'poll ds2413 for %s', x)
await self.get_port( try:
port=x, await self.get_port(
force_http=True, port=x,
http_cmd='list', force_http=True,
conv=False http_cmd='list',
) conv=False
)
except asyncio.TimeoutError:
continue
async def poll(self): async def poll(self):
""" """
@@ -253,6 +258,7 @@ class MegaD:
ret = await self._update_i2c(x) ret = await self._update_i2c(x)
if isinstance(ret, dict): if isinstance(ret, dict):
self.values.update(ret) self.values.update(ret)
for x in self.extenders: for x in self.extenders:
ret = await self._update_extender(x) ret = await self._update_extender(x)
if not isinstance(ret, dict): if not isinstance(ret, dict):
@@ -290,14 +296,21 @@ class MegaD:
url = f"{url}/?{cmd}" url = f"{url}/?{cmd}"
self.lg.debug('request: %s', url) self.lg.debug('request: %s', url)
async with self._http_lck(priority): async with self._http_lck(priority):
async with aiohttp.request("get", url=url) as req: for _ntry in range(3):
if req.status != 200: try:
self.lg.warning('%s returned %s (%s)', url, req.status, await req.text()) async with aiohttp.request("get", url=url, timeout=aiohttp.ClientTimeout(total=5)) as req:
return None if req.status != 200:
else: self.lg.warning('%s returned %s (%s)', url, req.status, await req.text())
ret = await req.text() return None
self.lg.debug('response %s', ret) else:
return ret ret = await req.text()
self.lg.debug('response %s', ret)
return ret
except asyncio.TimeoutError:
self.lg.warning(f'timeout while requesting {url}')
raise
# await asyncio.sleep(1)
raise asyncio.TimeoutError('after 3 tries')
async def save(self): async def save(self):
await self.send_command(cmd='s') await self.send_command(cmd='s')
@@ -350,7 +363,10 @@ class MegaD:
return {e.port for e in self.entities} return {e.port for e in self.entities}
async def get_all_ports(self, only_out=False, check_skip=False): async def get_all_ports(self, only_out=False, check_skip=False):
ret = await self.request(cmd='all') try:
ret = await self.request(cmd='all')
except asyncio.TimeoutError:
return
for port, x in enumerate(ret.split(';')): for port, x in enumerate(ret.split(';')):
if port in self.ds2413_ports: if port in self.ds2413_ports:
continue continue
@@ -446,7 +462,10 @@ class MegaD:
:param port: :param port:
:return: :return:
""" """
values = await self.request(pt=port, cmd='get') try:
values = await self.request(pt=port, cmd='get')
except asyncio.TimeoutError:
return
ret = {} ret = {}
for i, x in enumerate(values.split(';')): for i, x in enumerate(values.split(';')):
ret[f'{port}e{i}'] = x ret[f'{port}e{i}'] = x
@@ -462,9 +481,12 @@ class MegaD:
delay = None delay = None
if 'delay' in params: if 'delay' in params:
delay = params.pop('delay') delay = params.pop('delay')
ret = { try:
_params: await self.request(**params) ret = {
} _params: await self.request(**params)
}
except asyncio.TimeoutError:
return
self.lg.debug('i2c response: %s', ret) self.lg.debug('i2c response: %s', ret)
if delay: if delay:
self.lg.debug('delay %s', delay) self.lg.debug('delay %s', delay)

View File

@@ -146,7 +146,7 @@ class MegaI2C(MegaPushEntity):
ret = tmpl.async_render({'value': ret}) ret = tmpl.async_render({'value': ret})
except: except:
ret = ret ret = ret
return ret return str(ret)
@property @property
def device_class(self): def device_class(self):
@@ -242,7 +242,7 @@ class Mega1WSensor(MegaPushEntity):
ret = tmpl.async_render({'value': ret}) ret = tmpl.async_render({'value': ret})
except: except:
pass pass
return ret return str(ret)
@property @property
def name(self): def name(self):

View File

@@ -25,8 +25,7 @@
- Плавное диммирование для любых диммируемых объектов (в том числе с аппаратной поддержкой и без), - Плавное диммирование для любых диммируемых объектов (в том числе с аппаратной поддержкой и без),
[подробнее про smooth](https://github.com/andvikt/mega_hacs/wiki/smooth) [подробнее про smooth](https://github.com/andvikt/mega_hacs/wiki/smooth)
- Возможность работы с несколькими megad - Возможность работы с несколькими megad
- Обратная связь по [http](https://github.com/andvikt/mega_hacs/wiki/http) - Обратная связь по [http](https://github.com/andvikt/mega_hacs/wiki/http)
будет выключена в версиях >= 1.0.0, тк в нем нет необходимости)
- Автоматическое восстановление состояний выходов после перезагрузки контроллера - Автоматическое восстановление состояний выходов после перезагрузки контроллера
- Автоматическое добавление/изменение объектов после перезагрузки контроллера - Автоматическое добавление/изменение объектов после перезагрузки контроллера
- [События](https://github.com/andvikt/mega_hacs/wiki/События) на двойные/долгие нажатия - [События](https://github.com/andvikt/mega_hacs/wiki/События) на двойные/долгие нажатия