diff --git a/custom_components/xiaomi_home/cover.py b/custom_components/xiaomi_home/cover.py index 08398e6..d42c761 100644 --- a/custom_components/xiaomi_home/cover.py +++ b/custom_components/xiaomi_home/cover.py @@ -69,6 +69,10 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, device_list: list[MIoTDevice] = hass.data[DOMAIN]['devices'][ config_entry.entry_id] + # Get the cover config params + close_threshold = config_entry.options.get('close_threshold', None) + open_threshold = config_entry.options.get('open_threshold', None) + new_entities = [] for miot_device in device_list: for data in miot_device.entity_list.get('cover', []): @@ -80,8 +84,11 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, data.spec.device_class = CoverDeviceClass.SHUTTER elif data.spec.name == 'airer': data.spec.device_class = CoverDeviceClass.BLIND - new_entities.append(Cover(miot_device=miot_device, - entity_data=data)) + new_entities.append( + Cover(miot_device=miot_device, + entity_data=data, + close_threshold=close_threshold, + open_threshold=open_threshold)) if new_entities: async_add_entities(new_entities) @@ -106,9 +113,13 @@ class Cover(MIoTServiceEntity, CoverEntity): _prop_position_value_range: Optional[int] _prop_pos_closing: bool _prop_pos_opening: bool + _close_threshold: Optional[int] + _open_threshold: Optional[int] def __init__(self, miot_device: MIoTDevice, - entity_data: MIoTEntityData) -> None: + entity_data: MIoTEntityData, + close_threshold: int, + open_threshold: int) -> None: """Initialize the Cover.""" super().__init__(miot_device=miot_device, entity_data=entity_data) self._attr_device_class = entity_data.spec.device_class @@ -132,6 +143,14 @@ class Cover(MIoTServiceEntity, CoverEntity): self._prop_pos_closing = False self._prop_pos_opening = False + # Check the validity of the input parameters. + if close_threshold is not None and open_threshold is not None: + if close_threshold >= open_threshold: + close_threshold = None + open_threshold = None + self._close_threshold = close_threshold + self._open_threshold = open_threshold + # properties for prop in entity_data.props: if prop.name == 'motor-control': @@ -263,8 +282,16 @@ class Cover(MIoTServiceEntity, CoverEntity): self._prop_pos_closing = False return self.get_prop_value(prop=self._prop_target_position) pos = self.get_prop_value(prop=self._prop_current_position) - return None if pos is None else round(pos * 100 / - self._prop_position_value_range) + if pos is None: + return None + percentage = round(pos * 100 / self._prop_position_value_range) + if (self._close_threshold is not None) and (percentage + <= self._close_threshold): + return 0 + if (self._open_threshold is not None) and (percentage + >= self._open_threshold): + return 100 + return percentage @property def is_opening(self) -> Optional[bool]: