Compare commits

...

5 Commits

Author SHA1 Message Date
andvikt
c11de5c2b9 Bump version: 1.1.1b0 → 1.1.1b1 2021-11-07 12:38:18 +03:00
andvikt
679b53bbd3 new config adressation 2021-11-07 12:38:02 +03:00
Викторов Андрей Германович
2c2b3aab74 Bump version: 1.1.0 → 1.1.1b0 2021-11-03 10:24:29 +03:00
Викторов Андрей Германович
a77794dff7 fix sht31 updating issue
fix filters positive float
2021-11-03 10:24:21 +03:00
andvikt
ebb513b83d new config adressation 2021-10-29 21:14:50 +03:00
8 changed files with 36 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 1.1.0 current_version = 1.1.1b1
parse = (?P<major>\d+)(\.(?P<minor>\d+))(\.(?P<patch>\d+))(?P<release>[bf]*)(?P<build>\d*) parse = (?P<major>\d+)(\.(?P<minor>\d+))(\.(?P<patch>\d+))(?P<release>[bf]*)(?P<build>\d*)
commit = True commit = True
tag = True tag = True

View File

@@ -1,6 +1,7 @@
"""The mega integration.""" """The mega integration."""
import asyncio import asyncio
import logging import logging
import typing
from functools import partial from functools import partial
import voluptuous as vol import voluptuous as vol
@@ -83,10 +84,10 @@ CUSTOMIZE_PORT = {
vol.Optional(CONF_VALUE_TEMPLATE): cv.template, vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
vol.Optional(CONF_FORCE_I2C_SCAN): bool, vol.Optional(CONF_FORCE_I2C_SCAN): bool,
vol.Optional(CONF_HEX_TO_FLOAT): bool, vol.Optional(CONF_HEX_TO_FLOAT): bool,
vol.Optional(CONF_FILTER_VALUES): [cv.positive_float], vol.Optional(CONF_FILTER_VALUES): [vol.Coerce(float)],
vol.Optional(CONF_FILTER_SCALE): cv.positive_float, vol.Optional(CONF_FILTER_SCALE): vol.Coerce(float),
vol.Optional(CONF_FILTER_LOW): cv.positive_float, vol.Optional(CONF_FILTER_LOW): vol.Coerce(float),
vol.Optional(CONF_FILTER_HIGH): cv.positive_float, vol.Optional(CONF_FILTER_HIGH): vol.Coerce(float),
vol.Optional(CONF_SMOOTH): cv.time_period_seconds, vol.Optional(CONF_SMOOTH): cv.time_period_seconds,
# vol.Optional(CONF_RANGE): vol.ExactSequence([int, int]), TODO: сделать отбрасывание "плохих" значений # vol.Optional(CONF_RANGE): vol.ExactSequence([int, int]), TODO: сделать отбрасывание "плохих" значений
vol.Optional(str): { vol.Optional(str): {

View File

@@ -63,7 +63,7 @@ async def validate_input(hass: core.HomeAssistant, data):
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a config flow for mega.""" """Handle a config flow for mega."""
VERSION = 25 VERSION = 26
CONNECTION_CLASS = config_entries.CONN_CLASS_ASSUMED CONNECTION_CLASS = config_entries.CONN_CLASS_ASSUMED
async def async_step_user(self, user_input=None): async def async_step_user(self, user_input=None):

View File

@@ -86,7 +86,6 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
self.mega.ds2413_ports |= {self.port} self.mega.ds2413_ports |= {self.port}
super().__init__(coordinator=mega.updater) super().__init__(coordinator=mega.updater)
@property @property
def is_ws(self): def is_ws(self):
return False return False
@@ -131,9 +130,6 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
return {} return {}
if self._customize is None: if self._customize is None:
c_entity_id = self.hass.data.get(DOMAIN, {}).get(CONF_CUSTOM).get('entities', {}).get(self.entity_id, {}) c_entity_id = self.hass.data.get(DOMAIN, {}).get(CONF_CUSTOM).get('entities', {}).get(self.entity_id, {})
self.lg.debug(
'customize %s with %s', self.entity_id, c_entity_id
)
c = self.hass.data.get(DOMAIN, {}).get(CONF_CUSTOM) or {} c = self.hass.data.get(DOMAIN, {}).get(CONF_CUSTOM) or {}
c = c.get(self._mega_id) or {} c = c.get(self._mega_id) or {}
c = c.get(self.port) or {} c = c.get(self.port) or {}

View File

@@ -427,7 +427,7 @@ class MegaD:
def subscribe(self, port, callback): def subscribe(self, port, callback):
port = int_ignore(port) port = int_ignore(port)
self.lg.debug( self.lg.debug(
f'subscribe %s %s', port, str(callback) f'subscribe %s', port,
) )
self.http.callbacks[self.id][port].append(callback) self.http.callbacks[self.id][port].append(callback)

View File

@@ -1,4 +1,5 @@
from dataclasses import dataclass, field import typing
from dataclasses import dataclass, field, astuple
from urllib.parse import parse_qsl, urlparse from urllib.parse import parse_qsl, urlparse
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from homeassistant.const import ( from homeassistant.const import (
@@ -15,7 +16,15 @@ from homeassistant.const import (
) )
from collections import namedtuple from collections import namedtuple
DeviceType = namedtuple('DeviceType', 'device_class,unit_of_measurement,suffix') # DeviceType = namedtuple('DeviceType', 'device_class,unit_of_measurement,suffix')
@dataclass
class DeviceType:
device_class: typing.Optional[str] = None
unit_of_measurement: typing.Optional[str] = None
suffix: typing.Optional[str] = None
delay: typing.Optional[float] = None
def parse_scan_page(page: str): def parse_scan_page(page: str):
@@ -32,39 +41,40 @@ def parse_scan_page(page: str):
continue continue
classes = i2c_classes.get(dev, []) classes = i2c_classes.get(dev, [])
for i, c in enumerate(classes): for i, c in enumerate(classes):
_params = params.copy()
if c is Skip: if c is Skip:
continue continue
elif c is Request: elif c is Request:
req.append(params) req.append(_params)
continue continue
elif isinstance(c, Request): elif isinstance(c, Request):
if c.delay: if c.delay:
params = params.copy() _params['delay'] = c.delay
params['delay'] = c.delay req.append(_params)
req.append(params)
continue continue
elif isinstance(c, DeviceType): elif isinstance(c, DeviceType):
c, m, suffix = c c, m, suffix, delay = astuple(c)
if delay is not None:
_params['delay'] = delay
else: else:
continue continue
suffix = suffix or c suffix = suffix or c
if 'addr' in params: if 'addr' in _params:
suffix += f"_{params['addr']}" if suffix else str(params['addr']) suffix += f"_{_params['addr']}" if suffix else str(_params['addr'])
if suffix: if suffix:
_dev = f'{dev}_{suffix}' _dev = f'{dev}_{suffix}'
else: else:
_dev = dev _dev = dev
params = params.copy()
if i > 0: if i > 0:
params['i2c_par'] = i _params['i2c_par'] = i
ret.append({ ret.append({
'id_suffix': _dev, 'id_suffix': _dev,
'device_class': c, 'device_class': c,
'params': params, 'params': _params,
'unit_of_measurement': m, 'unit_of_measurement': m,
}) })
req.append(params) req.append(_params)
return req, ret return req, ret
@@ -83,7 +93,7 @@ i2c_classes = {
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None), DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
], ],
'sht31': [ 'sht31': [
DeviceType(DEVICE_CLASS_HUMIDITY, PERCENTAGE, None), DeviceType(DEVICE_CLASS_HUMIDITY, PERCENTAGE, None, delay=0.5),
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None), DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
], ],
'max44009': [ 'max44009': [

View File

@@ -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.1.0" "version": "v1.1.1b1"
} }

View File

@@ -83,6 +83,9 @@ mega:
диммера набирает от 0 до 100% диммера набирает от 0 до 100%
- **range** (list[int, int], [0, 255]), *начиная с версии 1.1.0*: границы диммирования в абсолютных единицах 0..255. При диммировании 1% - **range** (list[int, int], [0, 255]), *начиная с версии 1.1.0*: границы диммирования в абсолютных единицах 0..255. При диммировании 1%
будет равен левой границе, 100% - правой. будет равен левой границе, 100% - правой.
```yaml
range: [20, 200]
```
[Подробнее про плавное диммирование](smooth.md) [Подробнее про плавное диммирование](smooth.md)
### MegaD-16R-XT, MegaD-16PWM ### MegaD-16R-XT, MegaD-16PWM
Порты расширителей MegaD-16R-XT, MegaD-16PWM конфигурируются аналогично обычным реле и диммерам, но адресация порта Порты расширителей MegaD-16R-XT, MegaD-16PWM конфигурируются аналогично обычным реле и диммерам, но адресация порта