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]
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
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
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
def __init__(self, server, nodeid): self.server = server self.nodeid = nodeid self.params = ua.ReadParameters() self._debug_attr = []