From 8b2edc151441eec196bbe5623386f555d623f9c7 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Sun, 16 Oct 2016 20:36:06 +0200 Subject: [PATCH] ZWave: Add association service (#3894) * Add association service * Refactor service * Requested changes * Grammar in pydocstyle --- homeassistant/components/zwave/__init__.py | 33 ++++++++++++++++++++ homeassistant/components/zwave/const.py | 5 +++ homeassistant/components/zwave/services.yaml | 14 +++++++++ 3 files changed, 52 insertions(+) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 542be2241cc..93802487f25 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -132,6 +132,13 @@ SET_CONFIG_PARAMETER_SCHEMA = vol.Schema({ vol.Required(const.ATTR_CONFIG_VALUE): vol.Coerce(int), vol.Optional(const.ATTR_CONFIG_SIZE): vol.Coerce(int) }) +CHANGE_ASSOCIATION_SCHEMA = vol.Schema({ + vol.Required(const.ATTR_ASSOCIATION): cv.string, + vol.Required(const.ATTR_NODE_ID): vol.Coerce(int), + vol.Required(const.ATTR_TARGET_NODE_ID): vol.Coerce(int), + vol.Required(const.ATTR_GROUP): vol.Coerce(int), + vol.Optional(const.ATTR_INSTANCE, default=0x00): vol.Coerce(int) +}) CUSTOMIZE_SCHEMA = vol.Schema({ vol.Optional(CONF_POLLING_INTENSITY): @@ -240,6 +247,7 @@ def setup(hass, config): from pydispatch import dispatcher from openzwave.option import ZWaveOption from openzwave.network import ZWaveNetwork + from openzwave.group import ZWaveGroup default_zwave_config_path = os.path.join(os.path.dirname( libopenzwave.__file__), 'config') @@ -445,6 +453,26 @@ def setup(hass, config): _LOGGER.info("Setting config parameter %s on Node %s " "with value %s and size=%s", param, node_id, value, size) + def change_association(service): + """Change an association in the zwave network.""" + association_type = service.data.get(const.ATTR_ASSOCIATION) + node_id = service.data.get(const.ATTR_NODE_ID) + target_node_id = service.data.get(const.ATTR_TARGET_NODE_ID) + group = service.data.get(const.ATTR_GROUP) + instance = service.data.get(const.ATTR_INSTANCE) + + node = ZWaveGroup(group, NETWORK, node_id) + if association_type == 'add': + node.add_association(target_node_id, instance) + _LOGGER.info("Adding association for node:%s in group:%s " + "target node:%s, instance=%s", node_id, group, + target_node_id, instance) + if association_type == 'remove': + node.remove_association(target_node_id, instance) + _LOGGER.info("Removing association for node:%s in group:%s " + "target node:%s, instance=%s", node_id, group, + target_node_id, instance) + def start_zwave(_service_or_event): """Startup Z-Wave network.""" _LOGGER.info("Starting ZWave network.") @@ -510,6 +538,11 @@ def setup(hass, config): descriptions[ const.SERVICE_SET_CONFIG_PARAMETER], schema=SET_CONFIG_PARAMETER_SCHEMA) + hass.services.register(DOMAIN, const.SERVICE_CHANGE_ASSOCIATION, + change_association, + descriptions[ + const.SERVICE_CHANGE_ASSOCIATION], + schema=CHANGE_ASSOCIATION_SCHEMA) # Setup autoheal if autoheal: diff --git a/homeassistant/components/zwave/const.py b/homeassistant/components/zwave/const.py index 6b5c5fc55e5..698dad8e063 100644 --- a/homeassistant/components/zwave/const.py +++ b/homeassistant/components/zwave/const.py @@ -1,6 +1,10 @@ """Z-Wave Constants.""" ATTR_NODE_ID = "node_id" +ATTR_TARGET_NODE_ID = "target_node_id" +ATTR_ASSOCIATION = "association" +ATTR_INSTANCE = "instance" +ATTR_GROUP = "group" ATTR_VALUE_ID = "value_id" ATTR_OBJECT_ID = "object_id" ATTR_NAME = "name" @@ -11,6 +15,7 @@ ATTR_CONFIG_SIZE = "size" ATTR_CONFIG_VALUE = "value" NETWORK_READY_WAIT_SECS = 30 +SERVICE_CHANGE_ASSOCIATION = "change_association" SERVICE_ADD_NODE = "add_node" SERVICE_ADD_NODE_SECURE = "add_node_secure" SERVICE_REMOVE_NODE = "remove_node" diff --git a/homeassistant/components/zwave/services.yaml b/homeassistant/components/zwave/services.yaml index 7a73cd66fb3..cfe2edab5c9 100644 --- a/homeassistant/components/zwave/services.yaml +++ b/homeassistant/components/zwave/services.yaml @@ -1,3 +1,17 @@ +change_association: + description: Change an association in the Z-Wave network. + fields: + association: + description: Specify add or remove assosication + node_id: + description: Node id of the node to set association for. + target_node_id: + description: Node id of the node to associate to. + group: + description: Group number to set association for. + instance: + description: (Optional) Instance of association. Defaults to 0. + add_node: description: Add a new node to the Z-Wave network. Refer to OZW.log for details.