diff --git a/homeassistant/components/rollershutter/zwave.py b/homeassistant/components/rollershutter/zwave.py index 18a24e41232..01d6980a795 100644 --- a/homeassistant/components/rollershutter/zwave.py +++ b/homeassistant/components/rollershutter/zwave.py @@ -40,10 +40,14 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, RollershutterDevice): def __init__(self, value): """Initialize the zwave rollershutter.""" + import libopenzwave from openzwave.network import ZWaveNetwork from pydispatch import dispatcher ZWaveDeviceEntity.__init__(self, value, DOMAIN) + self._lozwmgr = libopenzwave.PyManager() + self._lozwmgr.create() self._node = value.node + self._current_position = None dispatcher.connect( self.value_changed, ZWaveNetwork.SIGNAL_VALUE_CHANGED) @@ -51,32 +55,53 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, RollershutterDevice): """Called when a value has changed on the network.""" if self._value.value_id == value.value_id or \ self._value.node == value.node: + self.update_properties() self.update_ha_state() _LOGGER.debug("Value changed on network %s", value) + def update_properties(self): + """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': + self._current_position = value.data + @property def current_position(self): """Return the current position of Zwave roller shutter.""" - if self._value.data <= 5: - return 100 - elif self._value.data >= 95: - return 0 - else: - return 100 - self._value.data + if self._current_position is not None: + if self._current_position <= 5: + return 100 + elif self._current_position >= 95: + return 0 + else: + return 100 - self._current_position def move_up(self, **kwargs): """Move the roller shutter up.""" - self._node.set_dimmer(self._value.value_id, 100) + 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': + self._lozwmgr.pressButton(value.value_id) + break def move_down(self, **kwargs): """Move the roller shutter down.""" - self._node.set_dimmer(self._value.value_id, 0) + 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 == 'Close': + self._lozwmgr.pressButton(value.value_id) + break def stop(self, **kwargs): """Stop the roller shutter.""" for value in self._node.get_values( - class_id=COMMAND_CLASS_SWITCH_BINARY).values(): - # Rollershutter will toggle between UP (True), DOWN (False). - # It also stops the shutter if the same value is sent while moving. - value.data = value.data - break + class_id=COMMAND_CLASS_SWITCH_MULTILEVEL).values(): + if value.command_class == zwave.COMMAND_CLASS_SWITCH_MULTILEVEL \ + and value.label == 'Open': + self._lozwmgr.releaseButton(value.value_id) + break diff --git a/homeassistant/components/zwave.py b/homeassistant/components/zwave.py index 8e978d26383..a60319188ce 100644 --- a/homeassistant/components/zwave.py +++ b/homeassistant/components/zwave.py @@ -66,10 +66,10 @@ COMMAND_CLASS_SENSOR_ALARM = 156 GENERIC_COMMAND_CLASS_WHATEVER = None GENERIC_COMMAND_CLASS_REMOTE_CONTROLLER = 1 GENERIC_COMMAND_CLASS_NOTIFICATION = 7 -GENERIC_COMMAND_CLASS_REMOTE_SWITCH = 12 GENERIC_COMMAND_CLASS_REPEATER_SLAVE = 15 -GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH = 17 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 @@ -113,7 +113,8 @@ DISCOVERY_COMPONENTS = [ TYPE_WHATEVER, GENRE_USER), ('light', - [GENERIC_COMMAND_CLASS_MULTILEVEL_SWITCH], + [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],