diff --git a/custom_components/tuya_v2/__init__.py b/custom_components/tuya_v2/__init__.py index 2d3df40..4248ee1 100644 --- a/custom_components/tuya_v2/__init__.py +++ b/custom_components/tuya_v2/__init__.py @@ -36,6 +36,7 @@ TUYA_DISCOVERY_NEW, TUYA_HA_DEVICES, TUYA_HA_TUYA_MAP, + TUYA_HOME_MANAGER, TUYA_MQTT_LISTENER, TUYA_SETUP_PLATFORM, TUYA_SUPPORT_HA_TYPE, @@ -104,6 +105,7 @@ async def _init_tuya_sdk(hass: HomeAssistant, entry: ConfigEntry) -> bool: # Get device list home_manager = TuyaHomeManager(api, tuya_mq, device_manager) await hass.async_add_executor_job(home_manager.update_device_cache) + hass.data[DOMAIN][TUYA_HOME_MANAGER] = home_manager class DeviceListener(TuyaDeviceListener): """Device Update Listener.""" diff --git a/custom_components/tuya_v2/binary_sensor.py b/custom_components/tuya_v2/binary_sensor.py index 514fb8d..431c3c1 100644 --- a/custom_components/tuya_v2/binary_sensor.py +++ b/custom_components/tuya_v2/binary_sensor.py @@ -14,6 +14,7 @@ DEVICE_CLASS_PROBLEM, DEVICE_CLASS_SMOKE, DEVICE_CLASS_LOCK, + DEVICE_CLASS_BATTERY, DOMAIN as DEVICE_DOMAIN, BinarySensorEntity, ) @@ -48,14 +49,18 @@ DPCODE_SWITCH = "switch" + +DPCODE_BATTERY_STATE = "battery_state" + DPCODE_DOORCONTACT_STATE = "doorcontact_state" DPCODE_SMOKE_SENSOR_STATE = "smoke_sensor_state" +DPCODE_SMOKE_SENSOR_STATUS = "smoke_sensor_status" DPCODE_GAS_SENSOR_STATE = "gas_sensor_state" DPCODE_PIR = "pir" DPCODE_WATER_SENSOR_STATE = "watersensor_state" DPCODE_SOS_STATE = "sos_state" DPCODE_PRESENCE_STATE = "presence_state" - +DPCODE_TEMPER_ALRAM = "temper_alarm" DPCODE_DOORLOCK_STATE = "closed_opened" @@ -133,6 +138,33 @@ def _setup_entities(hass, device_ids: List): (lambda d: d.status.get(DPCODE_SMOKE_SENSOR_STATE, 1) == "1"), ) ) + if DPCODE_SMOKE_SENSOR_STATUS in device.status: + entities.append( + TuyaHaBSensor( + device, + device_manager, + DEVICE_CLASS_SMOKE, + (lambda d: d.status.get(DPCODE_SMOKE_SENSOR_STATUS, 'normal') == "alarm"), + ) + ) + if DPCODE_BATTERY_STATE in device.status: + entities.append( + TuyaHaBSensor( + device, + device_manager, + DEVICE_CLASS_BATTERY, + (lambda d: d.status.get(DPCODE_BATTERY_STATE, 'normal') == "low"), + ) + ) + if DPCODE_TEMPER_ALRAM in device.status: + entities.append( + TuyaHaBSensor( + device, + device_manager, + DEVICE_CLASS_MOTION, + (lambda d: d.status.get(DPCODE_TEMPER_ALRAM, False)), + ) + ) if DPCODE_GAS_SENSOR_STATE in device.status: entities.append( TuyaHaBSensor( @@ -148,7 +180,7 @@ def _setup_entities(hass, device_ids: List): device, device_manager, DEVICE_CLASS_MOTION, - (lambda d: d.status.get(DPCODE_PIR, "none") == "1"), + (lambda d: d.status.get(DPCODE_PIR, "none") == "pir"), ) ) if DPCODE_WATER_SENSOR_STATE in device.status: @@ -157,7 +189,7 @@ def _setup_entities(hass, device_ids: List): device, device_manager, DEVICE_CLASS_MOISTURE, - (lambda d: d.status.get(DPCODE_WATER_SENSOR_STATE, "none") == "1"), + (lambda d: d.status.get(DPCODE_WATER_SENSOR_STATE, "normal") == "alarm"), ) ) if DPCODE_SOS_STATE in device.status: diff --git a/custom_components/tuya_v2/config_flow.py b/custom_components/tuya_v2/config_flow.py index 707e229..1deaa7a 100644 --- a/custom_components/tuya_v2/config_flow.py +++ b/custom_components/tuya_v2/config_flow.py @@ -81,15 +81,14 @@ def _try_login(cls, user_input): if project_type == ProjectType.INDUSTY_SOLUTIONS: response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) else: - for endpoint in TUYA_ENDPOINT.keys(): - api.endpoint = endpoint - response = api.login(user_input[CONF_USERNAME], - user_input[CONF_PASSWORD], - user_input[CONF_COUNTRY_CODE], - user_input[CONF_APP_TYPE]) - if response.get("success", False): - user_input[CONF_ENDPOINT] = endpoint - break + api.endpoint = "https://openapi.tuyacn.com" + response = api.login(user_input[CONF_USERNAME], + user_input[CONF_PASSWORD], + user_input[CONF_COUNTRY_CODE], + user_input[CONF_APP_TYPE]) + if response.get("success", False): + api.endpoint = api.token_info.platform_url + user_input[CONF_ENDPOINT] = api.token_info.platform_url _LOGGER.info(f"TuyaConfigFlow._try_login finish, response:, {response}") return response diff --git a/custom_components/tuya_v2/const.py b/custom_components/tuya_v2/const.py index 5f55e3d..3c96505 100644 --- a/custom_components/tuya_v2/const.py +++ b/custom_components/tuya_v2/const.py @@ -14,6 +14,7 @@ TUYA_DISCOVERY_NEW = "tuya_v2_discovery_new_{}" TUYA_DEVICE_MANAGER = "tuya_device_manager" +TUYA_HOME_MANAGER = "tuya_home_manager" TUYA_MQTT_LISTENER = "tuya_mqtt_listener" TUYA_HA_TUYA_MAP = "tuya_ha_tuya_map" TUYA_HA_DEVICES = "tuya_ha_devices" @@ -43,10 +44,7 @@ "humidifier", "number", "vacuum", - "select" + "select", + # "remote" # 'alarm_control_panel' ] - -TUYA_AIR_PURIFIER_TYPE = "kj" -TUYA_FAN_TYPE = "fs" -TUYA_PET_WATER_FEEDER_TYPE = "cwysj" diff --git a/custom_components/tuya_v2/cover.py b/custom_components/tuya_v2/cover.py index 0558835..ffd5fdd 100644 --- a/custom_components/tuya_v2/cover.py +++ b/custom_components/tuya_v2/cover.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Support for Tuya Cover.""" +from __future__ import annotations import logging from typing import Any, List @@ -18,7 +19,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect from .base import TuyaHaDevice -from .const import DOMAIN, TUYA_DEVICE_MANAGER, TUYA_DISCOVERY_NEW, TUYA_HA_TUYA_MAP +from .const import DOMAIN, TUYA_DEVICE_MANAGER, TUYA_DISCOVERY_NEW, TUYA_HA_TUYA_MAP, TUYA_HA_DEVICES _LOGGER = logging.getLogger(__name__) @@ -28,6 +29,7 @@ # https://developer.tuya.com/en/docs/iot/f?id=K9gf46o5mtfyc DPCODE_CONTROL = "control" DPCODE_PERCENT_CONTROL = "percent_control" +DPCODE_PERCENT_STATE = "percent_state" ATTR_POSITION = "position" @@ -46,6 +48,7 @@ async def async_discover_device(dev_ids): if not dev_ids: return entities = await hass.async_add_executor_job(_setup_entities, hass, dev_ids) + hass.data[DOMAIN][TUYA_HA_DEVICES].extend(entities) async_add_entities(entities) async_dispatcher_connect( @@ -81,10 +84,15 @@ def device_class(self) -> str: """Return Entity Properties.""" return DEVICE_CLASS_CURTAIN + @property + def is_closed(self) -> bool | None: + return False + @property def current_cover_position(self) -> int: """Return cover current position.""" - return self.tuya_device.status.get(DPCODE_PERCENT_CONTROL, 0) + position = self.tuya_device.status.get(DPCODE_PERCENT_STATE, 0) + return 100 - position def open_cover(self, **kwargs: Any) -> None: """Open the cover.""" diff --git a/custom_components/tuya_v2/fan.py b/custom_components/tuya_v2/fan.py index c932b38..1cbb456 100644 --- a/custom_components/tuya_v2/fan.py +++ b/custom_components/tuya_v2/fan.py @@ -29,9 +29,7 @@ TUYA_DEVICE_MANAGER, TUYA_DISCOVERY_NEW, TUYA_HA_DEVICES, - TUYA_HA_TUYA_MAP, - TUYA_AIR_PURIFIER_TYPE, - TUYA_FAN_TYPE, + TUYA_HA_TUYA_MAP ) _LOGGER = logging.getLogger(__name__) @@ -47,21 +45,23 @@ # Air Purifier # https://developer.tuya.com/en/docs/iot/s?id=K9gf48r41mn81 -DPCODE_AP_FAN_SPEED = "speed" +DPCODE_AP_FAN_SPEED = "speed" DPCODE_AP_FAN_SPEED_ENUM = "fan_speed_enum" TUYA_SUPPORT_TYPE = { - TUYA_FAN_TYPE, - TUYA_AIR_PURIFIER_TYPE + "fs", # Fan + "kj", # Air Purifier } + async def async_setup_entry( hass: HomeAssistant, _entry: ConfigEntry, async_add_entities ): """Set up tuya fan dynamically through tuya discovery.""" _LOGGER.info("fan init") - hass.data[DOMAIN][TUYA_HA_TUYA_MAP].update({DEVICE_DOMAIN: TUYA_SUPPORT_TYPE}) + hass.data[DOMAIN][TUYA_HA_TUYA_MAP].update( + {DEVICE_DOMAIN: TUYA_SUPPORT_TYPE}) async def async_discover_device(dev_ids): """Discover and add a discovered tuya fan.""" @@ -98,30 +98,33 @@ def _setup_entities(hass, device_ids: list): class TuyaHaFan(TuyaHaDevice, FanEntity): """Tuya Fan Device.""" - + def __init__(self, device: TuyaDevice, device_manager: TuyaDeviceManager): """Init Tuya Fan Device.""" super().__init__(device, device_manager) - + # Air purifier fan can be controlled either via the ranged values or via the enum. # We will always prefer the enumeration if available # Enum is used for e.g. MEES SmartHIMOX-H06 # Range is used for e.g. Concept CA3000 - self.air_purifier_speed_range = (0, 0) - self.air_purifier_speed_range_len = 0 + self.air_purifier_speed_range = (0, 0) + self.air_purifier_speed_range_len = 0 self.air_purifier_speed_range_enum = [] - if self.tuya_device.category == TUYA_AIR_PURIFIER_TYPE: + if self.tuya_device.category == "kj": try: if DPCODE_AP_FAN_SPEED_ENUM in self.tuya_device.status: - data = json.loads(self.tuya_device.function.get(DPCODE_AP_FAN_SPEED_ENUM, {}).values).get("range") + data = json.loads(self.tuya_device.function.get( + DPCODE_AP_FAN_SPEED_ENUM, {}).values).get("range") if data: self.air_purifier_speed_range = (1, len(data)) self.air_purifier_speed_range_len = len(data) self.air_purifier_speed_range_enum = data elif DPCODE_AP_FAN_SPEED in self.tuya_device.status: - data = json.loads(self.tuya_device.function.get(DPCODE_AP_FAN_SPEED, {}).values).get("range") + data = json.loads(self.tuya_device.function.get( + DPCODE_AP_FAN_SPEED, {}).values).get("range") if data: - self.air_purifier_speed_range = (int(data[0]), int(data[-1])) + self.air_purifier_speed_range = ( + int(data[0]), int(data[-1])) self.air_purifier_speed_range_len = len(data) except: _LOGGER.warn("Cannot parse the air-purifier speed range") @@ -132,17 +135,21 @@ def set_preset_mode(self, preset_mode: str) -> None: def set_direction(self, direction: str) -> None: """Set the direction of the fan.""" - self._send_command([{"code": DPCODE_FAN_DIRECTION, "value": direction}]) - + self._send_command( + [{"code": DPCODE_FAN_DIRECTION, "value": direction}]) + def set_percentage(self, percentage: int) -> None: """Set the speed of the fan, as a percentage.""" - if self.tuya_device.category == TUYA_AIR_PURIFIER_TYPE: - value_in_range = ceil(percentage_to_ranged_value(self.air_purifier_speed_range, percentage)) + if self.tuya_device.category == "kj": + value_in_range = ceil(percentage_to_ranged_value( + self.air_purifier_speed_range, percentage)) if len(self.air_purifier_speed_range_enum): # if air-purifier speed enumeration is supported we will prefer it. - self._send_command([{"code": DPCODE_AP_FAN_SPEED_ENUM, "value": str(self.air_purifier_speed_range_enum[value_in_range - 1])}]) + self._send_command([{"code": DPCODE_AP_FAN_SPEED_ENUM, "value": str( + self.air_purifier_speed_range_enum[value_in_range - 1])}]) else: - self._send_command([{"code": DPCODE_AP_FAN_SPEED, "value": str(value_in_range)}]) + self._send_command( + [{"code": DPCODE_AP_FAN_SPEED, "value": str(value_in_range)}]) else: super().set_percentage(percentage) @@ -162,7 +169,8 @@ def turn_on( def oscillate(self, oscillating: bool) -> None: """Oscillate the fan.""" - self._send_command([{"code": DPCODE_SWITCH_HORIZONTAL, "value": oscillating}]) + self._send_command( + [{"code": DPCODE_SWITCH_HORIZONTAL, "value": oscillating}]) # property @property @@ -206,29 +214,30 @@ def percentage(self) -> int: """Return the current speed.""" if not self.is_on: return 0 - - if self.tuya_device.category == TUYA_AIR_PURIFIER_TYPE: + + if self.tuya_device.category == "kj": if self.air_purifier_speed_range_len > 1: if len(self.air_purifier_speed_range_enum): # if air-purifier speed enumeration is supported we will prefer it. index = self.air_purifier_speed_range_enum.index( - self.tuya_device.status.get(DPCODE_AP_FAN_SPEED_ENUM, 0) + self.tuya_device.status.get( + DPCODE_AP_FAN_SPEED_ENUM, 0) ) return ranged_value_to_percentage(self.air_purifier_speed_range, - index + 1 - ) + index + 1 + ) else: return ranged_value_to_percentage(self.air_purifier_speed_range, - int(self.tuya_device.status.get(DPCODE_AP_FAN_SPEED, 0) - ) - ) + int(self.tuya_device.status.get(DPCODE_AP_FAN_SPEED, 0) + ) + ) else: return self.tuya_device.status.get(DPCODE_FAN_SPEED, 0) @property def speed_count(self) -> int: """Return the number of speeds the fan supports.""" - if self.tuya_device.category == TUYA_AIR_PURIFIER_TYPE: + if self.tuya_device.category == "kj": return self.air_purifier_speed_range_len return super().speed_count() @@ -244,7 +253,7 @@ def supported_features(self): supports = supports | SUPPORT_OSCILLATE if DPCODE_FAN_DIRECTION in self.tuya_device.status: supports = supports | SUPPORT_DIRECTION - + # Air Purifier specific if DPCODE_AP_FAN_SPEED in self.tuya_device.status or DPCODE_AP_FAN_SPEED_ENUM in self.tuya_device.status: supports = supports | SUPPORT_SET_SPEED diff --git a/custom_components/tuya_v2/humidifier.py b/custom_components/tuya_v2/humidifier.py index f626339..3f9a408 100644 --- a/custom_components/tuya_v2/humidifier.py +++ b/custom_components/tuya_v2/humidifier.py @@ -135,7 +135,7 @@ def turn_on(self, **kwargs): def turn_off(self, **kwargs): """Turn the device off.""" self._send_command([{"code": self.dp_switch, "value": False}]) - + def set_humidity(self, humidity): """Set new target humidity.""" self._send_command([{"code": DPCODE_HUMIDITY_SET, "value": humidity}]) diff --git a/custom_components/tuya_v2/manifest.json b/custom_components/tuya_v2/manifest.json index 1c893f1..c6db93a 100644 --- a/custom_components/tuya_v2/manifest.json +++ b/custom_components/tuya_v2/manifest.json @@ -1,10 +1,10 @@ { "domain": "tuya_v2", "name": "Tuya v2", - "version": "1.3.1", + "version": "1.3.2", "documentation": "https://github.com/tuya/tuya-home-assistant", "requirements": [ - "tuya-iot-py-sdk==0.3.0" + "tuya-iot-py-sdk==0.3.1" ], "codeowners": [ "@Tuya" diff --git a/custom_components/tuya_v2/remote.py b/custom_components/tuya_v2/remote.py new file mode 100644 index 0000000..f7ff1ab --- /dev/null +++ b/custom_components/tuya_v2/remote.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Support for Tuya switches.""" +from __future__ import annotations + +import logging +from typing import Any + +from tuya_iot import TuyaHomeManager + +from homeassistant.components.remote import RemoteEntity +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.dispatcher import async_dispatcher_connect + +from .base import TuyaHaDevice +from .const import ( + DOMAIN, + TUYA_HOME_MANAGER +) + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry( + hass: HomeAssistant, _entry: ConfigEntry, async_add_entities +): + """Set up tuya scenes.""" + _LOGGER.info("scenes remote init") + + entities = [] + + scenes = await hass.async_add_executor_job(hass.data[DOMAIN][TUYA_HOME_MANAGER].query_scenes) + for scene in scenes: + entities.append(TuyaHAScene(scene)) + + async_add_entities(entities) + +class TuyaHAScene(TuyaHaDevice, RemoteEntity): + """Tuya Scene Remote.""" + + def __init__(self, scene) -> None: + """Init Tuya Scene.""" + super().__init__() + + self.scene = scene + self.entity_id = f"tuya_v2.ty{self.scene.scene_id}" + + @property + def should_poll(self) -> bool: + """Hass should not poll.""" + return False + + @property + def unique_id(self) -> str | None: + """Return a unique ID.""" + return f"tys{self.scene.scene_id}" + + @property + def name(self) -> str | None: + """Return Tuya scene name.""" + return self.scene.name + + @property + def device_info(self): + """Return a device description for device registry.""" + _device_info = { + "identifiers": {(DOMAIN, f"{self.scene.scene_id}")}, + "manufacturer": "tuya", + "name": self.scene.name, + "model": "Tuya Scene", + } + return _device_info + + @property + def available(self) -> bool: + """Return if the scene is enabled.""" + return self.scene.enabled diff --git a/custom_components/tuya_v2/sensor.py b/custom_components/tuya_v2/sensor.py index ab88497..cccbdff 100644 --- a/custom_components/tuya_v2/sensor.py +++ b/custom_components/tuya_v2/sensor.py @@ -33,7 +33,6 @@ TUYA_DISCOVERY_NEW, TUYA_HA_DEVICES, TUYA_HA_TUYA_MAP, - TUYA_AIR_PURIFIER_TYPE, ) _LOGGER = logging.getLogger(__name__) @@ -53,7 +52,8 @@ "dlq", # Breaker "ldcg", # Luminance Sensor "ms", # Residential Lock - TUYA_AIR_PURIFIER_TYPE, # Air Purifier + "dj", # Smart RGB Plug + "kj", # Air Purifier ] # Smoke Detector @@ -61,7 +61,7 @@ DPCODE_BATTERY = "va_battery" DPCODE_BATTERY_PERCENTAGE = "battery_percentage" DPCODE_BATTERY_CODE = "battery" -DPCODE_BATTERY_STATE = "battery_state" + DPCODE_TEMPERATURE = "va_temperature" DPCODE_HUMIDITY = "va_humidity" @@ -136,7 +136,7 @@ def _setup_entities(hass, device_ids: List): if device is None: continue - if device.category == TUYA_AIR_PURIFIER_TYPE: + if device.category == "kj": if DPCODE_AP_PM25 in device.status: entities.append( TuyaHaSensor( @@ -278,16 +278,6 @@ def _setup_entities(hass, device_ids: List): PERCENTAGE, ) ) - if DPCODE_BATTERY_STATE in device.status: - entities.append( - TuyaHaSensor( - device, - device_manager, - DEVICE_CLASS_BATTERY, - DPCODE_BATTERY_STATE, - "", - ) - ) if DPCODE_TEMPERATURE in device.status: entities.append( diff --git a/custom_components/tuya_v2/switch.py b/custom_components/tuya_v2/switch.py index 405109b..c504c16 100644 --- a/custom_components/tuya_v2/switch.py +++ b/custom_components/tuya_v2/switch.py @@ -18,23 +18,19 @@ TUYA_DEVICE_MANAGER, TUYA_DISCOVERY_NEW, TUYA_HA_DEVICES, - TUYA_HA_TUYA_MAP, - TUYA_AIR_PURIFIER_TYPE, - TUYA_PET_WATER_FEEDER_TYPE, + TUYA_HA_TUYA_MAP ) _LOGGER = logging.getLogger(__name__) -AIR_PURIFIER_TYPE = "kj" - TUYA_SUPPORT_TYPE = { "kg", # Switch "cz", # Socket "pc", # Power Strip "bh", # Smart Kettle "dlq", # Breaker - TUYA_PET_WATER_FEEDER_TYPE, # Pet Water Feeder - TUYA_AIR_PURIFIER_TYPE # Air Purifier + "cwysj", # Pet Water Feeder + "kj" # Air Purifier } # Switch(kg), Socket(cz), Power Strip(pc) @@ -45,25 +41,29 @@ # https://developer.tuya.com/en/docs/iot/categorykj?id=Kaiuz1atqo5l7 # Pet Water Feeder # https://developer.tuya.com/en/docs/iot/f?id=K9gf46aewxem5 -DPCODE_ANION = "anion" # Air Purifier - Ionizer unit -DPCODE_FRESET = "filter_reset" # Air Purifier - Filter cartridge resetting; Pet Water Feeder - Filter cartridge resetting -DPCODE_LIGHT = "light" # Air Purifier - Light -DPCODE_LOCK = "lock" # Air Purifier - Child lock -DPCODE_UV = "uv" # Air Purifier - UV sterilization; Pet Water Feeder - UV sterilization -DPCODE_WET = "wet" # Air Purifier - Humidification unit +DPCODE_ANION = "anion" # Air Purifier - Ionizer unit +# Air Purifier - Filter cartridge resetting; Pet Water Feeder - Filter cartridge resetting +DPCODE_FRESET = "filter_reset" +DPCODE_LIGHT = "light" # Air Purifier - Light +DPCODE_LOCK = "lock" # Air Purifier - Child lock +# Air Purifier - UV sterilization; Pet Water Feeder - UV sterilization +DPCODE_UV = "uv" +DPCODE_WET = "wet" # Air Purifier - Humidification unit DPCODE_PRESET = "pump_reset" # Pet Water Feeder - Water pump resetting DPCODE_WRESET = "water_reset" # Pet Water Feeder - Resetting of water usage days DPCODE_START = "start" + async def async_setup_entry( hass: HomeAssistant, _entry: ConfigEntry, async_add_entities ): """Set up tuya sensors dynamically through tuya discovery.""" _LOGGER.info("switch init") - hass.data[DOMAIN][TUYA_HA_TUYA_MAP].update({DEVICE_DOMAIN: TUYA_SUPPORT_TYPE}) + hass.data[DOMAIN][TUYA_HA_TUYA_MAP].update( + {DEVICE_DOMAIN: TUYA_SUPPORT_TYPE}) async def async_discover_device(dev_ids): """Discover and add a discovered tuya sensor.""" @@ -96,24 +96,29 @@ def _setup_entities(hass, device_ids: list): continue for function in device.function: - if device.category == TUYA_AIR_PURIFIER_TYPE: + if device.category == "kj": if function in [DPCODE_ANION, DPCODE_FRESET, DPCODE_LIGHT, DPCODE_LOCK, DPCODE_UV, DPCODE_WET]: - entities.append(TuyaHaSwitch(device, device_manager, function)) + entities.append(TuyaHaSwitch( + device, device_manager, function)) # Main device switch is handled by the Fan object - elif device.category == TUYA_PET_WATER_FEEDER_TYPE: + elif device.category == "cwysj": if function in [DPCODE_FRESET, DPCODE_UV, DPCODE_PRESET, DPCODE_WRESET]: - entities.append(TuyaHaSwitch(device, device_manager, function)) - + entities.append(TuyaHaSwitch( + device, device_manager, function)) + if function.startswith(DPCODE_SWITCH): # Main device switch - entities.append(TuyaHaSwitch(device, device_manager, function)) + entities.append(TuyaHaSwitch( + device, device_manager, function)) continue else: if function.startswith(DPCODE_START): - entities.append(TuyaHaSwitch(device, device_manager, function)) - continue + entities.append(TuyaHaSwitch( + device, device_manager, function)) + continue if function.startswith(DPCODE_SWITCH): - entities.append(TuyaHaSwitch(device, device_manager, function)) + entities.append(TuyaHaSwitch( + device, device_manager, function)) continue return entities @@ -124,7 +129,6 @@ class TuyaHaSwitch(TuyaHaDevice, SwitchEntity): dp_code_switch = DPCODE_SWITCH dp_code_start = DPCODE_START - def __init__( self, device: TuyaDevice, device_manager: TuyaDeviceManager, dp_code: str = "" ) -> None: