mirror of
https://github.com/home-assistant/core.git
synced 2025-11-10 11:29:46 +00:00
* Create component via script.scaffold * Create sensor definition * Define coordinator * Define config flow * Refine sensor definition and add tests * Refine coordinator after testing end to end * Redefine sensor in a more idiomatic way * Use entity (common-module) * Follow config-flow conventions more closely * Use custom ConfigEntry to conform to strict-typing * Define API object instead of using aio directly * Test before setup in init * Add diagnostics * Make some more quality changes * Move scan interval to const * Commit generated files * Add quality scale * feedback: Apply consistent language to Tilt Pi refs * feedback: Remove empty manifest fields * feedback: Use translations instead of hardcoded name * feedback: Remove diagnostics * feedback: Idiomatic and general improvements * Use tilt-pi library * feedback: Coordinator data returns dict * feedback: Move client creation to coordinator * feedback: Request only Tilt Pi URL from user * Update homeassistant/components/tilt_pi/entity.py Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com> * Update homeassistant/components/tilt_pi/sensor.py Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com> * Update homeassistant/components/tilt_pi/entity.py Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com> * feedback: Avoid redundant keyword arguments in function calls * feedback: Remove unused models and variables * feedback: Use icons.json * feedback: Style best practices * Update homeassistant/components/tilt_pi/entity.py Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com> * Update tests/components/tilt_pi/test_config_flow.py Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com> * feedback: Improve config flow unit tests * feedback: Patch TiltPi client mock * feedback: Mark entity-device-class as done * feedback: Align quaity scale with current state * feeback: Create brands file for Tilt brand * feedback: Demonstrate recovery in config flow * feedback: Test coordinator behavior via sensors * Update homeassistant/components/tilt_pi/config_flow.py Co-authored-by: Josef Zweck <josef@zweck.dev> * Update homeassistant/components/tilt_pi/coordinator.py Co-authored-by: Josef Zweck <josef@zweck.dev> * Update homeassistant/components/tilt_pi/quality_scale.yaml Co-authored-by: Josef Zweck <josef@zweck.dev> * Update homeassistant/components/tilt_pi/quality_scale.yaml Co-authored-by: Josef Zweck <josef@zweck.dev> * Update homeassistant/components/tilt_pi/quality_scale.yaml Co-authored-by: Josef Zweck <josef@zweck.dev> * Update homeassistant/components/tilt_pi/config_flow.py Co-authored-by: Josef Zweck <josef@zweck.dev> * feedback: Update tilt_pi quality scale * feedback: Move const to coordinator * feedback: Correct strings.json for incorrect and missing fields * feedback: Use tiltpi package version published via CI * Run ruff format manually * Add missing string for invalid host * Fix * Fix --------- Co-authored-by: Michael Heyman <michaelheyman@users.noreply.github.com> Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com> Co-authored-by: Josef Zweck <josef@zweck.dev>
64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
"""Config flow for Tilt Pi integration."""
|
|
|
|
from typing import Any
|
|
|
|
import aiohttp
|
|
from tiltpi import TiltPiClient, TiltPiError
|
|
import voluptuous as vol
|
|
from yarl import URL
|
|
|
|
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
|
|
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_URL
|
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|
|
|
from .const import DOMAIN
|
|
|
|
|
|
class TiltPiConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
"""Handle a config flow for Tilt Pi."""
|
|
|
|
async def _check_connection(self, host: str, port: int) -> str | None:
|
|
"""Check if we can connect to the TiltPi instance."""
|
|
client = TiltPiClient(
|
|
host,
|
|
port,
|
|
session=async_get_clientsession(self.hass),
|
|
)
|
|
try:
|
|
await client.get_hydrometers()
|
|
except (TiltPiError, TimeoutError, aiohttp.ClientError):
|
|
return "cannot_connect"
|
|
return None
|
|
|
|
async def async_step_user(
|
|
self, user_input: dict[str, Any] | None = None
|
|
) -> ConfigFlowResult:
|
|
"""Handle a configuration flow initialized by the user."""
|
|
|
|
errors = {}
|
|
if user_input is not None:
|
|
url = URL(user_input[CONF_URL])
|
|
if (host := url.host) is None:
|
|
errors[CONF_URL] = "invalid_host"
|
|
else:
|
|
self._async_abort_entries_match({CONF_HOST: host})
|
|
port = url.port
|
|
assert port
|
|
error = await self._check_connection(host=host, port=port)
|
|
if error:
|
|
errors["base"] = error
|
|
else:
|
|
return self.async_create_entry(
|
|
title="Tilt Pi",
|
|
data={
|
|
CONF_HOST: host,
|
|
CONF_PORT: port,
|
|
},
|
|
)
|
|
|
|
return self.async_show_form(
|
|
step_id="user",
|
|
data_schema=vol.Schema({vol.Required(CONF_URL): str}),
|
|
errors=errors,
|
|
)
|