Zwave: Update commandclasses and deviceclasses according to sigma SDK (#3495)
* Update Command classes and device types to Sigma SDK * Fix some pylint * Seperate constants to file * Flake8 * coverage and flake8 pylint * Add services.yaml * Service descriptions was missing * Spelling :) * grammar * Remove zwave service descriptions from main
This commit is contained in:
parent
234f4449b0
commit
521080d1b0
16 changed files with 614 additions and 387 deletions
|
@ -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
|
||||
|
|
|
@ -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)])
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)])
|
||||
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
292
homeassistant/components/zwave/const.py
Normal file
292
homeassistant/components/zwave/const.py
Normal file
|
@ -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"
|
36
homeassistant/components/zwave/services.yaml
Normal file
36
homeassistant/components/zwave/services.yaml
Normal file
|
@ -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'
|
Loading…
Add table
Add a link
Reference in a new issue