diff --git a/.coveragerc b/.coveragerc index fb7e3edd62c2..f63c8e69f698 100644 --- a/.coveragerc +++ b/.coveragerc @@ -116,7 +116,6 @@ omit = homeassistant/components/*/zigbee.py homeassistant/components/zwave/* - homeassistant/components/*/zwave.py homeassistant/components/enocean.py homeassistant/components/*/enocean.py @@ -171,12 +170,15 @@ omit = homeassistant/components/climate/oem.py homeassistant/components/climate/proliphix.py homeassistant/components/climate/radiotherm.py + homeassistant/components/climate/zwave.py + homeassistant/components/config/zwave.py homeassistant/components/cover/garadget.py homeassistant/components/cover/homematic.py homeassistant/components/cover/myq.py homeassistant/components/cover/rpi_gpio.py homeassistant/components/cover/scsgate.py homeassistant/components/cover/wink.py + homeassistant/components/cover/zwave.py homeassistant/components/device_tracker/actiontec.py homeassistant/components/device_tracker/aruba.py homeassistant/components/device_tracker/asuswrt.py @@ -229,8 +231,10 @@ omit = homeassistant/components/light/yeelightsunflower.py homeassistant/components/light/piglow.py homeassistant/components/light/zengge.py + homeassistant/components/light/zwave.py homeassistant/components/lirc.py homeassistant/components/lock/nuki.py + homeassistant/components/lock/zwave.py homeassistant/components/media_player/anthemav.py homeassistant/components/media_player/apple_tv.py homeassistant/components/media_player/aquostv.py @@ -398,6 +402,7 @@ omit = homeassistant/components/sensor/xbox_live.py homeassistant/components/sensor/yweather.py homeassistant/components/sensor/zamg.py + homeassistant/components/sensor/zwave.py homeassistant/components/switch/acer_projector.py homeassistant/components/switch/anel_pwrctrl.py homeassistant/components/switch/arest.py @@ -420,6 +425,7 @@ omit = homeassistant/components/switch/tplink.py homeassistant/components/switch/transmission.py homeassistant/components/switch/wake_on_lan.py + homeassistant/components/switch/zwave.py homeassistant/components/telegram_webhooks.py homeassistant/components/thingspeak.py homeassistant/components/tts/amazon_polly.py diff --git a/homeassistant/components/binary_sensor/zwave.py b/homeassistant/components/binary_sensor/zwave.py index 48ef1479eecc..e0ff8535cfd1 100644 --- a/homeassistant/components/binary_sensor/zwave.py +++ b/homeassistant/components/binary_sensor/zwave.py @@ -58,11 +58,6 @@ class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity): """Return the class of this sensor, from DEVICE_CLASSES.""" return self._sensor_type - @property - def should_poll(self): - """No polling needed.""" - return False - class ZWaveTriggerSensor(ZWaveBinarySensor): """Representation of a stateless sensor within Z-Wave.""" diff --git a/tests/components/binary_sensor/test_zwave.py b/tests/components/binary_sensor/test_zwave.py new file mode 100644 index 000000000000..44ef13b262f7 --- /dev/null +++ b/tests/components/binary_sensor/test_zwave.py @@ -0,0 +1,96 @@ +"""Test Z-Wave binary sensors.""" +import asyncio +import datetime + +from unittest.mock import patch + +from homeassistant.components.zwave import const +from homeassistant.components.binary_sensor import zwave + +from tests.mock.zwave import MockNode, MockValue, value_changed + + +def test_get_device_detects_none(mock_openzwave): + """Test device is not returned.""" + node = MockNode() + value = MockValue(data=False, node=node) + + device = zwave.get_device(node=node, value=value, node_config={}) + assert device is None + + +def test_get_device_detects_trigger_sensor(mock_openzwave): + """Test device is a trigger sensor.""" + node = MockNode( + manufacturer_id='013c', product_type='0002', product_id='0002') + value = MockValue(data=False, node=node) + + device = zwave.get_device(node=node, value=value, node_config={}) + assert isinstance(device, zwave.ZWaveTriggerSensor) + assert device.device_class == "motion" + + +def test_get_device_detects_workaround_sensor(mock_openzwave): + """Test that workaround returns a binary sensor.""" + node = MockNode(manufacturer_id='010f', product_type='0b00') + value = MockValue(data=False, node=node, + command_class=const.COMMAND_CLASS_SENSOR_ALARM) + + device = zwave.get_device(node=node, value=value, node_config={}) + assert isinstance(device, zwave.ZWaveBinarySensor) + + +def test_get_device_detects_sensor(mock_openzwave): + """Test that device returns a binary sensor.""" + node = MockNode() + value = MockValue(data=False, node=node, + command_class=const.COMMAND_CLASS_SENSOR_BINARY) + + device = zwave.get_device(node=node, value=value, node_config={}) + assert isinstance(device, zwave.ZWaveBinarySensor) + + +def test_binary_sensor_value_changed(mock_openzwave): + """Test value changed for binary sensor.""" + node = MockNode() + value = MockValue(data=False, node=node, + command_class=const.COMMAND_CLASS_SENSOR_BINARY) + device = zwave.get_device(node=node, value=value, node_config={}) + + assert not device.is_on + + value.data = True + value_changed(value) + + assert device.is_on + + +@asyncio.coroutine +def test_trigger_sensor_value_changed(hass, mock_openzwave): + """Test value changed for trigger sensor.""" + node = MockNode( + manufacturer_id='013c', product_type='0002', product_id='0002') + value = MockValue(data=False, node=node) + device = zwave.get_device(node=node, value=value, node_config={}) + + assert not device.is_on + + value.data = True + yield from hass.loop.run_in_executor(None, value_changed, value) + yield from hass.async_block_till_done() + assert device.invalidate_after is None + + device.hass = hass + + value.data = True + yield from hass.loop.run_in_executor(None, value_changed, value) + yield from hass.async_block_till_done() + assert device.is_on + + test_time = device.invalidate_after - datetime.timedelta(seconds=1) + with patch('homeassistant.util.dt.utcnow', return_value=test_time): + assert device.is_on + + test_time = device.invalidate_after + with patch('homeassistant.util.dt.utcnow', return_value=test_time): + assert not device.is_on diff --git a/tests/components/light/test_zwave.py b/tests/components/light/test_zwave.py index 5a1b5ee183dc..50b9ef21742e 100644 --- a/tests/components/light/test_zwave.py +++ b/tests/components/light/test_zwave.py @@ -10,7 +10,7 @@ def test_get_device_detects_dimmer(mock_openzwave): node = MockNode() value = MockValue(data=0, node=node) - device = zwave.get_device(node, value, {}) + device = zwave.get_device(node=node, value=value, node_config={}) assert isinstance(device, zwave.ZwaveDimmer) @@ -19,7 +19,7 @@ def test_get_device_detects_colorlight(mock_openzwave): node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - device = zwave.get_device(node, value, {}) + device = zwave.get_device(node=node, value=value, node_config={}) assert isinstance(device, zwave.ZwaveColorLight) @@ -27,7 +27,7 @@ def test_dimmer_turn_on(mock_openzwave): """Test turning on a dimmable Z-Wave light.""" node = MockNode() value = MockValue(data=0, node=node) - device = zwave.get_device(node, value, {}) + device = zwave.get_device(node=node, value=value, node_config={}) device.turn_on() @@ -51,7 +51,7 @@ def test_dimmer_value_changed(mock_openzwave): """Test value changed for dimmer lights.""" node = MockNode() value = MockValue(data=0, node=node) - device = zwave.get_device(node, value, {}) + device = zwave.get_device(node=node, value=value, node_config={}) assert not device.is_on diff --git a/tests/mock/zwave.py b/tests/mock/zwave.py index 6c1454be16bf..2096f1c67fa0 100644 --- a/tests/mock/zwave.py +++ b/tests/mock/zwave.py @@ -24,6 +24,7 @@ class MockNode(MagicMock): name='Mock Node', manufacturer_id='ABCD', product_id='123', + product_type='678', command_classes=None): """Initialize a Z-Wave mock node.""" super().__init__() @@ -31,6 +32,7 @@ class MockNode(MagicMock): self.name = name self.manufacturer_id = manufacturer_id self.product_id = product_id + self.product_type = product_type self._command_classes = command_classes or [] def has_command_class(self, command_class): @@ -53,6 +55,7 @@ class MockValue(MagicMock): node=None, instance=0, index=0, + command_class=None, value_id=None): """Initialize a Z-Wave mock value.""" super().__init__() @@ -61,6 +64,7 @@ class MockValue(MagicMock): self.node = node self.instance = instance self.index = 0 + self.command_class = command_class if value_id is None: MockValue._mock_value_id += 1 value_id = MockValue._mock_value_id