docs: def login(self, username=None, password=None):
          """Explicit Abode login."""
          if username is not None:
              self._cache[CONST.ID] = username
          if password is not None:
              self._cache[CONST.PASSWORD] = password
  
          if (self._cache[CONST.ID] is None or
                  not isinstance(self._cache[CONST.ID], str)):
              raise AbodeAuthenticationException(ERROR.USERNAME)
  
          if (self._cache[CONST.PASSWORD] is None or
                  not isinstance(self._cache[CONST.PASSWORD], str)):
              raise AbodeAuthenticationException(ERROR.PASSWORD)
  
          self._save_cache()
  
          self._token = None
  
          login_data = {
              CONST.ID: self._cache[CONST.ID],
              CONST.PASSWORD: self._cache[CONST.PASSWORD],
              CONST.UUID: self._cache[CONST.UUID]
          }
  
          response = self._session.post(CONST.LOGIN_URL, json=login_data)
          response_object = json.loads(response.text)
  
          oauth_token = self._session.get(CONST.OAUTH_TOKEN_URL)
          oauth_token_object = json.loads(oauth_token.text)
  
          if response.status_code != 200:
              raise AbodeAuthenticationException((response.status_code,
                                                  response_object['message']))
  
          _LOGGER.debug("Login Response: %s", response.text)
  
          self._token = response_object['token']
          self._panel = response_object['panel']
          self._user = response_object['user']
          self._oauth_token = oauth_token_object['access_token']
  
          _LOGGER.info("Login successful")
  
          return True