Threadsafe configurator (#7536)

* Make Configurator thread safe, get_instance timing issues breaking configurator working on multiple devices

* No blank lines allowed after function docstring

* Fix comment Tox
This commit is contained in:
Kane610 2017-05-11 09:24:36 +02:00 committed by Andrey
parent 8cdadd2aa0
commit 2c8f6a0ad0

View File

@ -9,9 +9,11 @@ the user has submitted configuration information.
import asyncio import asyncio
import logging import logging
from homeassistant.core import callback as async_callback
from homeassistant.const import EVENT_TIME_CHANGED, ATTR_FRIENDLY_NAME, \ from homeassistant.const import EVENT_TIME_CHANGED, ATTR_FRIENDLY_NAME, \
ATTR_ENTITY_PICTURE ATTR_ENTITY_PICTURE
from homeassistant.helpers.entity import generate_entity_id from homeassistant.helpers.entity import generate_entity_id
from homeassistant.util.async import run_callback_threadsafe
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
_REQUESTS = {} _REQUESTS = {}
@ -43,7 +45,9 @@ def request_config(
Will return an ID to be used for sequent calls. Will return an ID to be used for sequent calls.
""" """
instance = _get_instance(hass) instance = run_callback_threadsafe(hass.loop,
_async_get_instance,
hass).result()
request_id = instance.request_config( request_id = instance.request_config(
name, callback, name, callback,
@ -79,7 +83,8 @@ def async_setup(hass, config):
return True return True
def _get_instance(hass): @async_callback
def _async_get_instance(hass):
"""Get an instance per hass object.""" """Get an instance per hass object."""
instance = hass.data.get(_KEY_INSTANCE) instance = hass.data.get(_KEY_INSTANCE)
@ -97,7 +102,7 @@ class Configurator(object):
self.hass = hass self.hass = hass
self._cur_id = 0 self._cur_id = 0
self._requests = {} self._requests = {}
hass.services.register( hass.services.async_register(
DOMAIN, SERVICE_CONFIGURE, self.handle_service_call) DOMAIN, SERVICE_CONFIGURE, self.handle_service_call)
def request_config( def request_config(