code: async def command(self, command=None, expected_codes=(), wait_codes=()):
          
          expected_codes = wrap_with_container(expected_codes)
          wait_codes = wrap_with_container(wait_codes)
          if command:
              logger.info(command)
              message = command + END_OF_LINE
              await self.stream.write(message.encode(encoding=self.encoding))
          if expected_codes or wait_codes:
              code, info = await self.parse_response()
              while any(map(code.matches, wait_codes)):
                  code, info = await self.parse_response()
              if expected_codes:
                  self.check_codes(expected_codes, code, info)
              return code, info
docs: :py:func:`asyncio.coroutine`
  
          Basic command logic.
  
          1. Send command if not omitted.
          2. Yield response until no wait code matches.
          3. Check code for expected.
  
          :param command: command line
          :type command: :py:class:`str`
  
          :param expected_codes: tuple of expected codes or expected code
          :type expected_codes: :py:class:`tuple` of :py:class:`str` or
              :py:class:`str`
  
          :param wait_codes: tuple of wait codes or wait code
          :type wait_codes: :py:class:`tuple` of :py:class:`str` or
              :py:class:`str`