180 lines
5.4 KiB
Python
180 lines
5.4 KiB
Python
"""Config flow for 1-Wire component."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.config_entries import ConfigFlow
|
|
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TYPE
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.data_entry_flow import FlowResult
|
|
|
|
from .const import (
|
|
CONF_MOUNT_DIR,
|
|
CONF_TYPE_OWSERVER,
|
|
CONF_TYPE_SYSBUS,
|
|
DEFAULT_OWSERVER_HOST,
|
|
DEFAULT_OWSERVER_PORT,
|
|
DEFAULT_SYSBUS_MOUNT_DIR,
|
|
DOMAIN,
|
|
)
|
|
from .onewirehub import CannotConnect, InvalidPath, OneWireHub
|
|
|
|
DATA_SCHEMA_USER = vol.Schema(
|
|
{vol.Required(CONF_TYPE): vol.In([CONF_TYPE_OWSERVER, CONF_TYPE_SYSBUS])}
|
|
)
|
|
DATA_SCHEMA_OWSERVER = vol.Schema(
|
|
{
|
|
vol.Required(CONF_HOST, default=DEFAULT_OWSERVER_HOST): str,
|
|
vol.Required(CONF_PORT, default=DEFAULT_OWSERVER_PORT): int,
|
|
}
|
|
)
|
|
DATA_SCHEMA_MOUNTDIR = vol.Schema(
|
|
{
|
|
vol.Required(CONF_MOUNT_DIR, default=DEFAULT_SYSBUS_MOUNT_DIR): str,
|
|
}
|
|
)
|
|
|
|
|
|
async def validate_input_owserver(
|
|
hass: HomeAssistant, data: dict[str, Any]
|
|
) -> dict[str, str]:
|
|
"""Validate the user input allows us to connect.
|
|
|
|
Data has the keys from DATA_SCHEMA_OWSERVER with values provided by the user.
|
|
"""
|
|
|
|
hub = OneWireHub(hass)
|
|
|
|
host = data[CONF_HOST]
|
|
port = data[CONF_PORT]
|
|
# Raises CannotConnect exception on failure
|
|
await hub.connect(host, port)
|
|
|
|
# Return info that you want to store in the config entry.
|
|
return {"title": host}
|
|
|
|
|
|
async def validate_input_mount_dir(
|
|
hass: HomeAssistant, data: dict[str, Any]
|
|
) -> dict[str, str]:
|
|
"""Validate the user input allows us to connect.
|
|
|
|
Data has the keys from DATA_SCHEMA_MOUNTDIR with values provided by the user.
|
|
"""
|
|
hub = OneWireHub(hass)
|
|
|
|
mount_dir = data[CONF_MOUNT_DIR]
|
|
|
|
# Raises InvalidDir exception on failure
|
|
await hub.check_mount_dir(mount_dir)
|
|
|
|
# Return info that you want to store in the config entry.
|
|
return {"title": mount_dir}
|
|
|
|
|
|
class OneWireFlowHandler(ConfigFlow, domain=DOMAIN):
|
|
"""Handle 1-Wire config flow."""
|
|
|
|
VERSION = 1
|
|
|
|
def __init__(self) -> None:
|
|
"""Initialize 1-Wire config flow."""
|
|
self.onewire_config: dict[str, Any] = {}
|
|
|
|
async def async_step_user(
|
|
self, user_input: dict[str, Any] | None = None
|
|
) -> FlowResult:
|
|
"""Handle 1-Wire config flow start.
|
|
|
|
Let user manually input configuration.
|
|
"""
|
|
errors: dict[str, str] = {}
|
|
if user_input is not None:
|
|
self.onewire_config.update(user_input)
|
|
if CONF_TYPE_OWSERVER == user_input[CONF_TYPE]:
|
|
return await self.async_step_owserver()
|
|
if CONF_TYPE_SYSBUS == user_input[CONF_TYPE]:
|
|
return await self.async_step_mount_dir()
|
|
|
|
return self.async_show_form(
|
|
step_id="user",
|
|
data_schema=DATA_SCHEMA_USER,
|
|
errors=errors,
|
|
)
|
|
|
|
async def async_step_owserver(
|
|
self, user_input: dict[str, Any] | None = None
|
|
) -> FlowResult:
|
|
"""Handle OWServer configuration."""
|
|
errors = {}
|
|
if user_input:
|
|
# Prevent duplicate entries
|
|
self._async_abort_entries_match(
|
|
{
|
|
CONF_TYPE: CONF_TYPE_OWSERVER,
|
|
CONF_HOST: user_input[CONF_HOST],
|
|
CONF_PORT: user_input[CONF_PORT],
|
|
}
|
|
)
|
|
|
|
self.onewire_config.update(user_input)
|
|
|
|
try:
|
|
info = await validate_input_owserver(self.hass, user_input)
|
|
except CannotConnect:
|
|
errors["base"] = "cannot_connect"
|
|
else:
|
|
return self.async_create_entry(
|
|
title=info["title"], data=self.onewire_config
|
|
)
|
|
|
|
return self.async_show_form(
|
|
step_id="owserver",
|
|
data_schema=DATA_SCHEMA_OWSERVER,
|
|
errors=errors,
|
|
)
|
|
|
|
async def async_step_mount_dir(
|
|
self, user_input: dict[str, Any] | None = None
|
|
) -> FlowResult:
|
|
"""Handle SysBus configuration."""
|
|
errors = {}
|
|
if user_input:
|
|
# Prevent duplicate entries
|
|
await self.async_set_unique_id(
|
|
f"{CONF_TYPE_SYSBUS}:{user_input[CONF_MOUNT_DIR]}"
|
|
)
|
|
self._abort_if_unique_id_configured()
|
|
|
|
self.onewire_config.update(user_input)
|
|
|
|
try:
|
|
info = await validate_input_mount_dir(self.hass, user_input)
|
|
except InvalidPath:
|
|
errors["base"] = "invalid_path"
|
|
else:
|
|
return self.async_create_entry(
|
|
title=info["title"], data=self.onewire_config
|
|
)
|
|
|
|
return self.async_show_form(
|
|
step_id="mount_dir",
|
|
data_schema=DATA_SCHEMA_MOUNTDIR,
|
|
errors=errors,
|
|
)
|
|
|
|
async def async_step_import(self, platform_config: dict[str, Any]) -> FlowResult:
|
|
"""Handle import configuration from YAML."""
|
|
# OWServer
|
|
if platform_config[CONF_TYPE] == CONF_TYPE_OWSERVER:
|
|
if CONF_PORT not in platform_config:
|
|
platform_config[CONF_PORT] = DEFAULT_OWSERVER_PORT
|
|
return await self.async_step_owserver(platform_config)
|
|
|
|
# SysBus
|
|
if CONF_MOUNT_DIR not in platform_config:
|
|
platform_config[CONF_MOUNT_DIR] = DEFAULT_SYSBUS_MOUNT_DIR
|
|
return await self.async_step_mount_dir(platform_config)
|