Пример #1
0
    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
Пример #2
0
    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,
        )
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
 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))
Пример #6
0
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
Пример #7
0
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