From a2730fb29d430a22d3059bf68a6bc13fdb2ccf8b Mon Sep 17 00:00:00 2001 From: rappenze Date: Sat, 23 Sep 2023 19:13:03 +0200 Subject: [PATCH] Fibaro finish separation of scenes (#100734) --- homeassistant/components/fibaro/__init__.py | 16 ++++++++-------- homeassistant/components/fibaro/scene.py | 6 ++---- tests/components/fibaro/conftest.py | 5 +---- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/fibaro/__init__.py b/homeassistant/components/fibaro/__init__.py index b4e5b47f297..0af6cf02586 100644 --- a/homeassistant/components/fibaro/__init__.py +++ b/homeassistant/components/fibaro/__init__.py @@ -8,6 +8,7 @@ from typing import Any from pyfibaro.fibaro_client import FibaroClient from pyfibaro.fibaro_device import DeviceModel +from pyfibaro.fibaro_scene import SceneModel from requests.exceptions import HTTPError from homeassistant.config_entries import ConfigEntry @@ -87,9 +88,11 @@ class FibaroController: self._import_plugins = config[CONF_IMPORT_PLUGINS] self._room_map = None # Mapping roomId to room object self._device_map = None # Mapping deviceId to device object - self.fibaro_devices: dict[Platform, list] = defaultdict( + self.fibaro_devices: dict[Platform, list[DeviceModel]] = defaultdict( list ) # List of devices by entity platform + # All scenes + self._scenes: list[SceneModel] = [] self._callbacks: dict[Any, Any] = {} # Update value callbacks by deviceId self.hub_serial: str # Unique serial number of the hub self.hub_name: str # The friendly name of the hub @@ -115,7 +118,7 @@ class FibaroController: self._room_map = {room.fibaro_id: room for room in self._client.read_rooms()} self._read_devices() - self._read_scenes() + self._scenes = self._client.read_scenes() return True def connect_with_error_handling(self) -> None: @@ -282,12 +285,9 @@ class FibaroController: room = self._room_map.get(room_id) return room.name if room else None - def _read_scenes(self): - scenes = self._client.read_scenes() - for device in scenes: - device.fibaro_controller = self - self.fibaro_devices[Platform.SCENE].append(device) - _LOGGER.debug("Scene -> %s", device) + def read_scenes(self) -> list[SceneModel]: + """Return list of scenes.""" + return self._scenes def _read_devices(self): """Read and process the device list.""" diff --git a/homeassistant/components/fibaro/scene.py b/homeassistant/components/fibaro/scene.py index 36d2666f97d..7ae8bff151f 100644 --- a/homeassistant/components/fibaro/scene.py +++ b/homeassistant/components/fibaro/scene.py @@ -7,7 +7,6 @@ from pyfibaro.fibaro_scene import SceneModel from homeassistant.components.scene import Scene from homeassistant.config_entries import ConfigEntry -from homeassistant.const import Platform from homeassistant.core import HomeAssistant from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback @@ -25,7 +24,7 @@ async def async_setup_entry( """Perform the setup for Fibaro scenes.""" controller: FibaroController = hass.data[DOMAIN][entry.entry_id] async_add_entities( - [FibaroScene(scene) for scene in controller.fibaro_devices[Platform.SCENE]], + [FibaroScene(scene, controller) for scene in controller.read_scenes()], True, ) @@ -33,11 +32,10 @@ async def async_setup_entry( class FibaroScene(Scene): """Representation of a Fibaro scene entity.""" - def __init__(self, fibaro_scene: SceneModel) -> None: + def __init__(self, fibaro_scene: SceneModel, controller: FibaroController) -> None: """Initialize the Fibaro scene.""" self._fibaro_scene = fibaro_scene - controller: FibaroController = fibaro_scene.fibaro_controller room_name = controller.get_room_name(fibaro_scene.room_id) if not room_name: room_name = "Unknown" diff --git a/tests/components/fibaro/conftest.py b/tests/components/fibaro/conftest.py index 1a3f9b083b8..2b6580c3191 100644 --- a/tests/components/fibaro/conftest.py +++ b/tests/components/fibaro/conftest.py @@ -47,10 +47,7 @@ async def setup_platform( controller_mock = Mock() controller_mock.hub_serial = "HC2-111111" controller_mock.get_room_name.return_value = room_name - controller_mock.fibaro_devices = {Platform.SCENE: scenes} - - for scene in scenes: - scene.fibaro_controller = controller_mock + controller_mock.read_scenes.return_value = scenes hass.data[DOMAIN] = {config_entry.entry_id: controller_mock} await hass.config_entries.async_forward_entry_setup(config_entry, platform)