From 34f6245e7418a49dce14664c3508b7ff2d2a6f0a Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Fri, 10 May 2019 22:37:03 +0200 Subject: [PATCH] Synchronize Sonos service calls (#23791) --- homeassistant/components/sonos/__init__.py | 6 ++++++ homeassistant/components/sonos/media_player.py | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sonos/__init__.py b/homeassistant/components/sonos/__init__.py index d0e467f6964..5f7b2d04431 100644 --- a/homeassistant/components/sonos/__init__.py +++ b/homeassistant/components/sonos/__init__.py @@ -1,4 +1,5 @@ """Support to embed Sonos.""" +import asyncio import voluptuous as vol from homeassistant import config_entries @@ -80,12 +81,15 @@ SONOS_SET_OPTION_SCHEMA = vol.Schema({ vol.Optional(ATTR_SPEECH_ENHANCE): cv.boolean, }) +DATA_SERVICE_EVENT = 'sonos_service_idle' + async def async_setup(hass, config): """Set up the Sonos component.""" conf = config.get(DOMAIN) hass.data[DOMAIN] = conf or {} + hass.data[DATA_SERVICE_EVENT] = asyncio.Event() if conf is not None: hass.async_create_task(hass.config_entries.flow.async_init( @@ -93,7 +97,9 @@ async def async_setup(hass, config): async def service_handle(service): """Dispatch a service call.""" + hass.data[DATA_SERVICE_EVENT].clear() async_dispatcher_send(hass, DOMAIN, service.service, service.data) + await hass.data[DATA_SERVICE_EVENT].wait() hass.services.async_register( DOMAIN, SERVICE_JOIN, service_handle, diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index 524353f8c54..5d1cd138260 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -25,7 +25,7 @@ from homeassistant.util.dt import utcnow from . import ( CONF_ADVERTISE_ADDR, CONF_HOSTS, CONF_INTERFACE_ADDR, - DOMAIN as SONOS_DOMAIN, + DATA_SERVICE_EVENT, DOMAIN as SONOS_DOMAIN, ATTR_ALARM_ID, ATTR_ENABLED, ATTR_INCLUDE_LINKED_ZONES, ATTR_MASTER, ATTR_NIGHT_SOUND, ATTR_SLEEP_TIME, ATTR_SPEECH_ENHANCE, ATTR_TIME, ATTR_VOLUME, ATTR_WITH_GROUP, @@ -155,6 +155,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): hass.async_add_executor_job(call, data) + # We are ready for the next service call + hass.data[DATA_SERVICE_EVENT].set() + async_dispatcher_connect(hass, SONOS_DOMAIN, async_service_handle)