Fibaro streamline hass.data entry (#100547)

* Fibaro streamline hass.data entry

* Fix tests
This commit is contained in:
rappenze 2023-09-18 20:22:23 +02:00 committed by GitHub
parent fa1a1715c9
commit ddd62a8f63
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 31 additions and 62 deletions

View file

@ -35,8 +35,6 @@ from .const import CONF_IMPORT_PLUGINS, DOMAIN
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
FIBARO_CONTROLLER = "fibaro_controller"
FIBARO_DEVICES = "fibaro_devices"
PLATFORMS = [ PLATFORMS = [
Platform.BINARY_SENSOR, Platform.BINARY_SENSOR,
Platform.CLIMATE, Platform.CLIMATE,
@ -377,12 +375,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
except FibaroAuthFailed as auth_ex: except FibaroAuthFailed as auth_ex:
raise ConfigEntryAuthFailed from auth_ex raise ConfigEntryAuthFailed from auth_ex
data: dict[str, Any] = {} hass.data.setdefault(DOMAIN, {})[entry.entry_id] = controller
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = data
data[FIBARO_CONTROLLER] = controller
devices = data[FIBARO_DEVICES] = {}
for platform in PLATFORMS:
devices[platform] = [*controller.fibaro_devices[platform]]
# register the hub device info separately as the hub has sometimes no entities # register the hub device info separately as the hub has sometimes no entities
device_registry = dr.async_get(hass) device_registry = dr.async_get(hass)
@ -408,7 +401,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
_LOGGER.debug("Shutting down Fibaro connection") _LOGGER.debug("Shutting down Fibaro connection")
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
hass.data[DOMAIN][entry.entry_id][FIBARO_CONTROLLER].disable_state_handler() hass.data[DOMAIN][entry.entry_id].disable_state_handler()
hass.data[DOMAIN].pop(entry.entry_id) hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok return unload_ok

View file

@ -16,7 +16,7 @@ from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
SENSOR_TYPES = { SENSOR_TYPES = {
@ -45,12 +45,11 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Perform the setup for Fibaro controller devices.""" """Perform the setup for Fibaro controller devices."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [
FibaroBinarySensor(device) FibaroBinarySensor(device)
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][ for device in controller.fibaro_devices[Platform.BINARY_SENSOR]
Platform.BINARY_SENSOR
]
], ],
True, True,
) )

View file

@ -21,7 +21,7 @@ from homeassistant.const import ATTR_TEMPERATURE, Platform, UnitOfTemperature
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
PRESET_RESUME = "resume" PRESET_RESUME = "resume"
@ -113,12 +113,11 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Perform the setup for Fibaro controller devices.""" """Perform the setup for Fibaro controller devices."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [
FibaroThermostat(device) FibaroThermostat(device)
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][ for device in controller.fibaro_devices[Platform.CLIMATE]
Platform.CLIMATE
]
], ],
True, True,
) )

View file

@ -17,7 +17,7 @@ from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
@ -27,13 +27,9 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the Fibaro covers.""" """Set up the Fibaro covers."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [FibaroCover(device) for device in controller.fibaro_devices[Platform.COVER]],
FibaroCover(device)
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][
Platform.COVER
]
],
True, True,
) )

View file

@ -23,7 +23,7 @@ from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
PARALLEL_UPDATES = 2 PARALLEL_UPDATES = 2
@ -56,13 +56,9 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Perform the setup for Fibaro controller devices.""" """Perform the setup for Fibaro controller devices."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [FibaroLight(device) for device in controller.fibaro_devices[Platform.LIGHT]],
FibaroLight(device)
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][
Platform.LIGHT
]
],
True, True,
) )

View file

@ -11,7 +11,7 @@ from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
@ -21,13 +21,9 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the Fibaro locks.""" """Set up the Fibaro locks."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [FibaroLock(device) for device in controller.fibaro_devices[Platform.LOCK]],
FibaroLock(device)
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][
Platform.LOCK
]
],
True, True,
) )

