diff --git a/custom_components/localtuya/binary_sensor.py b/custom_components/localtuya/binary_sensor.py index 4c742accf..34ba2aa0a 100644 --- a/custom_components/localtuya/binary_sensor.py +++ b/custom_components/localtuya/binary_sensor.py @@ -65,4 +65,6 @@ def status_updated(self): ) -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaBinarySensor) +async_setup_entry = partial( + async_setup_entry, DOMAIN, LocaltuyaBinarySensor, flow_schema +) diff --git a/custom_components/localtuya/common.py b/custom_components/localtuya/common.py index baba0fa6a..b2e467df6 100644 --- a/custom_components/localtuya/common.py +++ b/custom_components/localtuya/common.py @@ -40,7 +40,7 @@ def prepare_setup_entities(hass, config_entry, platform): async def async_setup_entry( - domain, entity_class, hass, config_entry, async_add_entities + domain, entity_class, flow_schema, hass, config_entry, async_add_entities ): """Set up a Tuya platform based on a config entry. @@ -53,8 +53,15 @@ async def async_setup_entry( if not entities_to_setup: return + dps_config_fields = list(get_dps_for_platform(flow_schema)) + entities = [] for device_config in entities_to_setup: + # Add DPS used by this platform to the request list + for dp_conf in dps_config_fields: + if dp_conf in device_config: + tuyainterface._interface.add_dps_to_request(device_config[dp_conf]) + entities.append( entity_class( tuyainterface, @@ -66,6 +73,13 @@ async def async_setup_entry( async_add_entities(entities) +def get_dps_for_platform(flow_schema): + """Return config keys for all platform keys that depends on a datapoint.""" + for key, value in flow_schema(None).items(): + if hasattr(value, "container") and value.container is None: + yield key.schema + + def get_entity_config(config_entry, dps_id): """Return entity config for a given DPS id.""" for entity in config_entry.data[CONF_ENTITIES]: diff --git a/custom_components/localtuya/cover.py b/custom_components/localtuya/cover.py index a95486e9f..18a19f8e0 100644 --- a/custom_components/localtuya/cover.py +++ b/custom_components/localtuya/cover.py @@ -165,4 +165,4 @@ def status_updated(self): self._current_cover_position = 50 -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaCover) +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaCover, flow_schema) diff --git a/custom_components/localtuya/fan.py b/custom_components/localtuya/fan.py index 81ddc891e..7fd881900 100644 --- a/custom_components/localtuya/fan.py +++ b/custom_components/localtuya/fan.py @@ -1,113 +1,113 @@ -"""Platform to locally control Tuya-based fan devices.""" -import logging -from functools import partial - -from homeassistant.components.fan import ( - FanEntity, - DOMAIN, - SPEED_OFF, - SPEED_LOW, - SPEED_MEDIUM, - SPEED_HIGH, - SUPPORT_SET_SPEED, - SUPPORT_OSCILLATE, -) - -from .common import LocalTuyaEntity, async_setup_entry - -_LOGGER = logging.getLogger(__name__) - - -def flow_schema(dps): - """Return schema used in config flow.""" - return {} - - -class LocaltuyaFan(LocalTuyaEntity, FanEntity): - """Representation of a Tuya fan.""" - - def __init__( - self, - device, - config_entry, - fanid, - **kwargs, - ): - """Initialize the entity.""" - super().__init__(device, config_entry, fanid, **kwargs) - self._is_on = False - self._speed = SPEED_OFF - self._oscillating = False - - @property - def oscillating(self): - """Return current oscillating status.""" - return self._oscillating - - @property - def is_on(self): - """Check if Tuya fan is on.""" - return self._is_on - - @property - def speed(self) -> str: - """Return the current speed.""" - return self._speed - - @property - def speed_list(self) -> list: - """Get the list of available speeds.""" - return [SPEED_OFF, SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH] - - def turn_on(self, speed: str = None, **kwargs) -> None: - """Turn on the entity.""" - self._device.set_dps(True, "1") - if speed is not None: - self.set_speed(speed) - else: - self.schedule_update_ha_state() - - def turn_off(self, **kwargs) -> None: - """Turn off the entity.""" - self._device.set_dps(False, "1") - self.schedule_update_ha_state() - - def set_speed(self, speed: str) -> None: - """Set the speed of the fan.""" - self._speed = speed - if speed == SPEED_OFF: - self._device.set_dps(False, "1") - elif speed == SPEED_LOW: - self._device.set_dps("1", "2") - elif speed == SPEED_MEDIUM: - self._device.set_dps("2", "2") - elif speed == SPEED_HIGH: - self._device.set_dps("3", "2") - self.schedule_update_ha_state() - - def oscillate(self, oscillating: bool) -> None: - """Set oscillation.""" - self._oscillating = oscillating - self._device.set_value("8", oscillating) - self.schedule_update_ha_state() - - @property - def supported_features(self) -> int: - """Flag supported features.""" - return SUPPORT_SET_SPEED | SUPPORT_OSCILLATE - - def status_updated(self): - """Get state of Tuya fan.""" - self._is_on = self._status["dps"]["1"] - if not self._status["dps"]["1"]: - self._speed = SPEED_OFF - elif self._status["dps"]["2"] == "1": - self._speed = SPEED_LOW - elif self._status["dps"]["2"] == "2": - self._speed = SPEED_MEDIUM - elif self._status["dps"]["2"] == "3": - self._speed = SPEED_HIGH - self._oscillating = self._status["dps"]["8"] - - -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaFan) +"""Platform to locally control Tuya-based fan devices.""" +import logging +from functools import partial + +from homeassistant.components.fan import ( + FanEntity, + DOMAIN, + SPEED_OFF, + SPEED_LOW, + SPEED_MEDIUM, + SPEED_HIGH, + SUPPORT_SET_SPEED, + SUPPORT_OSCILLATE, +) + +from .common import LocalTuyaEntity, async_setup_entry + +_LOGGER = logging.getLogger(__name__) + + +def flow_schema(dps): + """Return schema used in config flow.""" + return {} + + +class LocaltuyaFan(LocalTuyaEntity, FanEntity): + """Representation of a Tuya fan.""" + + def __init__( + self, + device, + config_entry, + fanid, + **kwargs, + ): + """Initialize the entity.""" + super().__init__(device, config_entry, fanid, **kwargs) + self._is_on = False + self._speed = SPEED_OFF + self._oscillating = False + + @property + def oscillating(self): + """Return current oscillating status.""" + return self._oscillating + + @property + def is_on(self): + """Check if Tuya fan is on.""" + return self._is_on + + @property + def speed(self) -> str: + """Return the current speed.""" + return self._speed + + @property + def speed_list(self) -> list: + """Get the list of available speeds.""" + return [SPEED_OFF, SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH] + + def turn_on(self, speed: str = None, **kwargs) -> None: + """Turn on the entity.""" + self._device.set_dps(True, "1") + if speed is not None: + self.set_speed(speed) + else: + self.schedule_update_ha_state() + + def turn_off(self, **kwargs) -> None: + """Turn off the entity.""" + self._device.set_dps(False, "1") + self.schedule_update_ha_state() + + def set_speed(self, speed: str) -> None: + """Set the speed of the fan.""" + self._speed = speed + if speed == SPEED_OFF: + self._device.set_dps(False, "1") + elif speed == SPEED_LOW: + self._device.set_dps("1", "2") + elif speed == SPEED_MEDIUM: + self._device.set_dps("2", "2") + elif speed == SPEED_HIGH: + self._device.set_dps("3", "2") + self.schedule_update_ha_state() + + def oscillate(self, oscillating: bool) -> None: + """Set oscillation.""" + self._oscillating = oscillating + self._device.set_value("8", oscillating) + self.schedule_update_ha_state() + + @property + def supported_features(self) -> int: + """Flag supported features.""" + return SUPPORT_SET_SPEED | SUPPORT_OSCILLATE + + def status_updated(self): + """Get state of Tuya fan.""" + self._is_on = self._status["dps"]["1"] + if not self._status["dps"]["1"]: + self._speed = SPEED_OFF + elif self._status["dps"]["2"] == "1": + self._speed = SPEED_LOW + elif self._status["dps"]["2"] == "2": + self._speed = SPEED_MEDIUM + elif self._status["dps"]["2"] == "3": + self._speed = SPEED_HIGH + self._oscillating = self._status["dps"]["8"] + + +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaFan, flow_schema) diff --git a/custom_components/localtuya/light.py b/custom_components/localtuya/light.py index 3a039d9b2..23b93e0f1 100644 --- a/custom_components/localtuya/light.py +++ b/custom_components/localtuya/light.py @@ -121,4 +121,4 @@ def status_updated(self): self._color_temp = self.dps(DPS_INDEX_COLOURTEMP) -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaLight) +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaLight, flow_schema) diff --git a/custom_components/localtuya/sensor.py b/custom_components/localtuya/sensor.py index a858bfe61..3f6699c69 100644 --- a/custom_components/localtuya/sensor.py +++ b/custom_components/localtuya/sensor.py @@ -69,4 +69,4 @@ def status_updated(self): self._state = state -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaSensor) +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaSensor, flow_schema) diff --git a/custom_components/localtuya/switch.py b/custom_components/localtuya/switch.py index b990f5262..6a03dca6a 100644 --- a/custom_components/localtuya/switch.py +++ b/custom_components/localtuya/switch.py @@ -78,4 +78,4 @@ def status_updated(self): self._state = self.dps(self._dps_id) -async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaSwitch) +async_setup_entry = partial(async_setup_entry, DOMAIN, LocaltuyaSwitch, flow_schema)