diff --git a/modules/test/protocol/python/src/protocol_bacnet.py b/modules/test/protocol/python/src/protocol_bacnet.py index 0981b7c89..aaa41b224 100644 --- a/modules/test/protocol/python/src/protocol_bacnet.py +++ b/modules/test/protocol/python/src/protocol_bacnet.py @@ -112,19 +112,35 @@ def validate_device(self): LOGGER.error('Error occurred when validating device', exc_info=True) return result, description - - def validate_protocol_version(self, device: BACnetDevice) -> tuple[bool, str]: + async def validate_protocol_version( + self, + device: BACnetDevice + ) -> tuple[bool, str]: LOGGER.info( f'Resolving protocol version for BACnet device: {device.device_id}' ) try: - version = self.bacnet.read( - f'{device.ip} device {device.device_id} protocolVersion') - revision = self.bacnet.read( - f'{device.ip} device {device.device_id} protocolRevision') - protocol_version = f'{version}.{revision}' - result = True - result_description = f'Device uses BACnet version {protocol_version}' + dut = await BAC0.device( + device.ip, + device.device_id, + self.bacnet + ) + version = await dut.read_property( + ('device', device.device_id, 'protocolVersion') + ) + revision = await dut.read_property( + ('device', device.device_id, 'protocolRevision') + ) + if version is None or revision is None: + result = False + result_description = ( + f'Failed to resolve protocol version: version={version}, ' + f'revision={revision}') + LOGGER.error(result_description) + else: + protocol_version = f'{version}.{revision}' + result = True + result_description = f'Device uses BACnet version {protocol_version}' except (UnknownPropertyError, ReadPropertyException, NoResponseFromController, DeviceNotConnected) as e: result = False diff --git a/modules/test/protocol/python/src/protocol_module.py b/modules/test/protocol/python/src/protocol_module.py index 646f912d1..95a43a7c9 100644 --- a/modules/test/protocol/python/src/protocol_module.py +++ b/modules/test/protocol/python/src/protocol_module.py @@ -27,11 +27,17 @@ class ProtocolModule(TestModule): def __init__(self, module): self._supports_bacnet = False + self._bacnet_loop = None super().__init__(module_name=module, log_name=LOG_NAME) global LOGGER LOGGER = self._get_logger() self._bacnet = BACnet(log=LOGGER, device_hw_addr=self._device_mac) + def _get_bacnet_loop(self): + if self._bacnet_loop is None: + self._bacnet_loop = asyncio.new_event_loop() + return self._bacnet_loop + def _protocol_valid_bacnet(self): LOGGER.info('Running protocol.valid_bacnet') result = None @@ -47,11 +53,8 @@ def _protocol_valid_bacnet(self): local_address = self.get_local_ip(interface_name) if local_address: local_address += '/24' - try: - loop = asyncio.get_running_loop() - loop.run_until_complete(self._bacnet.discover(local_address)) - except RuntimeError: - asyncio.run(self._bacnet.discover(local_address)) + self._get_bacnet_loop().run_until_complete( + self._bacnet.discover(local_address)) result = self._bacnet.validate_device() if result[0]: self._supports_bacnet = True @@ -78,8 +81,11 @@ def _protocol_bacnet_version(self): if len(self._bacnet.devices) > 0: for device in self._bacnet.devices: LOGGER.debug(f'Checking BACnet version for device: {device}') + loop = self._get_bacnet_loop() result_status, result_description = \ - self._bacnet.validate_protocol_version(device) + loop.run_until_complete( + self._bacnet.validate_protocol_version(device) + ) break LOGGER.info(result_description)