mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Z-Wave prevent I/O event loop (#6369)
* Prevent Z-Wave I/O in event loop * Move value_handler to util class. * Add docstring
This commit is contained in:
parent
ed9e93c29f
commit
edf130b341
@ -26,6 +26,7 @@ import homeassistant.helpers.config_validation as cv
|
|||||||
|
|
||||||
from . import const
|
from . import const
|
||||||
from . import workaround
|
from . import workaround
|
||||||
|
from .util import value_handler
|
||||||
|
|
||||||
REQUIREMENTS = ['pydispatcher==2.0.5']
|
REQUIREMENTS = ['pydispatcher==2.0.5']
|
||||||
|
|
||||||
@ -729,8 +730,11 @@ class ZWaveDeviceEntity(Entity):
|
|||||||
from pydispatch import dispatcher
|
from pydispatch import dispatcher
|
||||||
self._value = value
|
self._value = value
|
||||||
self._value.set_change_verified(False)
|
self._value.set_change_verified(False)
|
||||||
self.entity_id = "{}.{}".format(domain, self._object_id())
|
self.entity_id = "{}.{}".format(domain, object_id(value))
|
||||||
|
|
||||||
|
self._name = _value_name(self._value)
|
||||||
|
self._unique_id = "ZWAVE-{}-{}".format(self._value.node.node_id,
|
||||||
|
self._value.object_id)
|
||||||
self._wakeup_value_id = None
|
self._wakeup_value_id = None
|
||||||
self._battery_value_id = None
|
self._battery_value_id = None
|
||||||
self._power_value_id = None
|
self._power_value_id = None
|
||||||
@ -816,62 +820,13 @@ class ZWaveDeviceEntity(Entity):
|
|||||||
self.power_consumption = round(
|
self.power_consumption = round(
|
||||||
power_value.data, power_value.precision) if power_value else None
|
power_value.data, power_value.precision) if power_value else None
|
||||||
|
|
||||||
def _value_handler(self, method=None, class_id=None, index=None,
|
|
||||||
label=None, data=None, member=None, instance=None,
|
|
||||||
**kwargs):
|
|
||||||
"""Get the values for a given command_class with arguments.
|
|
||||||
|
|
||||||
May only be used inside callback.
|
|
||||||
|
|
||||||
"""
|
|
||||||
values = []
|
|
||||||
if class_id is None:
|
|
||||||
values.extend(self._value.node.get_values(**kwargs).values())
|
|
||||||
else:
|
|
||||||
if not isinstance(class_id, list):
|
|
||||||
class_id = [class_id]
|
|
||||||
for cid in class_id:
|
|
||||||
values.extend(self._value.node.get_values(
|
|
||||||
class_id=cid, **kwargs).values())
|
|
||||||
_LOGGER.debug('method=%s, class_id=%s, index=%s, label=%s, data=%s,'
|
|
||||||
' member=%s, instance=%d, kwargs=%s',
|
|
||||||
method, class_id, index, label, data, member, instance,
|
|
||||||
kwargs)
|
|
||||||
_LOGGER.debug('values=%s', values)
|
|
||||||
results = None
|
|
||||||
for value in values:
|
|
||||||
if index is not None and value.index != index:
|
|
||||||
continue
|
|
||||||
if label is not None:
|
|
||||||
label_found = False
|
|
||||||
for entry in label:
|
|
||||||
if value.label == entry:
|
|
||||||
label_found = True
|
|
||||||
break
|
|
||||||
if not label_found:
|
|
||||||
continue
|
|
||||||
if method == 'set':
|
|
||||||
value.data = data
|
|
||||||
return
|
|
||||||
if data is not None and value.data != data:
|
|
||||||
continue
|
|
||||||
if instance is not None and value.instance != instance:
|
|
||||||
continue
|
|
||||||
if member is not None:
|
|
||||||
results = getattr(value, member)
|
|
||||||
else:
|
|
||||||
results = value
|
|
||||||
break
|
|
||||||
_LOGGER.debug('final result=%s', results)
|
|
||||||
return results
|
|
||||||
|
|
||||||
def get_value(self, **kwargs):
|
def get_value(self, **kwargs):
|
||||||
"""Simplifyer to get values. May only be used inside callback."""
|
"""Simplifyer to get values. May only be used inside callback."""
|
||||||
return self._value_handler(method='get', **kwargs)
|
return value_handler(self._value, method='get', **kwargs)
|
||||||
|
|
||||||
def set_value(self, **kwargs):
|
def set_value(self, **kwargs):
|
||||||
"""Simplifyer to set a value."""
|
"""Simplifyer to set a value."""
|
||||||
return self._value_handler(method='set', **kwargs)
|
return value_handler(self._value, method='set', **kwargs)
|
||||||
|
|
||||||
def update_properties(self):
|
def update_properties(self):
|
||||||
"""Callback on data changes for node values."""
|
"""Callback on data changes for node values."""
|
||||||
@ -885,21 +840,12 @@ class ZWaveDeviceEntity(Entity):
|
|||||||
@property
|
@property
|
||||||
def unique_id(self):
|
def unique_id(self):
|
||||||
"""Return an unique ID."""
|
"""Return an unique ID."""
|
||||||
return "ZWAVE-{}-{}".format(self._value.node.node_id,
|
return self._unique_id
|
||||||
self._value.object_id)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"""Return the name of the device."""
|
"""Return the name of the device."""
|
||||||
return _value_name(self._value)
|
return self._name
|
||||||
|
|
||||||
def _object_id(self):
|
|
||||||
"""Return the object_id of the device value.
|
|
||||||
|
|
||||||
The object_id contains node_id and value instance id to not collide
|
|
||||||
with other entity_ids.
|
|
||||||
"""
|
|
||||||
return object_id(self._value)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
|
54
homeassistant/components/zwave/util.py
Normal file
54
homeassistant/components/zwave/util.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
"""Zwave util methods."""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def value_handler(value, method=None, class_id=None, index=None,
|
||||||
|
label=None, data=None, member=None, instance=None,
|
||||||
|
**kwargs):
|
||||||
|
"""Get the values for a given command_class with arguments.
|
||||||
|
|
||||||
|
May only be used inside callback.
|
||||||
|
|
||||||
|
"""
|
||||||
|
values = []
|
||||||
|
if class_id is None:
|
||||||
|
values.extend(value.node.get_values(**kwargs).values())
|
||||||
|
else:
|
||||||
|
if not isinstance(class_id, list):
|
||||||
|
class_id = [class_id]
|
||||||
|
for cid in class_id:
|
||||||
|
values.extend(value.node.get_values(
|
||||||
|
class_id=cid, **kwargs).values())
|
||||||
|
_LOGGER.debug('method=%s, class_id=%s, index=%s, label=%s, data=%s,'
|
||||||
|
' member=%s, instance=%d, kwargs=%s',
|
||||||
|
method, class_id, index, label, data, member, instance,
|
||||||
|
kwargs)
|
||||||
|
_LOGGER.debug('values=%s', values)
|
||||||
|
results = None
|
||||||
|
for value in values:
|
||||||
|
if index is not None and value.index != index:
|
||||||
|
continue
|
||||||
|
if label is not None:
|
||||||
|
label_found = False
|
||||||
|
for entry in label:
|
||||||
|
if value.label == entry:
|
||||||
|
label_found = True
|
||||||
|
break
|
||||||
|
if not label_found:
|
||||||
|
continue
|
||||||
|
if method == 'set':
|
||||||
|
value.data = data
|
||||||
|
return
|
||||||
|
if data is not None and value.data != data:
|
||||||
|
continue
|
||||||
|
if instance is not None and value.instance != instance:
|
||||||
|
continue
|
||||||
|
if member is not None:
|
||||||
|
results = getattr(value, member)
|
||||||
|
else:
|
||||||
|
results = value
|
||||||
|
break
|
||||||
|
_LOGGER.debug('final result=%s', results)
|
||||||
|
return results
|
Loading…
x
Reference in New Issue
Block a user