59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
from homeassistant.components.number import NumberEntity
|
|
|
|
from .core.const import DOMAIN
|
|
from .core.entity import XEntity
|
|
from .core.ewelink import SIGNAL_ADD_ENTITIES, XRegistry
|
|
|
|
PARALLEL_UPDATES = 0 # fix entity_platform parallel_updates Semaphore
|
|
|
|
|
|
async def async_setup_entry(hass, config_entry, add_entities):
|
|
ewelink: XRegistry = hass.data[DOMAIN][config_entry.entry_id]
|
|
ewelink.dispatcher_connect(
|
|
SIGNAL_ADD_ENTITIES,
|
|
lambda x: add_entities([e for e in x if isinstance(e, NumberEntity)]),
|
|
)
|
|
|
|
|
|
# noinspection PyAbstractClass
|
|
class XNumber(XEntity, NumberEntity):
|
|
multiply: float = None
|
|
round: int = None
|
|
|
|
def set_state(self, params: dict):
|
|
value = params[self.param]
|
|
if self.multiply:
|
|
value *= self.multiply
|
|
if self.round is not None:
|
|
# convert to int when round is zero
|
|
value = round(value, self.round or None)
|
|
self._attr_native_value = value
|
|
|
|
async def async_set_native_value(self, value: float) -> None:
|
|
if self.multiply:
|
|
value /= self.multiply
|
|
await self.ewelink.send(self.device, {self.param: int(value)})
|
|
|
|
|
|
class XPulseWidth(XNumber):
|
|
param = "pulseWidth"
|
|
|
|
__attr_entity_registry_enabled_default = False
|
|
|
|
_attr_native_max_value = 36000
|
|
_attr_native_min_value = 0.5
|
|
_attr_native_step = 0.5
|
|
|
|
def set_state(self, params: dict):
|
|
self._attr_native_value = params["pulseWidth"] / 1000
|
|
|
|
async def async_set_native_value(self, value: float) -> None:
|
|
"""
|
|
we need to send {'pulse': 'on'} in order to also set the pilseWidth
|
|
else it'll reject the command
|
|
also, since value is in (float) seconds, ensure we send milliseconds
|
|
in 500 multiples (int(value / .5) * 500)
|
|
"""
|
|
await self.ewelink.send(
|
|
self.device, {"pulse": "on", "pulseWidth": int(value / 0.5) * 500}
|
|
)
|