From c40db6608cd530472bf3f51ba6ab671cb55b0f37 Mon Sep 17 00:00:00 2001 From: LiShuzhen Date: Wed, 22 Jan 2025 16:57:43 +0800 Subject: [PATCH] feat: add airer as cover blind --- custom_components/xiaomi_home/cover.py | 16 +++++++++++----- .../xiaomi_home/miot/specs/specv2entity.py | 3 ++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/custom_components/xiaomi_home/cover.py b/custom_components/xiaomi_home/cover.py index db29774..6b2e5f8 100644 --- a/custom_components/xiaomi_home/cover.py +++ b/custom_components/xiaomi_home/cover.py @@ -84,6 +84,8 @@ async def async_setup_entry( data.spec.device_class = CoverDeviceClass.WINDOW elif data.spec.name == 'motor-controller': 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)) @@ -139,11 +141,11 @@ class Cover(MIoTServiceEntity, CoverEntity): 'motor-control value_list is None, %s', self.entity_id) continue for item in prop.value_list.items: - if item.name in {'open'}: + if item.name in {'open', 'up'}: self._attr_supported_features |= ( CoverEntityFeature.OPEN) self._prop_motor_value_open = item.value - elif item.name in {'close'}: + elif item.name in {'close', 'down'}: self._attr_supported_features |= ( CoverEntityFeature.CLOSE) self._prop_motor_value_close = item.value @@ -158,9 +160,9 @@ class Cover(MIoTServiceEntity, CoverEntity): 'status value_list is None, %s', self.entity_id) continue for item in prop.value_list.items: - if item.name in {'opening', 'open'}: + if item.name in {'opening', 'open', 'up'}: self._prop_status_opening = item.value - elif item.name in {'closing', 'close'}: + elif item.name in {'closing', 'close', 'down'}: self._prop_status_closing = item.value elif item.name in {'stop', 'pause'}: self._prop_status_stop = item.value @@ -211,8 +213,10 @@ class Cover(MIoTServiceEntity, CoverEntity): 0: the cover is closed, 100: the cover is fully opened, None: unknown. """ + if self._prop_current_position is None: + return None pos = self.get_prop_value(prop=self._prop_current_position) - if pos is None: + if pos is None or self._prop_position_value_range is None: return None return round(pos*100/self._prop_position_value_range) @@ -235,4 +239,6 @@ class Cover(MIoTServiceEntity, CoverEntity): @property def is_closed(self) -> Optional[bool]: """Return if the cover is closed.""" + if self._prop_current_position is None: + return None return self.get_prop_value(prop=self._prop_current_position) == 0 diff --git a/custom_components/xiaomi_home/miot/specs/specv2entity.py b/custom_components/xiaomi_home/miot/specs/specv2entity.py index 04c2006..e0943dc 100644 --- a/custom_components/xiaomi_home/miot/specs/specv2entity.py +++ b/custom_components/xiaomi_home/miot/specs/specv2entity.py @@ -320,7 +320,8 @@ SPEC_SERVICE_TRANS_MAP: dict[str, dict | str] = { 'entity': 'cover' }, 'window-opener': 'curtain', - 'motor-controller': 'curtain' + 'motor-controller': 'curtain', + 'airer': 'curtain' } """SPEC_PROP_TRANS_MAP