docs: async def connect(self, retry=2):
          """Connect to Mill."""
          # pylint: disable=too-many-return-statements
          url = API_ENDPOINT_1 + 'login'
          headers = {
              "Content-Type": "application/x-zc-object",
              "Connection": "Keep-Alive",
              "X-Zc-Major-Domain": "seanywell",
              "X-Zc-Msg-Name": "millService",
              "X-Zc-Sub-Domain": "milltype",
              "X-Zc-Seq-Id": "1",
              "X-Zc-Version": "1",
          }
          payload = {"account": self._username,
                     "password": self._password}
          try:
              with async_timeout.timeout(self._timeout):
                  resp = await self.websession.post(url,
                                                    data=json.dumps(payload),
                                                    headers=headers)
          except (asyncio.TimeoutError, aiohttp.ClientError):
              if retry < 1:
                  _LOGGER.error("Error connecting to Mill", exc_info=True)
                  return False
              return await self.connect(retry - 1)
  
          result = await resp.text()
          if '"errorCode":3504' in result:
              _LOGGER.error('Wrong password')
              return False
  
          if '"errorCode":3501' in result:
              _LOGGER.error('Account does not exist')
              return False
  
          data = json.loads(result)
          token = data.get('token')
          if token is None:
              _LOGGER.error('No token')
              return False
  
          user_id = data.get('userId')
          if user_id is None:
              _LOGGER.error('No user id')
              return False
  
          self._token = token
          self._user_id = user_id
          return True