From 923431110a0cb6dfeefc17225058e1f5e85b287c Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 27 Jan 2017 01:21:33 -0500 Subject: [PATCH] [*.zwave] Refactor of zwave value_changed (#5512) * Refactor of zwave value_changed * Rename update_properties to update * Revert "Rename update_properties to update" This reverts commit 723578e7d4e2156507c70f649a124a6193edc0db. --- .../components/binary_sensor/zwave.py | 27 +++-------- homeassistant/components/climate/zwave.py | 15 +----- homeassistant/components/cover/zwave.py | 28 +---------- homeassistant/components/light/zwave.py | 48 ++++++++----------- homeassistant/components/lock/zwave.py | 15 +----- homeassistant/components/sensor/zwave.py | 20 ++------ homeassistant/components/switch/zwave.py | 16 +------ homeassistant/components/zwave/__init__.py | 25 +++++++++- 8 files changed, 58 insertions(+), 136 deletions(-) diff --git a/homeassistant/components/binary_sensor/zwave.py b/homeassistant/components/binary_sensor/zwave.py index 32de0f653a7..b0054d7b00f 100644 --- a/homeassistant/components/binary_sensor/zwave.py +++ b/homeassistant/components/binary_sensor/zwave.py @@ -8,7 +8,6 @@ import logging import datetime import homeassistant.util.dt as dt_util from homeassistant.helpers.event import track_point_in_time -from homeassistant.helpers.entity import Entity from homeassistant.components import zwave from homeassistant.components.binary_sensor import ( DOMAIN, @@ -65,21 +64,14 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices([ZWaveBinarySensor(value, None)]) -class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity, Entity): +class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity): """Representation of a binary sensor within Z-Wave.""" def __init__(self, value, sensor_class): """Initialize the sensor.""" self._sensor_type = sensor_class - # pylint: disable=import-error - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher - zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN) - dispatcher.connect( - self.value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) - @property def is_on(self): """Return True if the binary sensor is on.""" @@ -95,32 +87,25 @@ class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity, Entity): """No polling needed.""" return False - def value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id or \ - self._value.node == value.node: - _LOGGER.debug('Value changed for label %s', self._value.label) - self.schedule_update_ha_state() - -class ZWaveTriggerSensor(ZWaveBinarySensor, Entity): +class ZWaveTriggerSensor(ZWaveBinarySensor): """Representation of a stateless sensor within Z-Wave.""" - def __init__(self, sensor_value, sensor_class, hass, re_arm_sec=60): + def __init__(self, value, sensor_class, hass, re_arm_sec=60): """Initialize the sensor.""" - super(ZWaveTriggerSensor, self).__init__(sensor_value, sensor_class) + super(ZWaveTriggerSensor, self).__init__(value, sensor_class) self._hass = hass self.re_arm_sec = re_arm_sec self.invalidate_after = dt_util.utcnow() + datetime.timedelta( seconds=self.re_arm_sec) # If it's active make sure that we set the timeout tracker - if sensor_value.data: + if value.data: track_point_in_time( self._hass, self.async_update_ha_state, self.invalidate_after) def value_changed(self, value): - """Called when a value has changed on the network.""" + """Called when a value for this entity's node has changed.""" if self._value.value_id == value.value_id: self.schedule_update_ha_state() if value.data: diff --git a/homeassistant/components/climate/zwave.py b/homeassistant/components/climate/zwave.py index f7bbe341cf7..fc2e8736ee9 100755 --- a/homeassistant/components/climate/zwave.py +++ b/homeassistant/components/climate/zwave.py @@ -52,8 +52,6 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): def __init__(self, value, temp_unit): """Initialize the Z-Wave climate device.""" - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher ZWaveDeviceEntity.__init__(self, value, DOMAIN) self._index = value.index self._node = value.node @@ -71,9 +69,6 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): _LOGGER.debug("temp_unit is %s", self._unit) self._zxt_120 = None self.update_properties() - # register listener - dispatcher.connect( - self.value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) # Make sure that we have values for the key before converting to int if (value.node.manufacturer_id.strip() and value.node.product_id.strip()): @@ -85,16 +80,8 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): " workaround") self._zxt_120 = 1 - def value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id or \ - self._value.node == value.node: - _LOGGER.debug('Value changed for label %s', self._value.label) - self.update_properties() - self.schedule_update_ha_state() - def update_properties(self): - """Callback on data change for the registered node/value pair.""" + """Callback on data changes for node values.""" # Operation Mode for value in self._node.get_values( class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values(): diff --git a/homeassistant/components/cover/zwave.py b/homeassistant/components/cover/zwave.py index 89947e3e4fc..d9d33942e15 100644 --- a/homeassistant/components/cover/zwave.py +++ b/homeassistant/components/cover/zwave.py @@ -53,8 +53,6 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): def __init__(self, value): """Initialize the zwave rollershutter.""" import libopenzwave - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher ZWaveDeviceEntity.__init__(self, value, DOMAIN) # pylint: disable=no-member self._lozwmgr = libopenzwave.PyManager() @@ -62,8 +60,6 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): self._node = value.node self._current_position = None self._workaround = None - dispatcher.connect( - self.value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) if (value.node.manufacturer_id.strip() and value.node.product_id.strip()): specific_sensor_key = (int(value.node.manufacturer_id, 16), @@ -74,16 +70,8 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): _LOGGER.debug("Controller without positioning feedback") self._workaround = 1 - def value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id or \ - self._value.node == value.node: - _LOGGER.debug('Value changed for label %s', self._value.label) - self.update_properties() - self.schedule_update_ha_state() - def update_properties(self): - """Callback on data change for the registered node/value pair.""" + """Callback on data changes for node values.""" # Position value for value in self._node.get_values( class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values(): @@ -160,24 +148,12 @@ class ZwaveGarageDoor(zwave.ZWaveDeviceEntity, CoverDevice): def __init__(self, value): """Initialize the zwave garage door.""" - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher ZWaveDeviceEntity.__init__(self, value, DOMAIN) - self._state = value.data - dispatcher.connect( - self.value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) - - def value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id: - _LOGGER.debug('Value changed for label %s', self._value.label) - self._state = value.data - self.schedule_update_ha_state() @property def is_closed(self): """Return the current position of Zwave garage door.""" - return not self._state + return not self._value.data def close_cover(self): """Close the garage door.""" diff --git a/homeassistant/components/light/zwave.py b/homeassistant/components/light/zwave.py index 754c27cbad3..ab6cb3cdecd 100644 --- a/homeassistant/components/light/zwave.py +++ b/homeassistant/components/light/zwave.py @@ -90,9 +90,6 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): def __init__(self, value, refresh, delay): """Initialize the light.""" - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher - zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN) self._brightness = None self._state = None @@ -118,38 +115,33 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): self._timer = None _LOGGER.debug('self._refreshing=%s self.delay=%s', self._refresh_value, self._delay) - dispatcher.connect( - self._value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) def update_properties(self): """Update internal properties based on zwave values.""" # Brightness self._brightness, self._state = brightness_state(self._value) - def _value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id or \ - self._value.node == value.node: - _LOGGER.debug('Value changed for label %s', self._value.label) - if self._refresh_value: - if self._refreshing: - self._refreshing = False - self.update_properties() - else: - def _refresh_value(): - """Used timer callback for delayed value refresh.""" - self._refreshing = True - self._value.refresh() - - if self._timer is not None and self._timer.isAlive(): - self._timer.cancel() - - self._timer = Timer(self._delay, _refresh_value) - self._timer.start() - self.schedule_update_ha_state() - else: + def value_changed(self, value): + """Called when a value for this entity's node has changed.""" + if self._refresh_value: + if self._refreshing: + self._refreshing = False self.update_properties() - self.schedule_update_ha_state() + else: + def _refresh_value(): + """Used timer callback for delayed value refresh.""" + self._refreshing = True + self._value.refresh() + + if self._timer is not None and self._timer.isAlive(): + self._timer.cancel() + + self._timer = Timer(self._delay, _refresh_value) + self._timer.start() + self.schedule_update_ha_state() + else: + self.update_properties() + self.schedule_update_ha_state() @property def brightness(self): diff --git a/homeassistant/components/lock/zwave.py b/homeassistant/components/lock/zwave.py index 16f2f82d81e..6ff628f158f 100644 --- a/homeassistant/components/lock/zwave.py +++ b/homeassistant/components/lock/zwave.py @@ -201,29 +201,16 @@ class ZwaveLock(zwave.ZWaveDeviceEntity, LockDevice): def __init__(self, value): """Initialize the Z-Wave switch device.""" - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher - zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN) self._node = value.node self._state = None self._notification = None self._lock_status = None - dispatcher.connect( - self._value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) self.update_properties() - def _value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id or \ - self._value.node == value.node: - _LOGGER.debug('Value changed for label %s', self._value.label) - self.update_properties() - self.schedule_update_ha_state() - def update_properties(self): - """Callback on data change for the registered node/value pair.""" + """Callback on data changes for node values.""" for value in self._node.get_values( class_id=zwave.const.COMMAND_CLASS_ALARM).values(): if value.label != "Access Control": diff --git a/homeassistant/components/sensor/zwave.py b/homeassistant/components/sensor/zwave.py index 67e2801974f..c66816541fb 100644 --- a/homeassistant/components/sensor/zwave.py +++ b/homeassistant/components/sensor/zwave.py @@ -10,7 +10,6 @@ import logging from homeassistant.components.sensor import DOMAIN from homeassistant.components import zwave from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT -from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) @@ -48,18 +47,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices([ZWaveAlarmSensor(value)]) -class ZWaveSensor(zwave.ZWaveDeviceEntity, Entity): +class ZWaveSensor(zwave.ZWaveDeviceEntity): """Representation of a Z-Wave sensor.""" - def __init__(self, sensor_value): + def __init__(self, value): """Initialize the sensor.""" - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher - - zwave.ZWaveDeviceEntity.__init__(self, sensor_value, DOMAIN) - - dispatcher.connect( - self.value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) + zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN) @property def state(self): @@ -71,13 +64,6 @@ class ZWaveSensor(zwave.ZWaveDeviceEntity, Entity): """Return the unit of measurement the value is expressed in.""" return self._value.units - def value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id or \ - self._value.node == value.node: - _LOGGER.debug('Value changed for label %s', self._value.label) - self.schedule_update_ha_state() - class ZWaveMultilevelSensor(ZWaveSensor): """Representation of a multi level sensor Z-Wave sensor.""" diff --git a/homeassistant/components/switch/zwave.py b/homeassistant/components/switch/zwave.py index 2f409f94ef3..fa50156ba4e 100644 --- a/homeassistant/components/switch/zwave.py +++ b/homeassistant/components/switch/zwave.py @@ -37,26 +37,12 @@ class ZwaveSwitch(zwave.ZWaveDeviceEntity, SwitchDevice): def __init__(self, value): """Initialize the Z-Wave switch device.""" - from openzwave.network import ZWaveNetwork - from pydispatch import dispatcher - zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN) - self._state = value.data - dispatcher.connect( - self._value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) - - def _value_changed(self, value): - """Called when a value has changed on the network.""" - if self._value.value_id == value.value_id: - _LOGGER.debug('Value changed for label %s', self._value.label) - self._state = value.data - self.schedule_update_ha_state() - @property def is_on(self): """Return true if device is on.""" - return self._state + return self._value.data def turn_on(self, **kwargs): """Turn the device on.""" diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 82c116aaa5c..c4b51ca9451 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -15,6 +15,7 @@ from homeassistant.helpers import discovery from homeassistant.const import ( ATTR_BATTERY_LEVEL, ATTR_LOCATION, ATTR_ENTITY_ID, CONF_CUSTOMIZE, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP) +from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import track_time_change from homeassistant.util import convert, slugify import homeassistant.config as conf_util @@ -600,14 +601,36 @@ def setup(hass, config): return True -class ZWaveDeviceEntity: +class ZWaveDeviceEntity(Entity): """Representation of a Z-Wave node entity.""" def __init__(self, value, domain): """Initialize the z-Wave device.""" + # pylint: disable=import-error + from openzwave.network import ZWaveNetwork + from pydispatch import dispatcher self._value = value self.entity_id = "{}.{}".format(domain, self._object_id()) + dispatcher.connect( + self.network_value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) + + def network_value_changed(self, value): + """Called when a value has changed on the network.""" + if self._value.value_id == value.value_id or \ + self._value.node == value.node: + _LOGGER.debug('Value changed for label %s', self._value.label) + self.value_changed(value) + + def value_changed(self, value): + """Called when a value for this entity's node has changed.""" + self.update_properties() + self.schedule_update_ha_state() + + def update_properties(self): + """Callback on data changes for node values.""" + pass + @property def should_poll(self): """No polling needed."""