Skip to content

Commit 8198dfb

Browse files
authored
Merge pull request #641 from plugwise/testing123
Try a different approach for runtime updating
2 parents 9d8359f + 49e047a commit 8198dfb

File tree

4 files changed

+34
-57
lines changed

4 files changed

+34
-57
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Versions from 0.40 and up
44

5+
## v0.50.1
6+
7+
- Code improvements via #640 and #641
8+
59
## v0.50.0
610

711
- Delete removed Plugwise devices at runtime.

custom_components/plugwise/coordinator.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from homeassistant.helpers import device_registry as dr
2424
from homeassistant.helpers.aiohttp_client import async_get_clientsession
2525
from homeassistant.helpers.debounce import Debouncer
26+
from homeassistant.helpers.device_registry import DeviceEntry, DeviceRegistry
2627
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
2728

2829
from .const import (
@@ -34,32 +35,21 @@
3435
LOGGER,
3536
)
3637

37-
EMPTY_DATA = PlugwiseData(gateway={}, devices={})
38-
3938

4039
async def cleanup_device_and_entity_registry(
41-
hass: HomeAssistant,
4240
data: PlugwiseData,
43-
self_data: PlugwiseData,
41+
device_reg: DeviceRegistry,
42+
device_list: list[DeviceEntry],
4443
entry: ConfigEntry,
4544
) -> None:
4645
"""Remove deleted devices from device- and entity-registry."""
47-
device_reg = dr.async_get(hass)
48-
device_list = dr.async_entries_for_config_entry(
49-
device_reg, entry.entry_id
50-
)
51-
if not (
52-
self_data != EMPTY_DATA # don't clean-up at init
53-
and len(device_list) - len(data.devices.keys()) > 0
54-
):
46+
if len(device_list) - len(data.devices.keys()) <= 0:
5547
return
5648

5749
# via_device cannot be None, this will result in the deletion
5850
# of other Plugwise Gateways when present!
5951
via_device: str = ""
60-
for device_entry in dr.async_entries_for_config_entry(
61-
device_reg, entry.entry_id
62-
):
52+
for device_entry in device_list:
6353
if not device_entry.identifiers:
6454
continue # pragma: no cover
6555

@@ -124,9 +114,9 @@ def __init__(
124114
websession=async_get_clientsession(hass, verify_ssl=False),
125115
)
126116
self._unavailable_logged = False
127-
self.data = EMPTY_DATA
128117
self.hass = hass
129-
self.new_devices: set[str] = set()
118+
self.device_list: list[DeviceEntry] = []
119+
self.new_devices: bool = False
130120
self.update_interval = update_interval
131121

132122
async def _connect(self) -> None:
@@ -149,7 +139,7 @@ async def _async_update_data(self) -> PlugwiseData:
149139
try:
150140
if not self._connected:
151141
await self._connect()
152-
fresh_data = await self.api.async_update()
142+
data = await self.api.async_update()
153143

154144
if self._unavailable_logged:
155145
self._unavailable_logged = False
@@ -172,10 +162,20 @@ async def _async_update_data(self) -> PlugwiseData:
172162
self._unavailable_logged = True
173163
raise UpdateFailed("Failed to connect") from err
174164

175-
await cleanup_device_and_entity_registry(self.hass, fresh_data, self.data, self.config_entry)
165+
device_reg = dr.async_get(self.hass)
166+
device_list = dr.async_entries_for_config_entry(
167+
device_reg, self.config_entry.entry_id
168+
)
169+
170+
await cleanup_device_and_entity_registry(
171+
data,
172+
device_reg,
173+
device_list,
174+
self.config_entry
175+
)
176176

177-
self.new_devices = (fresh_data.devices.keys() - self.data.devices.keys())
177+
self.new_devices = len(data.devices.keys()) - len(self.device_list) > 0
178178

179-
self.data = fresh_data
179+
self.device_list = device_list
180180

181-
return self.data
181+
return data

custom_components/plugwise/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
"iot_class": "local_polling",
1010
"loggers": ["plugwise"],
1111
"requirements": ["plugwise==0.37.5"],
12-
"version": "0.50.1a0"
12+
"version": "0.50.1"
1313
}

tests/components/plugwise/test_init.py

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ async def test_update_device(
211211
entity_registry: er.EntityRegistry,
212212
) -> None:
213213
"""Test a clean-up of the device_registry."""
214+
utcnow = dt_util.utcnow()
215+
data = mock_smile_adam_2.async_update.return_value
216+
214217
mock_config_entry.add_to_hass(hass)
215218
assert await async_setup_component(hass, DOMAIN, {})
216219
await hass.async_block_till_done()
@@ -224,13 +227,10 @@ async def test_update_device(
224227
== 6
225228
)
226229

227-
utcnow = dt_util.utcnow()
228-
data = mock_smile_adam_2.async_update.return_value
229230
# Add a 2nd Tom/Floor
230231
data.devices.update(TOM)
231232
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data):
232233
async_fire_time_changed(hass, utcnow + timedelta(minutes=1))
233-
await hass.config_entries.async_reload(mock_config_entry.entry_id)
234234
await hass.async_block_till_done()
235235

236236
assert (
@@ -246,21 +246,10 @@ async def test_update_device(
246246
item_list.extend(x[1] for x in device_entry.identifiers)
247247
assert "01234567890abcdefghijklmnopqrstu" in item_list
248248

249-
250-
async def test_remove_device(
251-
hass: HomeAssistant,
252-
mock_config_entry: MockConfigEntry,
253-
mock_smile_adam_2: MagicMock,
254-
device_registry: dr.DeviceRegistry,
255-
entity_registry: er.EntityRegistry,
256-
) -> None:
257-
"""Test a clean-up of the device_registry."""
258-
mock_config_entry.add_to_hass(hass)
259-
data = mock_smile_adam_2.async_update.return_value
260-
utcnow = dt_util.utcnow()
261-
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE) as mock_update:
262-
mock_update.return_value = data
263-
assert await async_setup_component(hass, DOMAIN, {})
249+
# Remove the existing Tom/Floor
250+
data.devices.pop("1772a4ea304041adb83f357b751341ff")
251+
with patch(HA_PLUGWISE_SMILE_ASYNC_UPDATE, return_value=data):
252+
async_fire_time_changed(hass, utcnow + timedelta(minutes=1))
264253
await hass.async_block_till_done()
265254

266255
assert (
@@ -271,22 +260,6 @@ async def test_remove_device(
271260
len(dr.async_entries_for_config_entry(device_registry, mock_config_entry.entry_id))
272261
== 6
273262
)
274-
275-
# Remove the Tom/Floor
276-
data.devices.pop("1772a4ea304041adb83f357b751341ff")
277-
mock_update.return_value = data
278-
LOGGER.debug("HOI removing TOM 1772a4ea304041adb83f357b751341ff")
279-
async_fire_time_changed(hass, utcnow + timedelta(seconds=65))
280-
await hass.async_block_till_done()
281-
282-
assert (
283-
len(er.async_entries_for_config_entry(entity_registry, mock_config_entry.entry_id))
284-
== 23
285-
)
286-
assert (
287-
len(dr.async_entries_for_config_entry(device_registry, mock_config_entry.entry_id))
288-
== 5
289-
)
290263
item_list: list[str] = []
291264
for device_entry in list(device_registry.devices.values()):
292265
item_list.extend(x[1] for x in device_entry.identifiers)

0 commit comments

Comments
 (0)