Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions homeassistant/components/comelit/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .coordinator import ComelitConfigEntry, ComelitVedoSystem
from .utils import DeviceType, new_device_listener

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
Expand All @@ -29,23 +30,19 @@ async def async_setup_entry(

coordinator = cast(ComelitVedoSystem, config_entry.runtime_data)

known_devices: set[int] = set()

def _check_device() -> None:
current_devices = set(coordinator.data["alarm_zones"])
new_devices = current_devices - known_devices
if new_devices:
known_devices.update(new_devices)
async_add_entities(
ComelitVedoBinarySensorEntity(
coordinator, device, config_entry.entry_id
)
for device in coordinator.data["alarm_zones"].values()
if device.index in new_devices
)

_check_device()
config_entry.async_on_unload(coordinator.async_add_listener(_check_device))
def _add_new_entities(new_devices: list[DeviceType], dev_type: str) -> None:
"""Add entities for new monitors."""
entities = [
ComelitVedoBinarySensorEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data["alarm_zones"].values()
if device in new_devices
]
if entities:
async_add_entities(entities)

config_entry.async_on_unload(
new_device_listener(coordinator, _add_new_entities, "alarm_zones")
)


class ComelitVedoBinarySensorEntity(
Expand Down
30 changes: 14 additions & 16 deletions homeassistant/components/comelit/cover.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
from .utils import bridge_api_call
from .utils import DeviceType, bridge_api_call, new_device_listener

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
Expand All @@ -36,21 +36,19 @@ async def async_setup_entry(

coordinator = cast(ComelitSerialBridge, config_entry.runtime_data)

known_devices: set[int] = set()

def _check_device() -> None:
current_devices = set(coordinator.data[COVER])
new_devices = current_devices - known_devices
if new_devices:
known_devices.update(new_devices)
async_add_entities(
ComelitCoverEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[COVER].values()
if device.index in new_devices
)

_check_device()
config_entry.async_on_unload(coordinator.async_add_listener(_check_device))
def _add_new_entities(new_devices: list[DeviceType], dev_type: str) -> None:
"""Add entities for new monitors."""
entities = [
ComelitCoverEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[dev_type].values()
if device in new_devices
]
if entities:
async_add_entities(entities)

config_entry.async_on_unload(
new_device_listener(coordinator, _add_new_entities, COVER)
)


class ComelitCoverEntity(ComelitBridgeBaseEntity, RestoreEntity, CoverEntity):
Expand Down
30 changes: 14 additions & 16 deletions homeassistant/components/comelit/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
from .utils import bridge_api_call
from .utils import DeviceType, bridge_api_call, new_device_listener

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
Expand All @@ -27,21 +27,19 @@ async def async_setup_entry(

coordinator = cast(ComelitSerialBridge, config_entry.runtime_data)

known_devices: set[int] = set()

def _check_device() -> None:
current_devices = set(coordinator.data[LIGHT])
new_devices = current_devices - known_devices
if new_devices:
known_devices.update(new_devices)
async_add_entities(
ComelitLightEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[LIGHT].values()
if device.index in new_devices
)

_check_device()
config_entry.async_on_unload(coordinator.async_add_listener(_check_device))
def _add_new_entities(new_devices: list[DeviceType], dev_type: str) -> None:
"""Add entities for new monitors."""
entities = [
ComelitLightEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[dev_type].values()
if device in new_devices
]
if entities:
async_add_entities(entities)

config_entry.async_on_unload(
new_device_listener(coordinator, _add_new_entities, LIGHT)
)


class ComelitLightEntity(ComelitBridgeBaseEntity, LightEntity):
Expand Down
63 changes: 30 additions & 33 deletions homeassistant/components/comelit/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

from .coordinator import ComelitConfigEntry, ComelitSerialBridge, ComelitVedoSystem
from .entity import ComelitBridgeBaseEntity
from .utils import DeviceType, new_device_listener

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
Expand Down Expand Up @@ -65,24 +66,22 @@ async def async_setup_bridge_entry(

coordinator = cast(ComelitSerialBridge, config_entry.runtime_data)

known_devices: set[int] = set()

def _check_device() -> None:
current_devices = set(coordinator.data[OTHER])
new_devices = current_devices - known_devices
if new_devices:
known_devices.update(new_devices)
async_add_entities(
ComelitBridgeSensorEntity(
coordinator, device, config_entry.entry_id, sensor_desc
)
for sensor_desc in SENSOR_BRIDGE_TYPES
for device in coordinator.data[OTHER].values()
if device.index in new_devices
def _add_new_entities(new_devices: list[DeviceType], dev_type: str) -> None:
"""Add entities for new monitors."""
entities = [
ComelitBridgeSensorEntity(
coordinator, device, config_entry.entry_id, sensor_desc
)
for sensor_desc in SENSOR_BRIDGE_TYPES
for device in coordinator.data[dev_type].values()
if device in new_devices
]
if entities:
async_add_entities(entities)

_check_device()
config_entry.async_on_unload(coordinator.async_add_listener(_check_device))
config_entry.async_on_unload(
new_device_listener(coordinator, _add_new_entities, OTHER)
)


async def async_setup_vedo_entry(
Expand All @@ -94,24 +93,22 @@ async def async_setup_vedo_entry(

coordinator = cast(ComelitVedoSystem, config_entry.runtime_data)

known_devices: set[int] = set()

def _check_device() -> None:
current_devices = set(coordinator.data["alarm_zones"])
new_devices = current_devices - known_devices
if new_devices:
known_devices.update(new_devices)
async_add_entities(
ComelitVedoSensorEntity(
coordinator, device, config_entry.entry_id, sensor_desc
)
for sensor_desc in SENSOR_VEDO_TYPES
for device in coordinator.data["alarm_zones"].values()
if device.index in new_devices
def _add_new_entities(new_devices: list[DeviceType], dev_type: str) -> None:
"""Add entities for new monitors."""
entities = [
ComelitVedoSensorEntity(
coordinator, device, config_entry.entry_id, sensor_desc
)

_check_device()
config_entry.async_on_unload(coordinator.async_add_listener(_check_device))
for sensor_desc in SENSOR_VEDO_TYPES
for device in coordinator.data["alarm_zones"].values()
if device in new_devices
]
if entities:
async_add_entities(entities)

config_entry.async_on_unload(
new_device_listener(coordinator, _add_new_entities, "alarm_zones")
)


class ComelitBridgeSensorEntity(ComelitBridgeBaseEntity, SensorEntity):
Expand Down
45 changes: 15 additions & 30 deletions homeassistant/components/comelit/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
from .utils import bridge_api_call
from .utils import DeviceType, bridge_api_call, new_device_listener

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
Expand All @@ -28,35 +28,20 @@ async def async_setup_entry(

coordinator = cast(ComelitSerialBridge, config_entry.runtime_data)

entities: list[ComelitSwitchEntity] = []
entities.extend(
ComelitSwitchEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[IRRIGATION].values()
)
entities.extend(
ComelitSwitchEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[OTHER].values()
)
async_add_entities(entities)

known_devices: dict[str, set[int]] = {
dev_type: set() for dev_type in (IRRIGATION, OTHER)
}

def _check_device() -> None:
for dev_type in (IRRIGATION, OTHER):
current_devices = set(coordinator.data[dev_type])
new_devices = current_devices - known_devices[dev_type]
if new_devices:
known_devices[dev_type].update(new_devices)
async_add_entities(
ComelitSwitchEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[dev_type].values()
if device.index in new_devices
)

_check_device()
config_entry.async_on_unload(coordinator.async_add_listener(_check_device))
def _add_new_entities(new_devices: list[DeviceType], dev_type: str) -> None:
"""Add entities for new monitors."""
entities = [
ComelitSwitchEntity(coordinator, device, config_entry.entry_id)
for device in coordinator.data[dev_type].values()
if device in new_devices
]
if entities:
async_add_entities(entities)

for dev_type in (IRRIGATION, OTHER):
config_entry.async_on_unload(
new_device_listener(coordinator, _add_new_entities, dev_type)
)


class ComelitSwitchEntity(ComelitBridgeBaseEntity, SwitchEntity):
Expand Down
47 changes: 46 additions & 1 deletion homeassistant/components/comelit/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
from functools import wraps
from typing import Any, Concatenate

from aiocomelit import ComelitSerialBridgeObject
from aiocomelit.api import (
ComelitSerialBridgeObject,
ComelitVedoAreaObject,
ComelitVedoZoneObject,
)
from aiocomelit.exceptions import CannotAuthenticate, CannotConnect, CannotRetrieveData
from aiohttp import ClientSession, CookieJar

Expand All @@ -19,8 +23,11 @@
)

from .const import _LOGGER, DOMAIN
from .coordinator import ComelitBaseCoordinator
from .entity import ComelitBridgeBaseEntity

DeviceType = ComelitSerialBridgeObject | ComelitVedoAreaObject | ComelitVedoZoneObject


async def async_client_session(hass: HomeAssistant) -> ClientSession:
"""Return a new aiohttp session."""
Expand Down Expand Up @@ -113,3 +120,41 @@ async def cmd_wrapper(self: _T, *args: _P.args, **kwargs: _P.kwargs) -> None:
self.coordinator.config_entry.async_start_reauth(self.hass)

return cmd_wrapper


def new_device_listener(
coordinator: ComelitBaseCoordinator,
new_devices_callback: Callable[
[
list[
ComelitSerialBridgeObject
| ComelitVedoAreaObject
| ComelitVedoZoneObject
],
str,
],
None,
],
data_type: str,
) -> Callable[[], None]:
"""Subscribe to coordinator updates to check for new devices."""
known_devices: set[int] = set()

def _check_devices() -> None:
"""Check for new devices and call callback with any new monitors."""
if not coordinator.data:
return

new_devices: list[DeviceType] = []
for _id in coordinator.data[data_type]:
if _id not in known_devices:
known_devices.add(_id)
new_devices.append(coordinator.data[data_type][_id])

if new_devices:
new_devices_callback(new_devices, data_type)

# Check for devices immediately
_check_devices()

return coordinator.async_add_listener(_check_devices)
Loading
Loading