예제 #1
0
 def get_attribute(self, attr):
     """
     Read one attribute of a node
     result code from server is checked and an exception is raised in case of error
     """
     rv = ua.ReadValueId()
     rv.NodeId = self.nodeid
     rv.AttributeId = attr
     params = ua.ReadParameters()
     params.NodesToRead.append(rv)
     result = self.server.read(params)
     result[0].StatusCode.check()
     return result[0]
예제 #2
0
    def get_attributes(self, attrs):
        """
        Read several attributes of a node
        list of DataValue is returned
        """
        params = ua.ReadParameters()
        for attr in attrs:
            rv = ua.ReadValueId()
            rv.NodeId = self.nodeid
            rv.AttributeId = attr
            params.NodesToRead.append(rv)

        results = self.server.read(params)
        return results
예제 #3
0
    async def batch_load_fn(self, attributeKeys):
        """
        Iterates through the attributeKeys and retrieves data
        from OPC UA servers based on the attributeKey values.

        Arguments
        attributeKeys:  List of strings with required infromation
                        to retrieve the attributes from OPC UA servers.
        Template:       "Server/NodeId/Attribute"
        Example:        "TestServer/ns=2;i=2/Value"

        Results
        sortedResults:  List of values returned by the OPC UA server
                        for each attribute. Also includes OPC UA read
                        time with each attribute.
                        In same order as attributeKeys.
        Example:        [<opcua_object>, readTime]
        """

        servers = defaultdict(list)
        i = 0
        for attribute in attributeKeys:
            info = attribute.split("/")
            servers[info[0]].append([i, info[1], info[2]])
            i += 1

        sortedResults = [None] * len(attributeKeys)
        for serverName, attributes in servers.items():
            params = ua.ReadParameters()
            server = getServer(serverName)
            for info in attributes:
                rv = ua.ReadValueId()
                if info[1] == "":
                    rv.NodeId = ua.NodeId.from_string(server.rootNodeId)
                else:
                    rv.NodeId = ua.NodeId.from_string(info[1])
                rv.AttributeId = ua.AttributeIds[info[2]]
                params.NodesToRead.append(rv)

            results, readTime = await server.read(params)

            i = 0
            for info in attributes:
                sortedResults[info[0]] = [results[i], readTime]
                i += 1

        return sortedResults
예제 #4
0
    async def get_variable_nodes(self,
                                 node,
                                 nodeClass=2,
                                 variableList=None,
                                 depth=0,
                                 maxDepth=10):
        """
        Eats a list of node object(s).
        Recursively finds nodes under given nodes that have given nodeClass.
        Returns node objects in a list.
        """

        if variableList is None:
            variableList = []

        depth += 1
        if depth >= maxDepth:
            return variableList

        nodes = node.get_children()
        params = ua.ReadParameters()
        for node in nodes:
            rv = ua.ReadValueId()
            rv.NodeId = node.nodeid
            rv.AttributeId = ua.AttributeIds.NodeClass
            params.NodesToRead.append(rv)

        results = []
        if len(params.NodesToRead) > 0:
            results, readTime = await self.read(params)

        for i in range(len(results)):
            if nodeClass == results[i].Value.Value:
                variableList.append(nodes[i])
            await self.get_variable_nodes(node=nodes[i],
                                          nodeClass=nodeClass,
                                          variableList=variableList,
                                          depth=depth)

        return variableList
예제 #5
0
 def __init__(self, server, nodeid):
     self.server = server
     self.nodeid = nodeid
     self.params = ua.ReadParameters()
     self._debug_attr = []