И то и другое делается руками.
Для таймаута, заверни вызов open_connection() в вызов asyncio.wait_for().
Для нескольких попыток,
for _ in range(попыток)
.
В итоге получим что-то вроде:
for _ in range(attempts):
try:
reader, writer = await asyncio.wait_for(
asyncio.open_connection(server, port),
timeout
)
except (asyncio.TimeoutError, Exception):
... # реагируем на ошибку соединения, пишем в лог или ещё что
else:
break # соединение принято
else: # относится к for, выполнится если не было break
... # реагируем на исчерпание попыток
# потом делаем return или throw
# если управление дошло досюда, соединение установлено
... # работаем