Files
core/homeassistant/components/vesync/config_flow.py
cdnninja 1b9acdc233 Convert Vesync to 3.X version of library (#148239)
Co-authored-by: SapuSeven <sapuseven@gmail.com>
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-09-02 15:31:38 +02:00

124 lines
3.7 KiB
Python

"""Config flow utilities."""
from collections.abc import Mapping
import logging
from typing import Any
from pyvesync import VeSync
from pyvesync.utils.errors import VeSyncError
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import callback
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
DATA_SCHEMA = vol.Schema(
{
vol.Required(CONF_USERNAME): cv.string,
vol.Required(CONF_PASSWORD): cv.string,
}
)
class VeSyncFlowHandler(ConfigFlow, domain=DOMAIN):
"""Handle a config flow."""
VERSION = 1
MINOR_VERSION = 2
@callback
def _show_form(self, errors: dict[str, str] | None = None) -> ConfigFlowResult:
"""Show form to the user."""
return self.async_show_form(
step_id="user",
data_schema=DATA_SCHEMA,
errors=errors if errors else {},
)
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle a flow start."""
if self._async_current_entries():
return self.async_abort(reason="single_instance_allowed")
if not user_input:
return self._show_form()
username = user_input[CONF_USERNAME]
password = user_input[CONF_PASSWORD]
time_zone = str(self.hass.config.time_zone)
manager = VeSync(
username,
password,
time_zone=time_zone,
session=async_get_clientsession(self.hass),
)
try:
await manager.login()
except VeSyncError as e:
_LOGGER.error("VeSync login failed: %s", str(e))
return self._show_form(errors={"base": "invalid_auth"})
return self.async_create_entry(
title=username,
data={CONF_USERNAME: username, CONF_PASSWORD: password},
)
async def async_step_reauth(
self, entry_data: Mapping[str, Any]
) -> ConfigFlowResult:
"""Handle re-authentication with vesync."""
return await self.async_step_reauth_confirm()
async def async_step_reauth_confirm(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Confirm re-authentication with vesync."""
if user_input:
username = user_input[CONF_USERNAME]
password = user_input[CONF_PASSWORD]
time_zone = str(self.hass.config.time_zone)
manager = VeSync(
username,
password,
time_zone=time_zone,
session=async_get_clientsession(self.hass),
)
try:
await manager.login()
except VeSyncError as e:
_LOGGER.error("VeSync login failed: %s", str(e))
return self.async_show_form(
step_id="reauth_confirm",
data_schema=DATA_SCHEMA,
description_placeholders={"name": "VeSync"},
errors={"base": "invalid_auth"},
)
return self.async_update_reload_and_abort(
self._get_reauth_entry(),
data_updates={
CONF_USERNAME: username,
CONF_PASSWORD: password,
},
)
return self.async_show_form(
step_id="reauth_confirm",
data_schema=DATA_SCHEMA,
description_placeholders={"name": "VeSync"},
errors={"base": "invalid_auth"},
)