<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def login(self, username=None, password=None):
 """Execute Skybell login."""

        if username is not None:
            self._username = username
        if password is not None:
            self._password = password

        if self._username is None or not isinstance(self._username, str):
            raise SkybellAuthenticationException(ERROR.USERNAME)

        if self._password is None or not isinstance(self._password, str):
            raise SkybellAuthenticationException(ERROR.PASSWORD)

        self.update_cache(
            {
                CONST.ACCESS_TOKEN: None
            })

        login_data = {
            'username': self._username,
            'password': self._password,
            'appId': self.cache(CONST.APP_ID),
            CONST.TOKEN: self.cache(CONST.TOKEN)
        }

        try:
            response = self.send_request('post', CONST.LOGIN_URL,
                                         json_data=login_data, retry=False)
        except Exception as exc:
            raise SkybellAuthenticationException(ERROR.LOGIN_FAILED, exc)

        _LOGGER.debug("Login Response: %s", response.text)

        response_object = json.loads(response.text)

        self.update_cache({
            CONST.ACCESS_TOKEN: response_object[CONST.ACCESS_TOKEN]})

        _LOGGER.info("Login successful")

        return True