diff --git a/homeassistant/components/zwave_js/cover.py b/homeassistant/components/zwave_js/cover.py index 4704718c804..686a186a7cb 100644 --- a/homeassistant/components/zwave_js/cover.py +++ b/homeassistant/components/zwave_js/cover.py @@ -51,7 +51,7 @@ async def async_setup_entry( entities: list[ZWaveBaseEntity] = [] if info.platform_hint == "motorized_barrier": entities.append(ZwaveMotorizedBarrier(config_entry, driver, info)) - elif info.platform_hint == "window_shutter_tilt": + elif info.platform_hint and info.platform_hint.endswith("tilt"): entities.append(ZWaveTiltCover(config_entry, driver, info)) else: entities.append(ZWaveCover(config_entry, driver, info)) @@ -99,6 +99,12 @@ def zwave_tilt_to_percent(value: int) -> int: class ZWaveCover(ZWaveBaseEntity, CoverEntity): """Representation of a Z-Wave Cover device.""" + _attr_supported_features = ( + CoverEntityFeature.OPEN + | CoverEntityFeature.CLOSE + | CoverEntityFeature.SET_POSITION + ) + def __init__( self, config_entry: ConfigEntry, @@ -108,11 +114,20 @@ class ZWaveCover(ZWaveBaseEntity, CoverEntity): """Initialize a ZWaveCover entity.""" super().__init__(config_entry, driver, info) + self._stop_cover_value = ( + self.get_zwave_value(COVER_OPEN_PROPERTY) + or self.get_zwave_value(COVER_UP_PROPERTY) + or self.get_zwave_value(COVER_ON_PROPERTY) + ) + + if self._stop_cover_value: + self._attr_supported_features |= CoverEntityFeature.STOP + # Entity class attributes self._attr_device_class = CoverDeviceClass.WINDOW - if self.info.platform_hint in ("window_shutter", "window_shutter_tilt"): + if self.info.platform_hint and self.info.platform_hint.startswith("shutter"): self._attr_device_class = CoverDeviceClass.SHUTTER - if self.info.platform_hint == "window_blind": + if self.info.platform_hint and self.info.platform_hint.startswith("blind"): self._attr_device_class = CoverDeviceClass.BLIND @property @@ -153,28 +168,13 @@ class ZWaveCover(ZWaveBaseEntity, CoverEntity): async def async_stop_cover(self, **kwargs: Any) -> None: """Stop cover.""" - cover_property = ( - self.get_zwave_value(COVER_OPEN_PROPERTY) - or self.get_zwave_value(COVER_UP_PROPERTY) - or self.get_zwave_value(COVER_ON_PROPERTY) - ) - if cover_property: - # Stop the cover, will stop regardless of the actual direction of travel. - await self.info.node.async_set_value(cover_property, False) + assert self._stop_cover_value + # Stop the cover, will stop regardless of the actual direction of travel. + await self.info.node.async_set_value(self._stop_cover_value, False) class ZWaveTiltCover(ZWaveCover): - """Representation of a Z-Wave Cover device with tilt.""" - - _attr_supported_features = ( - CoverEntityFeature.OPEN - | CoverEntityFeature.CLOSE - | CoverEntityFeature.STOP - | CoverEntityFeature.SET_POSITION - | CoverEntityFeature.OPEN_TILT - | CoverEntityFeature.CLOSE_TILT - | CoverEntityFeature.SET_TILT_POSITION - ) + """Representation of a Z-Wave cover device with tilt.""" def __init__( self, @@ -184,8 +184,15 @@ class ZWaveTiltCover(ZWaveCover): ) -> None: """Initialize a ZWaveCover entity.""" super().__init__(config_entry, driver, info) - self.data_template = cast( + + self._current_tilt_value = cast( CoverTiltDataTemplate, self.info.platform_data_template + ).current_tilt_value(self.info.platform_data) + + self._attr_supported_features |= ( + CoverEntityFeature.OPEN_TILT + | CoverEntityFeature.CLOSE_TILT + | CoverEntityFeature.SET_TILT_POSITION ) @property @@ -194,19 +201,18 @@ class ZWaveTiltCover(ZWaveCover): None is unknown, 0 is closed, 100 is fully open. """ - value = self.data_template.current_tilt_value(self.info.platform_data) + value = self._current_tilt_value if value is None or value.value is None: return None return zwave_tilt_to_percent(int(value.value)) async def async_set_cover_tilt_position(self, **kwargs: Any) -> None: """Move the cover tilt to a specific position.""" - tilt_value = self.data_template.current_tilt_value(self.info.platform_data) - if tilt_value: - await self.info.node.async_set_value( - tilt_value, - percent_to_zwave_tilt(kwargs[ATTR_TILT_POSITION]), - ) + assert self._current_tilt_value + await self.info.node.async_set_value( + self._current_tilt_value, + percent_to_zwave_tilt(kwargs[ATTR_TILT_POSITION]), + ) async def async_open_cover_tilt(self, **kwargs: Any) -> None: """Open the cover tilt.""" diff --git a/homeassistant/components/zwave_js/discovery.py b/homeassistant/components/zwave_js/discovery.py index b3255a76f7e..a43482e3e90 100644 --- a/homeassistant/components/zwave_js/discovery.py +++ b/homeassistant/components/zwave_js/discovery.py @@ -347,7 +347,7 @@ DISCOVERY_SCHEMAS = [ # Fibaro Shutter Fibaro FGR222 ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_shutter_tilt", + hint="shutter_tilt", manufacturer_id={0x010F}, product_id={0x1000, 0x1001}, product_type={0x0301, 0x0302}, @@ -371,7 +371,7 @@ DISCOVERY_SCHEMAS = [ # Qubino flush shutter ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_shutter", + hint="shutter", manufacturer_id={0x0159}, product_id={0x0052, 0x0053}, product_type={0x0003}, @@ -380,7 +380,7 @@ DISCOVERY_SCHEMAS = [ # Graber/Bali/Spring Fashion Covers ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_blind", + hint="blind", manufacturer_id={0x026E}, product_id={0x5A31}, product_type={0x4353}, @@ -389,7 +389,7 @@ DISCOVERY_SCHEMAS = [ # iBlinds v2 window blind motor ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_blind", + hint="blind", manufacturer_id={0x0287}, product_id={0x000D}, product_type={0x0003}, @@ -398,7 +398,7 @@ DISCOVERY_SCHEMAS = [ # Merten 507801 Connect Roller Shutter ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_shutter", + hint="shutter", manufacturer_id={0x007A}, product_id={0x0001}, product_type={0x8003}, @@ -414,7 +414,7 @@ DISCOVERY_SCHEMAS = [ # Disable endpoint 2, as it has no practical function. CC: Switch_Multilevel ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_shutter", + hint="shutter", manufacturer_id={0x007A}, product_id={0x0001}, product_type={0x8003}, @@ -807,7 +807,7 @@ DISCOVERY_SCHEMAS = [ # window coverings ZWaveDiscoverySchema( platform=Platform.COVER, - hint="window_cover", + hint="cover", device_class_generic={"Multilevel Switch"}, device_class_specific={ "Motor Control Class A",