Discover Z-Wave values by index (#7853)

* Discover Z-Wave values by index

* Add URLs for enums (Some Assembly Required)

* URLs on one line

* Move lint suppression to single line
This commit is contained in:
Adam Mills 2017-06-14 08:41:20 -04:00 committed by GitHub
parent 02f7eb9675
commit ae3973144c
5 changed files with 56 additions and 43 deletions

View File

@ -533,7 +533,7 @@ def setup(hass, config):
for value in ( for value in (
node.get_values(class_id=const.COMMAND_CLASS_METER) node.get_values(class_id=const.COMMAND_CLASS_METER)
.values()): .values()):
if value.index != const.METER_RESET_INDEX: if value.index != const.INDEX_METER_RESET:
continue continue
if value.instance != instance: if value.instance != instance:
continue continue

View File

@ -326,14 +326,42 @@ DISC_GENERIC_DEVICE_CLASS = "generic_device_class"
DISC_GENRE = "genre" DISC_GENRE = "genre"
DISC_INDEX = "index" DISC_INDEX = "index"
DISC_INSTANCE = "instance" DISC_INSTANCE = "instance"
DISC_LABEL = "label"
DISC_NODE_ID = "node_id" DISC_NODE_ID = "node_id"
DISC_OPTIONAL = "optional" DISC_OPTIONAL = "optional"
DISC_PRIMARY = "primary" DISC_PRIMARY = "primary"
DISC_READONLY = "readonly" DISC_SCHEMAS = "schemas"
DISC_SPECIFIC_DEVICE_CLASS = "specific_device_class" DISC_SPECIFIC_DEVICE_CLASS = "specific_device_class"
DISC_TYPE = "type" DISC_TYPE = "type"
DISC_VALUES = "values" DISC_VALUES = "values"
DISC_WRITEONLY = "writeonly"
METER_RESET_INDEX = 33 # noqa
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Alarm.cpp#L49
# See also:
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Alarm.cpp#L275
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Alarm.cpp#L278
INDEX_ALARM_TYPE = 0
INDEX_ALARM_LEVEL = 1
INDEX_ALARM_ACCESS_CONTROL = 9
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/DoorLock.cpp#L77
INDEX_DOOR_LOCK_LOCK = 0
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Meter.cpp#L114
# See also:
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Meter.cpp#L279
INDEX_METER_POWER = 8
INDEX_METER_RESET = 33
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/SensorMultilevel.cpp#L50
INDEX_SENSOR_MULTILEVEL_TEMPERATURE = 1
INDEX_SENSOR_MULTILEVEL_POWER = 4
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Color.cpp#L109
INDEX_SWITCH_COLOR_COLOR = 0
INDEX_SWITCH_COLOR_CHANNELS = 2
# https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/SwitchMultilevel.cpp#L54
INDEX_SWITCH_MULTILEVEL_LEVEL = 0
INDEX_SWITCH_MULTILEVEL_BRIGHT = 1
INDEX_SWITCH_MULTILEVEL_DIM = 2
INDEX_SWITCH_MULTILEVEL_DURATION = 5

View File

@ -3,9 +3,12 @@ from . import const
DEFAULT_VALUES_SCHEMA = { DEFAULT_VALUES_SCHEMA = {
'power': { 'power': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL, const.DISC_SCHEMAS: [
const.COMMAND_CLASS_METER], {const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL],
const.DISC_LABEL: ['Power'], const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_POWER]},
{const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_METER],
const.DISC_INDEX: [const.INDEX_METER_POWER]},
],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
} }
@ -36,7 +39,7 @@ DISCOVERY_SCHEMAS = [
}, },
'temperature': { 'temperature': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL],
const.DISC_LABEL: 'Temperature', const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_TEMPERATURE],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'mode': { 'mode': {
@ -81,12 +84,12 @@ DISCOVERY_SCHEMAS = [
}, },
'open': { 'open': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
const.DISC_LABEL: ['Open', 'Up', 'Bright'], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_BRIGHT],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'close': { 'close': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
const.DISC_LABEL: ['Close', 'Down', 'Dim'], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_DIM],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}})}, }})},
{const.DISC_COMPONENT: 'cover', # Garage Door {const.DISC_COMPONENT: 'cover', # Garage Door
@ -118,28 +121,22 @@ DISCOVERY_SCHEMAS = [
const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, **{ const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, **{
const.DISC_PRIMARY: { const.DISC_PRIMARY: {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
const.DISC_GENRE: const.GENRE_USER, const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_LEVEL],
const.DISC_TYPE: const.TYPE_BYTE, const.DISC_TYPE: const.TYPE_BYTE,
}, },
'dimming_duration': { 'dimming_duration': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
const.DISC_GENRE: const.GENRE_SYSTEM, const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_DURATION],
const.DISC_TYPE: const.TYPE_BYTE,
const.DISC_LABEL: 'Dimming Duration',
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'color': { 'color': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR],
const.DISC_GENRE: const.GENRE_USER, const.DISC_INDEX: [const.INDEX_SWITCH_COLOR_COLOR],
const.DISC_TYPE: const.TYPE_STRING,
const.DISC_READONLY: False,
const.DISC_WRITEONLY: False,
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'color_channels': { 'color_channels': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR],
const.DISC_GENRE: const.GENRE_SYSTEM, const.DISC_INDEX: [const.INDEX_SWITCH_COLOR_CHANNELS],
const.DISC_TYPE: const.TYPE_INT,
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}})}, }})},
{const.DISC_COMPONENT: 'lock', {const.DISC_COMPONENT: 'lock',
@ -150,22 +147,21 @@ DISCOVERY_SCHEMAS = [
const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, **{ const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, **{
const.DISC_PRIMARY: { const.DISC_PRIMARY: {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_DOOR_LOCK], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_DOOR_LOCK],
const.DISC_TYPE: const.TYPE_BOOL, const.DISC_INDEX: [const.INDEX_DOOR_LOCK_LOCK],
const.DISC_GENRE: const.GENRE_USER,
}, },
'access_control': { 'access_control': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM],
const.DISC_LABEL: 'Access Control', const.DISC_INDEX: [const.INDEX_ALARM_ACCESS_CONTROL],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'alarm_type': { 'alarm_type': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM],
const.DISC_LABEL: 'Alarm Type', const.DISC_INDEX: [const.INDEX_ALARM_TYPE],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'alarm_level': { 'alarm_level': {
const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM], const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM],
const.DISC_LABEL: 'Alarm Level', const.DISC_INDEX: [const.INDEX_ALARM_LEVEL],
const.DISC_OPTIONAL: True, const.DISC_OPTIONAL: True,
}, },
'v2btze_advanced': { 'v2btze_advanced': {

View File

@ -43,21 +43,6 @@ def check_value_schema(value, schema):
_LOGGER.debug("value.genre %s not in genre %s", _LOGGER.debug("value.genre %s not in genre %s",
value.genre, schema[const.DISC_GENRE]) value.genre, schema[const.DISC_GENRE])
return False return False
if (const.DISC_READONLY in schema and
value.is_read_only is not schema[const.DISC_READONLY]):
_LOGGER.debug("value.is_read_only %s not %s",
value.is_read_only, schema[const.DISC_READONLY])
return False
if (const.DISC_WRITEONLY in schema and
value.is_write_only is not schema[const.DISC_WRITEONLY]):
_LOGGER.debug("value.is_write_only %s not %s",
value.is_write_only, schema[const.DISC_WRITEONLY])
return False
if (const.DISC_LABEL in schema and
value.label not in schema[const.DISC_LABEL]):
_LOGGER.debug("value.label %s not in label %s",
value.label, schema[const.DISC_LABEL])
return False
if (const.DISC_INDEX in schema and if (const.DISC_INDEX in schema and
value.index not in schema[const.DISC_INDEX]): value.index not in schema[const.DISC_INDEX]):
_LOGGER.debug("value.index %s not in index %s", _LOGGER.debug("value.index %s not in index %s",
@ -68,6 +53,10 @@ def check_value_schema(value, schema):
_LOGGER.debug("value.instance %s not in instance %s", _LOGGER.debug("value.instance %s not in instance %s",
value.instance, schema[const.DISC_INSTANCE]) value.instance, schema[const.DISC_INSTANCE])
return False return False
if const.DISC_SCHEMAS in schema:
for schema_item in schema[const.DISC_SCHEMAS]:
if not check_value_schema(value, schema_item):
return False
return True return True

View File

@ -308,9 +308,9 @@ def test_value_discovery_existing_entity(hass, mock_openzwave):
with patch.object(zwave.node_entity.ZWaveBaseEntity, with patch.object(zwave.node_entity.ZWaveBaseEntity,
'maybe_schedule_update', new=mock_update): 'maybe_schedule_update', new=mock_update):
temperature = MockValue( temperature = MockValue(
data=23.5, node=node, index=12, instance=13, data=23.5, node=node, index=1, instance=13,
command_class=const.COMMAND_CLASS_SENSOR_MULTILEVEL, command_class=const.COMMAND_CLASS_SENSOR_MULTILEVEL,
label='Temperature', genre=const.GENRE_USER, units='C') genre=const.GENRE_USER, units='C')
hass.async_add_job(mock_receivers[0], node, temperature) hass.async_add_job(mock_receivers[0], node, temperature)
yield from hass.async_block_till_done() yield from hass.async_block_till_done()