Compare commits

...

14 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
andvikt
f5519a595d Bump version: 1.1.0b0 → 1.1.0 2021-10-29 21:05:14 +03:00
andvikt
ee26759003 Bump version: 1.0.10b20 → 1.1.0b0 2021-10-29 21:04:30 +03:00
andvikt
8869ad9cee new config adressation 2021-10-29 20:14:18 +03:00
andvikt
27f1e05a3a new config adressation 2021-10-29 20:13:31 +03:00
andvikt
7fdc2fc9ff new config adressation 2021-10-29 20:12:59 +03:00
andvikt
28bf4393f0 Bump version: 1.0.10b19 → 1.0.10b20 2021-10-29 19:53:01 +03:00
andvikt
5ecb246eff fix brightness 2021-10-29 19:52:10 +03:00
Викторов Андрей Германович
3ee464a896 Bump version: 1.0.10b18 → 1.0.10b19 2021-10-29 15:26:28 +03:00
Викторов Андрей Германович
6368fd7cfc add fill_na 2021-10-29 15:26:21 +03:00
10 changed files with 64 additions and 29 deletions

View File

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

View File

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

View File

@@ -63,7 +63,7 @@ async def validate_input(hass: core.HomeAssistant, data):
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a config flow for mega."""
VERSION = 25
VERSION = 26
CONNECTION_CLASS = config_entries.CONN_CLASS_ASSUMED
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}
super().__init__(coordinator=mega.updater)
@property
def is_ws(self):
return False
@@ -130,11 +129,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
if self.hass is None or self.entity_id is None:
return {}
if self._customize is None:
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 = c.get(self._mega_id) or {}
c = c.get(self.port) or {}
@@ -431,6 +426,8 @@ class MegaOutPort(MegaPushEntity):
))
def _calc_brightness(self, brightness):
if brightness is None:
brightness = 0
pct = brightness / 255
pct = max((0, pct))
pct = min((pct, 1))
@@ -440,6 +437,8 @@ class MegaOutPort(MegaPushEntity):
return brightness
def _cal_reverse_brightness(self, brightness):
if brightness is None:
brightness = 0
l, h = self.range
d = h - l
pct = (brightness - l) / d

View File

@@ -427,7 +427,7 @@ class MegaD:
def subscribe(self, port, callback):
port = int_ignore(port)
self.lg.debug(
f'subscribe %s %s', port, str(callback)
f'subscribe %s', port,
)
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 bs4 import BeautifulSoup
from homeassistant.const import (
@@ -15,7 +16,15 @@ from homeassistant.const import (
)
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):
@@ -32,39 +41,40 @@ def parse_scan_page(page: str):
continue
classes = i2c_classes.get(dev, [])
for i, c in enumerate(classes):
_params = params.copy()
if c is Skip:
continue
elif c is Request:
req.append(params)
req.append(_params)
continue
elif isinstance(c, Request):
if c.delay:
params = params.copy()
params['delay'] = c.delay
req.append(params)
_params['delay'] = c.delay
req.append(_params)
continue
elif isinstance(c, DeviceType):
c, m, suffix = c
c, m, suffix, delay = astuple(c)
if delay is not None:
_params['delay'] = delay
else:
continue
suffix = suffix or c
if 'addr' in params:
suffix += f"_{params['addr']}" if suffix else str(params['addr'])
if 'addr' in _params:
suffix += f"_{_params['addr']}" if suffix else str(_params['addr'])
if suffix:
_dev = f'{dev}_{suffix}'
else:
_dev = dev
params = params.copy()
if i > 0:
params['i2c_par'] = i
_params['i2c_par'] = i
ret.append({
'id_suffix': _dev,
'device_class': c,
'params': params,
'params': _params,
'unit_of_measurement': m,
})
req.append(params)
req.append(_params)
return req, ret
@@ -83,7 +93,7 @@ i2c_classes = {
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
],
'sht31': [
DeviceType(DEVICE_CLASS_HUMIDITY, PERCENTAGE, None),
DeviceType(DEVICE_CLASS_HUMIDITY, PERCENTAGE, None, delay=0.5),
DeviceType(DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None),
],
'max44009': [

View File

@@ -15,5 +15,5 @@
"@andvikt"
],
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
"version": "v1.0.10b18"
"version": "v1.1.1b1"
}

View File

@@ -324,7 +324,10 @@ class Mega1WSensor(FilterBadValues):
n = super().name
c = self.customize.get(CONF_NAME, {})
if isinstance(c, dict):
c = c.get(self.key)
try:
c = c.get(self.key)
except:
pass
return c or n

View File

@@ -1,6 +1,25 @@
С помощью yaml-конфигурации можно кастомизировать ваши устройства.
## Основное
!!! note "Альтернативная адресация"
Начиная с v1.1.0 большинство параметров объектов можно записывать в более простой и понятной форме:
```yaml
mega: # название интеграции
entities:
sensor.some_sensor: #entity_id как в интерфейсе HA
filter_low: 20
filter_high: 40
```
Рекомендуется пользоваться именно этим способом, тк он более логичный и простой.
Некоторые параметры по своей логике (влияют на entity_id) не могут быть записаны таким образом, среди них:
- domain
- skip
- name
Остальные параметры можно записывать используя новый entities
Конфиг записывается стандартным образом в файл `configuration.yaml`, начинаем с
указания названия интеграции:
```yaml hl_lines="1"
@@ -64,6 +83,9 @@ mega:
диммера набирает от 0 до 100%
- **range** (list[int, int], [0, 255]), *начиная с версии 1.1.0*: границы диммирования в абсолютных единицах 0..255. При диммировании 1%
будет равен левой границе, 100% - правой.
```yaml
range: [20, 200]
```
[Подробнее про плавное диммирование](smooth.md)
### MegaD-16R-XT, MegaD-16PWM
Порты расширителей MegaD-16R-XT, MegaD-16PWM конфигурируются аналогично обычным реле и диммерам, но адресация порта

View File

@@ -22,7 +22,7 @@ nav:
- Конфигурация:
- В интерфейсе: settings.md
- Настройка обратной связи: http.md
- YAML-конфиг: yaml.md
- Кастомизация: yaml.md
- i2c: i2c.md
- Плавные переходы: smooth.md
- Автоматизация: