"""Tuya TS004F devices.""" from __future__ import annotations from zigpy.profiles import zha from zigpy.zcl.clusters.general import ( Basic, Groups, Identify, LevelControl, OnOff, Ota, PowerConfiguration, Scenes, Time, ) from zigpy.zcl.clusters.lighting import Color from zigpy.zcl.clusters.lightlink import LightLink from zhaquirks.const import ( ALT_SHORT_PRESS, BUTTON, BUTTON_1, BUTTON_2, BUTTON_3, BUTTON_4, CLUSTER_ID, COMMAND, COMMAND_MOVE, COMMAND_MOVE_SATURATION, COMMAND_OFF, COMMAND_ON, COMMAND_STEP, COMMAND_STOP, COMMAND_STOP_MOVE_STEP, COMMAND_TOGGLE, DEVICE_TYPE, DIM_DOWN, DIM_UP, DOUBLE_PRESS, ENDPOINT_ID, ENDPOINTS, INPUT_CLUSTERS, LEFT, LONG_PRESS, LONG_RELEASE, MODEL, MODELS_INFO, OUTPUT_CLUSTERS, PARAMS, PROFILE_ID, RIGHT, ROTATED, ROTATED_FAST, ROTATED_SLOW, SHORT_PRESS, TURN_OFF, TURN_ON, ) from zhaquirks.tuya import ( EnchantedDevice, TuyaNoBindPowerConfigurationCluster, TuyaSmartRemoteOnOffCluster, TuyaZBExternalSwitchTypeCluster, ) class TuyaSmartRemote004FROK(EnchantedDevice): """Tuya Smart (rotating) Knob device.""" signature = { # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=, *user_descriptor_available=False)", # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096]) MODELS_INFO: [ ("_TZ3000_4fjiwweb", "TS004F"), ("_TZ3000_uri7ongn", "TS004F"), ("_TZ3000_ixla93vd", "TS004F"), ("_TZ3000_qja6nq5z", "TS004F"), ("_TZ3000_csflgqj2", "TS004F"), ("_TZ3000_abrsvsou", "TS004F"), ], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, LightLink.cluster_id, ], }, }, } replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, TuyaNoBindPowerConfigurationCluster, Identify.cluster_id, Groups.cluster_id, # Is needed for adding group then binding is not working. LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, TuyaSmartRemoteOnOffCluster, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id, ], }, }, } device_automation_triggers = { (SHORT_PRESS, BUTTON): {COMMAND: COMMAND_TOGGLE, ENDPOINT_ID: 1, CLUSTER_ID: 6}, (LONG_RELEASE, BUTTON): { COMMAND: COMMAND_STOP_MOVE_STEP, ENDPOINT_ID: 1, CLUSTER_ID: 768, }, (LONG_PRESS, BUTTON): { COMMAND: COMMAND_MOVE_SATURATION, ENDPOINT_ID: 1, CLUSTER_ID: 768, PARAMS: {"move_mode": 1}, }, (ROTATED_SLOW, RIGHT): { COMMAND: COMMAND_STEP, ENDPOINT_ID: 1, CLUSTER_ID: 8, PARAMS: {"step_mode": 0, "step_size": 13}, }, (ROTATED_SLOW, LEFT): { COMMAND: COMMAND_STEP, ENDPOINT_ID: 1, CLUSTER_ID: 8, PARAMS: {"step_mode": 1, "step_size": 13}, }, (ROTATED_FAST, RIGHT): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"step_mode": 0, "step_size": 37}, }, (ROTATED_FAST, LEFT): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"step_mode": 1, "step_size": 37}, }, (SHORT_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS}, (LONG_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS}, (DOUBLE_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS}, (ROTATED, RIGHT): { COMMAND: RIGHT, ENDPOINT_ID: 1, CLUSTER_ID: 6, }, (ROTATED, LEFT): { COMMAND: LEFT, ENDPOINT_ID: 1, CLUSTER_ID: 6, }, } class TuyaSmartRemote004FDMS(EnchantedDevice): """Tuya 4 btton dimmer switch / remote device.""" signature = { # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=, *user_descriptor_available=False)", # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096]) MODELS_INFO: [ ("_TZ3000_xabckq1v", "TS004F"), ("_TZ3000_czuyt8lz", "TS004F"), ("_TZ3000_b3mgfu0d", "TS004F"), ], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, LightLink.cluster_id, ], }, }, } replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, TuyaNoBindPowerConfigurationCluster, Identify.cluster_id, Groups.cluster_id, # Is needed for adding group then binding is not working. LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, TuyaSmartRemoteOnOffCluster, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id, ], }, 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ TuyaSmartRemoteOnOffCluster, ], OUTPUT_CLUSTERS: [], }, 3: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ TuyaSmartRemoteOnOffCluster, ], OUTPUT_CLUSTERS: [], }, 4: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ TuyaSmartRemoteOnOffCluster, ], OUTPUT_CLUSTERS: [], }, }, } device_automation_triggers = { (SHORT_PRESS, TURN_ON): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 1}, (SHORT_PRESS, TURN_OFF): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 1}, (SHORT_PRESS, DIM_UP): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"step_mode": 0}, }, (LONG_PRESS, DIM_UP): { COMMAND: COMMAND_MOVE, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"move_mode": 0}, }, (SHORT_PRESS, DIM_DOWN): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"step_mode": 1}, }, (LONG_PRESS, DIM_DOWN): { COMMAND: COMMAND_MOVE, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"move_mode": 1}, }, (LONG_RELEASE, DIM_DOWN): { COMMAND: COMMAND_STOP, CLUSTER_ID: 8, ENDPOINT_ID: 1, }, (SHORT_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS}, (LONG_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS}, (DOUBLE_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS}, (SHORT_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: SHORT_PRESS}, (LONG_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: LONG_PRESS}, (DOUBLE_PRESS, BUTTON_2): {ENDPOINT_ID: 2, COMMAND: DOUBLE_PRESS}, (SHORT_PRESS, BUTTON_3): {ENDPOINT_ID: 3, COMMAND: SHORT_PRESS}, (LONG_PRESS, BUTTON_3): {ENDPOINT_ID: 3, COMMAND: LONG_PRESS}, (DOUBLE_PRESS, BUTTON_3): {ENDPOINT_ID: 3, COMMAND: DOUBLE_PRESS}, (SHORT_PRESS, BUTTON_4): {ENDPOINT_ID: 4, COMMAND: SHORT_PRESS}, (LONG_PRESS, BUTTON_4): {ENDPOINT_ID: 4, COMMAND: LONG_PRESS}, (DOUBLE_PRESS, BUTTON_4): {ENDPOINT_ID: 4, COMMAND: DOUBLE_PRESS}, } class TuyaSmartRemote004FSK(EnchantedDevice): """Tuya Smart (Single) Knob device.""" signature = { # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=, *user_descriptor_available=False)", # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096, 57345], output_clusters=[25, 10, 3, 4, 6, 8, 4096]) MODELS_INFO: [ ("_TZ3000_kjfzuycl", "TS004F"), ("_TZ3000_ja5osu5g", "TS004F"), ], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LightLink.cluster_id, TuyaZBExternalSwitchTypeCluster.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, LightLink.cluster_id, ], }, }, } replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, TuyaNoBindPowerConfigurationCluster, Identify.cluster_id, Groups.cluster_id, # Is needed for adding group then binding is not working. LightLink.cluster_id, TuyaZBExternalSwitchTypeCluster, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, TuyaSmartRemoteOnOffCluster, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id, ], }, }, } device_automation_triggers = { (SHORT_PRESS, BUTTON): {COMMAND: COMMAND_ON, ENDPOINT_ID: 1, CLUSTER_ID: 6}, (DOUBLE_PRESS, BUTTON): {COMMAND: COMMAND_OFF, ENDPOINT_ID: 1, CLUSTER_ID: 6}, (LONG_PRESS, BUTTON): {COMMAND: COMMAND_STEP, ENDPOINT_ID: 1, CLUSTER_ID: 8}, (LONG_RELEASE, BUTTON): {COMMAND: COMMAND_STOP, ENDPOINT_ID: 1, CLUSTER_ID: 8}, (ALT_SHORT_PRESS, BUTTON): { ENDPOINT_ID: 1, CLUSTER_ID: 8, PARAMS: { "transition_time": 1, "options_mask": None, "options_override": None, }, }, (SHORT_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: SHORT_PRESS}, (LONG_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: LONG_PRESS}, (DOUBLE_PRESS, BUTTON_1): {ENDPOINT_ID: 1, COMMAND: DOUBLE_PRESS}, } class TuyaSmartRemote004FSK_v2(TuyaSmartRemote004FSK): """Tuya Smart (Single) Knob device.""" signature = { # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=, *user_descriptor_available=False)", # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096, 57345], output_clusters=[25, 10, 3, 4, 6, 8, 4096]) MODELS_INFO: [ ("_TZ3000_ja5osu5g", "TS004F"), ], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LightLink.cluster_id, TuyaZBExternalSwitchTypeCluster.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, LightLink.cluster_id, ], }, }, } class TuyaSmartRemote004F(EnchantedDevice): """Tuya 4-button New version remote device.""" signature = { # "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0, *allocate_address=True, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=, *user_descriptor_available=False)", # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=260, device_version=1, input_clusters=[0, 1, 3, 4, 6, 4096], output_clusters=[25, 10, 3, 4, 5, 6, 8, 4096]) MODEL: "TS004F", ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, LightLink.cluster_id, ], }, }, } replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, TuyaNoBindPowerConfigurationCluster, Identify.cluster_id, Groups.cluster_id, # Is needed for adding group then binding is not working. LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, Time.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, TuyaSmartRemoteOnOffCluster, LevelControl.cluster_id, LightLink.cluster_id, ], }, }, } device_automation_triggers = { (SHORT_PRESS, TURN_ON): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 1}, (SHORT_PRESS, TURN_OFF): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 1}, (SHORT_PRESS, DIM_UP): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"step_mode": 0}, }, (LONG_PRESS, DIM_UP): { COMMAND: COMMAND_MOVE, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"move_mode": 0}, }, (SHORT_PRESS, DIM_DOWN): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"step_mode": 1}, }, (LONG_PRESS, DIM_DOWN): { COMMAND: COMMAND_MOVE, CLUSTER_ID: 8, ENDPOINT_ID: 1, PARAMS: {"move_mode": 1}, }, (LONG_RELEASE, DIM_DOWN): { COMMAND: COMMAND_STOP, CLUSTER_ID: 8, ENDPOINT_ID: 1, }, }