mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 01:24:29 +05:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d94efbe1a7 | ||
|
|
eaa46a99ae | ||
|
|
e65598fe63 | ||
|
|
e12ab45c04 | ||
|
|
7fb72be646 | ||
|
|
f9f97a91b6 | ||
|
|
ad1210d5cc | ||
|
|
687e80f729 |
@@ -99,7 +99,7 @@ CONFIG_SCHEMA = vol.Schema(
|
|||||||
{
|
{
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
vol.Optional(CONF_ALLOW_HOSTS): [str],
|
vol.Optional(CONF_ALLOW_HOSTS): [str],
|
||||||
vol.Required(str, description='id меги из веб-интерфейса'): {
|
vol.Optional([str, int], description='id меги из веб-интерфейса'): {
|
||||||
vol.Optional(CONF_FORCE_D, description='Принудительно слать d после срабатывания входа', default=False): bool,
|
vol.Optional(CONF_FORCE_D, description='Принудительно слать d после срабатывания входа', default=False): bool,
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_DEF_RESPONSE,
|
CONF_DEF_RESPONSE,
|
||||||
@@ -114,7 +114,7 @@ CONFIG_SCHEMA = vol.Schema(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
extra=vol.ALLOW_EXTRA,
|
extra=vol.PREVENT_EXTRA,
|
||||||
)
|
)
|
||||||
|
|
||||||
ALIVE_STATE = 'alive'
|
ALIVE_STATE = 'alive'
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ LUX = 'lux'
|
|||||||
SINGLE_CLICK = 'single'
|
SINGLE_CLICK = 'single'
|
||||||
DOUBLE_CLICK = 'double'
|
DOUBLE_CLICK = 'double'
|
||||||
|
|
||||||
PATT_FW = re.compile(r'fw:\s(.+)\)')
|
PATT_FW = re.compile(r'fw:\s(.+)\b')
|
||||||
|
|
||||||
REMOVE_CONFIG = [
|
REMOVE_CONFIG = [
|
||||||
'extenders',
|
'extenders',
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ class MegaD:
|
|||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
|
self.skip_ports = set()
|
||||||
if config is not None:
|
if config is not None:
|
||||||
lg.debug(f'load config: %s', config.data)
|
lg.debug(f'load config: %s', config.data)
|
||||||
self.config = config
|
self.config = config
|
||||||
@@ -157,11 +158,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 +186,10 @@ class MegaD:
|
|||||||
continue
|
continue
|
||||||
if x.port in ports:
|
if x.port in ports:
|
||||||
continue
|
continue
|
||||||
|
try:
|
||||||
await self.get_port(x.port, force_http=True, http_cmd=x.http_cmd)
|
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 +236,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)
|
||||||
|
try:
|
||||||
await self.get_port(
|
await self.get_port(
|
||||||
port=x,
|
port=x,
|
||||||
force_http=True,
|
force_http=True,
|
||||||
http_cmd='list',
|
http_cmd='list',
|
||||||
conv=False
|
conv=False
|
||||||
)
|
)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
continue
|
||||||
|
|
||||||
async def poll(self):
|
async def poll(self):
|
||||||
"""
|
"""
|
||||||
@@ -253,6 +259,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,7 +297,9 @@ 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):
|
||||||
|
try:
|
||||||
|
async with aiohttp.request("get", url=url, timeout=aiohttp.ClientTimeout(total=5)) as req:
|
||||||
if req.status != 200:
|
if req.status != 200:
|
||||||
self.lg.warning('%s returned %s (%s)', url, req.status, await req.text())
|
self.lg.warning('%s returned %s (%s)', url, req.status, await req.text())
|
||||||
return None
|
return None
|
||||||
@@ -298,6 +307,11 @@ class MegaD:
|
|||||||
ret = await req.text()
|
ret = await req.text()
|
||||||
self.lg.debug('response %s', ret)
|
self.lg.debug('response %s', ret)
|
||||||
return 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 +364,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):
|
||||||
|
try:
|
||||||
ret = await self.request(cmd='all')
|
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 +463,10 @@ class MegaD:
|
|||||||
:param port:
|
:param port:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
try:
|
||||||
values = await self.request(pt=port, cmd='get')
|
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
|
||||||
@@ -458,13 +478,21 @@ class MegaD:
|
|||||||
:param params: параметры url
|
:param params: параметры url
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
pt = params.get('pt')
|
||||||
|
if pt in self.skip_ports:
|
||||||
|
return
|
||||||
|
if pt is not None:
|
||||||
|
pass
|
||||||
_params = tuple(params.items())
|
_params = tuple(params.items())
|
||||||
delay = None
|
delay = None
|
||||||
if 'delay' in params:
|
if 'delay' in params:
|
||||||
delay = params.pop('delay')
|
delay = params.pop('delay')
|
||||||
|
try:
|
||||||
ret = {
|
ret = {
|
||||||
_params: await self.request(**params)
|
_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)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from homeassistant.const import (
|
|||||||
DEVICE_CLASS_TEMPERATURE,
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
DEVICE_CLASS_ILLUMINANCE,
|
DEVICE_CLASS_ILLUMINANCE,
|
||||||
DEVICE_CLASS_PRESSURE,
|
DEVICE_CLASS_PRESSURE,
|
||||||
|
DEVICE_CLASS_CO2,
|
||||||
PERCENTAGE,
|
PERCENTAGE,
|
||||||
LIGHT_LUX,
|
LIGHT_LUX,
|
||||||
TEMP_CELSIUS,
|
TEMP_CELSIUS,
|
||||||
@@ -103,6 +104,10 @@ i2c_classes = {
|
|||||||
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
|
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
|
||||||
DeviceType(DEVICE_CLASS_HUMIDITY, PERCENTAGE, None)
|
DeviceType(DEVICE_CLASS_HUMIDITY, PERCENTAGE, None)
|
||||||
],
|
],
|
||||||
|
'dps368': [
|
||||||
|
DeviceType(DEVICE_CLASS_PRESSURE, PRESSURE_BAR, None),
|
||||||
|
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
|
||||||
|
],
|
||||||
'mlx90614': [
|
'mlx90614': [
|
||||||
Skip,
|
Skip,
|
||||||
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, 'temp'),
|
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, 'temp'),
|
||||||
@@ -119,9 +124,21 @@ i2c_classes = {
|
|||||||
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None), # сенсор встроенный в микросхему
|
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None), # сенсор встроенный в микросхему
|
||||||
],
|
],
|
||||||
't67xx': [
|
't67xx': [
|
||||||
DeviceType(None, CONCENTRATION_PARTS_PER_MILLION, None) # для co2 нет класса в HA
|
DeviceType(DEVICE_CLASS_CO2, CONCENTRATION_PARTS_PER_MILLION, None)
|
||||||
],
|
],
|
||||||
'tmp117': [
|
'tmp117': [
|
||||||
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
|
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
|
||||||
]
|
],
|
||||||
|
'ads1115': [
|
||||||
|
DeviceType(None, None, 'ch0'),
|
||||||
|
DeviceType(None, None, 'ch1'),
|
||||||
|
DeviceType(None, None, 'ch2'),
|
||||||
|
DeviceType(None, None, 'ch3'),
|
||||||
|
],
|
||||||
|
'ads1015': [
|
||||||
|
DeviceType(None, None, 'ch0'),
|
||||||
|
DeviceType(None, None, 'ch1'),
|
||||||
|
DeviceType(None, None, 'ch2'),
|
||||||
|
DeviceType(None, None, 'ch3'),
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"domain": "mega",
|
"domain": "mega",
|
||||||
"name": "mega",
|
"name": "mega",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/mega_hacs",
|
"documentation": "https://github.com/andvikt/mega_hacs",
|
||||||
"requirements": [
|
"requirements": [
|
||||||
"beautifulsoup4",
|
"beautifulsoup4",
|
||||||
"lxml"
|
"lxml"
|
||||||
@@ -15,5 +15,5 @@
|
|||||||
"@andvikt"
|
"@andvikt"
|
||||||
],
|
],
|
||||||
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
|
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
|
||||||
"version": "v1.0.1"
|
"version": "v1.0.6b4"
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ from homeassistant.const import (
|
|||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.template import Template
|
from homeassistant.helpers.template import Template
|
||||||
from .entities import MegaPushEntity
|
from .entities import MegaPushEntity
|
||||||
from .const import CONF_KEY, TEMP, HUM, W1, W1BUS, CONF_CONV_TEMPLATE, CONF_HEX_TO_FLOAT
|
from .const import CONF_KEY, TEMP, HUM, W1, W1BUS, CONF_CONV_TEMPLATE, CONF_HEX_TO_FLOAT, DOMAIN, CONF_CUSTOM, CONF_SKIP
|
||||||
from .hub import MegaD
|
from .hub import MegaD
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -84,9 +84,14 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, asyn
|
|||||||
mid = config_entry.data[CONF_ID]
|
mid = config_entry.data[CONF_ID]
|
||||||
hub: MegaD = hass.data['mega'][mid]
|
hub: MegaD = hass.data['mega'][mid]
|
||||||
devices = []
|
devices = []
|
||||||
|
customize = hass.data.get(DOMAIN, {}).get(CONF_CUSTOM, {}).get(mid, {})
|
||||||
for tp in ['sensor', 'i2c']:
|
for tp in ['sensor', 'i2c']:
|
||||||
for port, cfg in config_entry.data.get(tp, {}).items():
|
for port, cfg in config_entry.data.get(tp, {}).items():
|
||||||
port = int_ignore(port)
|
port = int_ignore(port)
|
||||||
|
c = customize.get(port, {})
|
||||||
|
if c.get(CONF_SKIP):
|
||||||
|
hub.skip_ports |= {port}
|
||||||
|
continue
|
||||||
for data in cfg:
|
for data in cfg:
|
||||||
hub.lg.debug(f'add sensor on port %s with data %s', port, data)
|
hub.lg.debug(f'add sensor on port %s with data %s', port, data)
|
||||||
sensor = _constructors[tp](
|
sensor = _constructors[tp](
|
||||||
|
|||||||
Reference in New Issue
Block a user