mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-11 17:14:28 +05:00
add brightness range
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user