From 24ef3934742bfbf59f7e3a0f07a6b8153bc844ac Mon Sep 17 00:00:00 2001 From: LiShuzhen Date: Tue, 16 Dec 2025 10:24:06 +0800 Subject: [PATCH] fix: required property in optional service --- .../xiaomi_home/miot/miot_device.py | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/custom_components/xiaomi_home/miot/miot_device.py b/custom_components/xiaomi_home/miot/miot_device.py index a585800..3b747b9 100644 --- a/custom_components/xiaomi_home/miot/miot_device.py +++ b/custom_components/xiaomi_home/miot/miot_device.py @@ -436,7 +436,7 @@ class MIoTDevice: optional_properties: dict required_actions: set optional_actions: set - # 2. The service shall have all required properties, actions. + # 2. The required service shall have all required properties, actions. if service.name in required_services: required_properties = SPEC_DEVICE_TRANS_MAP[spec_name][ 'required'].get( @@ -454,6 +454,21 @@ class MIoTDevice: 'required'].get( service.name, {} ).get('optional', {}).get('actions', set({})) + if not { + prop.name for prop in service.properties if prop.access + }.issuperset(set(required_properties.keys())): + return None + if not { + action.name for action in service.actions + }.issuperset(required_actions): + return None + # 3. The required property in required service shall have all required access mode. + for prop in service.properties: + if prop.name in required_properties: + if not set(prop.access).issuperset( + required_properties[prop.name]): + return None + # 4. The optional service shall have all required properties, actions. elif service.name in optional_services: required_properties = SPEC_DEVICE_TRANS_MAP[spec_name][ 'optional'].get( @@ -471,22 +486,22 @@ class MIoTDevice: 'optional'].get( service.name, {} ).get('optional', {}).get('actions', set({})) + if not { + prop.name for prop in service.properties if prop.access + }.issuperset(set(required_properties.keys())): + continue + if not { + action.name for action in service.actions + }.issuperset(required_actions): + continue + # 5. The required property in optional service shall have all required access mode. + for prop in service.properties: + if prop.name in required_properties: + if not set(prop.access).issuperset( + required_properties[prop.name]): + continue else: continue - if not { - prop.name for prop in service.properties if prop.access - }.issuperset(set(required_properties.keys())): - return None - if not { - action.name for action in service.actions - }.issuperset(required_actions): - return None - # 3. The required property shall have all required access mode. - for prop in service.properties: - if prop.name in required_properties: - if not set(prop.access).issuperset( - required_properties[prop.name]): - return None # property for prop in service.properties: if prop.name in set.union(