Apply suggested changes

This commit is contained in:
Robin Lintermann
2025-04-17 09:06:51 +00:00
parent d19aabfcd0
commit 7adc1e7e47
6 changed files with 64 additions and 46 deletions

View File

@@ -7,9 +7,6 @@ from homeassistant.const import CONF_ACCESS_TOKEN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryError from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryError
from homeassistant.helpers import config_validation as cv from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.typing import ConfigType
from .const import DOMAIN, HOST, PLATFORMS from .const import DOMAIN, HOST, PLATFORMS
@@ -18,11 +15,6 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
type FederwiegeConfigEntry = ConfigEntry[Federwiege] type FederwiegeConfigEntry = ConfigEntry[Federwiege]
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up this integration using YAML is not supported."""
return True
async def async_setup_entry(hass: HomeAssistant, entry: FederwiegeConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: FederwiegeConfigEntry) -> bool:
"""Set up this integration using UI.""" """Set up this integration using UI."""
if hass.data.get(DOMAIN) is None: if hass.data.get(DOMAIN) is None:
@@ -68,24 +60,3 @@ async def async_reload_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Reload config entry.""" """Reload config entry."""
await async_unload_entry(hass, entry) await async_unload_entry(hass, entry)
await async_setup_entry(hass, entry) await async_setup_entry(hass, entry)
class SmarlaBaseEntity(Entity):
"""Common Base Entity class for defining Smarla device."""
def __init__(
self,
federwiege: Federwiege,
) -> None:
"""Initialise the entity."""
super().__init__()
self._attr_has_entity_name = True
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, federwiege.serial_number)},
name="Federwiege",
model="Smarla",
manufacturer="Swing2Sleep",
serial_number=federwiege.serial_number,
)

View File

@@ -2,6 +2,8 @@
from __future__ import annotations from __future__ import annotations
from typing import Any
from pysmarlaapi import Connection from pysmarlaapi import Connection
import voluptuous as vol import voluptuous as vol
@@ -19,7 +21,9 @@ class SmarlaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
VERSION = 1 VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_PUSH CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_PUSH
async def async_step_user(self, user_input=None) -> config_entries.ConfigFlowResult: async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> config_entries.ConfigFlowResult:
"""Handle the initial step.""" """Handle the initial step."""
if user_input is None: if user_input is None:
return self.async_show_form( return self.async_show_form(
@@ -27,18 +31,20 @@ class SmarlaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
data_schema=STEP_USER_DATA_SCHEMA, data_schema=STEP_USER_DATA_SCHEMA,
) )
errors = {} errors: dict[str, str] = {}
try: try:
info = await self.validate_input(user_input) info = await self.validate_input(user_input)
except InvalidAuth:
errors["base"] = "invalid_auth"
except InvalidToken:
errors["base"] = "invalid_token"
if not errors:
return self.async_create_entry( return self.async_create_entry(
title=info["title"], title=info["title"],
data={CONF_ACCESS_TOKEN: info.get(CONF_ACCESS_TOKEN)}, data={CONF_ACCESS_TOKEN: info.get(CONF_ACCESS_TOKEN)},
) )
except InvalidAuth:
errors["base"] = "invalid_auth"
except ValueError:
errors["base"] = "invalid_token"
return self.async_show_form( return self.async_show_form(
step_id="user", step_id="user",
@@ -46,12 +52,15 @@ class SmarlaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
errors=errors, errors=errors,
) )
async def validate_input(self, data): async def validate_input(self, data: dict[str, Any]):
"""Validate the user input allows us to connect. """Validate the user input allows us to connect.
Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user. Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user.
""" """
conn = Connection(url=HOST, token_b64=data[CONF_ACCESS_TOKEN]) try:
conn = Connection(url=HOST, token_b64=data[CONF_ACCESS_TOKEN])
except ValueError as e:
raise InvalidToken from e
await self.async_set_unique_id(conn.token.serialNumber) await self.async_set_unique_id(conn.token.serialNumber)
self._abort_if_unique_id_configured() self._abort_if_unique_id_configured()
@@ -67,3 +76,7 @@ class SmarlaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
class InvalidAuth(exceptions.HomeAssistantError): class InvalidAuth(exceptions.HomeAssistantError):
"""Error to indicate there is invalid auth.""" """Error to indicate there is invalid auth."""
class InvalidToken(exceptions.HomeAssistantError):
"""Error to indicate there is an invalid token."""

View File

