diff --git a/homeassistant/components/cover/zwave.py b/homeassistant/components/cover/zwave.py index 2d61af4d00e..6278f3636b3 100644 --- a/homeassistant/components/cover/zwave.py +++ b/homeassistant/components/cover/zwave.py @@ -10,17 +10,9 @@ import logging from homeassistant.components.cover import DOMAIN from homeassistant.components.zwave import ZWaveDeviceEntity from homeassistant.components import zwave +from homeassistant.components.zwave import workaround from homeassistant.components.cover import CoverDevice -SOMFY = 0x47 -SOMFY_ZRTSI = 0x5a52 -SOMFY_ZRTSI_CONTROLLER = (SOMFY, SOMFY_ZRTSI) -WORKAROUND = 'workaround' - -DEVICE_MAPPINGS = { - SOMFY_ZRTSI_CONTROLLER: WORKAROUND -} - _LOGGER = logging.getLogger(__name__) @@ -58,16 +50,9 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): self._open_id = None self._close_id = None self._current_position = None - self._workaround = None - if (value.node.manufacturer_id.strip() and - value.node.product_id.strip()): - specific_sensor_key = (int(value.node.manufacturer_id, 16), - int(value.node.product_type, 16)) - - if specific_sensor_key in DEVICE_MAPPINGS: - if DEVICE_MAPPINGS[specific_sensor_key] == WORKAROUND: - _LOGGER.debug("Controller without positioning feedback") - self._workaround = 1 + self._workaround = workaround.get_device_mapping(value) + if self._workaround: + _LOGGER.debug("Using workaround %s", self._workaround) def update_properties(self): """Callback on data changes for node values.""" @@ -81,6 +66,8 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): self._close_id = self.get_value( class_id=zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL, label=['Close', 'Down'], member='value_id') + if self._workaround == workaround.WORKAROUND_REVERSE_OPEN_CLOSE: + self._open_id, self._close_id = self._close_id, self._open_id @property def is_closed(self): @@ -95,14 +82,15 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): @property def current_cover_position(self): """Return the current position of Zwave roller shutter.""" - if not self._workaround: - if self._current_position is not None: - if self._current_position <= 5: - return 0 - elif self._current_position >= 95: - return 100 - else: - return self._current_position + if self._workaround == workaround.WORKAROUND_NO_POSITION: + return None + if self._current_position is not None: + if self._current_position <= 5: + return 0 + elif self._current_position >= 95: + return 100 + else: + return self._current_position def open_cover(self, **kwargs): """Move the roller shutter up.""" diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 6080454f825..b2c471595ab 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -376,6 +376,10 @@ def setup(hass, config): workaround_component = workaround.get_device_component_mapping( value) if workaround_component and workaround_component != component: + if workaround_component == workaround.WORKAROUND_IGNORE: + _LOGGER.info("Ignoring device %s", + "{}.{}".format(component, object_id(value))) + continue _LOGGER.debug("Using %s instead of %s", workaround_component, component) component = workaround_component diff --git a/homeassistant/components/zwave/workaround.py b/homeassistant/components/zwave/workaround.py index 7712c1868db..9522917ed09 100644 --- a/homeassistant/components/zwave/workaround.py +++ b/homeassistant/components/zwave/workaround.py @@ -5,6 +5,7 @@ from . import const FIBARO = 0x010f PHILIO = 0x013c WENZHOU = 0x0118 +SOMFY = 0x47 # Product IDs PHILIO_SLIM_SENSOR = 0x0002 @@ -12,32 +13,51 @@ PHILIO_3_IN_1_SENSOR_GEN_4 = 0x000d # Product Types FGFS101_FLOOD_SENSOR_TYPE = 0x0b00 +FGRM222_SHUTTER2 = 0x0301 PHILIO_SENSOR = 0x0002 +SOMFY_ZRTSI = 0x5a52 # Mapping devices -PHILIO_SLIM_SENSOR_MOTION = (PHILIO, PHILIO_SENSOR, PHILIO_SLIM_SENSOR, 0) -PHILIO_3_IN_1_SENSOR_GEN_4_MOTION = ( +PHILIO_SLIM_SENSOR_MOTION_MTII = (PHILIO, PHILIO_SENSOR, PHILIO_SLIM_SENSOR, 0) +PHILIO_3_IN_1_SENSOR_GEN_4_MOTION_MTII = ( PHILIO, PHILIO_SENSOR, PHILIO_3_IN_1_SENSOR_GEN_4, 0) -WENZHOU_SLIM_SENSOR_MOTION = (WENZHOU, PHILIO_SENSOR, PHILIO_SLIM_SENSOR, 0) +WENZHOU_SLIM_SENSOR_MOTION_MTII = ( + WENZHOU, PHILIO_SENSOR, PHILIO_SLIM_SENSOR, 0) # Workarounds WORKAROUND_NO_OFF_EVENT = 'trigger_no_off_event' +WORKAROUND_NO_POSITION = 'workaround_no_position' +WORKAROUND_REVERSE_OPEN_CLOSE = 'reverse_open_close' +WORKAROUND_IGNORE = 'workaround_ignore' # List of workarounds by (manufacturer_id, product_type, product_id, index) -DEVICE_MAPPINGS = { - PHILIO_SLIM_SENSOR_MOTION: WORKAROUND_NO_OFF_EVENT, - PHILIO_3_IN_1_SENSOR_GEN_4_MOTION: WORKAROUND_NO_OFF_EVENT, - WENZHOU_SLIM_SENSOR_MOTION: WORKAROUND_NO_OFF_EVENT, +DEVICE_MAPPINGS_MTII = { + PHILIO_SLIM_SENSOR_MOTION_MTII: WORKAROUND_NO_OFF_EVENT, + PHILIO_3_IN_1_SENSOR_GEN_4_MOTION_MTII: WORKAROUND_NO_OFF_EVENT, + WENZHOU_SLIM_SENSOR_MOTION_MTII: WORKAROUND_NO_OFF_EVENT, } +SOMFY_ZRTSI_CONTROLLER_MT = (SOMFY, SOMFY_ZRTSI) +FIBARO_FGRM222_MT = (FIBARO, FGRM222_SHUTTER2) + +# List of workarounds by (manufacturer_id, product_type) +DEVICE_MAPPINGS_MT = { + SOMFY_ZRTSI_CONTROLLER_MT: WORKAROUND_NO_POSITION, + FIBARO_FGRM222_MT: WORKAROUND_REVERSE_OPEN_CLOSE, +} + + # Component mapping devices FIBARO_FGFS101_SENSOR_ALARM = ( FIBARO, FGFS101_FLOOD_SENSOR_TYPE, const.COMMAND_CLASS_SENSOR_ALARM) +FIBARO_FGRM222_BINARY = ( + FIBARO, FGRM222_SHUTTER2, const.COMMAND_CLASS_SWITCH_BINARY) # List of component workarounds by # (manufacturer_id, product_type, command_class) DEVICE_COMPONENT_MAPPING = { FIBARO_FGFS101_SENSOR_ALARM: 'binary_sensor', + FIBARO_FGRM222_BINARY: WORKAROUND_IGNORE, } @@ -61,7 +81,10 @@ def get_device_mapping(value): manufacturer_id = int(value.node.manufacturer_id, 16) product_type = int(value.node.product_type, 16) product_id = int(value.node.product_id, 16) - return DEVICE_MAPPINGS.get( + result = DEVICE_MAPPINGS_MTII.get( (manufacturer_id, product_type, product_id, value.index)) + if result: + return result + return DEVICE_MAPPINGS_MT.get((manufacturer_id, product_type)) return None