Improve Plugwise runtime-updating (#120230)
This commit is contained in:
parent
ab9cbf64da
commit
213cb6f0fd
7 changed files with 41 additions and 73 deletions
|
@ -89,26 +89,20 @@ async def async_setup_entry(
|
||||||
if not coordinator.new_devices:
|
if not coordinator.new_devices:
|
||||||
return
|
return
|
||||||
|
|
||||||
entities: list[PlugwiseBinarySensorEntity] = []
|
async_add_entities(
|
||||||
for device_id, device in coordinator.data.devices.items():
|
PlugwiseBinarySensorEntity(coordinator, device_id, description)
|
||||||
if not (binary_sensors := device.get("binary_sensors")):
|
for device_id in coordinator.new_devices
|
||||||
continue
|
if (
|
||||||
for description in BINARY_SENSORS:
|
binary_sensors := coordinator.data.devices[device_id].get(
|
||||||
if description.key not in binary_sensors:
|
"binary_sensors"
|
||||||
continue
|
|
||||||
|
|
||||||
entities.append(
|
|
||||||
PlugwiseBinarySensorEntity(
|
|
||||||
coordinator,
|
|
||||||
device_id,
|
|
||||||
description,
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
async_add_entities(entities)
|
)
|
||||||
|
for description in BINARY_SENSORS
|
||||||
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
if description.key in binary_sensors
|
||||||
|
)
|
||||||
|
|
||||||
_add_entities()
|
_add_entities()
|
||||||
|
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
||||||
|
|
||||||
|
|
||||||
class PlugwiseBinarySensorEntity(PlugwiseEntity, BinarySensorEntity):
|
class PlugwiseBinarySensorEntity(PlugwiseEntity, BinarySensorEntity):
|
||||||
|
|
|
@ -41,13 +41,12 @@ async def async_setup_entry(
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
PlugwiseClimateEntity(coordinator, device_id)
|
PlugwiseClimateEntity(coordinator, device_id)
|
||||||
for device_id, device in coordinator.data.devices.items()
|
for device_id in coordinator.new_devices
|
||||||
if device["dev_class"] in MASTER_THERMOSTATS
|
if coordinator.data.devices[device_id]["dev_class"] in MASTER_THERMOSTATS
|
||||||
)
|
)
|
||||||
|
|
||||||
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
|
||||||
|
|
||||||
_add_entities()
|
_add_entities()
|
||||||
|
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
||||||
|
|
||||||
|
|
||||||
class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):
|
class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):
|
||||||
|
|
|
@ -15,7 +15,6 @@ from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME
|
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryError
|
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.aiohttp_client import async_get_clientsession
|
||||||
from homeassistant.helpers.debounce import Debouncer
|
from homeassistant.helpers.debounce import Debouncer
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
|
@ -55,8 +54,8 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
|
||||||
timeout=30,
|
timeout=30,
|
||||||
websession=async_get_clientsession(hass, verify_ssl=False),
|
websession=async_get_clientsession(hass, verify_ssl=False),
|
||||||
)
|
)
|
||||||
self.device_list: list[dr.DeviceEntry] = []
|
self._current_devices: set[str] = set()
|
||||||
self.new_devices: bool = False
|
self.new_devices: set[str] = set()
|
||||||
|
|
||||||
async def _connect(self) -> None:
|
async def _connect(self) -> None:
|
||||||
"""Connect to the Plugwise Smile."""
|
"""Connect to the Plugwise Smile."""
|
||||||
|
@ -81,13 +80,8 @@ class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[PlugwiseData]):
|
||||||
raise ConfigEntryError("Device with unsupported firmware") from err
|
raise ConfigEntryError("Device with unsupported firmware") from err
|
||||||
except ConnectionFailedError as err:
|
except ConnectionFailedError as err:
|
||||||
raise UpdateFailed("Failed to connect to the Plugwise Smile") from err
|
raise UpdateFailed("Failed to connect to the Plugwise Smile") from err
|
||||||
|
else:
|
||||||
device_reg = dr.async_get(self.hass)
|
self.new_devices = set(data.devices) - self._current_devices
|
||||||
device_list = dr.async_entries_for_config_entry(
|
self._current_devices = set(data.devices)
|
||||||
device_reg, self.config_entry.entry_id
|
|
||||||
)
|
|
||||||
|
|
||||||
self.new_devices = len(data.devices.keys()) - len(self.device_list) > 0
|
|
||||||
self.device_list = device_list
|
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
|
@ -81,14 +81,13 @@ async def async_setup_entry(
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
PlugwiseNumberEntity(coordinator, device_id, description)
|
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
|
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()
|
_add_entities()
|
||||||
|
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
||||||
|
|
||||||
|
|
||||||
class PlugwiseNumberEntity(PlugwiseEntity, NumberEntity):
|
class PlugwiseNumberEntity(PlugwiseEntity, NumberEntity):
|
||||||
|
|
|
@ -74,14 +74,13 @@ async def async_setup_entry(
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
PlugwiseSelectEntity(coordinator, device_id, description)
|
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
|
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()
|
_add_entities()
|
||||||
|
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
||||||
|
|
||||||
|
|
||||||
class PlugwiseSelectEntity(PlugwiseEntity, SelectEntity):
|
class PlugwiseSelectEntity(PlugwiseEntity, SelectEntity):
|
||||||
|
|
|
@ -414,27 +414,16 @@ async def async_setup_entry(
|
||||||
if not coordinator.new_devices:
|
if not coordinator.new_devices:
|
||||||
return
|
return
|
||||||
|
|
||||||
entities: list[PlugwiseSensorEntity] = []
|
async_add_entities(
|
||||||
for device_id, device in coordinator.data.devices.items():
|
PlugwiseSensorEntity(coordinator, device_id, description)
|
||||||
if not (sensors := device.get("sensors")):
|
for device_id in coordinator.new_devices
|
||||||
continue
|
if (sensors := coordinator.data.devices[device_id].get("sensors"))
|
||||||
for description in SENSORS:
|
for description in SENSORS
|
||||||
if description.key not in sensors:
|
if description.key in sensors
|
||||||
continue
|
)
|
||||||
|
|
||||||
entities.append(
|
|
||||||
PlugwiseSensorEntity(
|
|
||||||
coordinator,
|
|
||||||
device_id,
|
|
||||||
description,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
async_add_entities(entities)
|
|
||||||
|
|
||||||
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
|
||||||
|
|
||||||
_add_entities()
|
_add_entities()
|
||||||
|
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
||||||
|
|
||||||
|
|
||||||
class PlugwiseSensorEntity(PlugwiseEntity, SensorEntity):
|
class PlugwiseSensorEntity(PlugwiseEntity, SensorEntity):
|
||||||
|
|
|
@ -68,22 +68,16 @@ async def async_setup_entry(
|
||||||
if not coordinator.new_devices:
|
if not coordinator.new_devices:
|
||||||
return
|
return
|
||||||
|
|
||||||
entities: list[PlugwiseSwitchEntity] = []
|
async_add_entities(
|
||||||
for device_id, device in coordinator.data.devices.items():
|
PlugwiseSwitchEntity(coordinator, device_id, description)
|
||||||
if not (switches := device.get("switches")):
|
for device_id in coordinator.new_devices
|
||||||
continue
|
if (switches := coordinator.data.devices[device_id].get("switches"))
|
||||||
for description in SWITCHES:
|
for description in SWITCHES
|
||||||
if description.key not in switches:
|
if description.key in switches
|
||||||
continue
|
)
|
||||||
entities.append(
|
|
||||||
PlugwiseSwitchEntity(coordinator, device_id, description)
|
|
||||||
)
|
|
||||||
|
|
||||||
async_add_entities(entities)
|
|
||||||
|
|
||||||
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
|
||||||
|
|
||||||
_add_entities()
|
_add_entities()
|
||||||
|
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
|
||||||
|
|
||||||
|
|
||||||
class PlugwiseSwitchEntity(PlugwiseEntity, SwitchEntity):
|
class PlugwiseSwitchEntity(PlugwiseEntity, SwitchEntity):
|
||||||
|
|
Loading…
Add table
Reference in a new issue