Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Store runtime data in entry in Ecovacs #116445

Merged
merged 1 commit into from
Apr 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 9 additions & 9 deletions homeassistant/components/ecovacs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
Platform.SWITCH,
Platform.VACUUM,
]
EcovacsConfigEntry = ConfigEntry[EcovacsController]


async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
Expand All @@ -50,21 +51,20 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
return True


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_setup_entry(hass: HomeAssistant, entry: EcovacsConfigEntry) -> bool:
"""Set up this integration using UI."""
controller = EcovacsController(hass, entry.data)
await controller.initialize()

hass.data.setdefault(DOMAIN, {})[entry.entry_id] = controller
async def on_unload() -> None:
await controller.teardown()

entry.async_on_unload(on_unload)
entry.runtime_data = controller
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True


async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_unload_entry(hass: HomeAssistant, entry: EcovacsConfigEntry) -> bool:
"""Unload config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
await hass.data[DOMAIN][entry.entry_id].teardown()
hass.data[DOMAIN].pop(entry.entry_id)
if not hass.data[DOMAIN]:
hass.data.pop(DOMAIN)
return unload_ok
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
11 changes: 5 additions & 6 deletions homeassistant/components/ecovacs/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,11 @@
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import (
CapabilityDevice,
EcovacsCapabilityEntityDescription,
Expand Down Expand Up @@ -52,13 +50,14 @@ class EcovacsBinarySensorEntityDescription(

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
async_add_entities(
get_supported_entitites(controller, EcovacsBinarySensor, ENTITY_DESCRIPTIONS)
get_supported_entitites(
config_entry.runtime_data, EcovacsBinarySensor, ENTITY_DESCRIPTIONS
)
)


Expand Down
9 changes: 4 additions & 5 deletions homeassistant/components/ecovacs/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@
from deebot_client.events import LifeSpan

from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN, SUPPORTED_LIFESPANS
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .const import SUPPORTED_LIFESPANS
from .entity import (
CapabilityDevice,
EcovacsCapabilityEntityDescription,
Expand Down Expand Up @@ -66,11 +65,11 @@ class EcovacsLifespanButtonEntityDescription(ButtonEntityDescription):

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
entities: list[EcovacsEntity] = get_supported_entitites(
controller, EcovacsButtonEntity, ENTITY_DESCRIPTIONS
)
Expand Down
11 changes: 8 additions & 3 deletions homeassistant/components/ecovacs/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def __init__(self, hass: HomeAssistant, config: Mapping[str, Any]) -> None:
"""Initialize controller."""
self._hass = hass
self._devices: list[Device] = []
self.legacy_devices: list[VacBot] = []
self._legacy_devices: list[VacBot] = []
rest_url = config.get(CONF_OVERRIDE_REST_URL)
self._device_id = get_client_device_id(hass, rest_url is not None)
country = config[CONF_COUNTRY]
Expand Down Expand Up @@ -101,7 +101,7 @@ async def initialize(self) -> None:
self._continent,
monitor=True,
)
self.legacy_devices.append(bot)
self._legacy_devices.append(bot)
except InvalidAuthenticationError as ex:
raise ConfigEntryError("Invalid credentials") from ex
except DeebotError as ex:
Expand All @@ -113,7 +113,7 @@ async def teardown(self) -> None:
"""Disconnect controller."""
for device in self._devices:
await device.teardown()
for legacy_device in self.legacy_devices:
for legacy_device in self._legacy_devices:
await self._hass.async_add_executor_job(legacy_device.disconnect)
await self._mqtt.disconnect()
await self._authenticator.teardown()
Expand All @@ -124,3 +124,8 @@ def devices(self, capability: type[Capabilities]) -> Generator[Device, None, Non
for device in self._devices:
if isinstance(device.capabilities, capability):
yield device

@property
def legacy_devices(self) -> list[VacBot]:
"""Return legacy devices."""
return self._legacy_devices
edenhaus marked this conversation as resolved.
Show resolved Hide resolved
9 changes: 4 additions & 5 deletions homeassistant/components/ecovacs/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
from deebot_client.capabilities import Capabilities

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant

from .const import CONF_OVERRIDE_MQTT_URL, CONF_OVERRIDE_REST_URL, DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .const import CONF_OVERRIDE_MQTT_URL, CONF_OVERRIDE_REST_URL

REDACT_CONFIG = {
CONF_USERNAME,
Expand All @@ -25,10 +24,10 @@


async def async_get_config_entry_diagnostics(
hass: HomeAssistant, config_entry: ConfigEntry
hass: HomeAssistant, config_entry: EcovacsConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
diag: dict[str, Any] = {
"config": async_redact_data(config_entry.as_dict(), REDACT_CONFIG)
}
Expand Down
8 changes: 3 additions & 5 deletions homeassistant/components/ecovacs/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,22 @@
from deebot_client.events import CleanJobStatus, ReportStatsEvent

from homeassistant.components.event import EventEntity, EventEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import EcovacsEntity
from .util import get_name_key


async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
async_add_entities(
EcovacsLastJobEventEntity(device) for device in controller.devices(Capabilities)
)
Expand Down
8 changes: 3 additions & 5 deletions homeassistant/components/ecovacs/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,21 @@
from deebot_client.events.map import CachedMapInfoEvent, MapChangedEvent

from homeassistant.components.image import ImageEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import EcovacsEntity


async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
entities = []
for device in controller.devices(VacuumCapabilities):
capabilities: VacuumCapabilities = device.capabilities
Expand Down
8 changes: 3 additions & 5 deletions homeassistant/components/ecovacs/lawn_mower.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,10 @@
LawnMowerEntityEntityDescription,
LawnMowerEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import EcovacsEntity

_LOGGER = logging.getLogger(__name__)
Expand All @@ -38,11 +36,11 @@

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Ecovacs mowers."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
mowers: list[EcovacsMower] = [
EcovacsMower(device) for device in controller.devices(MowerCapabilities)
]
Expand Down
8 changes: 3 additions & 5 deletions homeassistant/components/ecovacs/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,11 @@
from deebot_client.events import CleanCountEvent, VolumeEvent

from homeassistant.components.number import NumberEntity, NumberEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import (
CapabilityDevice,
EcovacsCapabilityEntityDescription,
Expand Down Expand Up @@ -70,11 +68,11 @@ class EcovacsNumberEntityDescription(

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
entities: list[EcovacsEntity] = get_supported_entitites(
controller, EcovacsNumberEntity, ENTITY_DESCRIPTIONS
)
Expand Down
8 changes: 3 additions & 5 deletions homeassistant/components/ecovacs/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@
from deebot_client.events import WaterInfoEvent, WorkModeEvent

from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import (
CapabilityDevice,
EcovacsCapabilityEntityDescription,
Expand Down Expand Up @@ -62,11 +60,11 @@ class EcovacsSelectEntityDescription(

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
entities = get_supported_entitites(
controller, EcovacsSelectEntity, ENTITY_DESCRIPTIONS
)
Expand Down
9 changes: 4 additions & 5 deletions homeassistant/components/ecovacs/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
AREA_SQUARE_METERS,
ATTR_BATTERY_LEVEL,
Expand All @@ -37,8 +36,8 @@
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType

from .const import DOMAIN, SUPPORTED_LIFESPANS
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .const import SUPPORTED_LIFESPANS
from .entity import (
CapabilityDevice,
EcovacsCapabilityEntityDescription,
Expand Down Expand Up @@ -171,11 +170,11 @@ class EcovacsLifespanSensorEntityDescription(SensorEntityDescription):

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data

entities: list[EcovacsEntity] = get_supported_entitites(
controller, EcovacsSensor, ENTITY_DESCRIPTIONS
Expand Down
8 changes: 3 additions & 5 deletions homeassistant/components/ecovacs/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,11 @@
from deebot_client.events import EnableEvent

from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .controller import EcovacsController
from . import EcovacsConfigEntry
from .entity import (
CapabilityDevice,
EcovacsCapabilityEntityDescription,
Expand Down Expand Up @@ -121,11 +119,11 @@ class EcovacsSwitchEntityDescription(

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Add entities for passed config_entry in HA."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
entities: list[EcovacsEntity] = get_supported_entitites(
controller, EcovacsSwitchEntity, ENTITY_DESCRIPTIONS
)
Expand Down
7 changes: 3 additions & 4 deletions homeassistant/components/ecovacs/vacuum.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,14 @@
StateVacuumEntityDescription,
VacuumEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.icon import icon_for_battery_level
from homeassistant.util import slugify

from . import EcovacsConfigEntry
from .const import DOMAIN
from .controller import EcovacsController
from .entity import EcovacsEntity
from .util import get_name_key

Expand All @@ -43,11 +42,11 @@

async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
config_entry: EcovacsConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Ecovacs vacuums."""
controller: EcovacsController = hass.data[DOMAIN][config_entry.entry_id]
controller = config_entry.runtime_data
vacuums: list[EcovacsVacuum | EcovacsLegacyVacuum] = [
EcovacsVacuum(device) for device in controller.devices(VacuumCapabilities)
]
Expand Down