mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 00:37:13 +00:00
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:
parent
02f7eb9675
commit
ae3973144c
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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': {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user