From 1b476151007c187a24812fc7ff712719ab452cac Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Fri, 22 May 2020 12:08:17 +0200 Subject: [PATCH] More robust attribute checking before conversion, as the object can actually be either a ZWaveNode or a ZWaveController --- platypush/plugins/zwave/__init__.py | 65 +++++++++++++++-------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/platypush/plugins/zwave/__init__.py b/platypush/plugins/zwave/__init__.py index cd7b7f05f3..2ff74f457b 100644 --- a/platypush/plugins/zwave/__init__.py +++ b/platypush/plugins/zwave/__init__.py @@ -206,45 +206,46 @@ class ZwavePlugin(Plugin): 'node_id': node.node_id, 'home_id': node.home_id, 'capabilities': list(node.capabilities), - 'command_classes': [node.get_command_class_as_string(cc) for cc in node.command_classes], - 'device_type': node.device_type, + 'command_classes': [node.get_command_class_as_string(cc) for cc in node.command_classes] + if hasattr(node, 'command_classes') else [], + 'device_type': node.device_type if hasattr(node, 'device_type') else '', 'groups': { group_id: cls.group_to_dict(group) for group_id, group in node.groups.items() }, - 'is_awake': node.is_awake, - 'is_failed': node.is_failed, - 'is_beaming_device': node.is_beaming_device, - 'is_frequent_listening_device': node.is_frequent_listening_device, - 'is_info_received': node.is_info_received, - 'is_listening_device': node.is_listening_device, - 'is_locked': node.is_locked, - 'is_ready': node.is_ready, - 'is_routing_device': node.is_routing_device, - 'is_security_device': node.is_security_device, - 'is_sleeping': node.is_sleeping, - 'last_update': node.last_update, - 'location': node.location, - 'manufacturer_id': node.manufacturer_id, - 'manufacturer_name': node.manufacturer_name, - 'max_baud_rate': node.max_baud_rate, - 'neighbours': [node_id for node_id in node.neighbors], - 'name': node.name, - 'outdated': node.outdated, - 'product_id': node.product_id, - 'product_name': node.product_name, - 'product_type': node.product_type, - 'query_stage': node.query_stage, - 'role': node.role, - 'security': node.security, - 'specific': node.specific, - 'type': node.type, - 'use_cache': node.use_cache, - 'version': node.version, + 'is_awake': node.is_awake if hasattr(node, 'is_awake') else False, + 'is_failed': node.is_failed if hasattr(node, 'is_failed') else False, + 'is_beaming_device': node.is_beaming_device if hasattr(node, 'is_beaming_device') else False, + 'is_frequent_listening_device': node.is_frequent_listening_device if hasattr(node, 'is_frequent_listening_device') else False, + 'is_info_received': node.is_info_received if hasattr(node, 'is_info_received') else False, + 'is_listening_device': node.is_listening_device if hasattr(node, 'is_listening_device') else False, + 'is_locked': node.is_locked if hasattr(node, 'is_locked') else False, + 'is_ready': node.is_ready if hasattr(node, 'is_ready') else False, + 'is_routing_device': node.is_routing_device if hasattr(node, 'is_routing_device') else False, + 'is_security_device': node.is_security_device if hasattr(node, 'is_security_device') else False, + 'is_sleeping': node.is_sleeping if hasattr(node, 'is_sleeping') else False, + 'last_update': node.last_update if hasattr(node, 'last_update') else None, + 'location': node.location if hasattr(node, 'location') else None, + 'manufacturer_id': node.manufacturer_id if hasattr(node, 'manufacturer_id') else None, + 'manufacturer_name': node.manufacturer_name if hasattr(node, 'manufacturer_name') else None, + 'max_baud_rate': node.max_baud_rate if hasattr(node, 'max_baud_rate') else None, + 'neighbours': [node_id for node_id in node.neighbors] if hasattr(node, 'neighbours') else [], + 'name': node.name if hasattr(node, 'name') else None, + 'outdated': node.outdated if hasattr(node, 'outdated') else False, + 'product_id': node.product_id if hasattr(node, 'product_id') else None, + 'product_name': node.product_name if hasattr(node, 'product_name') else None, + 'product_type': node.product_type if hasattr(node, 'product_type') else None, + 'query_stage': node.query_stage if hasattr(node, 'query_stage') else None, + 'role': node.role if hasattr(node, 'role') else None, + 'security': node.security if hasattr(node, 'security') else None, + 'specific': node.specific if hasattr(node, 'specific') else None, + 'type': node.type if hasattr(node, 'type') else None, + 'use_cache': node.use_cache if hasattr(node, 'use_cache') else False, + 'version': node.version if hasattr(node, 'version') else None, 'values': { value.id_on_network: cls.value_to_dict(value) for value_id, value in (node.values or {}).items() - }, + } if hasattr(node, 'values') else {}, } def _get_node(self, node_id: Optional[int] = None, node_name: Optional[str] = None) -> ZWaveNode: