Bump aioesphomeapi to 39.0.0 (#150523)

This commit is contained in:
J. Nick Koston
2025-08-13 03:17:20 -05:00
committed by GitHub
parent 8a52e9ca01
commit 8a54a1d95c
9 changed files with 195 additions and 80 deletions

View File

@@ -2,7 +2,6 @@
from __future__ import annotations
import asyncio
import base64
from functools import partial
import logging
@@ -15,7 +14,6 @@ from aioesphomeapi import (
APIVersion,
DeviceInfo as EsphomeDeviceInfo,
EncryptionPlaintextAPIError,
EntityInfo,
HomeassistantServiceCall,
InvalidAuthAPIError,
InvalidEncryptionKeyAPIError,
@@ -63,7 +61,6 @@ from homeassistant.helpers.issue_registry import (
)
from homeassistant.helpers.service import async_set_service_schema
from homeassistant.helpers.template import Template
from homeassistant.util.async_ import create_eager_task
from .bluetooth import async_connect_scanner
from .const import (
@@ -425,14 +422,7 @@ class ESPHomeManager:
unique_id_is_mac_address = unique_id and ":" in unique_id
if entry.options.get(CONF_SUBSCRIBE_LOGS):
self._async_subscribe_logs(self._async_get_equivalent_log_level())
results = await asyncio.gather(
create_eager_task(cli.device_info()),
create_eager_task(cli.list_entities_services()),
)
device_info: EsphomeDeviceInfo = results[0]
entity_infos_services: tuple[list[EntityInfo], list[UserService]] = results[1]
entity_infos, services = entity_infos_services
device_info, entity_infos, services = await cli.device_info_and_list_entities()
device_mac = format_mac(device_info.mac_address)
mac_address_matches = unique_id == device_mac

View File

@@ -17,7 +17,7 @@
"mqtt": ["esphome/discover/#"],
"quality_scale": "platinum",
"requirements": [
"aioesphomeapi==38.2.1",
"aioesphomeapi==39.0.0",
"esphome-dashboard-api==1.3.0",
"bleak-esphome==3.1.0"
],

2
requirements_all.txt generated
View File

@@ -247,7 +247,7 @@ aioelectricitymaps==0.4.0
aioemonitor==1.0.5
# homeassistant.components.esphome
aioesphomeapi==38.2.1
aioesphomeapi==39.0.0
# homeassistant.components.flo
aioflo==2021.11.0

View File

@@ -235,7 +235,7 @@ aioelectricitymaps==0.4.0
aioemonitor==1.0.5
# homeassistant.components.esphome
aioesphomeapi==38.2.1
aioesphomeapi==39.0.0
# homeassistant.components.flo
aioflo==2021.11.0

View File

@@ -517,6 +517,9 @@ async def _mock_generic_device_entry(
mock_client.list_entities_services = AsyncMock(
return_value=mock_list_entities_services
)
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(mock_device.device_info, *mock_list_entities_services)
)
def _subscribe_home_assistant_states_and_services(
*,

View File

@@ -1045,8 +1045,11 @@ async def test_encryption_key_valid_psk(
assert result["step_id"] == "encryption_key"
assert result["description_placeholders"] == {"name": "ESPHome"}
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(uses_password=False, name="test")
device_info = DeviceInfo(uses_password=False, name="test")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_NOISE_PSK: VALID_NOISE_PSK}
@@ -1363,10 +1366,13 @@ async def test_reauth_confirm_invalid(
assert result["errors"]
assert result["errors"]["base"] == "invalid_psk"
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
uses_password=False, name="test", mac_address="11:22:33:44:55:aa"
)
device_info = DeviceInfo(
uses_password=False, name="test", mac_address="11:22:33:44:55:aa"
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_NOISE_PSK: VALID_NOISE_PSK}
@@ -1404,10 +1410,13 @@ async def test_reauth_confirm_invalid_with_unique_id(
assert result["errors"]
assert result["errors"]["base"] == "invalid_psk"
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
uses_password=False, name="test", mac_address="11:22:33:44:55:aa"
)
device_info = DeviceInfo(
uses_password=False, name="test", mac_address="11:22:33:44:55:aa"
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_NOISE_PSK: VALID_NOISE_PSK}
@@ -1460,8 +1469,11 @@ async def test_discovery_dhcp_updates_host(
unique_id="11:22:33:44:55:aa",
)
entry.add_to_hass(hass)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(name="test8266", mac_address="1122334455aa")
device_info = DeviceInfo(name="test8266", mac_address="1122334455aa")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
service_info = DhcpServiceInfo(
@@ -1496,8 +1508,11 @@ async def test_discovery_dhcp_does_not_update_host_wrong_mac(
unique_id="11:22:33:44:55:aa",
)
entry.add_to_hass(hass)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(name="test8266", mac_address="1122334455ff")
device_info = DeviceInfo(name="test8266", mac_address="1122334455ff")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
service_info = DhcpServiceInfo(
@@ -1602,7 +1617,12 @@ async def test_discovery_dhcp_no_changes(
)
entry.add_to_hass(hass)
mock_client.device_info = AsyncMock(return_value=DeviceInfo(name="test8266"))
device_info = DeviceInfo(name="test8266")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
service_info = DhcpServiceInfo(
ip="192.168.43.183",
@@ -2034,12 +2054,15 @@ async def test_user_flow_name_conflict_migrate(
unique_id="11:22:33:44:55:cc",
)
existing_entry.add_to_hass(hass)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
uses_password=False,
name="test",
mac_address="11:22:33:44:55:AA",
)
device_info = DeviceInfo(
uses_password=False,
name="test",
mac_address="11:22:33:44:55:AA",
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
result = await hass.config_entries.flow.async_init(
@@ -2084,12 +2107,15 @@ async def test_user_flow_name_conflict_overwrite(
unique_id="11:22:33:44:55:cc",
)
existing_entry.add_to_hass(hass)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
uses_password=False,
name="test",
mac_address="11:22:33:44:55:AA",
)
device_info = DeviceInfo(
uses_password=False,
name="test",
mac_address="11:22:33:44:55:AA",
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
result = await hass.config_entries.flow.async_init(

View File

@@ -214,6 +214,9 @@ async def test_entities_removed_after_reload(
mock_device.client.list_entities_services = AsyncMock(
return_value=(entity_info, [])
)
mock_device.client.device_info_and_list_entities = AsyncMock(
return_value=(mock_device.device_info, entity_info, [])
)
assert await hass.config_entries.async_setup(entry.entry_id)
on_future = hass.loop.create_future()
@@ -677,6 +680,13 @@ async def test_deep_sleep_added_after_setup(
**{**asdict(mock_device.device_info), "has_deep_sleep": True}
)
mock_device.client.device_info = AsyncMock(return_value=new_device_info)
mock_device.client.device_info_and_list_entities = AsyncMock(
return_value=(
new_device_info,
mock_device.client.list_entities_services.return_value[0],
mock_device.client.list_entities_services.return_value[1],
)
)
mock_device.device_info = new_device_info
await mock_device.mock_connect()
@@ -952,6 +962,9 @@ async def test_entity_switches_between_devices(
mock_client.list_entities_services = AsyncMock(
return_value=(updated_entity_info, [])
)
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, updated_entity_info, [])
)
# Trigger a reconnect to simulate the entity info update
await device.mock_disconnect(expected_disconnect=False)
await device.mock_connect()
@@ -979,6 +992,9 @@ async def test_entity_switches_between_devices(
mock_client.list_entities_services = AsyncMock(
return_value=(updated_entity_info, [])
)
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, updated_entity_info, [])
)
await device.mock_disconnect(expected_disconnect=False)
await device.mock_connect()
@@ -1005,6 +1021,9 @@ async def test_entity_switches_between_devices(
mock_client.list_entities_services = AsyncMock(
return_value=(updated_entity_info, [])
)
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, updated_entity_info, [])
)
await device.mock_disconnect(expected_disconnect=False)
await device.mock_connect()
@@ -1228,6 +1247,9 @@ async def test_unique_id_migration_when_entity_moves_between_devices(
# Update the entity info by changing what the mock returns
mock_client.list_entities_services = AsyncMock(return_value=(new_entity_info, []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, new_entity_info, [])
)
# Trigger a reconnect to simulate the entity info update
await device.mock_disconnect(expected_disconnect=False)
@@ -1322,6 +1344,9 @@ async def test_unique_id_migration_sub_device_to_main_device(
# Update the entity info
mock_client.list_entities_services = AsyncMock(return_value=(new_entity_info, []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, new_entity_info, [])
)
# Trigger a reconnect
await device.mock_disconnect(expected_disconnect=False)
@@ -1415,6 +1440,9 @@ async def test_unique_id_migration_between_sub_devices(
# Update the entity info
mock_client.list_entities_services = AsyncMock(return_value=(new_entity_info, []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, new_entity_info, [])
)
# Trigger a reconnect
await device.mock_disconnect(expected_disconnect=False)
@@ -1534,6 +1562,9 @@ async def test_entity_device_id_rename_in_yaml(
# Update the entity info
mock_client.list_entities_services = AsyncMock(return_value=(new_entity_info, []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(new_device_info, new_entity_info, [])
)
# Trigger a reconnect to simulate the YAML config change
await device.mock_disconnect(expected_disconnect=False)

View File

@@ -422,10 +422,11 @@ async def test_unique_id_updated_to_mac(
mock_client.subscribe_home_assistant_states_and_services = (
async_subscribe_home_assistant_states_and_services
)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
mac_address="1122334455aa",
)
device_info = DeviceInfo(mac_address="1122334455aa")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -455,11 +456,14 @@ async def test_add_missing_bluetooth_mac_address(
mock_client.subscribe_home_assistant_states_and_services = (
async_subscribe_home_assistant_states_and_services
)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
mac_address="1122334455aa",
bluetooth_mac_address="AA:BB:CC:DD:EE:FF",
)
device_info = DeviceInfo(
mac_address="1122334455aa",
bluetooth_mac_address="AA:BB:CC:DD:EE:FF",
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -493,8 +497,11 @@ async def test_unique_id_not_updated_if_name_same_and_already_mac(
disconnect_done.set_result(None)
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455ab", name="test")
device_info = DeviceInfo(mac_address="1122334455ab", name="test")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -523,8 +530,11 @@ async def test_unique_id_updated_if_name_unset_and_already_mac(
disconnect_done.set_result(None)
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455ab", name="test")
device_info = DeviceInfo(mac_address="1122334455ab", name="test")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -558,8 +568,11 @@ async def test_unique_id_not_updated_if_name_different_and_already_mac(
disconnect_done.set_result(None)
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455ab", name="different")
device_info = DeviceInfo(mac_address="1122334455ab", name="different")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -597,8 +610,11 @@ async def test_name_updated_only_if_mac_matches(
mock_client.subscribe_home_assistant_states_and_services = (
async_subscribe_home_assistant_states_and_services
)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455aa", name="new")
device_info = DeviceInfo(mac_address="1122334455aa", name="new")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -634,8 +650,11 @@ async def test_name_updated_only_if_mac_was_unset(
mock_client.subscribe_home_assistant_states_and_services = (
async_subscribe_home_assistant_states_and_services
)
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455aa", name="new")
device_info = DeviceInfo(mac_address="1122334455aa", name="new")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -672,8 +691,11 @@ async def test_connection_aborted_wrong_device(
disconnect_done.set_result(None)
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455ab", name="different")
device_info = DeviceInfo(mac_address="1122334455ab", name="different")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -703,10 +725,12 @@ async def test_connection_aborted_wrong_device(
hostname="test",
macaddress="1122334455aa",
)
new_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455aa", name="test")
)
device_info = DeviceInfo(mac_address="1122334455aa", name="test")
new_info = AsyncMock(return_value=device_info)
mock_client.device_info = new_info
# Also need to update device_info_and_list_entities
new_combined_info = AsyncMock(return_value=(device_info, [], []))
mock_client.device_info_and_list_entities = new_combined_info
result = await hass.config_entries.flow.async_init(
"esphome", context={"source": config_entries.SOURCE_DHCP}, data=service_info
)
@@ -720,7 +744,8 @@ async def test_connection_aborted_wrong_device(
}
assert entry.data[CONF_HOST] == "192.168.43.184"
await hass.async_block_till_done()
assert len(new_info.mock_calls) == 2
# Check that either device_info or device_info_and_list_entities was called
assert len(new_info.mock_calls) + len(new_combined_info.mock_calls) == 2
assert "Unexpected device found at" not in caplog.text
@@ -749,8 +774,11 @@ async def test_connection_aborted_wrong_device_same_name(
disconnect_done.set_result(None)
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455ab", name="test")
device_info = DeviceInfo(mac_address="1122334455ab", name="test")
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(entry.entry_id)
@@ -777,10 +805,12 @@ async def test_connection_aborted_wrong_device_same_name(
hostname="test",
macaddress="1122334455aa",
)
new_info = AsyncMock(
return_value=DeviceInfo(mac_address="1122334455aa", name="test")
)
device_info = DeviceInfo(mac_address="1122334455aa", name="test")
new_info = AsyncMock(return_value=device_info)
mock_client.device_info = new_info
# Also need to update device_info_and_list_entities
new_combined_info = AsyncMock(return_value=(device_info, [], []))
mock_client.device_info_and_list_entities = new_combined_info
result = await hass.config_entries.flow.async_init(
"esphome", context={"source": config_entries.SOURCE_DHCP}, data=service_info
)
@@ -794,7 +824,8 @@ async def test_connection_aborted_wrong_device_same_name(
}
assert entry.data[CONF_HOST] == "192.168.43.184"
await hass.async_block_till_done()
assert len(new_info.mock_calls) == 2
# Check that either device_info or device_info_and_list_entities was called
assert len(new_info.mock_calls) + len(new_combined_info.mock_calls) == 2
assert "Unexpected device found at" not in caplog.text
@@ -823,6 +854,12 @@ async def test_failure_during_connect(
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(side_effect=APIConnectionError("fail"))
mock_client.list_entities_services = AsyncMock(
side_effect=APIConnectionError("fail")
)
mock_client.device_info_and_list_entities = AsyncMock(
side_effect=APIConnectionError("fail")
)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
@@ -989,6 +1026,9 @@ async def test_esphome_device_with_dash_in_name_user_services(
# Verify the service can be removed
mock_client.list_entities_services = AsyncMock(return_value=([], [service1]))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, [], [service1])
)
await device.mock_disconnect(True)
await hass.async_block_till_done()
await device.mock_connect()
@@ -1045,6 +1085,9 @@ async def test_esphome_user_services_ignores_invalid_arg_types(
# Verify the service can be removed
mock_client.list_entities_services = AsyncMock(return_value=([], [service2]))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, [], [service2])
)
await device.mock_disconnect(True)
await hass.async_block_till_done()
await device.mock_connect()
@@ -1153,6 +1196,9 @@ async def test_esphome_user_services_changes(
# Verify the service can be updated
mock_client.list_entities_services = AsyncMock(return_value=([], [new_service1]))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, [], [new_service1])
)
await device.mock_disconnect(True)
await hass.async_block_till_done()
await device.mock_connect()
@@ -1486,6 +1532,10 @@ async def test_device_adds_friendly_name(
**{**device.device_info.to_dict(), "friendly_name": "I have a friendly name"}
)
mock_client.device_info = AsyncMock(return_value=device.device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, [], [])
)
await device.mock_connect()
await hass.async_block_till_done()
dev = dev_reg.async_get_device(
@@ -1676,6 +1726,10 @@ async def test_sub_device_cleanup(
# Update the mock client to return the new device info
mock_client.device_info = AsyncMock(return_value=device.device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device.device_info, [], [])
)
# Simulate reconnection which triggers device registry update
await device.mock_connect()

View File

@@ -55,10 +55,13 @@ async def test_device_conflict_manual(
disconnect_done.set_result(None)
mock_client.disconnect = async_disconnect
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
mac_address="1122334455ab", name="test", model="esp32-iso-poe"
)
device_info = DeviceInfo(
mac_address="1122334455ab", name="test", model="esp32-iso-poe"
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
@@ -102,10 +105,13 @@ async def test_device_conflict_manual(
assert data["type"] == FlowResultType.FORM
assert data["step_id"] == "manual"
mock_client.device_info = AsyncMock(
return_value=DeviceInfo(
mac_address="11:22:33:44:55:aa", name="test", model="esp32-iso-poe"
)
device_info = DeviceInfo(
mac_address="11:22:33:44:55:aa", name="test", model="esp32-iso-poe"
)
mock_client.device_info = AsyncMock(return_value=device_info)
mock_client.list_entities_services = AsyncMock(return_value=([], []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(device_info, [], [])
)
caplog.clear()
data = await process_repair_fix_flow(client, flow_id)
@@ -169,6 +175,11 @@ async def test_device_conflict_migration(
mac_address="11:22:33:44:55:AB", name="test", model="esp32-iso-poe"
)
mock_client.device_info = AsyncMock(return_value=new_device_info)
# Keep the same entity_info when reloading
mock_client.list_entities_services = AsyncMock(return_value=(entity_info, []))
mock_client.device_info_and_list_entities = AsyncMock(
return_value=(new_device_info, entity_info, [])
)
device.device_info = new_device_info
await hass.config_entries.async_reload(mock_config_entry.entry_id)
await hass.async_block_till_done()