@@ -0,0 +1,29 @@
"""Common base for entities."""
from pysmarlaapi import Federwiege
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity import Entity
from .const import DOMAIN
class SmarlaBaseEntity(Entity):
"""Common Base Entity class for defining Smarla device."""
def __init__(
self,
federwiege: Federwiege,
) -> None:
"""Initialise the entity."""
super().__init__()
self._attr_has_entity_name = True
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, federwiege.serial_number)},
name="Federwiege",
model="Smarla",
manufacturer="Swing2Sleep",
serial_number=federwiege.serial_number,
)

View File

@@ -1,6 +1,7 @@
"""Support for the Swing2Sleep Smarla number entities.""" """Support for the Swing2Sleep Smarla number entities."""
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any
from pysmarlaapi import Federwiege from pysmarlaapi import Federwiege
@@ -12,7 +13,8 @@ from homeassistant.components.number import (
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import FederwiegeConfigEntry, SmarlaBaseEntity from . import FederwiegeConfigEntry
from .entity import SmarlaBaseEntity
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
@@ -45,7 +47,7 @@ async def async_setup_entry(
"""Set up the Smarla numbers from config entry.""" """Set up the Smarla numbers from config entry."""
federwiege = config_entry.runtime_data federwiege = config_entry.runtime_data
entities: list[SmarlaNumber] = [] entities: list[NumberEntity] = []
for desc in NUMBER_TYPES: for desc in NUMBER_TYPES:
entity = SmarlaNumber(federwiege, desc) entity = SmarlaNumber(federwiege, desc)
@@ -57,7 +59,7 @@ async def async_setup_entry(
class SmarlaNumber(SmarlaBaseEntity, NumberEntity): class SmarlaNumber(SmarlaBaseEntity, NumberEntity):
"""Representation of Smarla number.""" """Representation of Smarla number."""
async def on_change(self, value): async def on_change(self, value: Any):
"""Notify ha when state changes.""" """Notify ha when state changes."""
self.async_write_ha_state() self.async_write_ha_state()

View File

@@ -1,6 +1,7 @@
"""Support for the Swing2Sleep Smarla sensor entities.""" """Support for the Swing2Sleep Smarla sensor entities."""
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any
from pysmarlaapi import Federwiege from pysmarlaapi import Federwiege
@@ -13,7 +14,8 @@ from homeassistant.const import UnitOfLength, UnitOfTime
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import FederwiegeConfigEntry, SmarlaBaseEntity from . import FederwiegeConfigEntry
from .entity import SmarlaBaseEntity
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
@@ -72,7 +74,7 @@ async def async_setup_entry(
"""Set up the Smarla sensors from config entry.""" """Set up the Smarla sensors from config entry."""
federwiege = config_entry.runtime_data federwiege = config_entry.runtime_data
entities: list[SmarlaSensor] = [] entities: list[SensorEntity] = []
for desc in NUMBER_TYPES: for desc in NUMBER_TYPES:
entity = SmarlaSensor(federwiege, desc) entity = SmarlaSensor(federwiege, desc)
@@ -84,7 +86,7 @@ async def async_setup_entry(
class SmarlaSensor(SmarlaBaseEntity, SensorEntity): class SmarlaSensor(SmarlaBaseEntity, SensorEntity):
"""Representation of Smarla sensor.""" """Representation of Smarla sensor."""
async def on_change(self, value): async def on_change(self, value: Any):
"""Notify ha when state changes.""" """Notify ha when state changes."""
self.async_write_ha_state() self.async_write_ha_state()

View File

@@ -9,7 +9,8 @@ from homeassistant.components.switch import SwitchEntity, SwitchEntityDescriptio
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import FederwiegeConfigEntry, SmarlaBaseEntity from . import FederwiegeConfigEntry
from .entity import SmarlaBaseEntity
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
@@ -44,7 +45,7 @@ async def async_setup_entry(
"""Set up the Smarla switches from config entry.""" """Set up the Smarla switches from config entry."""
federwiege = config_entry.runtime_data federwiege = config_entry.runtime_data
entities: list[SmarlaSwitch] = [] entities: list[SwitchEntity] = []
for desc in NUMBER_TYPES: for desc in NUMBER_TYPES:
entity = SmarlaSwitch(federwiege, desc) entity = SmarlaSwitch(federwiege, desc)
@@ -56,7 +57,7 @@ async def async_setup_entry(
class SmarlaSwitch(SmarlaBaseEntity, SwitchEntity): class SmarlaSwitch(SmarlaBaseEntity, SwitchEntity):
"""Representation of Smarla switch.""" """Representation of Smarla switch."""
async def on_change(self, value): async def on_change(self, value: Any):
"""Notify ha when state changes.""" """Notify ha when state changes."""
self.async_write_ha_state() self.async_write_ha_state()