def __search_nodes_and_subscribe(self, device_info): sub_nodes = [] information_types = {"attributes": "attributes", "timeseries": "telemetry"} for information_type in information_types: for information in device_info["configuration"][information_type]: information_key = information["key"] config_path = TBUtility.get_value(information["path"], get_tag=True) information_path = self._check_path(config_path, device_info["deviceNode"]) information["path"] = '${%s}' % information_path information_nodes = [] self.__search_node(device_info["deviceNode"], information_path, result=information_nodes) for information_node in information_nodes: if information_node is not None: try: information_value = information_node.get_value() except: log.error("Err get_value: %s", str(information_node)) continue log.debug("Node for %s \"%s\" with path: %s - FOUND! Current values is: %s", information_type, information_key, information_path, str(information_value)) if device_info.get("uplink_converter") is None: configuration = {**device_info["configuration"], "deviceName": device_info["deviceName"], "deviceType": device_info["deviceType"]} if device_info["configuration"].get('converter') is None: converter = OpcUaUplinkConverter(configuration) else: converter = TBModuleLoader.import_module(self._connector_type, configuration) device_info["uplink_converter"] = converter else: converter = device_info["uplink_converter"] self.subscribed[information_node] = {"converter": converter, "path": information_path, "config_path": config_path} if not device_info.get(information_types[information_type]): device_info[information_types[information_type]] = [] converted_data = converter.convert((config_path, information_path), information_value) self.statistics['MessagesReceived'] = self.statistics['MessagesReceived'] + 1 self.data_to_send.append(converted_data) self.statistics['MessagesSent'] = self.statistics['MessagesSent'] + 1 log.debug("Data to ThingsBoard: %s", converted_data) if not self.__server_conf.get("disableSubscriptions", False): sub_nodes.append(information_node) else: log.error("Node for %s \"%s\" with path %s - NOT FOUND!", information_type, information_key, information_path) if not self.__server_conf.get("disableSubscriptions", False): if self.__sub is None: self.__sub = self.client.create_subscription(self.__server_conf.get("subCheckPeriodInMillis", 500), self.__sub_handler) if sub_nodes: self.__sub.subscribe_data_change(sub_nodes) log.debug("Added subscription to nodes: %s", str(sub_nodes))
def __search_nodes_and_subscribe(self, device_configuration, device_info): device_configuration.update(**device_info) information_types = { "attributes": "attributes", "timeseries": "telemetry" } for information_type in information_types: for information in device_configuration[information_type]: information_key = information["key"] config_path = TBUtility.get_value(information["path"], get_tag=True) information_path = self._check_path(config_path, device_info["deviceNode"]) information["path"] = '${%s}' % information_path information_node = self.__search_node( device_info["deviceNode"], information_path) if information_node is not None: information_value = information_node.get_value() log.debug( "Node for %s \"%s\" with path: %s - FOUND! Current values is: %s", information_type, information_key, information_path, str(information_value)) if device_configuration.get("uplink_converter") is None: if device_configuration.get('converter') is None: converter = OpcUaUplinkConverter( device_configuration) else: converter = TBUtility.check_and_import( self.__connector_type, device_configuration['converter']) device_configuration["uplink_converter"] = converter else: converter = device_configuration["uplink_converter"] self.subscribed[information_node] = { "converter": converter, "path": information_path, "config_path": config_path } if not device_info.get( information_types[information_type]): device_info[information_types[information_type]] = [] converted_data = converter.convert( (config_path, information_path), information_value) self.statistics['MessagesReceived'] += 1 self.data_to_send.append(converted_data) self.statistics['MessagesSent'] += 1 self.__sub.subscribe_data_change(information_node) log.debug("Data to ThingsBoard: %s", converted_data) else: log.error("Node for %s \"%s\" with path %s - NOT FOUND!", information_type, information_key, information_path)
def test_opcua_getting_values(self): test_opcua_config = { 'deviceNodePattern': 'Root\\.Objects\\.Device1', 'deviceNamePattern': 'Device ${Root\\.Objects\\.Device1\\.serialNumber}', 'attributes': [{ 'key': 'temperature °C', 'path': '${ns=2;i=5}' }], 'timeseries': [{ 'key': 'humidity', 'path': '${Root\\.Objects\\.Device1\\.TemperatureAndHumiditySensor\\.Humidity}' }, { 'key': 'batteryLevel', 'path': '${Battery\\.batteryLevel}' }], 'deviceName': 'Device Number One', 'deviceType': 'default' } test_data_list = [24.1, 25.8, 59.8] test_configs = [ ('ns=2;i=5', 'ns=2;i=5'), ('Root\\.Objects\\.Device1\\.TemperatureAndHumiditySensor\\.Humidity', 'Root\\.Objects\\.Device1\\.TemperatureAndHumiditySensor\\.Humidity' ), ('Battery\\.batteryLevel', 'Root\\\\.Objects\\\\.Device1\\\\.Battery\\\\.batteryLevel') ] test_opcua_result = [{ 'deviceName': 'Device Number One', 'deviceType': 'default', 'attributes': [{ 'temperature °C': '24.1' }], 'telemetry': [] }, { 'deviceName': 'Device Number One', 'deviceType': 'default', 'attributes': [], 'telemetry': [{ 'humidity': '25.8' }] }, { 'deviceName': 'Device Number One', 'deviceType': 'default', 'attributes': [], 'telemetry': [{ 'batteryLevel': '59.8' }] }] converter = OpcUaUplinkConverter(test_opcua_config) result = [] for index, config in enumerate(test_configs): result.append(converter.convert(config, test_data_list[index])) self.assertListEqual(result, test_opcua_result)