diff --git a/.coveragerc b/.coveragerc index 8f12390556c..0bfa3fb1a04 100644 --- a/.coveragerc +++ b/.coveragerc @@ -77,7 +77,7 @@ omit = homeassistant/components/zigbee.py homeassistant/components/*/zigbee.py - homeassistant/components/zwave.py + homeassistant/components/zwave/* homeassistant/components/*/zwave.py homeassistant/components/enocean.py diff --git a/homeassistant/components/binary_sensor/zwave.py b/homeassistant/components/binary_sensor/zwave.py index 1b47b98fe9f..69688c7e4f6 100644 --- a/homeassistant/components/binary_sensor/zwave.py +++ b/homeassistant/components/binary_sensor/zwave.py @@ -36,8 +36,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] value.set_change_verified(False) # Make sure that we have values for the key before converting to int @@ -58,7 +58,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): ]) return - if value.command_class == zwave.COMMAND_CLASS_SENSOR_BINARY: + if value.command_class == zwave.const.COMMAND_CLASS_SENSOR_BINARY: add_devices([ZWaveBinarySensor(value, None)]) diff --git a/homeassistant/components/climate/zwave.py b/homeassistant/components/climate/zwave.py index 4eec1f9c652..0fb13d258aa 100755 --- a/homeassistant/components/climate/zwave.py +++ b/homeassistant/components/climate/zwave.py @@ -9,8 +9,7 @@ https://home-assistant.io/components/climate.zwave/ import logging from homeassistant.components.climate import DOMAIN from homeassistant.components.climate import ClimateDevice -from homeassistant.components.zwave import ( - ATTR_NODE_ID, ATTR_VALUE_ID, ZWaveDeviceEntity) +from homeassistant.components.zwave import ZWaveDeviceEntity from homeassistant.components import zwave from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, ATTR_TEMPERATURE) @@ -28,12 +27,6 @@ HORSTMANN = 0x0059 HORSTMANN_HRT4_ZW = 0x3 HORSTMANN_HRT4_ZW_THERMOSTAT = (HORSTMANN, HORSTMANN_HRT4_ZW) -COMMAND_CLASS_SENSOR_MULTILEVEL = 0x31 -COMMAND_CLASS_THERMOSTAT_MODE = 0x40 -COMMAND_CLASS_THERMOSTAT_SETPOINT = 0x43 -COMMAND_CLASS_THERMOSTAT_FAN_MODE = 0x44 -COMMAND_CLASS_CONFIGURATION = 0x70 - WORKAROUND_ZXT_120 = 'zxt_120' WORKAROUND_HRT4_ZW = 'hrt4_zw' @@ -67,19 +60,19 @@ def setup_platform(hass, config, add_devices, discovery_info=None): discovery_info, zwave.NETWORK) return temp_unit = hass.config.units.temperature_unit - node = zwave.NETWORK.nodes[discovery_info[ATTR_NODE_ID]] - value = node.values[discovery_info[ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] value.set_change_verified(False) add_devices([ZWaveClimate(value, temp_unit)]) _LOGGER.debug("discovery_info=%s and zwave.NETWORK=%s", discovery_info, zwave.NETWORK) -# pylint: disable=too-many-arguments, abstract-method +# pylint: disable=abstract-method class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): """Represents a ZWave Climate device.""" - # pylint: disable=too-many-public-methods, too-many-instance-attributes + # pylint: disable=too-many-instance-attributes def __init__(self, value, temp_unit): """Initialize the zwave climate device.""" from openzwave.network import ZWaveNetwork @@ -130,7 +123,7 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): """Callback on data change for the registered node/value pair.""" # Operation Mode for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_MODE).values(): + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values(): self._current_operation = value.data self._index_operation = SET_TEMP_TO_INDEX.get( self._current_operation) @@ -139,14 +132,16 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): _LOGGER.debug("self._current_operation=%s", self._current_operation) # Current Temp - for value in self._node.get_values( - class_id=COMMAND_CLASS_SENSOR_MULTILEVEL).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL) + .values()): if value.label == 'Temperature': self._current_temperature = int(value.data) self._unit = value.units # Fan Mode - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_FAN_MODE).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE) + .values()): self._current_fan_mode = value.data self._fan_list = list(value.data_items) _LOGGER.debug("self._fan_list=%s", self._fan_list) @@ -154,17 +149,21 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): self._current_fan_mode) # Swing mode if self._zxt_120 == 1: - for value in self._node.get_values( - class_id=COMMAND_CLASS_CONFIGURATION).values(): - if value.command_class == 112 and value.index == 33: + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_CONFIGURATION) + .values()): + if value.command_class == \ + zwave.const.COMMAND_CLASS_CONFIGURATION and \ + value.index == 33: self._current_swing_mode = value.data self._swing_list = list(value.data_items) _LOGGER.debug("self._swing_list=%s", self._swing_list) _LOGGER.debug("self._current_swing_mode=%s", self._current_swing_mode) # Set point - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT) + .values()): if self.current_operation is not None and \ self.current_operation != 'Off': if self._index_operation != value.index: @@ -232,7 +231,6 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): """Return the temperature we try to reach.""" return self._target_temperature -# pylint: disable=too-many-branches, too-many-statements def set_temperature(self, **kwargs): """Set new target temperature.""" if kwargs.get(ATTR_TEMPERATURE) is not None: @@ -240,8 +238,9 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): else: return - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT) + .values()): if self.current_operation is not None: if self._hrt4_zw and self.current_operation == 'Off': # HRT4-ZW can change setpoint when off. @@ -279,17 +278,21 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): def set_fan_mode(self, fan): """Set new target fan mode.""" - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_FAN_MODE).values(): - if value.command_class == 68 and value.index == 0: + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE). + values()): + 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): """Set new target operation mode.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_MODE).values(): - if value.command_class == 64 and value.index == 0: + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values(): + if value.command_class == \ + zwave.const.COMMAND_CLASS_THERMOSTAT_MODE and value.index == 0: value.data = bytes(operation_mode, 'utf-8') break @@ -297,7 +300,9 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): """Set new target swing mode.""" if self._zxt_120 == 1: for value in self._node.get_values( - class_id=COMMAND_CLASS_CONFIGURATION).values(): - if value.command_class == 112 and value.index == 33: + class_id=zwave.const.COMMAND_CLASS_CONFIGURATION).values(): + if value.command_class == \ + zwave.const.COMMAND_CLASS_CONFIGURATION and \ + value.index == 33: value.data = bytes(swing_mode, 'utf-8') break diff --git a/homeassistant/components/cover/zwave.py b/homeassistant/components/cover/zwave.py index df7b2e14cb5..a3db374ddf1 100644 --- a/homeassistant/components/cover/zwave.py +++ b/homeassistant/components/cover/zwave.py @@ -12,9 +12,6 @@ from homeassistant.components.zwave import ZWaveDeviceEntity from homeassistant.components import zwave from homeassistant.components.cover import CoverDevice -COMMAND_CLASS_SWITCH_MULTILEVEL = 0x26 # 38 -COMMAND_CLASS_SWITCH_BINARY = 0x25 # 37 - SOMFY = 0x47 SOMFY_ZRTSI = 0x5a52 SOMFY_ZRTSI_CONTROLLER = (SOMFY, SOMFY_ZRTSI) @@ -32,17 +29,17 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] - if (value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL and - value.index == 0): + if node.has_command_class(zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL) \ + and value.index == 0: value.set_change_verified(False) add_devices([ZwaveRollershutter(value)]) - elif (value.command_class == zwave.COMMAND_CLASS_SWITCH_BINARY or - value.command_class == zwave.COMMAND_CLASS_BARRIER_OPERATOR): - if value.type != zwave.TYPE_BOOL and \ - value.genre != zwave.GENRE_USER: + elif node.has_command_class(zwave.const.COMMAND_CLASS_SWITCH_BINARY) or \ + node.has_command_class(zwave.const.COMMAND_CLASS_BARRIER_OPERATOR): + if value.type != zwave.const.TYPE_BOOL and \ + value.genre != zwave.const.GENRE_USER: return value.set_change_verified(False) add_devices([ZwaveGarageDoor(value)]) @@ -59,6 +56,7 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): from openzwave.network import ZWaveNetwork from pydispatch import dispatcher ZWaveDeviceEntity.__init__(self, value, DOMAIN) + # pylint: disable=no-member self._lozwmgr = libopenzwave.PyManager() self._lozwmgr.create() self._node = value.node @@ -88,9 +86,10 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): """Callback on data change for the registered node/value pair.""" # Position value for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Level': + class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values(): + if value.command_class == \ + zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and \ + value.label == 'Level': self._current_position = value.data @property @@ -118,22 +117,24 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): def open_cover(self, **kwargs): """Move the roller shutter up.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Open' or \ - value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Down': + 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.pressButton(value.value_id) break def close_cover(self, **kwargs): """Move the roller shutter down.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Up' or \ - value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Close': + class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values(): + if value.command_class == \ + zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \ + 'Up' or value.command_class == \ + zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \ + 'Close': self._lozwmgr.pressButton(value.value_id) break @@ -144,11 +145,12 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): def stop_cover(self, **kwargs): """Stop the roller shutter.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Open' or \ - value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Down': + 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 diff --git a/homeassistant/components/garage_door/zwave.py b/homeassistant/components/garage_door/zwave.py index 8ef0fcbed63..b180dd76e46 100644 --- a/homeassistant/components/garage_door/zwave.py +++ b/homeassistant/components/garage_door/zwave.py @@ -22,15 +22,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] - if value.command_class != zwave.COMMAND_CLASS_SWITCH_BINARY and \ - value.command_class != zwave.COMMAND_CLASS_BARRIER_OPERATOR: + if value.command_class != zwave.const.COMMAND_CLASS_SWITCH_BINARY and \ + value.command_class != zwave.const.COMMAND_CLASS_BARRIER_OPERATOR: return - if value.type != zwave.TYPE_BOOL: + if value.type != zwave.const.TYPE_BOOL: return - if value.genre != zwave.GENRE_USER: + if value.genre != zwave.const.GENRE_USER: return value.set_change_verified(False) diff --git a/homeassistant/components/hvac/zwave.py b/homeassistant/components/hvac/zwave.py index f8cb3fa5c9e..5415fe0b41c 100755 --- a/homeassistant/components/hvac/zwave.py +++ b/homeassistant/components/hvac/zwave.py @@ -9,8 +9,7 @@ https://home-assistant.io/components/hvac.zwave/ import logging from homeassistant.components.hvac import DOMAIN from homeassistant.components.hvac import HvacDevice -from homeassistant.components.zwave import ( - ATTR_NODE_ID, ATTR_VALUE_ID, ZWaveDeviceEntity) +from homeassistant.components.zwave import ZWaveDeviceEntity from homeassistant.components import zwave from homeassistant.const import (TEMP_FAHRENHEIT, TEMP_CELSIUS) @@ -23,12 +22,6 @@ REMOTEC = 0x5254 REMOTEC_ZXT_120 = 0x8377 REMOTEC_ZXT_120_THERMOSTAT = (REMOTEC, REMOTEC_ZXT_120, 0) -COMMAND_CLASS_SENSOR_MULTILEVEL = 0x31 -COMMAND_CLASS_THERMOSTAT_MODE = 0x40 -COMMAND_CLASS_THERMOSTAT_SETPOINT = 0x43 -COMMAND_CLASS_THERMOSTAT_FAN_MODE = 0x44 -COMMAND_CLASS_CONFIGURATION = 0x70 - WORKAROUND_ZXT_120 = 'zxt_120' DEVICE_MAPPINGS = { @@ -50,8 +43,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): discovery_info, zwave.NETWORK) return - node = zwave.NETWORK.nodes[discovery_info[ATTR_NODE_ID]] - value = node.values[discovery_info[ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] value.set_change_verified(False) add_devices([ZWaveHvac(value)]) _LOGGER.debug("discovery_info=%s and zwave.NETWORK=%s", @@ -107,25 +100,29 @@ class ZWaveHvac(ZWaveDeviceEntity, HvacDevice): def update_properties(self): """Callback on data change for the registered node/value pair.""" # Set point - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT) + .values()): if int(value.data) != 0: self._target_temperature = int(value.data) # Operation Mode - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_MODE).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE) + .values()): self._current_operation = value.data self._operation_list = list(value.data_items) _LOGGER.debug("self._operation_list=%s", self._operation_list) # Current Temp - for value in self._node.get_values( - class_id=COMMAND_CLASS_SENSOR_MULTILEVEL).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL) + .values()): if value.label == 'Temperature': self._current_temperature = int(value.data) self._unit = value.units # Fan Mode - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_FAN_MODE).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE) + .values()): self._current_operation_state = value.data self._fan_list = list(value.data_items) _LOGGER.debug("self._fan_list=%s", self._fan_list) @@ -133,8 +130,9 @@ class ZWaveHvac(ZWaveDeviceEntity, HvacDevice): self._current_operation_state) # Swing mode if self._zxt_120 == 1: - for value in self._node.get_values( - class_id=COMMAND_CLASS_CONFIGURATION).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_CONFIGURATION) + .values()): if value.command_class == 112 and value.index == 33: self._current_swing_mode = value.data self._swing_list = list(value.data_items) @@ -199,8 +197,9 @@ class ZWaveHvac(ZWaveDeviceEntity, HvacDevice): def set_temperature(self, temperature): """Set new target temperature.""" - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT) + .values()): if value.command_class != 67: continue if self._zxt_120: @@ -217,8 +216,9 @@ class ZWaveHvac(ZWaveDeviceEntity, HvacDevice): def set_fan_mode(self, fan): """Set new target fan mode.""" - for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_FAN_MODE).values(): + for value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_MODE) + .values()): if value.command_class == 68 and value.index == 0: value.data = bytes(fan, 'utf-8') break @@ -226,7 +226,7 @@ class ZWaveHvac(ZWaveDeviceEntity, HvacDevice): def set_operation_mode(self, operation_mode): """Set new target operation mode.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_MODE).values(): + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values(): if value.command_class == 64 and value.index == 0: value.data = bytes(operation_mode, 'utf-8') break @@ -235,7 +235,7 @@ class ZWaveHvac(ZWaveDeviceEntity, HvacDevice): """Set new target swing mode.""" if self._zxt_120 == 1: for value in self._node.get_values( - class_id=COMMAND_CLASS_CONFIGURATION).values(): + class_id=zwave.const.COMMAND_CLASS_CONFIGURATION).values(): if value.command_class == 112 and value.index == 33: value.data = bytes(swing_mode, 'utf-8') break diff --git a/homeassistant/components/light/zwave.py b/homeassistant/components/light/zwave.py index 49c4b5f8dd9..14d635153fb 100644 --- a/homeassistant/components/light/zwave.py +++ b/homeassistant/components/light/zwave.py @@ -50,19 +50,19 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] - if value.command_class != zwave.COMMAND_CLASS_SWITCH_MULTILEVEL: + if value.command_class != zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL: return - if value.type != zwave.TYPE_BYTE: + if value.type != zwave.const.TYPE_BYTE: return - if value.genre != zwave.GENRE_USER: + if value.genre != zwave.const.GENRE_USER: return value.set_change_verified(False) - if node.has_command_class(zwave.COMMAND_CLASS_COLOR): + if node.has_command_class(zwave.const.COMMAND_CLASS_SWITCH_COLOR): try: add_devices([ZwaveColorLight(value)]) except ValueError as exception: @@ -195,8 +195,8 @@ class ZwaveColorLight(ZwaveDimmer): raise ValueError("No matching color command found.") for value_color_channels in value.node.get_values( - class_id=zwave.COMMAND_CLASS_COLOR, genre='System', - type="Int").values(): + class_id=zwave.const.COMMAND_CLASS_SWITCH_COLOR, + genre='System', type="Int").values(): self._value_color_channels = value_color_channels if self._value_color_channels is None: diff --git a/homeassistant/components/lock/zwave.py b/homeassistant/components/lock/zwave.py index 9a3b24deb8a..4c0b7ae34ac 100644 --- a/homeassistant/components/lock/zwave.py +++ b/homeassistant/components/lock/zwave.py @@ -16,14 +16,14 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] - if value.command_class != zwave.COMMAND_CLASS_DOOR_LOCK: + if value.command_class != zwave.const.COMMAND_CLASS_DOOR_LOCK: return - if value.type != zwave.TYPE_BOOL: + if value.type != zwave.const.TYPE_BOOL: return - if value.genre != zwave.GENRE_USER: + if value.genre != zwave.const.GENRE_USER: return value.set_change_verified(False) diff --git a/homeassistant/components/rollershutter/zwave.py b/homeassistant/components/rollershutter/zwave.py index 1e193830005..e0f1d2b6e4b 100644 --- a/homeassistant/components/rollershutter/zwave.py +++ b/homeassistant/components/rollershutter/zwave.py @@ -12,9 +12,6 @@ from homeassistant.components.zwave import ZWaveDeviceEntity from homeassistant.components import zwave from homeassistant.components.rollershutter import RollershutterDevice -COMMAND_CLASS_SWITCH_MULTILEVEL = 0x26 # 38 -COMMAND_CLASS_SWITCH_BINARY = 0x25 # 37 - SOMFY = 0x47 SOMFY_ZRTSI = 0x5a52 SOMFY_ZRTSI_CONTROLLER = (SOMFY, SOMFY_ZRTSI) @@ -32,10 +29,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] - if value.command_class != zwave.COMMAND_CLASS_SWITCH_MULTILEVEL: + if value.command_class != zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL: return if value.index != 0: return @@ -82,9 +79,10 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, RollershutterDevice): """Callback on data change for the registered node/value pair.""" # Position value for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Level': + class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values(): + if value.command_class == \ + zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and \ + value.label == 'Level': self._current_position = value.data @property @@ -101,23 +99,26 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, RollershutterDevice): def move_up(self, **kwargs): """Move the roller shutter up.""" - for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Open' or \ - value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Down': + for value in (self._node.get_values( + 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.pressButton(value.value_id) break def move_down(self, **kwargs): """Move the roller shutter down.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Up' or \ - value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Close': + class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL).values(): + if value.command_class == \ + zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \ + 'Up' or value.command_class == \ + zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and value.label == \ + 'Close': self._lozwmgr.pressButton(value.value_id) break @@ -128,10 +129,11 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, RollershutterDevice): def stop(self, **kwargs): """Stop the roller shutter.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): - if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Open' or \ - value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ - and value.label == 'Down': + 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 diff --git a/homeassistant/components/sensor/zwave.py b/homeassistant/components/sensor/zwave.py index 023ddf4db82..4f474dbe73f 100644 --- a/homeassistant/components/sensor/zwave.py +++ b/homeassistant/components/sensor/zwave.py @@ -37,8 +37,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] value.set_change_verified(False) @@ -59,15 +59,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None): return # Generic Device mappings - if value.command_class == zwave.COMMAND_CLASS_SENSOR_MULTILEVEL: + if node.has_command_class(zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL): add_devices([ZWaveMultilevelSensor(value)]) - elif (value.command_class == zwave.COMMAND_CLASS_METER and - value.type == zwave.TYPE_DECIMAL): + elif node.has_command_class(zwave.const.COMMAND_CLASS_METER) and \ + value.type == zwave.const.TYPE_DECIMAL: add_devices([ZWaveMultilevelSensor(value)]) - elif (value.command_class == zwave.COMMAND_CLASS_ALARM or - value.command_class == zwave.COMMAND_CLASS_SENSOR_ALARM): + elif node.has_command_class(zwave.const.COMMAND_CLASS_ALARM) or \ + node.has_command_class(zwave.const.COMMAND_CLASS_SENSOR_ALARM): add_devices([ZWaveAlarmSensor(value)]) diff --git a/homeassistant/components/services.yaml b/homeassistant/components/services.yaml index 13078418e93..3df736647cb 100644 --- a/homeassistant/components/services.yaml +++ b/homeassistant/components/services.yaml @@ -101,41 +101,3 @@ openalpr: restart: description: Restart ffmpeg process of device. - -zwave: - add_node: - description: Add a new node to the zwave network. Refer to OZW.log for details. - - add_node_secure: - description: Add a new node to the zwave network with secure communications. Node must support this, and network key must be set. Refer to OZW.log for details. - - cancel_command: - description: Cancel a running zwave controller command. Use this to exit add_node, if you wasn't going to use it but activated it. - - heal_network: - description: Start a zwave network heal. This might take a while and will slow down the zwave network greatly while it is being processed. Refer to OZW.log for details. - - remove_node: - description: Remove a node from the zwave network. Refer to OZW.log for details. - - start_network: - description: Start the zwave network. This might take a while, depending on how big your zwave network is. - - stop_network: - description: Stop the zwave network, all updates into HASS will stop. - - soft_reset: - description: This will reset the controller without removing its data. Use carefully because not all controllers support this. Refer to controllers manual. - - test_network: - description: This will send test to nodes in the zwave network. This will greatly slow down the zwave network while it is being processed. Refer to OZW.log for details. - - rename_node: - description: Set the name of a node. - fields: - entity_id: - description: Name(s) of entities to to rename - example: 'light.leviton_vrmx11lz_multilevel_scene_switch_level_40' - name: - description: New Name - example: 'kitchen' diff --git a/homeassistant/components/switch/zwave.py b/homeassistant/components/switch/zwave.py index c1ad3d36f2d..4ba9cff378e 100644 --- a/homeassistant/components/switch/zwave.py +++ b/homeassistant/components/switch/zwave.py @@ -16,14 +16,13 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None or zwave.NETWORK is None: return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] - if value.command_class != zwave.COMMAND_CLASS_SWITCH_BINARY: + if not node.has_command_class(zwave.const.COMMAND_CLASS_SWITCH_BINARY): return - if value.type != zwave.TYPE_BOOL: - return - if value.genre != zwave.GENRE_USER: + if value.type != zwave.const.TYPE_BOOL or value.genre != \ + zwave.const.GENRE_USER: return value.set_change_verified(False) diff --git a/homeassistant/components/thermostat/zwave.py b/homeassistant/components/thermostat/zwave.py index 6bed82284bb..de1bd3bc03b 100644 --- a/homeassistant/components/thermostat/zwave.py +++ b/homeassistant/components/thermostat/zwave.py @@ -25,12 +25,6 @@ DEVICE_MAPPINGS = { REMOTEC_ZXT_120_THERMOSTAT: WORKAROUND_IGNORE } -COMMAND_CLASS_THERMOSTAT_FAN_STATE = 69 # 0x45 -COMMAND_CLASS_THERMOSTAT_SETPOINT = 67 # 0x43 -COMMAND_CLASS_SENSOR_MULTILEVEL = 49 # 0x31 -COMMAND_CLASS_THERMOSTAT_OPERATING_STATE = 66 # 0x42 -COMMAND_CLASS_THERMOSTAT_MODE = 64 # 0x40 - def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the ZWave thermostats.""" @@ -39,8 +33,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): discovery_info, zwave.NETWORK) return - node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] - value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + node = zwave.NETWORK.nodes[discovery_info[zwave.const.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.const.ATTR_VALUE_ID]] value.set_change_verified(False) # Make sure that we have values for the key before converting to int if (value.node.manufacturer_id.strip() and @@ -52,13 +46,13 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.debug("Remotec ZXT-120 Zwave Thermostat, ignoring") return if not (value.node.get_values_for_command_class( - COMMAND_CLASS_SENSOR_MULTILEVEL) and + zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL) and value.node.get_values_for_command_class( - COMMAND_CLASS_THERMOSTAT_SETPOINT)): + zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT)): return - if value.command_class != COMMAND_CLASS_SENSOR_MULTILEVEL and \ - value.command_class != COMMAND_CLASS_THERMOSTAT_SETPOINT: + if value.command_class != zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL and \ + value.command_class != zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT: return add_devices([ZWaveThermostat(value)]) @@ -99,20 +93,22 @@ class ZWaveThermostat(zwave.ZWaveDeviceEntity, ThermostatDevice): """Callback on data change for the registered node/value pair.""" # current Temp for _, value in self._node.get_values_for_command_class( - COMMAND_CLASS_SENSOR_MULTILEVEL).items(): + zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL).items(): if value.label == 'Temperature': self._current_temperature = int(value.data) self._unit = value.units # operation state - for _, value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_OPERATING_STATE).items(): + for _, value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE) + .items()): self._current_operation_state = value.data_as_string # target temperature temps = [] - for _, value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).items(): + for _, value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT) + .items()): temps.append(int(value.data)) if value.index == self._index: self._target_temperature = value.data @@ -120,8 +116,9 @@ class ZWaveThermostat(zwave.ZWaveDeviceEntity, ThermostatDevice): self._target_temperature_low = min(temps) # fan state - for _, value in self._node.get_values( - class_id=COMMAND_CLASS_THERMOSTAT_FAN_STATE).items(): + for _, value in (self._node.get_values( + class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_STATE) + .items()): self._current_fan_state = value.data_as_string @property @@ -165,7 +162,7 @@ class ZWaveThermostat(zwave.ZWaveDeviceEntity, ThermostatDevice): """Set new target temperature.""" # set point for _, value in self._node.get_values_for_command_class( - COMMAND_CLASS_THERMOSTAT_SETPOINT).items(): + zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT).items(): if int(value.data) != 0 and value.index == self._index: value.data = temperature break diff --git a/homeassistant/components/zwave.py b/homeassistant/components/zwave/__init__.py similarity index 67% rename from homeassistant/components/zwave.py rename to homeassistant/components/zwave/__init__.py index eb1d048244b..d5080752eab 100644 --- a/homeassistant/components/zwave.py +++ b/homeassistant/components/zwave/__init__.py @@ -19,6 +19,7 @@ from homeassistant.helpers.event import track_time_change from homeassistant.util import convert, slugify import homeassistant.config as conf_util import homeassistant.helpers.config_validation as cv +from . import const DOMAIN = "zwave" REQUIREMENTS = ['pydispatcher==2.0.5'] @@ -30,175 +31,93 @@ CONF_POLLING_INTERVAL = "polling_interval" CONF_POLLING_INTENSITY = "polling_intensity" CONF_AUTOHEAL = "autoheal" DEFAULT_CONF_AUTOHEAL = True - -# How long to wait for the zwave network to be ready. -NETWORK_READY_WAIT_SECS = 30 - -SERVICE_ADD_NODE = "add_node" -SERVICE_ADD_NODE_SECURE = "add_node_secure" -SERVICE_REMOVE_NODE = "remove_node" -SERVICE_CANCEL_COMMAND = "cancel_command" -SERVICE_HEAL_NETWORK = "heal_network" -SERVICE_SOFT_RESET = "soft_reset" -SERVICE_TEST_NETWORK = "test_network" -SERVICE_STOP_NETWORK = "stop_network" -SERVICE_START_NETWORK = "start_network" -SERVICE_RENAME_NODE = "rename_node" - -EVENT_SCENE_ACTIVATED = "zwave.scene_activated" -EVENT_NODE_EVENT = "zwave.node_event" -EVENT_NETWORK_READY = "zwave.network_ready" -EVENT_NETWORK_COMPLETE = "zwave.network_complete" -EVENT_NETWORK_START = "zwave.network_start" -EVENT_NETWORK_STOP = "zwave.network_stop" - -COMMAND_CLASS_WHATEVER = None -COMMAND_CLASS_SENSOR_MULTILEVEL = 49 -COMMAND_CLASS_COLOR = 51 -COMMAND_CLASS_METER = 50 -COMMAND_CLASS_ALARM = 113 -COMMAND_CLASS_SWITCH_BINARY = 37 -COMMAND_CLASS_SENSOR_BINARY = 48 -COMMAND_CLASS_SWITCH_MULTILEVEL = 38 -COMMAND_CLASS_DOOR_LOCK = 98 -COMMAND_CLASS_THERMOSTAT_SETPOINT = 67 -COMMAND_CLASS_THERMOSTAT_FAN_MODE = 68 -COMMAND_CLASS_BARRIER_OPERATOR = 102 -COMMAND_CLASS_BATTERY = 128 -COMMAND_CLASS_SENSOR_ALARM = 156 - -GENERIC_COMMAND_CLASS_WHATEVER = None -GENERIC_COMMAND_CLASS_REMOTE_CONTROLLER = 1 -GENERIC_COMMAND_CLASS_NOTIFICATION = 7 -GENERIC_COMMAND_CLASS_REPEATER_SLAVE = 15 -GENERIC_COMMAND_CLASS_BINARY_SWITCH = 16 -GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH = 17 -GENERIC_COMMAND_CLASS_REMOTE_SWITCH = 18 -GENERIC_COMMAND_CLASS_WALL_CONTROLLER = 24 -GENERIC_COMMAND_CLASS_ENTRY_CONTROL = 64 -GENERIC_COMMAND_CLASS_BINARY_SENSOR = 32 -GENERIC_COMMAND_CLASS_MULTILEVEL_SENSOR = 33 -GENERIC_COMMAND_CLASS_METER = 49 -GENERIC_COMMAND_CLASS_ALARM_SENSOR = 161 -GENERIC_COMMAND_CLASS_THERMOSTAT = 8 - -SPECIFIC_DEVICE_CLASS_WHATEVER = None -SPECIFIC_DEVICE_CLASS_NOT_USED = 0 -SPECIFIC_DEVICE_CLASS_MULTILEVEL_POWER_SWITCH = 1 -SPECIFIC_DEVICE_CLASS_ADVANCED_DOOR_LOCK = 2 -SPECIFIC_DEVICE_CLASS_MULTIPOSITION_MOTOR = 3 -SPECIFIC_DEVICE_CLASS_SECURE_KEYPAD_DOOR_LOCK = 3 -SPECIFIC_DEVICE_CLASS_MULTILEVEL_SCENE = 4 -SPECIFIC_DEVICE_CLASS_SECURE_DOOR = 5 -SPECIFIC_DEVICE_CLASS_MOTOR_CONTROL_CLASS_A = 5 -SPECIFIC_DEVICE_CLASS_MOTOR_CONTROL_CLASS_B = 6 -SPECIFIC_DEVICE_CLASS_SECURE_BARRIER_ADD_ON = 7 -SPECIFIC_DEVICE_CLASS_MOTOR_CONTROL_CLASS_C = 7 - -GENRE_WHATEVER = None -GENRE_USER = "User" - -TYPE_WHATEVER = None -TYPE_BYTE = "Byte" -TYPE_BOOL = "Bool" -TYPE_DECIMAL = "Decimal" - +NETWORK = None # List of tuple (DOMAIN, discovered service, supported command classes, # value type, genre type, specific device class). DISCOVERY_COMPONENTS = [ ('sensor', - [GENERIC_COMMAND_CLASS_WHATEVER], - [SPECIFIC_DEVICE_CLASS_WHATEVER], - [COMMAND_CLASS_SENSOR_MULTILEVEL, - COMMAND_CLASS_METER, - COMMAND_CLASS_ALARM, - COMMAND_CLASS_SENSOR_ALARM], - TYPE_WHATEVER, - GENRE_USER), + [const.GENERIC_TYPE_WHATEVER], + [const.SPECIFIC_TYPE_WHATEVER], + [const.COMMAND_CLASS_SENSOR_MULTILEVEL, + const.COMMAND_CLASS_METER, + const.COMMAND_CLASS_ALARM, + const.COMMAND_CLASS_SENSOR_ALARM], + const.TYPE_WHATEVER, + const.GENRE_USER), ('light', - [GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH, - GENERIC_COMMAND_CLASS_REMOTE_SWITCH], - [SPECIFIC_DEVICE_CLASS_MULTILEVEL_POWER_SWITCH, - SPECIFIC_DEVICE_CLASS_MULTILEVEL_SCENE, - SPECIFIC_DEVICE_CLASS_NOT_USED], - [COMMAND_CLASS_SWITCH_MULTILEVEL], - TYPE_BYTE, - GENRE_USER), + [const.GENERIC_TYPE_SWITCH_MULTILEVEL, + const.GENERIC_TYPE_SWITCH_REMOTE], + [const.SPECIFIC_TYPE_POWER_SWITCH_MULTILEVEL, + const.SPECIFIC_TYPE_SCENE_SWITCH_MULTILEVEL, + const.SPECIFIC_TYPE_NOT_USED], + [const.COMMAND_CLASS_SWITCH_MULTILEVEL], + const.TYPE_BYTE, + const.GENRE_USER), ('switch', - [GENERIC_COMMAND_CLASS_ALARM_SENSOR, - GENERIC_COMMAND_CLASS_BINARY_SENSOR, - GENERIC_COMMAND_CLASS_BINARY_SWITCH, - GENERIC_COMMAND_CLASS_ENTRY_CONTROL, - GENERIC_COMMAND_CLASS_MULTILEVEL_SENSOR, - GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH, - GENERIC_COMMAND_CLASS_NOTIFICATION, - GENERIC_COMMAND_CLASS_REMOTE_CONTROLLER, - GENERIC_COMMAND_CLASS_REMOTE_SWITCH, - GENERIC_COMMAND_CLASS_REPEATER_SLAVE, - GENERIC_COMMAND_CLASS_THERMOSTAT, - GENERIC_COMMAND_CLASS_WALL_CONTROLLER], - [SPECIFIC_DEVICE_CLASS_WHATEVER], - [COMMAND_CLASS_SWITCH_BINARY], - TYPE_BOOL, - GENRE_USER), + [const.GENERIC_TYPE_SENSOR_ALARM, + const.GENERIC_TYPE_SENSOR_BINARY, + const.GENERIC_TYPE_SWITCH_BINARY, + const.GENERIC_TYPE_ENTRY_CONTROL, + const.GENERIC_TYPE_SENSOR_MULTILEVEL, + const.GENERIC_TYPE_SWITCH_MULTILEVEL, + const.GENERIC_TYPE_SENSOR_NOTIFICATION, + const.GENERIC_TYPE_GENERIC_CONTROLLER, + const.GENERIC_TYPE_SWITCH_REMOTE, + const.GENERIC_TYPE_REPEATER_SLAVE, + const.GENERIC_TYPE_THERMOSTAT, + const.GENERIC_TYPE_WALL_CONTROLLER], + [const.SPECIFIC_TYPE_WHATEVER], + [const.COMMAND_CLASS_SWITCH_BINARY], + const.TYPE_BOOL, + const.GENRE_USER), ('binary_sensor', - [GENERIC_COMMAND_CLASS_ALARM_SENSOR, - GENERIC_COMMAND_CLASS_BINARY_SENSOR, - GENERIC_COMMAND_CLASS_BINARY_SWITCH, - GENERIC_COMMAND_CLASS_METER, - GENERIC_COMMAND_CLASS_MULTILEVEL_SENSOR, - GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH, - GENERIC_COMMAND_CLASS_NOTIFICATION, - GENERIC_COMMAND_CLASS_THERMOSTAT], - [SPECIFIC_DEVICE_CLASS_WHATEVER], - [COMMAND_CLASS_SENSOR_BINARY], - TYPE_BOOL, - GENRE_USER), + [const.GENERIC_TYPE_SENSOR_ALARM, + const.GENERIC_TYPE_SENSOR_BINARY, + const.GENERIC_TYPE_SWITCH_BINARY, + const.GENERIC_TYPE_METER, + const.GENERIC_TYPE_SENSOR_MULTILEVEL, + const.GENERIC_TYPE_SWITCH_MULTILEVEL, + const.GENERIC_TYPE_SENSOR_NOTIFICATION, + const.GENERIC_TYPE_THERMOSTAT], + [const.SPECIFIC_TYPE_WHATEVER], + [const.COMMAND_CLASS_SENSOR_BINARY], + const.TYPE_BOOL, + const.GENRE_USER), ('lock', - [GENERIC_COMMAND_CLASS_ENTRY_CONTROL], - [SPECIFIC_DEVICE_CLASS_ADVANCED_DOOR_LOCK, - SPECIFIC_DEVICE_CLASS_SECURE_KEYPAD_DOOR_LOCK], - [COMMAND_CLASS_DOOR_LOCK], - TYPE_BOOL, - GENRE_USER), + [const.GENERIC_TYPE_ENTRY_CONTROL], + [const.SPECIFIC_TYPE_ADVANCED_DOOR_LOCK, + const.SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK], + [const.COMMAND_CLASS_DOOR_LOCK], + const.TYPE_BOOL, + const.GENRE_USER), ('cover', - [GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH, - GENERIC_COMMAND_CLASS_ENTRY_CONTROL], - [SPECIFIC_DEVICE_CLASS_MOTOR_CONTROL_CLASS_A, - SPECIFIC_DEVICE_CLASS_MOTOR_CONTROL_CLASS_B, - SPECIFIC_DEVICE_CLASS_MOTOR_CONTROL_CLASS_C, - SPECIFIC_DEVICE_CLASS_MULTIPOSITION_MOTOR, - SPECIFIC_DEVICE_CLASS_SECURE_BARRIER_ADD_ON, - SPECIFIC_DEVICE_CLASS_SECURE_DOOR], - [COMMAND_CLASS_SWITCH_BINARY, - COMMAND_CLASS_BARRIER_OPERATOR, - COMMAND_CLASS_SWITCH_MULTILEVEL], - TYPE_WHATEVER, - GENRE_USER), + [const.GENERIC_TYPE_SWITCH_MULTILEVEL, + const.GENERIC_TYPE_ENTRY_CONTROL], + [const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL, + const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL, + const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL, + const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION, + const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON, + const.SPECIFIC_TYPE_SECURE_DOOR], + [const.COMMAND_CLASS_SWITCH_BINARY, + const.COMMAND_CLASS_BARRIER_OPERATOR, + const.COMMAND_CLASS_SWITCH_MULTILEVEL], + const.TYPE_WHATEVER, + const.GENRE_USER), ('climate', - [GENERIC_COMMAND_CLASS_THERMOSTAT], - [SPECIFIC_DEVICE_CLASS_WHATEVER], - [COMMAND_CLASS_THERMOSTAT_SETPOINT], - TYPE_WHATEVER, - GENRE_WHATEVER), + [const.GENERIC_TYPE_THERMOSTAT], + [const.SPECIFIC_TYPE_WHATEVER], + [const.COMMAND_CLASS_THERMOSTAT_SETPOINT], + const.TYPE_WHATEVER, + const.GENRE_WHATEVER), ] - -ATTR_NODE_ID = "node_id" -ATTR_VALUE_ID = "value_id" -ATTR_OBJECT_ID = "object_id" -ATTR_NAME = "name" -ATTR_SCENE_ID = "scene_id" -ATTR_BASIC_LEVEL = "basic_level" - RENAME_NODE_SCHEMA = vol.Schema({ vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_NAME): cv.string, + vol.Required(const.ATTR_NAME): cv.string, }) -NETWORK = None - _LOGGER = logging.getLogger(__name__) @@ -386,23 +305,23 @@ def setup(hass, config): value.disable_poll() discovery.load_platform(hass, component, DOMAIN, { - ATTR_NODE_ID: node.node_id, - ATTR_VALUE_ID: value.value_id, + const.ATTR_NODE_ID: node.node_id, + const.ATTR_VALUE_ID: value.value_id, }, config) def scene_activated(node, scene_id): """Called when a scene is activated on any node in the network.""" - hass.bus.fire(EVENT_SCENE_ACTIVATED, { + hass.bus.fire(const.EVENT_SCENE_ACTIVATED, { ATTR_ENTITY_ID: _node_object_id(node), - ATTR_OBJECT_ID: _node_object_id(node), - ATTR_SCENE_ID: scene_id + const.ATTR_OBJECT_ID: _node_object_id(node), + const.ATTR_SCENE_ID: scene_id }) def node_event_activated(node, value): """Called when a nodeevent is activated on any node in the network.""" - hass.bus.fire(EVENT_NODE_EVENT, { - ATTR_OBJECT_ID: _node_object_id(node), - ATTR_BASIC_LEVEL: value + hass.bus.fire(const.EVENT_NODE_EVENT, { + const.ATTR_OBJECT_ID: _node_object_id(node), + const.ATTR_BASIC_LEVEL: value }) def network_ready(): @@ -410,13 +329,13 @@ def setup(hass, config): _LOGGER.info("Zwave network is ready for use. All awake nodes" " have been queried. Sleeping nodes will be" " queried when they awake.") - hass.bus.fire(EVENT_NETWORK_READY) + hass.bus.fire(const.EVENT_NETWORK_READY) def network_complete(): """Called when all nodes on network have been queried.""" _LOGGER.info("Zwave network is complete. All nodes on the network" " have been queried") - hass.bus.fire(EVENT_NETWORK_COMPLETE) + hass.bus.fire(const.EVENT_NETWORK_COMPLETE) dispatcher.connect( value_added, ZWaveNetwork.SIGNAL_VALUE_ADDED, weak=False) @@ -468,14 +387,14 @@ def setup(hass, config): """Stop Z-Wave network.""" _LOGGER.info("Stopping ZWave network.") NETWORK.stop() - hass.bus.fire(EVENT_NETWORK_STOP) + hass.bus.fire(const.EVENT_NETWORK_STOP) def rename_node(service): """Rename a node.""" state = hass.states.get(service.data.get(ATTR_ENTITY_ID)) - node_id = state.attributes.get(ATTR_NODE_ID) + node_id = state.attributes.get(const.ATTR_NODE_ID) node = NETWORK.nodes[node_id] - name = service.data.get(ATTR_NAME) + name = service.data.get(const.ATTR_NAME) node.name = name _LOGGER.info( "Renamed ZWave node %d to %s", node_id, name) @@ -484,12 +403,12 @@ def setup(hass, config): """Startup Z-Wave network.""" _LOGGER.info("Starting ZWave network.") NETWORK.start() - hass.bus.fire(EVENT_NETWORK_START) + hass.bus.fire(const.EVENT_NETWORK_START) # Need to be in STATE_AWAKED before talking to nodes. # Wait up to NETWORK_READY_WAIT_SECS seconds for the zwave network # to be ready. - for i in range(NETWORK_READY_WAIT_SECS): + for i in range(const.NETWORK_READY_WAIT_SECS): _LOGGER.debug( "network state: %d %s", NETWORK.state, NETWORK.state_str) if NETWORK.state >= NETWORK.STATE_AWAKED: @@ -499,7 +418,7 @@ def setup(hass, config): else: _LOGGER.warning( "zwave not ready after %d seconds, continuing anyway", - NETWORK_READY_WAIT_SECS) + const.NETWORK_READY_WAIT_SECS) _LOGGER.info( "final network state: %d %s", NETWORK.state, NETWORK.state_str) @@ -514,18 +433,31 @@ def setup(hass, config): hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_zwave) # Register node services for Z-Wave network - hass.services.register(DOMAIN, SERVICE_ADD_NODE, add_node) - hass.services.register(DOMAIN, SERVICE_ADD_NODE_SECURE, - add_node_secure) - hass.services.register(DOMAIN, SERVICE_REMOVE_NODE, remove_node) - hass.services.register(DOMAIN, SERVICE_CANCEL_COMMAND, cancel_command) - hass.services.register(DOMAIN, SERVICE_HEAL_NETWORK, heal_network) - hass.services.register(DOMAIN, SERVICE_SOFT_RESET, soft_reset) - hass.services.register(DOMAIN, SERVICE_TEST_NETWORK, test_network) - hass.services.register(DOMAIN, SERVICE_STOP_NETWORK, stop_zwave) - hass.services.register(DOMAIN, SERVICE_START_NETWORK, start_zwave) - hass.services.register(DOMAIN, SERVICE_RENAME_NODE, rename_node, - descriptions[DOMAIN][SERVICE_RENAME_NODE], + hass.services.register(DOMAIN, const.SERVICE_ADD_NODE, add_node, + descriptions[const.SERVICE_ADD_NODE]) + hass.services.register(DOMAIN, const.SERVICE_ADD_NODE_SECURE, + add_node_secure, + descriptions[const.SERVICE_ADD_NODE_SECURE]) + hass.services.register(DOMAIN, const.SERVICE_REMOVE_NODE, remove_node, + descriptions[const.SERVICE_REMOVE_NODE]) + hass.services.register(DOMAIN, const.SERVICE_CANCEL_COMMAND, + cancel_command, + descriptions[const.SERVICE_CANCEL_COMMAND]) + hass.services.register(DOMAIN, const.SERVICE_HEAL_NETWORK, + heal_network, + descriptions[const.SERVICE_HEAL_NETWORK]) + hass.services.register(DOMAIN, const.SERVICE_SOFT_RESET, soft_reset, + descriptions[const.SERVICE_SOFT_RESET]) + hass.services.register(DOMAIN, const.SERVICE_TEST_NETWORK, + test_network, + descriptions[const.SERVICE_TEST_NETWORK]) + hass.services.register(DOMAIN, const.SERVICE_STOP_NETWORK, stop_zwave, + descriptions[const.SERVICE_STOP_NETWORK]) + hass.services.register(DOMAIN, const.SERVICE_START_NETWORK, + start_zwave, + descriptions[const.SERVICE_START_NETWORK]) + hass.services.register(DOMAIN, const.SERVICE_RENAME_NODE, rename_node, + descriptions[const.SERVICE_RENAME_NODE], schema=RENAME_NODE_SCHEMA) # Setup autoheal @@ -574,7 +506,7 @@ class ZWaveDeviceEntity: def device_state_attributes(self): """Return the device specific state attributes.""" attrs = { - ATTR_NODE_ID: self._value.node.node_id, + const.ATTR_NODE_ID: self._value.node.node_id, } battery_level = self._value.node.get_battery_level() diff --git a/homeassistant/components/zwave/const.py b/homeassistant/components/zwave/const.py new file mode 100644 index 00000000000..155bc545ad4 --- /dev/null +++ b/homeassistant/components/zwave/const.py @@ -0,0 +1,292 @@ +"""Z-Wave Constants.""" + +ATTR_NODE_ID = "node_id" +ATTR_VALUE_ID = "value_id" +ATTR_OBJECT_ID = "object_id" +ATTR_NAME = "name" +ATTR_SCENE_ID = "scene_id" +ATTR_BASIC_LEVEL = "basic_level" +NETWORK_READY_WAIT_SECS = 30 + +SERVICE_ADD_NODE = "add_node" +SERVICE_ADD_NODE_SECURE = "add_node_secure" +SERVICE_REMOVE_NODE = "remove_node" +SERVICE_CANCEL_COMMAND = "cancel_command" +SERVICE_HEAL_NETWORK = "heal_network" +SERVICE_SOFT_RESET = "soft_reset" +SERVICE_TEST_NETWORK = "test_network" +SERVICE_STOP_NETWORK = "stop_network" +SERVICE_START_NETWORK = "start_network" +SERVICE_RENAME_NODE = "rename_node" + +EVENT_SCENE_ACTIVATED = "zwave.scene_activated" +EVENT_NODE_EVENT = "zwave.node_event" +EVENT_NETWORK_READY = "zwave.network_ready" +EVENT_NETWORK_COMPLETE = "zwave.network_complete" +EVENT_NETWORK_START = "zwave.network_start" +EVENT_NETWORK_STOP = "zwave.network_stop" + +COMMAND_CLASS_ALARM = 113 +COMMAND_CLASS_ANTITHEFT = 93 +COMMAND_CLASS_APPLICATION_CAPABILITY = 87 +COMMAND_CLASS_APPLICATION_STATUS = 34 +COMMAND_CLASS_ASSOCIATION = 133 +COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION = 155 +COMMAND_CLASS_ASSOCIATION_GRP_INFO = 89 +COMMAND_CLASS_BARRIER_OPERATOR = 102 +COMMAND_CLASS_BASIC = 32 +COMMAND_CLASS_BASIC_TARIFF_INFO = 54 +COMMAND_CLASS_BASIC_WINDOW_COVERING = 80 +COMMAND_CLASS_BATTERY = 128 +COMMAND_CLASS_CENTRAL_SCENE = 91 +COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE = 70 +COMMAND_CLASS_CLOCK = 129 +COMMAND_CLASS_CONFIGURATION = 112 +COMMAND_CLASS_CONTROLLER_REPLICATION = 33 +COMMAND_CLASS_CRC_16_ENCAP = 86 +COMMAND_CLASS_DCP_CONFIG = 58 +COMMAND_CLASS_DCP_MONITOR = 59 +COMMAND_CLASS_DEVICE_RESET_LOCALLY = 90 +COMMAND_CLASS_DOOR_LOCK = 98 +COMMAND_CLASS_DOOR_LOCK_LOGGING = 76 +COMMAND_CLASS_ENERGY_PRODUCTION = 144 +COMMAND_CLASS_ENTRY_CONTROL = 111 +COMMAND_CLASS_FIRMWARE_UPDATE_MD = 122 +COMMAND_CLASS_GEOGRAPHIC_LOCATION = 140 +COMMAND_CLASS_GROUPING_NAME = 123 +COMMAND_CLASS_HAIL = 130 +COMMAND_CLASS_HRV_CONTROL = 57 +COMMAND_CLASS_HRV_STATUS = 55 +COMMAND_CLASS_HUMIDITY_CONTROL_MODE = 109 +COMMAND_CLASS_HUMIDITY_CONTROL_OPERATING_STATE = 110 +COMMAND_CLASS_HUMIDITY_CONTROL_SETPOINT = 100 +COMMAND_CLASS_INDICATOR = 135 +COMMAND_CLASS_IP_ASSOCIATION = 92 +COMMAND_CLASS_IP_CONFIGURATION = 14 +COMMAND_CLASS_IRRIGATION = 107 +COMMAND_CLASS_LANGUAGE = 137 +COMMAND_CLASS_LOCK = 118 +COMMAND_CLASS_MAILBOX = 105 +COMMAND_CLASS_MANUFACTURER_PROPRIETARY = 145 +COMMAND_CLASS_MANUFACTURER_SPECIFIC = 114 +COMMAND_CLASS_MARK = 239 +COMMAND_CLASS_METER = 50 +COMMAND_CLASS_METER_PULSE = 53 +COMMAND_CLASS_METER_TBL_CONFIG = 60 +COMMAND_CLASS_METER_TBL_MONITOR = 61 +COMMAND_CLASS_METER_TBL_PUSH = 62 +COMMAND_CLASS_MTP_WINDOW_COVERING = 81 +COMMAND_CLASS_MULTI_CHANNEL = 96 +COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION = 142 +COMMAND_CLASS_MULTI_COMMAND = 143 +COMMAND_CLASS_NETWORK_MANAGEMENT_BASIC = 77 +COMMAND_CLASS_NETWORK_MANAGEMENT_INCLUSION = 52 +COMMAND_CLASS_NETWORK_MANAGEMENT_PRIMARY = 84 +COMMAND_CLASS_NETWORK_MANAGEMENT_PROXY = 82 +COMMAND_CLASS_NO_OPERATION = 0 +COMMAND_CLASS_NODE_NAMING = 119 +COMMAND_CLASS_NON_INTEROPERABLE = 240 +COMMAND_CLASS_NOTIFICATION = 113 +COMMAND_CLASS_POWERLEVEL = 115 +COMMAND_CLASS_PREPAYMENT = 63 +COMMAND_CLASS_PREPAYMENT_ENCAPSULATION = 65 +COMMAND_CLASS_PROPRIETARY = 136 +COMMAND_CLASS_PROTECTION = 117 +COMMAND_CLASS_RATE_TBL_CONFIG = 72 +COMMAND_CLASS_RATE_TBL_MONITOR = 73 +COMMAND_CLASS_REMOTE_ASSOCIATION_ACTIVATE = 124 +COMMAND_CLASS_REMOTE_ASSOCIATION = 125 +COMMAND_CLASS_SCENE_ACTIVATION = 43 +COMMAND_CLASS_SCENE_ACTUATOR_CONF = 44 +COMMAND_CLASS_SCENE_CONTROLLER_CONF = 45 +COMMAND_CLASS_SCHEDULE = 83 +COMMAND_CLASS_SCHEDULE_ENTRY_LOCK = 78 +COMMAND_CLASS_SCREEN_ATTRIBUTES = 147 +COMMAND_CLASS_SCREEN_MD = 146 +COMMAND_CLASS_SECURITY = 152 +COMMAND_CLASS_SECURITY_SCHEME0_MARK = 61696 +COMMAND_CLASS_SENSOR_ALARM = 156 +COMMAND_CLASS_SENSOR_BINARY = 48 +COMMAND_CLASS_SENSOR_CONFIGURATION = 158 +COMMAND_CLASS_SENSOR_MULTILEVEL = 49 +COMMAND_CLASS_SILENCE_ALARM = 157 +COMMAND_CLASS_SIMPLE_AV_CONTROL = 148 +COMMAND_CLASS_SUPERVISION = 108 +COMMAND_CLASS_SWITCH_ALL = 39 +COMMAND_CLASS_SWITCH_BINARY = 37 +COMMAND_CLASS_SWITCH_COLOR = 51 +COMMAND_CLASS_SWITCH_MULTILEVEL = 38 +COMMAND_CLASS_SWITCH_TOGGLE_BINARY = 40 +COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL = 41 +COMMAND_CLASS_TARIFF_TBL_CONFIG = 74 +COMMAND_CLASS_TARIFF_TBL_MONITOR = 75 +COMMAND_CLASS_THERMOSTAT_FAN_MODE = 68 +COMMAND_CLASS_THERMOSTAT_FAN_STATE = 69 +COMMAND_CLASS_THERMOSTAT_MODE = 64 +COMMAND_CLASS_THERMOSTAT_OPERATING_STATE = 66 +COMMAND_CLASS_THERMOSTAT_SETBACK = 71 +COMMAND_CLASS_THERMOSTAT_SETPOINT = 67 +COMMAND_CLASS_TIME = 138 +COMMAND_CLASS_TIME_PARAMETERS = 139 +COMMAND_CLASS_TRANSPORT_SERVICE = 85 +COMMAND_CLASS_USER_CODE = 99 +COMMAND_CLASS_VERSION = 134 +COMMAND_CLASS_WAKE_UP = 132 +COMMAND_CLASS_ZIP = 35 +COMMAND_CLASS_ZIP_NAMING = 104 +COMMAND_CLASS_ZIP_ND = 88 +COMMAND_CLASS_ZIP_6LOWPAN = 79 +COMMAND_CLASS_ZIP_GATEWAY = 95 +COMMAND_CLASS_ZIP_PORTAL = 97 +COMMAND_CLASS_ZWAVEPLUS_INFO = 94 +COMMAND_CLASS_WHATEVER = None # Match ALL +COMMAND_CLASS_WINDOW_COVERING = 106 + +GENERIC_TYPE_WHATEVER = None # Match ALL +SPECIFIC_TYPE_WHATEVER = None # Match ALL +SPECIFIC_TYPE_NOT_USED = 0 # Available in all Generic types + +GENERIC_TYPE_AV_CONTROL_POINT = 3 +SPECIFIC_TYPE_DOORBELL = 18 +SPECIFIC_TYPE_SATELLITE_RECIEVER = 4 +SPECIFIC_TYPE_SATELLITE_RECIEVER_V2 = 17 + +GENERIC_TYPE_DISPLAY = 4 +SPECIFIC_TYPE_SIMPLE_DISPLAY = 1 + +GENERIC_TYPE_ENTRY_CONTROL = 64 +SPECIFIC_TYPE_DOOR_LOCK = 1 +SPECIFIC_TYPE_ADVANCED_DOOR_LOCK = 2 +SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK = 3 +SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK_DEADBOLT = 4 +SPECIFIC_TYPE_SECURE_DOOR = 5 +SPECIFIC_TYPE_SECURE_GATE = 6 +SPECIFIC_TYPE_SECURE_BARRIER_ADDON = 7 +SPECIFIC_TYPE_SECURE_BARRIER_OPEN_ONLY = 8 +SPECIFIC_TYPE_SECURE_BARRIER_CLOSE_ONLY = 9 +SPECIFIC_TYPE_SECURE_LOCKBOX = 10 +SPECIFIC_TYPE_SECURE_KEYPAD = 11 + +GENERIC_TYPE_GENERIC_CONTROLLER = 1 +SPECIFIC_TYPE_PORTABLE_CONTROLLER = 1 +SPECIFIC_TYPE_PORTABLE_SCENE_CONTROLLER = 2 +SPECIFIC_TYPE_PORTABLE_INSTALLER_TOOL = 3 +SPECIFIC_TYPE_REMOTE_CONTROL_AV = 4 +SPECIFIC_TYPE_REMOTE_CONTROL_SIMPLE = 6 + +GENERIC_TYPE_METER = 49 +SPECIFIC_TYPE_SIMPLE_METER = 1 +SPECIFIC_TYPE_ADV_ENERGY_CONTROL = 2 +SPECIFIC_TYPE_WHOLE_HOME_METER_SIMPLE = 3 + +GENERIC_TYPE_METER_PULSE = 48 + +GENERIC_TYPE_NON_INTEROPERABLE = 255 + +GENERIC_TYPE_REPEATER_SLAVE = 15 +SPECIFIC_TYPE_REPEATER_SLAVE = 1 +SPECIFIC_TYPE_VIRTUAL_NODE = 2 + +GENERIC_TYPE_SECURITY_PANEL = 23 +SPECIFIC_TYPE_ZONED_SECURITY_PANEL = 1 + +GENERIC_TYPE_SEMI_INTEROPERABLE = 80 +SPECIFIC_TYPE_ENERGY_PRODUCTION = 1 + +GENERIC_TYPE_SENSOR_ALARM = 161 +SPECIFIC_TYPE_ADV_ZENSOR_NET_ALARM_SENSOR = 5 +SPECIFIC_TYPE_ADV_ZENSOR_NET_SMOKE_SENSOR = 10 +SPECIFIC_TYPE_BASIC_ROUTING_ALARM_SENSOR = 1 +SPECIFIC_TYPE_BASIC_ROUTING_SMOKE_SENSOR = 6 +SPECIFIC_TYPE_BASIC_ZENSOR_NET_ALARM_SENSOR = 3 +SPECIFIC_TYPE_BASIC_ZENSOR_NET_SMOKE_SENSOR = 8 +SPECIFIC_TYPE_ROUTING_ALARM_SENSOR = 2 +SPECIFIC_TYPE_ROUTING_SMOKE_SENSOR = 7 +SPECIFIC_TYPE_ZENSOR_NET_ALARM_SENSOR = 4 +SPECIFIC_TYPE_ZENSOR_NET_SMOKE_SENSOR = 9 +SPECIFIC_TYPE_ALARM_SENSOR = 11 + +GENERIC_TYPE_SENSOR_BINARY = 32 +SPECIFIC_TYPE_ROUTING_SENSOR_BINARY = 1 + +GENERIC_TYPE_SENSOR_MULTILEVEL = 33 +SPECIFIC_TYPE_ROUTING_SENSOR_MULTILEVEL = 1 +SPECIFIC_TYPE_CHIMNEY_FAN = 2 + +GENERIC_TYPE_STATIC_CONTROLLER = 2 +SPECIFIC_TYPE_PC_CONTROLLER = 1 +SPECIFIC_TYPE_SCENE_CONTROLLER = 2 +SPECIFIC_TYPE_STATIC_INSTALLER_TOOL = 3 +SPECIFIC_TYPE_SET_TOP_BOX = 4 +SPECIFIC_TYPE_SUB_SYSTEM_CONTROLLER = 5 +SPECIFIC_TYPE_TV = 6 +SPECIFIC_TYPE_GATEWAY = 7 + +GENERIC_TYPE_SWITCH_BINARY = 16 +SPECIFIC_TYPE_POWER_SWITCH_BINARY = 1 +SPECIFIC_TYPE_SCENE_SWITCH_BINARY = 3 +SPECIFIC_TYPE_POWER_STRIP = 4 +SPECIFIC_TYPE_SIREN = 5 +SPECIFIC_TYPE_VALVE_OPEN_CLOSE = 6 +SPECIFIC_TYPE_COLOR_TUNABLE_BINARY = 2 +SPECIFIC_TYPE_IRRIGATION_CONTROLLER = 7 + +GENERIC_TYPE_SWITCH_MULTILEVEL = 17 +SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL = 5 +SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL = 6 +SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL = 7 +SPECIFIC_TYPE_MOTOR_MULTIPOSITION = 3 +SPECIFIC_TYPE_POWER_SWITCH_MULTILEVEL = 1 +SPECIFIC_TYPE_SCENE_SWITCH_MULTILEVEL = 4 +SPECIFIC_TYPE_FAN_SWITCH = 8 +SPECIFIC_TYPE_COLOR_TUNABLE_MULTILEVEL = 2 + +GENERIC_TYPE_SWITCH_REMOTE = 18 +SPECIFIC_TYPE_REMOTE_BINARY = 1 +SPECIFIC_TYPE_REMOTE_MULTILEVEL = 2 +SPECIFIC_TYPE_REMOTE_TOGGLE_BINARY = 3 +SPECIFIC_TYPE_REMOTE_TOGGLE_MULTILEVEL = 4 + +GENERIC_TYPE_SWITCH_TOGGLE = 19 +SPECIFIC_TYPE_SWITCH_TOGGLE_BINARY = 1 +SPECIFIC_TYPE_SWITCH_TOGGLE_MULTILEVEL = 2 + +GENERIC_TYPE_THERMOSTAT = 8 +SPECIFIC_TYPE_SETBACK_SCHEDULE_THERMOSTAT = 3 +SPECIFIC_TYPE_SETBACK_THERMOSTAT = 5 +SPECIFIC_TYPE_SETPOINT_THERMOSTAT = 4 +SPECIFIC_TYPE_THERMOSTAT_GENERAL = 2 +SPECIFIC_TYPE_THERMOSTAT_GENERAL_V2 = 6 +SPECIFIC_TYPE_THERMOSTAT_HEATING = 1 + +GENERIC_TYPE_VENTILATION = 22 +SPECIFIC_TYPE_RESIDENTIAL_HRV = 1 + +GENERIC_TYPE_WINDOWS_COVERING = 9 +SPECIFIC_TYPE_SIMPLE_WINDOW_COVERING = 1 + +GENERIC_TYPE_ZIP_NODE = 21 +SPECIFIC_TYPE_ZIP_ADV_NODE = 2 +SPECIFIC_TYPE_ZIP_TUN_NODE = 1 + +GENERIC_TYPE_WALL_CONTROLLER = 24 +SPECIFIC_TYPE_BASIC_WALL_CONTROLLER = 1 + +GENERIC_TYPE_NETWORK_EXTENDER = 5 +SPECIFIC_TYPE_SECURE_EXTENDER = 1 + +GENERIC_TYPE_APPLIANCE = 6 +SPECIFIC_TYPE_GENERAL_APPLIANCE = 1 +SPECIFIC_TYPE_KITCHEN_APPLIANCE = 2 +SPECIFIC_TYPE_LAUNDRY_APPLIANCE = 3 + +GENERIC_TYPE_SENSOR_NOTIFICATION = 7 +SPECIFIC_TYPE_NOTIFICATION_SENSOR = 1 + +GENRE_WHATEVER = None +GENRE_USER = "User" + +TYPE_WHATEVER = None +TYPE_BYTE = "Byte" +TYPE_BOOL = "Bool" +TYPE_DECIMAL = "Decimal" diff --git a/homeassistant/components/zwave/services.yaml b/homeassistant/components/zwave/services.yaml new file mode 100644 index 00000000000..234faf0a87d --- /dev/null +++ b/homeassistant/components/zwave/services.yaml @@ -0,0 +1,36 @@ +add_node: + description: Add a new node to the Z-Wave network. Refer to OZW.log for details. + +add_node_secure: + description: Add a new node to the Z-Wave network with secure communications. Node must support this, and network key must be set. Refer to OZW.log for details. + +cancel_command: + description: Cancel a running Z-Wave controller command. Use this to exit add_node, if you wasn't going to use it but activated it. + +heal_network: + description: Start a Z-Wave network heal. This might take a while and will slow down the Z-Wave network greatly while it is being processed. Refer to OZW.log for details. + +remove_node: + description: Remove a node from the Z-Wave network. Refer to OZW.log for details. + +start_network: + description: Start the Z-Wave network. This might take a while, depending on how big your Z-Wave network is. + +stop_network: + description: Stop the Z-Wave network, all updates into HASS will stop. + +soft_reset: + description: This will reset the controller without removing its data. Use carefully because not all controllers support this. Refer to controllers manual. + +test_network: + description: This will send test to nodes in the Z-Wave network. This will greatly slow down the Z-Wave network while it is being processed. Refer to OZW.log for details. + +rename_node: + description: Set the name(s) of a node. + fields: + entity_id: + description: Name(s) of entities to to rename + example: 'light.leviton_vrmx11lz_multilevel_scene_switch_level_40' + name: + description: New Name + example: 'kitchen'