add brightness range

This commit is contained in:
Викторов Андрей Германович
2021-10-29 12:53:17 +03:00
parent 86f58bbfd9
commit 40ff7cca2e
4 changed files with 44 additions and 12 deletions

View File

@@ -52,6 +52,10 @@ LED_LIGHT = \
CUSTOMIZE_PORT = { CUSTOMIZE_PORT = {
vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool, vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool,
vol.Optional(CONF_RANGE, description='диапазон диммирования'): [
vol.Range(0, 255),
vol.Range(0, 255),
],
vol.Optional(CONF_INVERT, default=False): bool, vol.Optional(CONF_INVERT, default=False): bool,
vol.Optional(CONF_NAME): vol.Any(str, { vol.Optional(CONF_NAME): vol.Any(str, {
vol.Required(str): str vol.Required(str): str

View File

@@ -12,7 +12,7 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.restore_state import RestoreEntity
from . import hub as h from . import hub as h
from .const import DOMAIN, CONF_CUSTOM, CONF_INVERT, EVENT_BINARY_SENSOR, LONG, \ from .const import DOMAIN, CONF_CUSTOM, CONF_INVERT, EVENT_BINARY_SENSOR, LONG, \
LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK, EVENT_BINARY, CONF_SMOOTH LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK, EVENT_BINARY, CONF_SMOOTH, CONF_RANGE
_events_on = False _events_on = False
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@@ -308,35 +308,43 @@ class MegaOutPort(MegaPushEntity):
else: else:
return 255 return 255
@property
def range(self) -> typing.List[int]:
return self.customize.get(CONF_RANGE, [0, 255])
@property @property
def invert(self): def invert(self):
return self.customize.get(CONF_INVERT, False) return self.customize.get(CONF_INVERT, False)
@property @property
def brightness(self): def brightness(self):
ret = None
if not self.dimmer: if not self.dimmer:
return return
val = self.mega.values.get(self.port, {}) val = self.mega.values.get(self.port, {})
if isinstance(val, dict) and len(val) == 0 and self._state is not None: if isinstance(val, dict) and len(val) == 0 and self._state is not None:
return self._state.attributes.get("brightness") ret = safe_int(self._state.attributes.get("brightness"), def_on=self.max_dim, def_off=0, def_val=0)
ret = self._calc_brightness(ret)
elif isinstance(self.port, str) and 'e' in self.port: elif isinstance(self.port, str) and 'e' in self.port:
if isinstance(val, str): if isinstance(val, str):
val = safe_int(val) val = safe_int(val, def_on=self.max_dim, def_off=0, def_val=0)
else: else:
val = 0 val = 0
if val == 0: if val == 0:
return self._brightness ret = self._brightness
elif isinstance(val, (int, float)): elif isinstance(val, (int, float)):
return int(val / self.dimmer_scale) ret = int(val / self.dimmer_scale)
elif val is not None: elif val is not None:
val = val.get("value") val = val.get("value")
if val is None: if val is None:
return return
try: try:
val = int(val) val = int(val)
return val ret = val
except Exception: except Exception:
pass pass
ret = self._cal_reverse_brightness(ret)
return ret
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
@@ -422,6 +430,24 @@ class MegaOutPort(MegaPushEntity):
updater=partial(self.update_from_smooth, update_state=update_state), updater=partial(self.update_from_smooth, update_state=update_state),
)) ))
def _calc_brightness(self, brightness):
pct = brightness / 255
pct = max((0, pct))
pct = min((pct, 1))
l, h = self.range
d = h - l
brightness = round(pct * d + l)
return brightness
def _cal_reverse_brightness(self, brightness):
l, h = self.range
d = h - l
pct = (brightness - l) / d
pct = max((0, pct))
pct = min((pct, 1))
brightness = round(pct * 255)
return brightness
async def async_turn_on(self, brightness=None, transition=None, **kwargs): async def async_turn_on(self, brightness=None, transition=None, **kwargs):
if (time.time() - self._last_called) < 0.1: if (time.time() - self._last_called) < 0.1:
return return
@@ -431,6 +457,7 @@ class MegaOutPort(MegaPushEntity):
if not self.is_on and (brightness is None or brightness == 0): if not self.is_on and (brightness is None or brightness == 0):
brightness = self._restore_brightness brightness = self._restore_brightness
brightness = brightness or self.brightness or 255 brightness = brightness or self.brightness or 255
brightness = self._calc_brightness(brightness)
_prev = safe_int(self.brightness) or 0 _prev = safe_int(self.brightness) or 0
self._brightness = brightness self._brightness = brightness
if self.dimmer and brightness == 0: if self.dimmer and brightness == 0:
@@ -474,7 +501,7 @@ class MegaOutPort(MegaPushEntity):
if (time.time() - self._last_called) < 0.1: if (time.time() - self._last_called) < 0.1:
return return
self._last_called = time.time() self._last_called = time.time()
self._restore_brightness = safe_int(self._brightness) self._restore_brightness = self._cal_reverse_brightness(safe_int(self._brightness))
if not self.dimmer: if not self.dimmer:
transition = None transition = None
cmd = "0" if not self.invert else "1" cmd = "0" if not self.invert else "1"
@@ -510,12 +537,12 @@ class MegaOutPort(MegaPushEntity):
def safe_int(v): def safe_int(v, def_on=1, def_off=0, def_val=None):
if v == 'ON': if v == 'ON':
return 1 return def_on
elif v == 'OFF': elif v == 'OFF':
return 0 return def_off
try: try:
return int(v) return int(v)
except (ValueError, TypeError): except (ValueError, TypeError):
return None return def_val

View File

@@ -1,6 +1,7 @@
"""Platform for light integration.""" """Platform for light integration."""
import asyncio import asyncio
import logging import logging
import typing
from datetime import timedelta, datetime from datetime import timedelta, datetime
from functools import partial from functools import partial

View File

@@ -128,7 +128,7 @@ class FilterBadValues(MegaPushEntity):
self._prev_value is not None self._prev_value is not None
and self.filter_scale is not None and self.filter_scale is not None
and ( and (
abs(value - self._prev_value) / self._prev_value > self.filter_scale abs(value - self._prev_value) / self._prev_value > self.filter_scale
) )
): ):
value = self._prev_value value = self._prev_value