Improve Plugwise runtime-updating (#120230)

This commit is contained in:
Bouwe Westerdijk 2024-06-24 09:57:04 +02:00 committed by GitHub
parent ab9cbf64da
commit 213cb6f0fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 41 additions and 73 deletions

View file

@ -89,26 +89,20 @@ async def async_setup_entry(
if not coordinator.new_devices:
return
entities: list[PlugwiseBinarySensorEntity] = []
for device_id, device in coordinator.data.devices.items():
if not (binary_sensors := device.get("binary_sensors")):
continue
for description in BINARY_SENSORS:
if description.key not in binary_sensors:
continue
entities.append(
PlugwiseBinarySensorEntity(
coordinator,
device_id,
description,
)
async_add_entities(
PlugwiseBinarySensorEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices
if (
binary_sensors := coordinator.data.devices[device_id].get(
"binary_sensors"
)
async_add_entities(entities)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
)
for description in BINARY_SENSORS
if description.key in binary_sensors
)
_add_entities()
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
class PlugwiseBinarySensorEntity(PlugwiseEntity, BinarySensorEntity):

View file

@ -41,13 +41,12 @@ async def async_setup_entry(
async_add_entities(
PlugwiseClimateEntity(coordinator, device_id)
for device_id, device in coordinator.data.devices.items()
if device["dev_class"] in MASTER_THERMOSTATS
for device_id in coordinator.new_devices
if coordinator.data.devices[device_id]["dev_class"] in MASTER_THERMOSTATS
)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
_add_entities()
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):

View file

@ -15,7 +15,6 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryError
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
@ -55,8 +54,8 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
timeout=30,
websession=async_get_clientsession(hass, verify_ssl=False),
)
self.device_list: list[dr.DeviceEntry] = []
self.new_devices: bool = False
self._current_devices: set[str] = set()
self.new_devices: set[str] = set()
async def _connect(self) -> None:
"""Connect to the Plugwise Smile."""
@ -81,13 +80,8 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
raise ConfigEntryError("Device with unsupported firmware") from err
except ConnectionFailedError as err:
raise UpdateFailed("Failed to connect to the Plugwise Smile") from err
device_reg = dr.async_get(self.hass)
device_list = dr.async_entries_for_config_entry(
device_reg, self.config_entry.entry_id
)
self.new_devices = len(data.devices.keys()) - len(self.device_list) > 0
self.device_list = device_list
else:
self.new_devices = set(data.devices) - self._current_devices
self._current_devices = set(data.devices)
return data

View file

@ -81,14 +81,13 @@ async def async_setup_entry(
async_add_entities(
PlugwiseNumberEntity(coordinator, device_id, description)
for device_id, device in coordinator.data.devices.items()
for device_id in coordinator.new_devices
for description in NUMBER_TYPES
if description.key in device
if description.key in coordinator.data.devices[device_id]
)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
_add_entities()
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
class PlugwiseNumberEntity(PlugwiseEntity, NumberEntity):

View file

@ -74,14 +74,13 @@ async def async_setup_entry(
async_add_entities(
PlugwiseSelectEntity(coordinator, device_id, description)
for device_id, device in coordinator.data.devices.items()
for device_id in coordinator.new_devices
for description in SELECT_TYPES
if description.options_key in device
if description.options_key in coordinator.data.devices[device_id]
)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
_add_entities()
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
class PlugwiseSelectEntity(PlugwiseEntity, SelectEntity):

View file

@ -414,27 +414,16 @@ async def async_setup_entry(
if not coordinator.new_devices:
return
entities: list[PlugwiseSensorEntity] = []
for device_id, device in coordinator.data.devices.items():
if not (sensors := device.get("sensors")):
continue
for description in SENSORS:
if description.key not in sensors:
continue
entities.append(
PlugwiseSensorEntity(
coordinator,
device_id,
description,
)
)
async_add_entities(entities)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
async_add_entities(
PlugwiseSensorEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices
if (sensors := coordinator.data.devices[device_id].get("sensors"))
for description in SENSORS
if description.key in sensors
)
_add_entities()
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
class PlugwiseSensorEntity(PlugwiseEntity, SensorEntity):

View file

@ -68,22 +68,16 @@ async def async_setup_entry(
if not coordinator.new_devices:
return
entities: list[PlugwiseSwitchEntity] = []
for device_id, device in coordinator.data.devices.items():
if not (switches := device.get("switches")):
continue
for description in SWITCHES:
if description.key not in switches:
continue
entities.append(
PlugwiseSwitchEntity(coordinator, device_id, description)
)
async_add_entities(entities)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
async_add_entities(
PlugwiseSwitchEntity(coordinator, device_id, description)
for device_id in coordinator.new_devices
if (switches := coordinator.data.devices[device_id].get("switches"))
for description in SWITCHES
if description.key in switches
)
_add_entities()
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
class PlugwiseSwitchEntity(PlugwiseEntity, SwitchEntity):