View file

@ -13,7 +13,7 @@ from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util import slugify from homeassistant.util import slugify
from . import FIBARO_DEVICES, FibaroController from . import FibaroController
from .const import DOMAIN from .const import DOMAIN
@ -23,13 +23,9 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Perform the setup for Fibaro scenes.""" """Perform the setup for Fibaro scenes."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [FibaroScene(scene) for scene in controller.fibaro_devices[Platform.SCENE]],
FibaroScene(scene)
for scene in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][
Platform.SCENE
]
],
True, True,
) )

View file

@ -26,7 +26,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util import convert from homeassistant.util import convert
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
# List of known sensors which represents a fibaro device # List of known sensors which represents a fibaro device
@ -107,7 +107,9 @@ async def async_setup_entry(
"""Set up the Fibaro controller devices.""" """Set up the Fibaro controller devices."""
entities: list[SensorEntity] = [] entities: list[SensorEntity] = []
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][Platform.SENSOR]: controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
for device in controller.fibaro_devices[Platform.SENSOR]:
entity_description = MAIN_SENSOR_TYPES.get(device.type) entity_description = MAIN_SENSOR_TYPES.get(device.type)
# main sensors are created even if the entity type is not known # main sensors are created even if the entity type is not known
@ -122,7 +124,7 @@ async def async_setup_entry(
Platform.SENSOR, Platform.SENSOR,
Platform.SWITCH, Platform.SWITCH,
): ):
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][platform]: for device in controller.fibaro_devices[platform]:
for entity_description in ADDITIONAL_SENSOR_TYPES: for entity_description in ADDITIONAL_SENSOR_TYPES:
if entity_description.key in device.properties: if entity_description.key in device.properties:
entities.append(FibaroAdditionalSensor(device, entity_description)) entities.append(FibaroAdditionalSensor(device, entity_description))

View file

@ -11,7 +11,7 @@ from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FIBARO_DEVICES, FibaroDevice from . import FibaroController, FibaroDevice
from .const import DOMAIN from .const import DOMAIN
@ -21,13 +21,9 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the Fibaro switches.""" """Set up the Fibaro switches."""
controller: FibaroController = hass.data[DOMAIN][entry.entry_id]
async_add_entities( async_add_entities(
[ [FibaroSwitch(device) for device in controller.fibaro_devices[Platform.SWITCH]],
FibaroSwitch(device)
for device in hass.data[DOMAIN][entry.entry_id][FIBARO_DEVICES][
Platform.SWITCH
]
],
True, True,
) )

View file

@ -5,7 +5,7 @@ from unittest.mock import AsyncMock, Mock, patch
from pyfibaro.fibaro_scene import SceneModel from pyfibaro.fibaro_scene import SceneModel
import pytest import pytest
from homeassistant.components.fibaro import DOMAIN, FIBARO_CONTROLLER, FIBARO_DEVICES from homeassistant.components.fibaro import DOMAIN
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import Platform from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -47,16 +47,12 @@ async def setup_platform(
controller_mock = Mock() controller_mock = Mock()
controller_mock.hub_serial = "HC2-111111" controller_mock.hub_serial = "HC2-111111"
controller_mock.get_room_name.return_value = room_name controller_mock.get_room_name.return_value = room_name
controller_mock.fibaro_devices = {Platform.SCENE: scenes}
for scene in scenes: for scene in scenes:
scene.fibaro_controller = controller_mock scene.fibaro_controller = controller_mock
hass.data[DOMAIN] = { hass.data[DOMAIN] = {config_entry.entry_id: controller_mock}
config_entry.entry_id: {
FIBARO_CONTROLLER: controller_mock,
FIBARO_DEVICES: {Platform.SCENE: scenes},
}
}
await hass.config_entries.async_forward_entry_setup(config_entry, platform) await hass.config_entries.async_forward_entry_setup(config_entry, platform)
await hass.async_block_till_done() await hass.async_block_till_done()
return config_entry return config_entry