Adding helper for get and set values (#5743)

* cleanup

* Update __init__.py

* Update __init__.py

* Update __init__.py
pull/5830/head
John Arild Berentsen 2017-02-09 13:40:35 +01:00 committed by GitHub
parent c550a316a4
commit 298575f7cb
5 changed files with 219 additions and 226 deletions

View File

@ -83,42 +83,49 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
def update_properties(self): def update_properties(self):
"""Callback on data changes for node values.""" """Callback on data changes for node values."""
# Operation Mode # Operation Mode
for value in self._node.get_values( self._current_operation = self.get_value(
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values(): class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE, member='data')
self._current_operation = value.data operation_list = self.get_value(
self._operation_list = list(value.data_items) class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE,
member='data_items')
if operation_list:
self._operation_list = list(operation_list)
_LOGGER.debug("self._operation_list=%s", self._operation_list) _LOGGER.debug("self._operation_list=%s", self._operation_list)
_LOGGER.debug("self._current_operation=%s", _LOGGER.debug("self._current_operation=%s", self._current_operation)
self._current_operation)
# Current Temp # Current Temp
for value in ( self._current_temperature = self.get_value(
self._node.get_values( class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL,
class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL) label=['Temperature'], member='data')
.values()): self._unit = self.get_value(
if value.label == 'Temperature': class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL,
self._current_temperature = round((float(value.data)), 1) label=['Temperature'], member='units')
self._unit = value.units
# Fan Mode # Fan Mode
for value in ( self._current_fan_mode = self.get_value(
self._node.get_values( class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE,
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE) member='data')
.values()): fan_list = self.get_value(
self._current_fan_mode = value.data class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE,
self._fan_list = list(value.data_items) member='data_items')
if fan_list:
self._fan_list = list(fan_list)
_LOGGER.debug("self._fan_list=%s", self._fan_list) _LOGGER.debug("self._fan_list=%s", self._fan_list)
_LOGGER.debug("self._current_fan_mode=%s", _LOGGER.debug("self._current_fan_mode=%s",
self._current_fan_mode) self._current_fan_mode)
# Swing mode # Swing mode
if self._zxt_120 == 1: if self._zxt_120 == 1:
for value in ( self._current_swing_mode = (
self._node.get_values( self.get_value(
class_id=zwave.const.COMMAND_CLASS_CONFIGURATION) class_id=zwave.const.COMMAND_CLASS_CONFIGURATION,
.values()): index=33,
if value.command_class == \ member='data'))
zwave.const.COMMAND_CLASS_CONFIGURATION and \ swing_list = self.get_value(class_id=zwave.const
value.index == 33: .COMMAND_CLASS_CONFIGURATION,
self._current_swing_mode = value.data index=33,
self._swing_list = list(value.data_items) member='data_items')
if swing_list:
self._swing_list = list(swing_list)
_LOGGER.debug("self._swing_list=%s", self._swing_list) _LOGGER.debug("self._swing_list=%s", self._swing_list)
_LOGGER.debug("self._current_swing_mode=%s", _LOGGER.debug("self._current_swing_mode=%s",
self._current_swing_mode) self._current_swing_mode)
@ -139,19 +146,16 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
break break
else: else:
self._target_temperature = round((float(value.data)), 1) self._target_temperature = round((float(value.data)), 1)
# Operating state # Operating state
for value in ( self._operating_state = self.get_value(
self._node.get_values( class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE,
class_id=zwave.const member='data')
.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE).values()):
self._operating_state = value.data
# Fan operating state # Fan operating state
for value in ( self._fan_state = self.get_value(
self._node.get_values( class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_STATE,
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_STATE) member='data')
.values()):
self._fan_state = value.data
@property @property
def should_poll(self): def should_poll(self):
@ -215,50 +219,29 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
else: else:
return return
for value in (self._node.get_values( self.set_value(
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT) class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT,
.values()): index=self._index, data=temperature)
if value.index == self._index: self.update_ha_state()
if self._zxt_120:
# ZXT-120 responds only to whole int
value.data = round(temperature, 0)
self._target_temperature = temperature
self.schedule_update_ha_state()
else:
value.data = temperature
self.schedule_update_ha_state()
break
def set_fan_mode(self, fan): def set_fan_mode(self, fan):
"""Set new target fan mode.""" """Set new target fan mode."""
for value in (self._node.get_values( self.set_value(
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE). class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE,
values()): index=0, data=bytes(fan, 'utf-8'))
if value.command_class == \
zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE and \
value.index == 0:
value.data = bytes(fan, 'utf-8')
break
def set_operation_mode(self, operation_mode): def set_operation_mode(self, operation_mode):
"""Set new target operation mode.""" """Set new target operation mode."""
for value in self._node.get_values( self.set_value(
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values(): class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE,
if value.command_class == \ index=0, data=bytes(operation_mode, 'utf-8'))
zwave.const.COMMAND_CLASS_THERMOSTAT_MODE and value.index == 0:
value.data = bytes(operation_mode, 'utf-8')
break
def set_swing_mode(self, swing_mode): def set_swing_mode(self, swing_mode):
"""Set new target swing mode.""" """Set new target swing mode."""
if self._zxt_120 == 1: if self._zxt_120 == 1:
for value in self._node.get_values( self.set_value(
class_id=zwave.const.COMMAND_CLASS_CONFIGURATION).values(): class_id=zwave.const.COMMAND_CLASS_CONFIGURATION,
if value.command_class == \ index=33, data=bytes(swing_mode, 'utf-8'))
zwave.const.COMMAND_CLASS_CONFIGURATION and \
value.index == 33:
value.data = bytes(swing_mode, 'utf-8')
break
@property @property
def device_state_attributes(self): def device_state_attributes(self):

View File

@ -52,12 +52,11 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice):
def __init__(self, value): def __init__(self, value):
"""Initialize the zwave rollershutter.""" """Initialize the zwave rollershutter."""
import libopenzwave
ZWaveDeviceEntity.__init__(self, value, DOMAIN) ZWaveDeviceEntity.__init__(self, value, DOMAIN)
# pylint: disable=no-member # pylint: disable=no-member
self._lozwmgr = libopenzwave.PyManager()
self._lozwmgr.create()
self._node = value.node self._node = value.node
self._open_id = None
self._close_id = None
self._current_position = None self._current_position = None
self._workaround = None self._workaround = None
if (value.node.manufacturer_id.strip() and if (value.node.manufacturer_id.strip() and
@ -73,12 +72,15 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice):
def update_properties(self): def update_properties(self):
"""Callback on data changes for node values.""" """Callback on data changes for node values."""
# Position value # Position value
for value in self._node.get_values( self._current_position = self.get_value(
class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values(): class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL,
if value.command_class == \ label=['Level'], member='data')
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and \ self._open_id = self.get_value(
value.label == 'Level': class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL,
self._current_position = value.data label=['Open', 'Up'], member='value_id')
self._close_id = self.get_value(
class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL,
label=['Close', 'Down'], member='value_id')
@property @property
def is_closed(self): def is_closed(self):
@ -104,27 +106,11 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice):
def open_cover(self, **kwargs): def open_cover(self, **kwargs):
"""Move the roller shutter up.""" """Move the roller shutter up."""
for value in self._node.get_values( zwave.NETWORK.manager.pressButton(self._open_id)
class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values():
if value.command_class == \
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \
'Open' or value.command_class == \
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \
'Up':
self._lozwmgr.pressButton(value.value_id)
break
def close_cover(self, **kwargs): def close_cover(self, **kwargs):
"""Move the roller shutter down.""" """Move the roller shutter down."""
for value in self._node.get_values( zwave.NETWORK.manager.pressButton(self._close_id)
class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values():
if value.command_class == \
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \
'Down' or value.command_class == \
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \
'Close':
self._lozwmgr.pressButton(value.value_id)
break
def set_cover_position(self, position, **kwargs): def set_cover_position(self, position, **kwargs):
"""Move the roller shutter to a specific position.""" """Move the roller shutter to a specific position."""
@ -132,15 +118,7 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice):
def stop_cover(self, **kwargs): def stop_cover(self, **kwargs):
"""Stop the roller shutter.""" """Stop the roller shutter."""
for value in self._node.get_values( zwave.NETWORK.manager.releaseButton(self._open_id)
class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values():
if value.command_class == \
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \
'Open' or value.command_class == \
zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \
'Down':
self._lozwmgr.releaseButton(value.value_id)
break
class ZwaveGarageDoor(zwave.ZWaveDeviceEntity, CoverDevice): class ZwaveGarageDoor(zwave.ZWaveDeviceEntity, CoverDevice):

View File

@ -217,11 +217,9 @@ class ZwaveColorLight(ZwaveDimmer):
self._value_color = value_color self._value_color = value_color
if self._value_color_channels is None: if self._value_color_channels is None:
for value_color_channels in self._value.node.get_values( self._value_color_channels = self.get_value(
class_id=zwave.const.COMMAND_CLASS_SWITCH_COLOR, class_id=zwave.const.COMMAND_CLASS_SWITCH_COLOR,
genre=zwave.const.GENRE_SYSTEM, genre=zwave.const.GENRE_SYSTEM, type=zwave.const.TYPE_INT)
type=zwave.const.TYPE_INT).values():
self._value_color_channels = value_color_channels
if self._value_color and self._value_color_channels: if self._value_color and self._value_color_channels:
_LOGGER.debug("Zwave node color values found.") _LOGGER.debug("Zwave node color values found.")

View File

@ -38,68 +38,68 @@ DEVICE_MAPPINGS = {
} }
LOCK_NOTIFICATION = { LOCK_NOTIFICATION = {
1: 'Manual Lock', '1': 'Manual Lock',
2: 'Manual Unlock', '2': 'Manual Unlock',
3: 'RF Lock', '3': 'RF Lock',
4: 'RF Unlock', '4': 'RF Unlock',
5: 'Keypad Lock', '5': 'Keypad Lock',
6: 'Keypad Unlock', '6': 'Keypad Unlock',
11: 'Lock Jammed', '11': 'Lock Jammed',
254: 'Unknown Event' '254': 'Unknown Event'
} }
LOCK_ALARM_TYPE = { LOCK_ALARM_TYPE = {
9: 'Deadbolt Jammed', '9': 'Deadbolt Jammed',
18: 'Locked with Keypad by user ', '18': 'Locked with Keypad by user ',
19: 'Unlocked with Keypad by user ', '19': 'Unlocked with Keypad by user ',
21: 'Manually Locked by', '21': 'Manually Locked by',
22: 'Manually Unlocked by Key or Inside thumb turn', '22': 'Manually Unlocked by Key or Inside thumb turn',
24: 'Locked by RF', '24': 'Locked by RF',
25: 'Unlocked by RF', '25': 'Unlocked by RF',
27: 'Auto re-lock', '27': 'Auto re-lock',
33: 'User deleted: ', '33': 'User deleted: ',
112: 'Master code changed or User added: ', '112': 'Master code changed or User added: ',
113: 'Duplicate Pin-code: ', '113': 'Duplicate Pin-code: ',
130: 'RF module, power restored', '130': 'RF module, power restored',
161: 'Tamper Alarm: ', '161': 'Tamper Alarm: ',
167: 'Low Battery', '167': 'Low Battery',
168: 'Critical Battery Level', '168': 'Critical Battery Level',
169: 'Battery too low to operate' '169': 'Battery too low to operate'
} }
MANUAL_LOCK_ALARM_LEVEL = { MANUAL_LOCK_ALARM_LEVEL = {
1: 'Key Cylinder or Inside thumb turn', '1': 'Key Cylinder or Inside thumb turn',
2: 'Touch function (lock and leave)' '2': 'Touch function (lock and leave)'
} }
TAMPER_ALARM_LEVEL = { TAMPER_ALARM_LEVEL = {
1: 'Too many keypresses', '1': 'Too many keypresses',
2: 'Cover removed' '2': 'Cover removed'
} }
LOCK_STATUS = { LOCK_STATUS = {
1: True, '1': True,
2: False, '2': False,
3: True, '3': True,
4: False, '4': False,
5: True, '5': True,
6: False, '6': False,
9: False, '9': False,
18: True, '18': True,
19: False, '19': False,
21: True, '21': True,
22: False, '22': False,
24: True, '24': True,
25: False, '25': False,
27: True '27': True
} }
ALARM_TYPE_STD = [ ALARM_TYPE_STD = [
18, '18',
19, '19',
33, '33',
112, '112',
113 '113'
] ]
SET_USERCODE_SCHEMA = vol.Schema({ SET_USERCODE_SCHEMA = vol.Schema({
@ -234,66 +234,58 @@ class ZwaveLock(zwave.ZWaveDeviceEntity, LockDevice):
def update_properties(self): def update_properties(self):
"""Callback on data changes for node values.""" """Callback on data changes for node values."""
for value in self._node.get_values( self._state = self.get_value(class_id=zwave
class_id=zwave.const.COMMAND_CLASS_DOOR_LOCK).values(): .const.COMMAND_CLASS_DOOR_LOCK,
if value.type != zwave.const.TYPE_BOOL: type=zwave.const.TYPE_BOOL,
continue genre=zwave.const.GENRE_USER,
if value.genre != zwave.const.GENRE_USER: member='data')
continue
self._state = value.data
_LOGGER.debug('Lock state set from Bool value and' _LOGGER.debug('Lock state set from Bool value and'
' is %s', value.data) ' is %s', self._state)
break notification_data = self.get_value(class_id=zwave.const
.COMMAND_CLASS_ALARM,
for value in self._node.get_values( label=['Access Control'],
class_id=zwave.const.COMMAND_CLASS_ALARM).values(): member='data')
if value.label != "Access Control": if notification_data:
continue self._notification = LOCK_NOTIFICATION.get(str(notification_data))
self._notification = LOCK_NOTIFICATION.get(value.data)
notification_data = value.data
if self._v2btze: if self._v2btze:
for value in (self._node.get_values( advanced_config = self.get_value(class_id=zwave.const
class_id=zwave.const.COMMAND_CLASS_CONFIGURATION) .COMMAND_CLASS_CONFIGURATION,
.values()): index=12,
if value.index != 12: data=CONFIG_ADVANCED,
continue member='data')
if value.data == CONFIG_ADVANCED: if advanced_config:
self._state = LOCK_STATUS.get(notification_data) self._state = LOCK_STATUS.get(str(notification_data))
_LOGGER.debug('Lock state set from Access Control ' _LOGGER.debug('Lock state set from Access Control '
'value and is %s', notification_data) 'value and is %s, get=%s',
break str(notification_data),
self.state)
break alarm_type = self.get_value(class_id=zwave.const
.COMMAND_CLASS_ALARM,
for value in self._node.get_values( label=['Alarm Type'], member='data')
class_id=zwave.const.COMMAND_CLASS_ALARM).values(): _LOGGER.debug('Lock alarm_type is %s', str(alarm_type))
if value.label != "Alarm Type": alarm_level = self.get_value(class_id=zwave.const
continue .COMMAND_CLASS_ALARM,
alarm_type = value.data label=['Alarm Level'], member='data')
break _LOGGER.debug('Lock alarm_level is %s', str(alarm_level))
if not alarm_type:
for value in self._node.get_values( return
class_id=zwave.const.COMMAND_CLASS_ALARM).values():
if value.label != "Alarm Level":
continue
alarm_level = value.data
_LOGGER.debug('Lock alarm_level is %s', alarm_level)
if alarm_type is 21: if alarm_type is 21:
self._lock_status = '{}{}'.format( self._lock_status = '{}{}'.format(
LOCK_ALARM_TYPE.get(alarm_type), LOCK_ALARM_TYPE.get(str(alarm_type)),
MANUAL_LOCK_ALARM_LEVEL.get(alarm_level)) MANUAL_LOCK_ALARM_LEVEL.get(str(alarm_level)))
if alarm_type in ALARM_TYPE_STD: if alarm_type in ALARM_TYPE_STD:
self._lock_status = '{}{}'.format( self._lock_status = '{}{}'.format(
LOCK_ALARM_TYPE.get(alarm_type), alarm_level) LOCK_ALARM_TYPE.get(str(alarm_type)), str(alarm_level))
break return
if alarm_type is 161: if alarm_type is 161:
self._lock_status = '{}{}'.format( self._lock_status = '{}{}'.format(
LOCK_ALARM_TYPE.get(alarm_type), LOCK_ALARM_TYPE.get(str(alarm_type)),
TAMPER_ALARM_LEVEL.get(alarm_level)) TAMPER_ALARM_LEVEL.get(str(alarm_level)))
break return
if alarm_type != 0: if alarm_type != 0:
self._lock_status = LOCK_ALARM_TYPE.get(alarm_type) self._lock_status = LOCK_ALARM_TYPE.get(str(alarm_type))
break return
@property @property
def is_locked(self): def is_locked(self):

View File

@ -27,6 +27,7 @@ REQUIREMENTS = ['pydispatcher==2.0.5']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
CLASS_ID = 'class_id'
CONF_AUTOHEAL = 'autoheal' CONF_AUTOHEAL = 'autoheal'
CONF_DEBUG = 'debug' CONF_DEBUG = 'debug'
CONF_POLLING_INTENSITY = 'polling_intensity' CONF_POLLING_INTENSITY = 'polling_intensity'
@ -634,6 +635,47 @@ class ZWaveDeviceEntity(Entity):
self.update_properties() self.update_properties()
self.schedule_update_ha_state() self.schedule_update_ha_state()
def _value_handler(self, method=None, class_id=None, index=None,
label=None, data=None, member=None, **kwargs):
"""Get the values for a given command_class with arguments."""
varname = member
if class_id is not None:
kwargs[CLASS_ID] = class_id
_LOGGER.debug('method=%s, class_id=%s, index=%s, label=%s, data=%s,'
' member=%s, kwargs=%s',
method, class_id, index, label, data, member, kwargs)
values = self._value.node.get_values(**kwargs).values()
_LOGGER.debug('values=%s', values)
if not values:
return None
for value in values:
if index is not None and value.index != index:
continue
if label is not None:
for entry in label:
if entry is not None and value.label != entry:
continue
if method == 'set':
value.data = data
return
if data is not None and value.data != data:
continue
if member is not None:
results = getattr(value, varname)
else:
results = value
break
_LOGGER.debug('final result=%s', results)
return results
def get_value(self, **kwargs):
"""Simplifyer to get values."""
return self._value_handler(method='get', **kwargs)
def set_value(self, **kwargs):
"""Simplifyer to set a value."""
return self._value_handler(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."""
pass pass