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))
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
    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)