def add_item(self, node, desc, parent=None): item = [ QStandardItem(desc.DisplayName.to_string()), QStandardItem(desc.BrowseName.to_string()), QStandardItem(desc.NodeId.to_string()) ] if desc.NodeClass == ua.NodeClass.Object: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.FolderType): item[0].setIcon(QIcon(":/folder.svg")) else: item[0].setIcon(QIcon(":/object.svg")) elif desc.NodeClass == ua.NodeClass.Variable: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.PropertyType): item[0].setIcon(QIcon(":/property.svg")) else: item[0].setIcon(QIcon(":/variable.svg")) elif desc.NodeClass == ua.NodeClass.Method: item[0].setIcon(QIcon(":/method.svg")) item[0].setData(node) if parent: return parent.appendRow(item) else: return self.appendRow(item)
def add_item(self, node, desc, parent=None): data = [ QStandardItem(desc.DisplayName.to_string()), QStandardItem(desc.BrowseName.to_string()), QStandardItem(desc.NodeId.to_string()) ] if desc.NodeClass == ua.NodeClass.Object: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.FolderType): data[0].setIcon(QIcon(QPixmap('./Iconos/folder.png'))) else: data[0].setIcon(QIcon("./Iconos/object.png")) elif desc.NodeClass == ua.NodeClass.Variable: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.PropertyType): data[0].setIcon(QIcon("./Iconos/property.png")) else: data[0].setIcon(QIcon("./Iconos/variable.jpg")) elif desc.NodeClass == ua.NodeClass.Method: data[0].setIcon(QIcon("./Iconos/method.png")) data[0].setData(node) if parent: parent.appendRow(data) else: self.appendRow(data)
def add_item(self, desc, parent=None, node=None): dname = bname = "No Value" if desc.DisplayName: dname = desc.DisplayName.to_string() if desc.BrowseName: bname = desc.BrowseName.to_string() nodeid = desc.NodeId.to_string() item = [ QStandardItem(dname), QStandardItem(bname), QStandardItem(nodeid) ] if desc.NodeClass == ua.NodeClass.Object: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.FolderType): item[0].setIcon(QIcon("icons/folder.svg")) else: try: object_type = self.custom_objects[desc.NodeId] icon = get_icon(object_type) except KeyError: icon = "icons/object.svg" item[0].setIcon(QIcon(icon)) elif desc.NodeClass == ua.NodeClass.Variable: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.PropertyType): item[0].setIcon(QIcon("icons/property.svg")) else: item[0].setIcon(QIcon("icons/variable.svg")) elif desc.NodeClass == ua.NodeClass.Method: item[0].setIcon(QIcon("icons/method.svg")) elif desc.NodeClass == ua.NodeClass.ObjectType: item[0].setIcon(QIcon("icons/objecttype.svg")) elif desc.NodeClass == ua.NodeClass.VariableType: item[0].setIcon(QIcon("icons/variabletype.svg")) elif desc.NodeClass == ua.NodeClass.DataType: item[0].setIcon(QIcon("icons/datatype.svg")) elif desc.NodeClass == ua.NodeClass.ReferenceType: item[0].setIcon(QIcon("icons/referencetype.svg")) if node: item[0].setData(node, Qt.UserRole) else: parent_node = parent.data(Qt.UserRole) item[0].setData(Node(parent_node.server, desc.NodeId), Qt.UserRole) if parent: return parent.appendRow(item) else: return self.appendRow(item)
def test_null(self): n = ua.NodeId(b'000000', 0, nodeidtype=ua.NodeIdType.Guid) self.assertTrue(n.is_null()) self.assertTrue(n.has_null_identifier()) n = ua.NodeId(b'000000', 1, nodeidtype=ua.NodeIdType.Guid) self.assertFalse(n.is_null()) self.assertTrue(n.has_null_identifier()) n = ua.NodeId() self.assertTrue(n.is_null()) self.assertTrue(n.has_null_identifier()) n = ua.NodeId(0, 0) self.assertTrue(n.is_null()) self.assertTrue(n.has_null_identifier()) n = ua.NodeId("", 0) self.assertTrue(n.is_null()) self.assertTrue(n.has_null_identifier()) n = ua.TwoByteNodeId(0) self.assertTrue(n.is_null()) self.assertTrue(n.has_null_identifier()) n = ua.NodeId(0, 3) self.assertFalse(n.is_null()) self.assertTrue(n.has_null_identifier())
def load_custom_objects(self): """ Function that populates custom_objects dictionary, with nodeids of custom objects as keys and string representations of their types as values """ # Get Objects folder objects_folder = self.client.get_objects_node() # Get Organize references to objects inside folder descriptions = objects_folder.get_references( ua.ObjectIds.Organizes, ua.BrowseDirection.Forward, ua.NodeClass.Object, False) for desc in descriptions: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.FolderType): folder_name = desc.BrowseName.Name if folder_name == "Actuators" or folder_name == "Sensors": # Get folder node folder_node = self.get_node(desc.NodeId) # Get all objects inside folder objects = folder_node.get_children(ua.ObjectIds.Organizes, ua.NodeClass.Object) for obj in objects: # Get HasTypeDefinition references ref = obj.get_references( ua.ObjectIds.HasTypeDefinition, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)[0] custom_type = ref.BrowseName.Name if custom_type in self.known_custom_types: self.custom_objects[obj.nodeid] = custom_type
def test_nodeid(self): nid = ua.NodeId() self.assertEqual(nid.NodeIdType, ua.NodeIdType.TwoByte) nid = ua.NodeId(446, 3, ua.NodeIdType.FourByte) self.assertEqual(nid.NodeIdType, ua.NodeIdType.FourByte) d = nodeid_to_binary(nid) new_nid = nodeid_from_binary(io.BytesIO(d)) self.assertEqual(new_nid, nid) self.assertEqual(new_nid.NodeIdType, ua.NodeIdType.FourByte) self.assertEqual(new_nid.Identifier, 446) self.assertEqual(new_nid.NamespaceIndex, 3) tb = ua.TwoByteNodeId(53) fb = ua.FourByteNodeId(53) n = ua.NumericNodeId(53) n1 = ua.NumericNodeId(53, 0) s1 = ua.StringNodeId("53", 0) bs = ua.ByteStringNodeId(b"53", 0) gid = uuid.uuid4() g = ua.ByteStringNodeId(str(gid), 0) guid = ua.GuidNodeId(gid) self.assertEqual(tb, fb) self.assertEqual(tb, n) self.assertEqual(tb, n1) self.assertEqual(n1, fb) self.assertNotEqual(g, guid) self.assertEqual(tb, nodeid_from_binary(ua.utils.Buffer(nodeid_to_binary(tb)))) self.assertEqual(fb, nodeid_from_binary(ua.utils.Buffer(nodeid_to_binary(fb)))) self.assertEqual(n, nodeid_from_binary(ua.utils.Buffer(nodeid_to_binary(n)))) self.assertEqual(s1, nodeid_from_binary(ua.utils.Buffer(nodeid_to_binary(s1)))) self.assertEqual(bs, nodeid_from_binary(ua.utils.Buffer(nodeid_to_binary(bs)))) self.assertEqual(guid, nodeid_from_binary(ua.utils.Buffer(nodeid_to_binary(guid))))
def instanciate_node(parent, node_type, idx): """ Instanciate a new node under 'parent' using a type """ results = node_type.get_attributes([ ua.AttributeIds.NodeClass, ua.AttributeIds.BrowseName, ua.AttributeIds.DisplayName ]) nclass, bname, dname = [res.Value.Value for res in results] #descs = node_type.get_children_descriptions(refs=ua.ObjectIds.HasTypeDefinition) typedef = ua.FourByteNodeId(ua.ObjectIds.BaseObjectType) #if len(descs) > 1: #print("DESCS", descs) #typedef = descs[0].TypeDefinition rdesc = ua.ReferenceDescription() rdesc.NodeId = node_type.nodeid rdesc.BrowseName = bname rdesc.DisplayName = dname rdesc.NodeClass = nclass rdesc.ReferenceTypeId = ua.TwoByteNodeId(ua.ObjectIds.HasComponent) rdesc.TypeDefinition = typedef print("MYRDESC", rdesc) return _instanciate_node(parent.server, parent.nodeid, rdesc, idx)
def get_references(self, refs=ua.ObjectIds.References, direction=ua.BrowseDirection.Both, nodeclassmask=ua.NodeClass.Unspecified, includesubtypes=True): """ returns references of the node based on specific filter defined with: refs = ObjectId of the Reference direction = Browse direction for references nodeclassmask = filter nodes based on specific class includesubtypes = If true subtypes of the reference (ref) are also included """ desc = ua.BrowseDescription() desc.BrowseDirection = direction desc.ReferenceTypeId = ua.TwoByteNodeId(refs) desc.IncludeSubtypes = includesubtypes desc.NodeClassMask = nodeclassmask desc.ResultMask = ua.BrowseResultMask.All desc.NodeId = self.nodeid params = ua.BrowseParameters() params.View.Timestamp = ua.win_epoch_to_datetime(0) params.NodesToBrowse.append(desc) results = self.server.browse(params) return results[0].References
def test_nodeid(self): nid = ua.NodeId() self.assertEqual(nid.NodeIdType, ua.NodeIdType.TwoByte) nid = ua.NodeId(446, 3, ua.NodeIdType.FourByte) self.assertEqual(nid.NodeIdType, ua.NodeIdType.FourByte) d = nid.to_binary() new_nid = nid.from_binary(io.BytesIO(d)) self.assertEqual(new_nid, nid) self.assertEqual(new_nid.NodeIdType, ua.NodeIdType.FourByte) self.assertEqual(new_nid.Identifier, 446) self.assertEqual(new_nid.NamespaceIndex, 3) tb = ua.TwoByteNodeId(53) fb = ua.FourByteNodeId(53) n = ua.NumericNodeId(53) n1 = ua.NumericNodeId(53, 0) s = ua.StringNodeId(53, 0) # should we raise an exception??? s1 = ua.StringNodeId("53", 0) bs = ua.ByteStringNodeId(b"53", 0) gid = ua.Guid() g = ua.ByteStringNodeId(gid, 0) self.assertEqual(tb, fb) self.assertEqual(tb, n) self.assertEqual(tb, n1) self.assertEqual(n1, fb) self.assertNotEqual(n1, s) self.assertNotEqual(s, bs) self.assertNotEqual(s, g)
def get_child(self, path): """ get a child specified by its path from this node. A path might be: * a string representing a qualified name. * a qualified name * a list of string * a list of qualified names """ if type(path) not in (list, tuple): path = [path] rpath = ua.RelativePath() for item in path: el = ua.RelativePathElement() el.ReferenceTypeId = ua.TwoByteNodeId( ua.ObjectIds.HierarchicalReferences) el.IsInverse = False el.IncludeSubtypes = True if isinstance(item, ua.QualifiedName): el.TargetName = item else: el.TargetName = ua.QualifiedName.from_string(item) rpath.Elements.append(el) bpath = ua.BrowsePath() bpath.StartingNode = self.nodeid bpath.RelativePath = rpath result = self.server.translate_browsepaths_to_nodeids([bpath]) result = result[0] result.StatusCode.check() # FIXME: seems this method may return several nodes return Node(self.server, result.Targets[0].TargetId)
def _get_node_desc(self, node): attrs = node.get_attributes([ua.AttributeIds.DisplayName, ua.AttributeIds.BrowseName, ua.AttributeIds.NodeId, ua.AttributeIds.NodeClass]) desc = ua.ReferenceDescription() desc.DisplayName = attrs[0].Value.Value desc.BrowseName = attrs[1].Value.Value desc.NodeId = attrs[2].Value.Value desc.NodeClass = attrs[3].Value.Value desc.TypeDefinition = ua.TwoByteNodeId(ua.ObjectIds.FolderType) return desc
def add_item(self, desc, parent=None, node=None): dname = bname = nodeid = "No Value" if desc.DisplayName: dname = desc.DisplayName.to_string() if desc.BrowseName: bname = desc.BrowseName.to_string() nodeid = desc.NodeId.to_string() item = [ QStandardItem(dname), QStandardItem(bname), QStandardItem(nodeid) ] if desc.NodeClass == ua.NodeClass.Object: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.FolderType): item[0].setIcon(self.icons.get("folder")) else: item[0].setIcon(self.icons.get("object")) elif desc.NodeClass == ua.NodeClass.Variable: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.PropertyType): item[0].setIcon(self.icons.get("property")) else: item[0].setIcon(self.icons.get("variable")) elif desc.NodeClass == ua.NodeClass.Method: item[0].setIcon(self.icons.get("method")) elif desc.NodeClass == ua.NodeClass.ObjectType: item[0].setIcon(self.icons.get("object_type")) elif desc.NodeClass == ua.NodeClass.VariableType: item[0].setIcon(self.icons.get("variable_type")) elif desc.NodeClass == ua.NodeClass.DataType: item[0].setIcon(self.icons.get("data_type")) elif desc.NodeClass == ua.NodeClass.ReferenceType: item[0].setIcon(self.icons.get("reference_type")) if node: item[0].setData(node, Qt.UserRole) else: parent_node = parent.data(Qt.UserRole) item[0].setData(Node(parent_node.server, desc.NodeId), Qt.UserRole) if parent: return parent.appendRow(item) else: return self.appendRow(item)
def get_root_node_and_desc(self): node = self.client.get_root_node() attrs = node.get_attributes([ua.AttributeIds.DisplayName, ua.AttributeIds.BrowseName, ua.AttributeIds.NodeId, ua.AttributeIds.NodeClass]) desc = ua.ReferenceDescription() desc.DisplayName = attrs[0].Value.Value desc.BrowseName = attrs[1].Value.Value desc.NodeId = attrs[2].Value.Value desc.NodeClass = attrs[3].Value.Value desc.TypeDefinition = ua.TwoByteNodeId(ua.ObjectIds.FolderType) return node, desc
def test_bool_variable(self): o = self.opc.get_objects_node() v = o.add_variable(3, 'BoolVariable', True) dt = v.get_data_type() self.assertEqual(dt, ua.TwoByteNodeId(ua.ObjectIds.Boolean)) val = v.get_value() self.assertEqual(True, val) v.set_value(False) val = v.get_value() self.assertEqual(False, val)
def _to_nodeid(nodeid): if isinstance(nodeid, int): return ua.TwoByteNodeId(nodeid) elif isinstance(nodeid, Node): return nodeid.nodeid elif isinstance(nodeid, ua.NodeId): return nodeid elif type(nodeid) in (str, bytes): return ua.NodeId.from_string(nodeid) else: raise ua.UaError("Could not resolve '{0}' to a type id".format(nodeid))
def _make_relative_path(self, path): rpath = ua.RelativePath() for item in path: el = ua.RelativePathElement() el.ReferenceTypeId = ua.TwoByteNodeId(ua.ObjectIds.HierarchicalReferences) el.IsInverse = False el.IncludeSubtypes = True if isinstance(item, ua.QualifiedName): el.TargetName = item else: el.TargetName = ua.QualifiedName.from_string(item) rpath.Elements.append(el) return rpath
def _instanciate_node(server, parentid, rdesc, idx): """ Instanciate a new node under 'parent' using a type """ print("Instanciating: node %s in %s" % (rdesc, parentid)) addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = ua.generate_nodeid(idx) addnode.BrowseName = rdesc.BrowseName addnode.NodeClass = rdesc.NodeClass addnode.ParentNodeId = parentid addnode.ReferenceTypeId = ua.TwoByteNodeId(ua.ObjectIds.HasComponent) addnode.TypeDefinition = rdesc.TypeDefinition print("ADDNODE", addnode) node_type = Node(server, rdesc.NodeId) if rdesc.NodeClass in (ua.NodeClass.Object, ua.NodeClass.ObjectType): print(node_type, " is object") _read_and_copy_attrs(node_type, ua.ObjectAttributes(), addnode) #_add_object_attrs(addnode, rdesc, node_type) elif rdesc.NodeClass in (ua.NodeClass.Variable, ua.NodeClass.VariableType): print(node_type, " is variable") _read_and_copy_attrs(node_type, ua.VariableAttributes(), addnode) #_add_variable_attrs(addnode, rdesc, node_type) else: print("Node class not supported: ", rdesc.NodeClass) print("ADDNODE FINAL ", addnode) server.add_nodes([addnode]) refs = [] ref = ua.AddReferencesItem() ref.IsForward = True ref.ReferenceTypeId = addnode.ReferenceTypeId ref.SourceNodeId = parentid ref.TargetNodeClass = addnode.NodeClass ref.TargetNodeId = addnode.RequestedNewNodeId refs.append(ref) server.add_references(refs) descs = node_type.get_children_descriptions( includesubtypes=False) #FIXME: should be false print("node is", rdesc.NodeId, node_type, node_type.get_children()) print("Children are: ", descs) for rdesc in descs: _instanciate_node(server, addnode.RequestedNewNodeId, rdesc, idx) return Node(server, addnode.RequestedNewNodeId)
def add_item(self, desc, parent=None, node=None): item = [ QStandardItem(desc.DisplayName.to_string()), QStandardItem(desc.BrowseName.to_string()), QStandardItem(desc.NodeId.to_string()) ] if desc.NodeClass == ua.NodeClass.Object: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.FolderType): item[0].setIcon(QIcon(":/folder.svg")) else: item[0].setIcon(QIcon(":/object.svg")) elif desc.NodeClass == ua.NodeClass.Variable: if desc.TypeDefinition == ua.TwoByteNodeId( ua.ObjectIds.PropertyType): item[0].setIcon(QIcon(":/property.svg")) else: item[0].setIcon(QIcon(":/variable.svg")) elif desc.NodeClass == ua.NodeClass.Method: item[0].setIcon(QIcon(":/method.svg")) elif desc.NodeClass == ua.NodeClass.ObjectType: item[0].setIcon(QIcon(":/object_type.svg")) elif desc.NodeClass == ua.NodeClass.VariableType: item[0].setIcon(QIcon(":/variable_type.svg")) elif desc.NodeClass == ua.NodeClass.DataType: item[0].setIcon(QIcon(":/data_type.svg")) elif desc.NodeClass == ua.NodeClass.ReferenceType: item[0].setIcon(QIcon(":/reference_type.svg")) if node: item[0].setData(node, Qt.UserRole) else: parent_node = parent.data(Qt.UserRole) item[0].setData(Node(parent_node.server, desc.NodeId), Qt.UserRole) if parent: return parent.appendRow(item) else: return self.appendRow(item)
async def browse(self): object_root = Node( name='', parent=self, server=self.uaclient, server_id=self.id, nodeid=self.get_node( ua.TwoByteNodeId(ua.ObjectIds.ObjectsFolder) ) ) object_root.name = (await object_root.get_display_name()).Text await self.browse_nodes( parent=self, node=object_root )
def test_nodeid_ordering(self): a = ua.NodeId(2000, 1) b = ua.NodeId(3000, 1) c = ua.NodeId(20, 0) d = ua.NodeId("tititu", 1) e = ua.NodeId("aaaaa", 1) f = ua.NodeId("aaaaa", 2) g = ua.NodeId(uuid.uuid4(), 1) h = ua.TwoByteNodeId(2001) i = ua.NodeId(b"lkjkl", 1, ua.NodeIdType.ByteString) j = ua.NodeId(b"aaa", 5, ua.NodeIdType.ByteString) mylist = [a, b, c, d, e, f, g, h, i, j] mylist.sort() expected = [h, c, a, b, e, d, f, g, i, j] self.assertEqual(mylist, expected)
async def browse(self): """The function that starts a browse activity. Establishes the root node, gets the objects node, and starts the browse_nodes function""" logging.info("Browsing Servers") for server_id, server in self.servers.items(): server.uaclient.parent = server object_root = Node(name='', parent=server, server=server.uaclient, integration_client_id=self.permanent_id, server_id=server_id, nodeid=server.get_node( ua.TwoByteNodeId( ua.ObjectIds.ObjectsFolder))) object_root.name = (await object_root.get_display_name()).Text await server.browse_nodes(parent=server, node=object_root)
def get_children_descriptions(self, refs=ua.ObjectIds.HierarchicalReferences, nodeclassmask=ua.NodeClass.Unspecified, includesubtypes=True): """ return all attributes of child nodes as UA BrowseResult structs """ desc = ua.BrowseDescription() desc.BrowseDirection = ua.BrowseDirection.Forward desc.ReferenceTypeId = ua.TwoByteNodeId(refs) desc.IncludeSubtypes = includesubtypes desc.NodeClassMask = nodeclassmask desc.ResultMask = ua.BrowseResultMask.All desc.NodeId = self.nodeid params = ua.BrowseParameters() params.View.Timestamp = ua.win_epoch_to_datetime(0) params.NodesToBrowse.append(desc) results = self.server.browse(params) return results[0].References
def get_server_node(self): return self.get_node(ua.TwoByteNodeId(ua.ObjectIds.Server))
def get_objects_node(self): return self.get_node(ua.TwoByteNodeId(ua.ObjectIds.ObjectsFolder))
def get_root_node(self): return self.get_node(ua.TwoByteNodeId(ua.ObjectIds.RootFolder))
def get_server_node(self): """ Get Server node of server. Returns a Node object. """ return self.get_node(ua.TwoByteNodeId(ua.ObjectIds.Server))
def get_objects_node(self): """ Get Objects node of server. Returns a Node object. """ return self.get_node(ua.TwoByteNodeId(ua.ObjectIds.ObjectsFolder))
def get_root_node(self): """ Get Root node of server. Returns a Node object. """ return self.get_node(ua.TwoByteNodeId(ua.ObjectIds.RootFolder))