From 67f0de441b489890efa802a325f187b761098ad6 Mon Sep 17 00:00:00 2001 From: Christopher Fenner <9592452+CFenner@users.noreply.github.com> Date: Mon, 23 Dec 2024 00:06:01 +0100 Subject: [PATCH] Fulfill IQS rule runtime-data in ViCare integration (#133633) --- homeassistant/components/vicare/__init__.py | 63 ++++++------------- .../components/vicare/binary_sensor.py | 10 +-- homeassistant/components/vicare/button.py | 10 +-- homeassistant/components/vicare/climate.py | 12 ++-- .../components/vicare/config_flow.py | 8 +-- homeassistant/components/vicare/const.py | 2 +- .../components/vicare/diagnostics.py | 9 ++- homeassistant/components/vicare/fan.py | 11 +--- homeassistant/components/vicare/number.py | 15 ++--- .../components/vicare/quality_scale.yaml | 4 +- homeassistant/components/vicare/sensor.py | 11 +--- homeassistant/components/vicare/types.py | 13 ++++ homeassistant/components/vicare/utils.py | 40 ++++++++++-- .../components/vicare/water_heater.py | 10 +-- tests/components/vicare/conftest.py | 4 +- tests/components/vicare/test_binary_sensor.py | 2 +- tests/components/vicare/test_button.py | 2 +- tests/components/vicare/test_climate.py | 2 +- tests/components/vicare/test_config_flow.py | 12 ++-- tests/components/vicare/test_fan.py | 2 +- tests/components/vicare/test_init.py | 2 +- tests/components/vicare/test_number.py | 2 +- tests/components/vicare/test_sensor.py | 4 +- tests/components/vicare/test_water_heater.py | 2 +- 24 files changed, 121 insertions(+), 131 deletions(-) diff --git a/homeassistant/components/vicare/__init__.py b/homeassistant/components/vicare/__init__.py index d6b9e4b923a..9c331f0e9ec 100644 --- a/homeassistant/components/vicare/__init__.py +++ b/homeassistant/components/vicare/__init__.py @@ -2,11 +2,9 @@ from __future__ import annotations -from collections.abc import Mapping from contextlib import suppress import logging import os -from typing import Any from PyViCare.PyViCare import PyViCare from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig @@ -16,8 +14,6 @@ from PyViCare.PyViCareUtils import ( ) from homeassistant.components.climate import DOMAIN as DOMAIN_CLIMATE -from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_CLIENT_ID, CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.helpers import device_registry as dr, entity_registry as er @@ -25,31 +21,28 @@ from homeassistant.helpers.storage import STORAGE_DIR from .const import ( DEFAULT_CACHE_DURATION, - DEVICE_LIST, DOMAIN, PLATFORMS, UNSUPPORTED_DEVICES, + VICARE_TOKEN_FILENAME, ) -from .types import ViCareDevice -from .utils import get_device, get_device_serial +from .types import ViCareConfigEntry, ViCareData, ViCareDevice +from .utils import get_device, get_device_serial, login _LOGGER = logging.getLogger(__name__) -_TOKEN_FILENAME = "vicare_token.save" -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_setup_entry(hass: HomeAssistant, entry: ViCareConfigEntry) -> bool: """Set up from config entry.""" _LOGGER.debug("Setting up ViCare component") - - hass.data[DOMAIN] = {} - hass.data[DOMAIN][entry.entry_id] = {} - try: - await hass.async_add_executor_job(setup_vicare_api, hass, entry) + entry.runtime_data = await hass.async_add_executor_job( + setup_vicare_api, hass, entry + ) except (PyViCareInvalidConfigurationError, PyViCareInvalidCredentialsError) as err: raise ConfigEntryAuthFailed("Authentication failed") from err - for device in hass.data[DOMAIN][entry.entry_id][DEVICE_LIST]: + for device in entry.runtime_data.devices: # Migration can be removed in 2025.4.0 await async_migrate_devices_and_entities(hass, entry, device) @@ -58,28 +51,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return True -def vicare_login( - hass: HomeAssistant, - entry_data: Mapping[str, Any], - cache_duration=DEFAULT_CACHE_DURATION, -) -> PyViCare: - """Login via PyVicare API.""" - vicare_api = PyViCare() - vicare_api.setCacheDuration(cache_duration) - vicare_api.initWithCredentials( - entry_data[CONF_USERNAME], - entry_data[CONF_PASSWORD], - entry_data[CONF_CLIENT_ID], - hass.config.path(STORAGE_DIR, _TOKEN_FILENAME), - ) - return vicare_api - - -def setup_vicare_api(hass: HomeAssistant, entry: ConfigEntry) -> None: +def setup_vicare_api(hass: HomeAssistant, entry: ViCareConfigEntry) -> PyViCare: """Set up PyVicare API.""" - vicare_api = vicare_login(hass, entry.data) + client = login(hass, entry.data) - device_config_list = get_supported_devices(vicare_api.devices) + device_config_list = get_supported_devices(client.devices) + + # increase cache duration to fit rate limit to number of devices if (number_of_devices := len(device_config_list)) > 1: cache_duration = DEFAULT_CACHE_DURATION * number_of_devices _LOGGER.debug( @@ -87,36 +65,35 @@ def setup_vicare_api(hass: HomeAssistant, entry: ConfigEntry) -> None: number_of_devices, cache_duration, ) - vicare_api = vicare_login(hass, entry.data, cache_duration) - device_config_list = get_supported_devices(vicare_api.devices) + client = login(hass, entry.data, cache_duration) + device_config_list = get_supported_devices(client.devices) for device in device_config_list: _LOGGER.debug( "Found device: %s (online: %s)", device.getModel(), str(device.isOnline()) ) - hass.data[DOMAIN][entry.entry_id][DEVICE_LIST] = [ + devices = [ ViCareDevice(config=device_config, api=get_device(entry, device_config)) for device_config in device_config_list ] + return ViCareData(client=client, devices=devices) -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry(hass: HomeAssistant, entry: ViCareConfigEntry) -> bool: """Unload ViCare config entry.""" unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - if unload_ok: - hass.data[DOMAIN].pop(entry.entry_id) with suppress(FileNotFoundError): await hass.async_add_executor_job( - os.remove, hass.config.path(STORAGE_DIR, _TOKEN_FILENAME) + os.remove, hass.config.path(STORAGE_DIR, VICARE_TOKEN_FILENAME) ) return unload_ok async def async_migrate_devices_and_entities( - hass: HomeAssistant, entry: ConfigEntry, device: ViCareDevice + hass: HomeAssistant, entry: ViCareConfigEntry, device: ViCareDevice ) -> None: """Migrate old entry.""" device_registry = dr.async_get(hass) diff --git a/homeassistant/components/vicare/binary_sensor.py b/homeassistant/components/vicare/binary_sensor.py index 55f0ab96ed0..ced02dae97e 100644 --- a/homeassistant/components/vicare/binary_sensor.py +++ b/homeassistant/components/vicare/binary_sensor.py @@ -24,13 +24,11 @@ from homeassistant.components.binary_sensor import ( BinarySensorEntity, BinarySensorEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DEVICE_LIST, DOMAIN from .entity import ViCareEntity -from .types import ViCareDevice, ViCareRequiredKeysMixin +from .types import ViCareConfigEntry, ViCareDevice, ViCareRequiredKeysMixin from .utils import ( get_burners, get_circuits, @@ -152,16 +150,14 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Create the ViCare binary sensor devices.""" - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ) ) diff --git a/homeassistant/components/vicare/button.py b/homeassistant/components/vicare/button.py index 49d142c1edb..ad7d600eba3 100644 --- a/homeassistant/components/vicare/button.py +++ b/homeassistant/components/vicare/button.py @@ -16,14 +16,12 @@ from PyViCare.PyViCareUtils import ( import requests 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 DEVICE_LIST, DOMAIN from .entity import ViCareEntity -from .types import ViCareDevice, ViCareRequiredKeysMixinWithSet +from .types import ViCareConfigEntry, ViCareDevice, ViCareRequiredKeysMixinWithSet from .utils import get_device_serial, is_supported _LOGGER = logging.getLogger(__name__) @@ -67,16 +65,14 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Create the ViCare button entities.""" - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ) ) diff --git a/homeassistant/components/vicare/climate.py b/homeassistant/components/vicare/climate.py index 67330bf201d..62231a4e2fe 100644 --- a/homeassistant/components/vicare/climate.py +++ b/homeassistant/components/vicare/climate.py @@ -24,7 +24,6 @@ from homeassistant.components.climate import ( HVACAction, HVACMode, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_TEMPERATURE, PRECISION_TENTHS, @@ -37,9 +36,9 @@ from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DEVICE_LIST, DOMAIN +from .const import DOMAIN from .entity import ViCareEntity -from .types import HeatingProgram, ViCareDevice +from .types import HeatingProgram, ViCareConfigEntry, ViCareDevice from .utils import get_burners, get_circuits, get_compressors, get_device_serial _LOGGER = logging.getLogger(__name__) @@ -99,25 +98,22 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up the ViCare climate platform.""" platform = entity_platform.async_get_current_platform() - platform.async_register_entity_service( SERVICE_SET_VICARE_MODE, {vol.Required(SERVICE_SET_VICARE_MODE_ATTR_MODE): cv.string}, "set_vicare_mode", ) - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ) ) diff --git a/homeassistant/components/vicare/config_flow.py b/homeassistant/components/vicare/config_flow.py index c711cc06074..6594e6ec9e4 100644 --- a/homeassistant/components/vicare/config_flow.py +++ b/homeassistant/components/vicare/config_flow.py @@ -18,7 +18,6 @@ from homeassistant.const import CONF_CLIENT_ID, CONF_PASSWORD, CONF_USERNAME import homeassistant.helpers.config_validation as cv from homeassistant.helpers.device_registry import format_mac -from . import vicare_login from .const import ( CONF_HEATING_TYPE, DEFAULT_HEATING_TYPE, @@ -26,6 +25,7 @@ from .const import ( VICARE_NAME, HeatingType, ) +from .utils import login _LOGGER = logging.getLogger(__name__) @@ -62,9 +62,7 @@ class ViCareConfigFlow(ConfigFlow, domain=DOMAIN): if user_input is not None: try: - await self.hass.async_add_executor_job( - vicare_login, self.hass, user_input - ) + await self.hass.async_add_executor_job(login, self.hass, user_input) except (PyViCareInvalidConfigurationError, PyViCareInvalidCredentialsError): errors["base"] = "invalid_auth" else: @@ -96,7 +94,7 @@ class ViCareConfigFlow(ConfigFlow, domain=DOMAIN): } try: - await self.hass.async_add_executor_job(vicare_login, self.hass, data) + await self.hass.async_add_executor_job(login, self.hass, data) except (PyViCareInvalidConfigurationError, PyViCareInvalidCredentialsError): errors["base"] = "invalid_auth" else: diff --git a/homeassistant/components/vicare/const.py b/homeassistant/components/vicare/const.py index 828a879927d..bcf41223d3f 100644 --- a/homeassistant/components/vicare/const.py +++ b/homeassistant/components/vicare/const.py @@ -25,8 +25,8 @@ UNSUPPORTED_DEVICES = [ "E3_RoomControl_One_522", ] -DEVICE_LIST = "device_list" VICARE_NAME = "ViCare" +VICARE_TOKEN_FILENAME = "vicare_token.save" CONF_CIRCUIT = "circuit" CONF_HEATING_TYPE = "heating_type" diff --git a/homeassistant/components/vicare/diagnostics.py b/homeassistant/components/vicare/diagnostics.py index 9182e96509f..7695c304451 100644 --- a/homeassistant/components/vicare/diagnostics.py +++ b/homeassistant/components/vicare/diagnostics.py @@ -6,25 +6,24 @@ import json from typing import Any from homeassistant.components.diagnostics import async_redact_data -from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_CLIENT_ID, CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant -from .const import DEVICE_LIST, DOMAIN +from .types import ViCareConfigEntry TO_REDACT = {CONF_CLIENT_ID, CONF_PASSWORD, CONF_USERNAME} async def async_get_config_entry_diagnostics( - hass: HomeAssistant, entry: ConfigEntry + hass: HomeAssistant, entry: ViCareConfigEntry ) -> dict[str, Any]: """Return diagnostics for a config entry.""" def dump_devices() -> list[dict[str, Any]]: """Dump devices.""" return [ - json.loads(device.config.dump_secure()) - for device in hass.data[DOMAIN][entry.entry_id][DEVICE_LIST] + json.loads(device.dump_secure()) + for device in entry.runtime_data.client.devices ] return { diff --git a/homeassistant/components/vicare/fan.py b/homeassistant/components/vicare/fan.py index 6e8513a1f7e..69aa8396fea 100644 --- a/homeassistant/components/vicare/fan.py +++ b/homeassistant/components/vicare/fan.py @@ -19,7 +19,6 @@ from PyViCare.PyViCareVentilationDevice import ( from requests.exceptions import ConnectionError as RequestConnectionError from homeassistant.components.fan import FanEntity, FanEntityFeature -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.percentage import ( @@ -27,9 +26,8 @@ from homeassistant.util.percentage import ( percentage_to_ordered_list_item, ) -from .const import DEVICE_LIST, DOMAIN from .entity import ViCareEntity -from .types import ViCareDevice +from .types import ViCareConfigEntry, ViCareDevice from .utils import get_device_serial _LOGGER = logging.getLogger(__name__) @@ -104,17 +102,14 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up the ViCare fan platform.""" - - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ) ) diff --git a/homeassistant/components/vicare/number.py b/homeassistant/components/vicare/number.py index f9af9636941..8ffaa727634 100644 --- a/homeassistant/components/vicare/number.py +++ b/homeassistant/components/vicare/number.py @@ -25,14 +25,17 @@ from homeassistant.components.number import ( NumberEntity, NumberEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import EntityCategory, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DEVICE_LIST, DOMAIN from .entity import ViCareEntity -from .types import HeatingProgram, ViCareDevice, ViCareRequiredKeysMixin +from .types import ( + HeatingProgram, + ViCareConfigEntry, + ViCareDevice, + ViCareRequiredKeysMixin, +) from .utils import get_circuits, get_device_serial, is_supported _LOGGER = logging.getLogger(__name__) @@ -370,16 +373,14 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Create the ViCare number devices.""" - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ) ) diff --git a/homeassistant/components/vicare/quality_scale.yaml b/homeassistant/components/vicare/quality_scale.yaml index 959e2e90583..35a1e7b0adb 100644 --- a/homeassistant/components/vicare/quality_scale.yaml +++ b/homeassistant/components/vicare/quality_scale.yaml @@ -6,9 +6,7 @@ rules: status: todo comment: Uniqueness is not checked yet. config-flow-test-coverage: done - runtime-data: - status: todo - comment: runtime_data is not used yet. + runtime-data: done test-before-setup: done appropriate-polling: done entity-unique-id: done diff --git a/homeassistant/components/vicare/sensor.py b/homeassistant/components/vicare/sensor.py index 57b7c0bec9a..3386c849f74 100644 --- a/homeassistant/components/vicare/sensor.py +++ b/homeassistant/components/vicare/sensor.py @@ -25,7 +25,6 @@ from homeassistant.components.sensor import ( SensorEntityDescription, SensorStateClass, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( PERCENTAGE, EntityCategory, @@ -40,8 +39,6 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import ( - DEVICE_LIST, - DOMAIN, VICARE_CUBIC_METER, VICARE_KW, VICARE_KWH, @@ -50,7 +47,7 @@ from .const import ( VICARE_WH, ) from .entity import ViCareEntity -from .types import ViCareDevice, ViCareRequiredKeysMixin +from .types import ViCareConfigEntry, ViCareDevice, ViCareRequiredKeysMixin from .utils import ( get_burners, get_circuits, @@ -968,16 +965,14 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Create the ViCare sensor devices.""" - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ), # run update to have device_class set depending on unit_of_measurement True, diff --git a/homeassistant/components/vicare/types.py b/homeassistant/components/vicare/types.py index 98d1c0566ce..65ae2a53c3e 100644 --- a/homeassistant/components/vicare/types.py +++ b/homeassistant/components/vicare/types.py @@ -6,6 +6,7 @@ from dataclasses import dataclass import enum from typing import Any +from PyViCare.PyViCare import PyViCare from PyViCare.PyViCareDevice import Device as PyViCareDevice from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig @@ -15,6 +16,7 @@ from homeassistant.components.climate import ( PRESET_HOME, PRESET_SLEEP, ) +from homeassistant.config_entries import ConfigEntry class HeatingProgram(enum.StrEnum): @@ -80,6 +82,17 @@ class ViCareDevice: api: PyViCareDevice +@dataclass(frozen=True) +class ViCareData: + """ViCare data class.""" + + client: PyViCare + devices: list[ViCareDevice] + + +type ViCareConfigEntry = ConfigEntry[ViCareData] + + @dataclass(frozen=True) class ViCareRequiredKeysMixin: """Mixin for required keys.""" diff --git a/homeassistant/components/vicare/utils.py b/homeassistant/components/vicare/utils.py index 5156ea4a41e..120dad83113 100644 --- a/homeassistant/components/vicare/utils.py +++ b/homeassistant/components/vicare/utils.py @@ -1,7 +1,12 @@ """ViCare helpers functions.""" -import logging +from __future__ import annotations +from collections.abc import Mapping +import logging +from typing import Any + +from PyViCare.PyViCare import PyViCare from PyViCare.PyViCareDevice import Device as PyViCareDevice from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig from PyViCare.PyViCareHeatingDevice import ( @@ -14,16 +19,41 @@ from PyViCare.PyViCareUtils import ( ) import requests -from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_CLIENT_ID, CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.storage import STORAGE_DIR -from .const import CONF_HEATING_TYPE, HEATING_TYPE_TO_CREATOR_METHOD, HeatingType -from .types import ViCareRequiredKeysMixin +from .const import ( + CONF_HEATING_TYPE, + DEFAULT_CACHE_DURATION, + HEATING_TYPE_TO_CREATOR_METHOD, + VICARE_TOKEN_FILENAME, + HeatingType, +) +from .types import ViCareConfigEntry, ViCareRequiredKeysMixin _LOGGER = logging.getLogger(__name__) +def login( + hass: HomeAssistant, + entry_data: Mapping[str, Any], + cache_duration=DEFAULT_CACHE_DURATION, +) -> PyViCare: + """Login via PyVicare API.""" + vicare_api = PyViCare() + vicare_api.setCacheDuration(cache_duration) + vicare_api.initWithCredentials( + entry_data[CONF_USERNAME], + entry_data[CONF_PASSWORD], + entry_data[CONF_CLIENT_ID], + hass.config.path(STORAGE_DIR, VICARE_TOKEN_FILENAME), + ) + return vicare_api + + def get_device( - entry: ConfigEntry, device_config: PyViCareDeviceConfig + entry: ViCareConfigEntry, device_config: PyViCareDeviceConfig ) -> PyViCareDevice: """Get device for device config.""" return getattr( diff --git a/homeassistant/components/vicare/water_heater.py b/homeassistant/components/vicare/water_heater.py index 5e241c9a3be..114ff620c3f 100644 --- a/homeassistant/components/vicare/water_heater.py +++ b/homeassistant/components/vicare/water_heater.py @@ -20,14 +20,12 @@ from homeassistant.components.water_heater import ( WaterHeaterEntity, WaterHeaterEntityFeature, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, PRECISION_TENTHS, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DEVICE_LIST, DOMAIN from .entity import ViCareEntity -from .types import ViCareDevice +from .types import ViCareConfigEntry, ViCareDevice from .utils import get_circuits, get_device_serial _LOGGER = logging.getLogger(__name__) @@ -81,16 +79,14 @@ def _build_entities( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: ViCareConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up the ViCare water heater platform.""" - device_list = hass.data[DOMAIN][config_entry.entry_id][DEVICE_LIST] - async_add_entities( await hass.async_add_executor_job( _build_entities, - device_list, + config_entry.runtime_data.devices, ) ) diff --git a/tests/components/vicare/conftest.py b/tests/components/vicare/conftest.py index aadf85e7081..8e10d2f1a25 100644 --- a/tests/components/vicare/conftest.py +++ b/tests/components/vicare/conftest.py @@ -84,7 +84,7 @@ async def mock_vicare_gas_boiler( """Return a mocked ViCare API representing a single gas boiler device.""" fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")] with patch( - f"{MODULE}.vicare_login", + f"{MODULE}.login", return_value=MockPyViCare(fixtures), ): await setup_integration(hass, mock_config_entry) @@ -102,7 +102,7 @@ async def mock_vicare_room_sensors( Fixture({"type:climateSensor"}, "vicare/RoomSensor2.json"), ] with patch( - f"{MODULE}.vicare_login", + f"{MODULE}.login", return_value=MockPyViCare(fixtures), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_binary_sensor.py b/tests/components/vicare/test_binary_sensor.py index b9b8a57a59b..44612673a11 100644 --- a/tests/components/vicare/test_binary_sensor.py +++ b/tests/components/vicare/test_binary_sensor.py @@ -43,7 +43,7 @@ async def test_all_entities( """Test all entities.""" fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.BINARY_SENSOR]), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_button.py b/tests/components/vicare/test_button.py index c024af41d78..cdc47e3833d 100644 --- a/tests/components/vicare/test_button.py +++ b/tests/components/vicare/test_button.py @@ -25,7 +25,7 @@ async def test_all_entities( """Test all entities.""" fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.BUTTON]), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_climate.py b/tests/components/vicare/test_climate.py index 44df87276e7..f48a8988cf0 100644 --- a/tests/components/vicare/test_climate.py +++ b/tests/components/vicare/test_climate.py @@ -25,7 +25,7 @@ async def test_all_entities( """Test all entities.""" fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.CLIMATE]), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_config_flow.py b/tests/components/vicare/test_config_flow.py index a522cf75d5d..d44fd1b9fed 100644 --- a/tests/components/vicare/test_config_flow.py +++ b/tests/components/vicare/test_config_flow.py @@ -49,7 +49,7 @@ async def test_user_create_entry( # test PyViCareInvalidConfigurationError with patch( - f"{MODULE}.config_flow.vicare_login", + f"{MODULE}.config_flow.login", side_effect=PyViCareInvalidConfigurationError( {"error": "foo", "error_description": "bar"} ), @@ -65,7 +65,7 @@ async def test_user_create_entry( # test PyViCareInvalidCredentialsError with patch( - f"{MODULE}.config_flow.vicare_login", + f"{MODULE}.config_flow.login", side_effect=PyViCareInvalidCredentialsError, ): result = await hass.config_entries.flow.async_configure( @@ -79,7 +79,7 @@ async def test_user_create_entry( # test success with patch( - f"{MODULE}.config_flow.vicare_login", + f"{MODULE}.config_flow.login", return_value=None, ): result = await hass.config_entries.flow.async_configure( @@ -110,7 +110,7 @@ async def test_step_reauth(hass: HomeAssistant, mock_setup_entry: AsyncMock) -> # test PyViCareInvalidConfigurationError with patch( - f"{MODULE}.config_flow.vicare_login", + f"{MODULE}.config_flow.login", side_effect=PyViCareInvalidConfigurationError( {"error": "foo", "error_description": "bar"} ), @@ -125,7 +125,7 @@ async def test_step_reauth(hass: HomeAssistant, mock_setup_entry: AsyncMock) -> # test success with patch( - f"{MODULE}.config_flow.vicare_login", + f"{MODULE}.config_flow.login", return_value=None, ): result = await hass.config_entries.flow.async_configure( @@ -160,7 +160,7 @@ async def test_form_dhcp( assert result["errors"] == {} with patch( - f"{MODULE}.config_flow.vicare_login", + f"{MODULE}.config_flow.login", return_value=None, ): result = await hass.config_entries.flow.async_configure( diff --git a/tests/components/vicare/test_fan.py b/tests/components/vicare/test_fan.py index ba5db6e42c7..aaf6a968ffd 100644 --- a/tests/components/vicare/test_fan.py +++ b/tests/components/vicare/test_fan.py @@ -25,7 +25,7 @@ async def test_all_entities( """Test all entities.""" fixtures: list[Fixture] = [Fixture({"type:ventilation"}, "vicare/ViAir300F.json")] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.FAN]), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_init.py b/tests/components/vicare/test_init.py index 62bec7f50c5..d553f2758b8 100644 --- a/tests/components/vicare/test_init.py +++ b/tests/components/vicare/test_init.py @@ -26,7 +26,7 @@ async def test_device_and_entity_migration( Fixture({"type:boiler"}, "vicare/dummy-device-no-serial.json"), ] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.CLIMATE]), ): mock_config_entry.add_to_hass(hass) diff --git a/tests/components/vicare/test_number.py b/tests/components/vicare/test_number.py index c3aa66a86f6..7b9c1915b95 100644 --- a/tests/components/vicare/test_number.py +++ b/tests/components/vicare/test_number.py @@ -25,7 +25,7 @@ async def test_all_entities( """Test all entities.""" fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.NUMBER]), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_sensor.py b/tests/components/vicare/test_sensor.py index 06c8b963680..afd3232478a 100644 --- a/tests/components/vicare/test_sensor.py +++ b/tests/components/vicare/test_sensor.py @@ -27,7 +27,7 @@ async def test_all_entities( Fixture({"type:boiler"}, "vicare/Vitodens300W.json"), ] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.SENSOR]), ): await setup_integration(hass, mock_config_entry) @@ -48,7 +48,7 @@ async def test_room_sensors( Fixture({"type:climateSensor"}, "vicare/RoomSensor2.json"), ] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.SENSOR]), ): await setup_integration(hass, mock_config_entry) diff --git a/tests/components/vicare/test_water_heater.py b/tests/components/vicare/test_water_heater.py index fbb5863cf7a..f9ca431af6d 100644 --- a/tests/components/vicare/test_water_heater.py +++ b/tests/components/vicare/test_water_heater.py @@ -25,7 +25,7 @@ async def test_all_entities( """Test all entities.""" fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")] with ( - patch(f"{MODULE}.vicare_login", return_value=MockPyViCare(fixtures)), + patch(f"{MODULE}.login", return_value=MockPyViCare(fixtures)), patch(f"{MODULE}.PLATFORMS", [Platform.WATER_HEATER]), ): await setup_integration(hass, mock_config_entry)