From 19649390d3ce09e98346ec67b17539fb0cca70ed Mon Sep 17 00:00:00 2001 From: Arthur Andersen Date: Sat, 7 Nov 2015 15:52:36 +0100 Subject: [PATCH] [Zwave] Add binary switch component --- homeassistant/components/switch/__init__.py | 6 +- homeassistant/components/switch/zwave.py | 80 +++++++++++++++++++++ homeassistant/components/zwave.py | 8 +++ 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 homeassistant/components/switch/zwave.py diff --git a/homeassistant/components/switch/__init__.py b/homeassistant/components/switch/__init__.py index ac4ae533596..9a0abb4ce7a 100644 --- a/homeassistant/components/switch/__init__.py +++ b/homeassistant/components/switch/__init__.py @@ -16,7 +16,8 @@ from homeassistant.helpers.entity import ToggleEntity from homeassistant.const import ( STATE_ON, SERVICE_TURN_ON, SERVICE_TURN_OFF, ATTR_ENTITY_ID) -from homeassistant.components import group, discovery, wink, isy994, verisure +from homeassistant.components import ( + group, discovery, wink, isy994, verisure, zwave) DOMAIN = 'switch' DEPENDENCIES = [] @@ -38,7 +39,8 @@ DISCOVERY_PLATFORMS = { discovery.SERVICE_WEMO: 'wemo', wink.DISCOVER_SWITCHES: 'wink', isy994.DISCOVER_SWITCHES: 'isy994', - verisure.DISCOVER_SWITCHES: 'verisure' + verisure.DISCOVER_SWITCHES: 'verisure', + zwave.DISCOVER_SWITCHES: 'zwave', } PROP_TO_ATTR = { diff --git a/homeassistant/components/switch/zwave.py b/homeassistant/components/switch/zwave.py new file mode 100644 index 00000000000..12368dc0c22 --- /dev/null +++ b/homeassistant/components/switch/zwave.py @@ -0,0 +1,80 @@ +""" +homeassistant.components.switch.demo +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Demo platform that has two fake switches. +""" +# pylint: disable=import-error +from openzwave.network import ZWaveNetwork +from pydispatch import dispatcher + +import homeassistant.components.zwave as zwave + +from homeassistant.components.switch import SwitchDevice + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Find and return demo switches. """ + if discovery_info is None: + return + + node = zwave.NETWORK.nodes[discovery_info[zwave.ATTR_NODE_ID]] + value = node.values[discovery_info[zwave.ATTR_VALUE_ID]] + + if value.command_class != zwave.COMMAND_CLASS_SWITCH_BINARY: + return + if value.type != zwave.TYPE_BOOL: + return + if value.genre != zwave.GENRE_USER: + return + + value.set_change_verified(False) + add_devices([ZwaveSwitch(value)]) + + +class ZwaveSwitch(SwitchDevice): + """ Provides a zwave switch. """ + def __init__(self, value): + self._value = value + self._node = value.node + + self._state = value.data + + dispatcher.connect( + self._value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) + + def _value_changed(self, value): + """ Called when a value has changed on the network. """ + if self._value.value_id == value.value_id: + self._state = value.data + self.update_ha_state() + + @property + def should_poll(self): + """ No polling needed for a demo switch. """ + return False + + @property + def name(self): + """ Returns the name of the device if any. """ + name = self._node.name or "{}".format(self._node.product_name) + + return "{}".format(name or self._value.label) + + @property + def is_on(self): + """ True if device is on. """ + return self._state + + def turn_on(self, **kwargs): + """ Turn the device on. """ + if self._node.set_switch(self._value.value_id, True): + self._state = True + self.update_ha_state() + + def turn_off(self, **kwargs): + """ Turn the device off. """ + if self._node.set_switch(self._value.value_id, False): + self._state = False + self.update_ha_state() diff --git a/homeassistant/components/zwave.py b/homeassistant/components/zwave.py index e5b321c989d..b7a8ddce1f4 100644 --- a/homeassistant/components/zwave.py +++ b/homeassistant/components/zwave.py @@ -22,9 +22,12 @@ DEFAULT_CONF_USB_STICK_PATH = "/zwaveusbstick" CONF_DEBUG = "debug" DISCOVER_SENSORS = "zwave.sensors" +DISCOVER_SWITCHES = "zwave.switch" DISCOVER_LIGHTS = "zwave.light" COMMAND_CLASS_SWITCH_MULTILEVEL = 38 + +COMMAND_CLASS_SWITCH_BINARY = 37 COMMAND_CLASS_SENSOR_BINARY = 48 COMMAND_CLASS_SENSOR_MULTILEVEL = 49 COMMAND_CLASS_BATTERY = 128 @@ -49,6 +52,11 @@ DISCOVERY_COMPONENTS = [ [COMMAND_CLASS_SWITCH_MULTILEVEL], TYPE_BYTE, GENRE_USER), + ('switch', + DISCOVER_SWITCHES, + [COMMAND_CLASS_SWITCH_BINARY], + TYPE_BOOL, + GENRE_USER), ] ATTR_NODE_ID = "node_id"