Execute a command and return response.

        command:    the command instance to be executed
        password:   if specified, will be used to execute this command (overriding any
                    global password that may have been assigned to the property)
        timeout:    maximum number of seconds to wait for a response

async def async_execute(self, command: Command, password: str = '',
                            timeout: int = EXECUTE_TIMEOUT_SECS) -> Response:
        """
        Execute a command and return response.

        command:    the command instance to be executed
        password:   if specified, will be used to execute this command (overriding any
                    global password that may have been assigned to the property)
        timeout:    maximum number of seconds to wait for a response
        """
        if not self._is_connected:
            raise ConnectionError("Client is not connected to the server")
        state = {
            'command': command,
            'event': asyncio.Event(loop=self._loop)
        } # type: Dict[str, Any]
        self._executing[command.name] = state
        try:
            self._send(command, password)
            await asyncio.wait_for(state['event'].wait(), timeout)
            return state['response']
        finally:
            self._executing[command.name] = None