mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Reload nest integration when new devices are added (#62976)
This commit is contained in:
parent
d62f9a19ae
commit
2df0adfbc7
@ -1,6 +1,7 @@
|
|||||||
"""Support for Nest devices."""
|
"""Support for Nest devices."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from collections.abc import Awaitable, Callable
|
||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -178,12 +179,21 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|||||||
class SignalUpdateCallback:
|
class SignalUpdateCallback:
|
||||||
"""An EventCallback invoked when new events arrive from subscriber."""
|
"""An EventCallback invoked when new events arrive from subscriber."""
|
||||||
|
|
||||||
def __init__(self, hass: HomeAssistant) -> None:
|
def __init__(
|
||||||
|
self, hass: HomeAssistant, config_reload_cb: Callable[[], Awaitable[None]]
|
||||||
|
) -> None:
|
||||||
"""Initialize EventCallback."""
|
"""Initialize EventCallback."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
|
self._config_reload_cb = config_reload_cb
|
||||||
|
|
||||||
async def async_handle_event(self, event_message: EventMessage) -> None:
|
async def async_handle_event(self, event_message: EventMessage) -> None:
|
||||||
"""Process an incoming EventMessage."""
|
"""Process an incoming EventMessage."""
|
||||||
|
if event_message.relation_update:
|
||||||
|
# A device was added/removed or a home was added/removed. Reload the integration
|
||||||
|
# in order to detect any changes.
|
||||||
|
_LOGGER.info("Devices or homes have changed; Reloading")
|
||||||
|
self._hass.async_create_task(self._config_reload_cb())
|
||||||
|
return
|
||||||
if not event_message.resource_update_name:
|
if not event_message.resource_update_name:
|
||||||
return
|
return
|
||||||
device_id = event_message.resource_update_name
|
device_id = event_message.resource_update_name
|
||||||
@ -221,7 +231,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
# Use disk backed event media store
|
# Use disk backed event media store
|
||||||
subscriber.cache_policy.store = await async_get_media_event_store(hass, subscriber)
|
subscriber.cache_policy.store = await async_get_media_event_store(hass, subscriber)
|
||||||
|
|
||||||
callback = SignalUpdateCallback(hass)
|
async def async_config_reload() -> None:
|
||||||
|
await hass.config_entries.async_reload(entry.entry_id)
|
||||||
|
|
||||||
|
callback = SignalUpdateCallback(hass, async_config_reload)
|
||||||
subscriber.set_update_callback(callback.async_handle_event)
|
subscriber.set_update_callback(callback.async_handle_event)
|
||||||
try:
|
try:
|
||||||
await subscriber.start_async()
|
await subscriber.start_async()
|
||||||
|
@ -5,6 +5,7 @@ pubsub subscriber.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
from google_nest_sdm.device import Device
|
from google_nest_sdm.device import Device
|
||||||
from google_nest_sdm.event import EventMessage
|
from google_nest_sdm.event import EventMessage
|
||||||
@ -446,3 +447,65 @@ async def test_doorbell_event_session_update(hass):
|
|||||||
"timestamp": timestamp2.replace(microsecond=0),
|
"timestamp": timestamp2.replace(microsecond=0),
|
||||||
"nest_event_id": EVENT_SESSION_ID,
|
"nest_event_id": EVENT_SESSION_ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_structure_update_event(hass):
|
||||||
|
"""Test a pubsub message for a new device being added."""
|
||||||
|
events = async_capture_events(hass, NEST_EVENT)
|
||||||
|
subscriber = await async_setup_devices(
|
||||||
|
hass,
|
||||||
|
"sdm.devices.types.DOORBELL",
|
||||||
|
create_device_traits(["sdm.devices.traits.DoorbellChime"]),
|
||||||
|
)
|
||||||
|
|
||||||
|
# Entity for first device is registered
|
||||||
|
registry = er.async_get(hass)
|
||||||
|
assert registry.async_get("camera.front")
|
||||||
|
|
||||||
|
new_device = Device.MakeDevice(
|
||||||
|
{
|
||||||
|
"name": "device-id-2",
|
||||||
|
"type": "sdm.devices.types.CAMERA",
|
||||||
|
"traits": {
|
||||||
|
"sdm.devices.traits.Info": {
|
||||||
|
"customName": "Back",
|
||||||
|
},
|
||||||
|
"sdm.devices.traits.CameraLiveStream": {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
auth=None,
|
||||||
|
)
|
||||||
|
device_manager = await subscriber.async_get_device_manager()
|
||||||
|
device_manager.add_device(new_device)
|
||||||
|
|
||||||
|
# Entity for new devie has not yet been loaded
|
||||||
|
assert not registry.async_get("camera.back")
|
||||||
|
|
||||||
|
# Send a message that triggers the device to be loaded
|
||||||
|
message = EventMessage(
|
||||||
|
{
|
||||||
|
"eventId": "some-event-id",
|
||||||
|
"timestamp": utcnow().isoformat(timespec="seconds"),
|
||||||
|
"relationUpdate": {
|
||||||
|
"type": "CREATED",
|
||||||
|
"subject": "enterprise/example/foo",
|
||||||
|
"object": "enterprise/example/devices/some-device-id2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
auth=None,
|
||||||
|
)
|
||||||
|
with patch(
|
||||||
|
"homeassistant.helpers.config_entry_oauth2_flow.async_get_config_entry_implementation"
|
||||||
|
), patch("homeassistant.components.nest.PLATFORMS", [PLATFORM]), patch(
|
||||||
|
"homeassistant.components.nest.api.GoogleNestSubscriber",
|
||||||
|
return_value=subscriber,
|
||||||
|
):
|
||||||
|
await subscriber.async_receive_event(message)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
# No home assistant events published
|
||||||
|
assert not events
|
||||||
|
|
||||||
|
# Both enties now exist
|
||||||
|
assert registry.async_get("camera.front")
|
||||||
|
assert registry.async_get("camera.back")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user