def _try_login(user_input): project_type = ProjectType(user_input[CONF_PROJECT_TYPE]) api = TuyaOpenAPI( TUYA_ENDPOINTS[user_input[CONF_ENDPOINT]] if project_type == ProjectType.INDUSTY_SOLUTIONS else "", user_input[CONF_ACCESS_ID], user_input[CONF_ACCESS_SECRET], project_type, ) api.set_dev_channel("hass") if project_type == ProjectType.INDUSTY_SOLUTIONS: response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) else: if user_input[CONF_COUNTRY_CODE] in COUNTRY_CODE_CHINA: api.endpoint = TUYA_ENDPOINT_BASE else: api.endpoint = TUYA_ENDPOINT_OTHER response = api.login( user_input[CONF_USERNAME], user_input[CONF_PASSWORD], user_input[CONF_COUNTRY_CODE], TUYA_APP_TYPES[user_input[CONF_APP_TYPE]], ) if response.get("success", False) and isinstance( api.token_info.platform_url, str): api.endpoint = api.token_info.platform_url user_input[CONF_ENDPOINT] = api.token_info.platform_url return response
async def async_step_login(self, user_input=None): """Step login.""" errors = {} if user_input is not None: assert self.conf_project_type is not None user_input[CONF_PROJECT_TYPE] = TUYA_PROJECT_TYPES[ self.conf_project_type] response = await self.hass.async_add_executor_job( self._try_login, user_input) if response.get("success", False): _LOGGER.debug("Login success: %s", response) return self.async_create_entry( title=user_input[CONF_USERNAME], data=user_input, ) errors["base"] = RESULT_AUTH_FAILED _LOGGER.error("Login failed: %s", response) if (ProjectType(TUYA_PROJECT_TYPES[self.conf_project_type]) == ProjectType.SMART_HOME): return self.async_show_form(step_id="login", data_schema=DATA_SCHEMA_SMART_HOME, errors=errors) return self.async_show_form( step_id="login", data_schema=DATA_SCHEMA_INDUSTRY_SOLUTIONS, errors=errors, )
def _try_login(user_input): project_type = ProjectType(user_input[CONF_PROJECT_TYPE]) api = TuyaOpenAPI( user_input[CONF_ENDPOINT] if project_type == ProjectType.INDUSTY_SOLUTIONS else "", user_input[CONF_ACCESS_ID], user_input[CONF_ACCESS_SECRET], project_type, ) api.set_dev_channel("hass") if project_type == ProjectType.INDUSTY_SOLUTIONS: response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) else: api.endpoint = TUYA_ENDPOINT_BASE 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) and isinstance( api.token_info.platform_url, str): api.endpoint = api.token_info.platform_url user_input[CONF_ENDPOINT] = api.token_info.platform_url _LOGGER.debug("TuyaConfigFlow._try_login finish, response:, %s", response) return response
def _try_login(cls, user_input): _LOGGER.info( f"TuyaConfigFlow._try_login start, user_input: {user_input}") project_type = ProjectType(user_input[CONF_PROJECT_TYPE]) api = TuyaOpenAPI( user_input[CONF_ENDPOINT] if project_type == ProjectType.INDUSTY_SOLUTIONS else "", user_input[CONF_ACCESS_ID], user_input[CONF_ACCESS_SECRET], project_type, ) api.set_dev_channel("hass") if project_type == ProjectType.INDUSTY_SOLUTIONS: response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) else: if user_input[CONF_COUNTRY_CODE] in COUNTRY_CODE_CHINA: api.endpoint = "https://openapi.tuyacn.com" else: api.endpoint = "https://openapi.tuyaus.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
async def async_step_project_type(self, user_input=None): """Step project type.""" self.conf_project_type = user_input[CONF_PROJECT_TYPE] self.project_type = ProjectType(self.conf_project_type) return (self.async_show_form(step_id="user", data_schema=DATA_SCHEMA_SMART_HOME) if self.project_type == ProjectType.SMART_HOME else self.async_show_form( step_id="user", data_schema=DATA_SCHEMA_INDUSTRY_SOLUTIONS))
async def _init_tuya_sdk(hass: HomeAssistant, entry: ConfigEntry) -> bool: entry_data = entry_decrypt(hass, entry, entry.data) project_type = ProjectType(entry_data[CONF_PROJECT_TYPE]) api = TuyaOpenAPI( entry_data[CONF_ENDPOINT], entry_data[CONF_ACCESS_ID], entry_data[CONF_ACCESS_SECRET], project_type, ) api.set_dev_channel("hass") if project_type == ProjectType.INDUSTY_SOLUTIONS: response = await hass.async_add_executor_job(api.login, entry_data[CONF_USERNAME], entry_data[CONF_PASSWORD]) else: response = await hass.async_add_executor_job( api.login, entry_data[CONF_USERNAME], entry_data[CONF_PASSWORD], entry_data[CONF_COUNTRY_CODE], entry_data[CONF_APP_TYPE], ) if response.get("success", False) is False: _LOGGER.error("Tuya login error response: %s", response) return False tuya_mq = TuyaOpenMQ(api) tuya_mq.start() device_manager = TuyaDeviceManager(api, tuya_mq) # 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][entry.entry_id][TUYA_HOME_MANAGER] = home_manager listener = DeviceListener(hass, entry) hass.data[DOMAIN][entry.entry_id][TUYA_MQTT_LISTENER] = listener device_manager.add_device_listener(listener) hass.data[DOMAIN][entry.entry_id][TUYA_DEVICE_MANAGER] = device_manager # Clean up device entities await cleanup_device_registry(hass, entry) _LOGGER.debug("init support type->%s", PLATFORMS) hass.config_entries.async_setup_platforms(entry, PLATFORMS) return True
async def _init_tuya_sdk(hass: HomeAssistant, entry: ConfigEntry) -> bool: init_entry_data = entry.data # decrypt or encrypt entry info entry_data = entry_decrypt(hass, entry, init_entry_data) project_type = ProjectType(entry_data[CONF_PROJECT_TYPE]) api = TuyaOpenAPI( entry_data[CONF_ENDPOINT], entry_data[CONF_ACCESS_ID], entry_data[CONF_ACCESS_SECRET], project_type, ) api.set_dev_channel("hass") response = ( await hass.async_add_executor_job( api.login, entry_data[CONF_USERNAME], entry_data[CONF_PASSWORD] ) if project_type == ProjectType.INDUSTY_SOLUTIONS else await hass.async_add_executor_job( api.login, entry_data[CONF_USERNAME], entry_data[CONF_PASSWORD], entry_data[CONF_COUNTRY_CODE], entry_data[CONF_APP_TYPE], ) ) if response.get("success", False) is False: _LOGGER.error(f"Tuya login error response: {response}") return False tuya_mq = TuyaOpenMQ(api) tuya_mq.start() device_manager = TuyaDeviceManager(api, tuya_mq) # 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.""" def update_device(self, device: TuyaDevice): for ha_device in hass.data[DOMAIN][TUYA_HA_DEVICES]: if ha_device.tuya_device.id == device.id: _LOGGER.debug(f"_update-->{self};->>{ha_device.tuya_device.status}") ha_device.schedule_update_ha_state() def add_device(self, device: TuyaDevice): device_add = False _LOGGER.info( f"""add device category->{device.category}; keys->, {hass.data[DOMAIN][TUYA_HA_TUYA_MAP].keys()}""" ) if device.category in itertools.chain( *hass.data[DOMAIN][TUYA_HA_TUYA_MAP].values() ): ha_tuya_map = hass.data[DOMAIN][TUYA_HA_TUYA_MAP] remove_hass_device(hass, device.id) for key, tuya_list in ha_tuya_map.items(): if device.category in tuya_list: device_add = True async_dispatcher_send( hass, TUYA_DISCOVERY_NEW.format(key), [device.id] ) if device_add: device_manager = hass.data[DOMAIN][TUYA_DEVICE_MANAGER] device_manager.mq.stop() tuya_mq = TuyaOpenMQ(device_manager.api) tuya_mq.start() device_manager.mq = tuya_mq tuya_mq.add_message_listener(device_manager.on_message) def remove_device(self, device_id: str): _LOGGER.info(f"tuya remove device:{device_id}") remove_hass_device(hass, device_id) __listener = DeviceListener() hass.data[DOMAIN][TUYA_MQTT_LISTENER] = __listener device_manager.add_device_listener(__listener) hass.data[DOMAIN][TUYA_DEVICE_MANAGER] = device_manager # Clean up device entities await cleanup_device_registry(hass) _LOGGER.info(f"init support type->{TUYA_SUPPORT_HA_TYPE}") for platform in TUYA_SUPPORT_HA_TYPE: _LOGGER.info(f"tuya async platform-->{platform}") hass.async_create_task( hass.config_entries.async_forward_entry_setup(entry, platform) ) hass.data[DOMAIN][TUYA_SETUP_PLATFORM].add(platform) return True