def _create_method(parent, nodeid, qname, callback, inputs, outputs): node = ua.AddNodesItem() node.RequestedNewNodeId = nodeid node.BrowseName = qname node.NodeClass = ua.NodeClass.Method node.ParentNodeId = parent.nodeid node.ReferenceTypeId = ua.NodeId.from_string("i=47") #node.TypeDefinition = ua.NodeId(ua.ObjectIds.BaseObjectType) attrs = ua.MethodAttributes() attrs.Description = ua.LocalizedText(qname.Name) attrs.DisplayName = ua.LocalizedText(qname.Name) attrs.WriteMask = ua.OpenFileMode.Read attrs.UserWriteMask = ua.OpenFileMode.Read attrs.Executable = True attrs.UserExecutable = True node.NodeAttributes = attrs results = parent.server.add_nodes([node]) results[0].StatusCode.check() method = Node(parent.server, nodeid) if inputs: create_property(method, ua.generate_nodeid(qname.NamespaceIndex), ua.QualifiedName("InputArguments", 0), [_vtype_to_argument(vtype) for vtype in inputs]) if outputs: create_property(method, ua.generate_nodeid(qname.NamespaceIndex), ua.QualifiedName("OutputArguments", 0), [_vtype_to_argument(vtype) for vtype in outputs]) parent.server.add_method_callback(method.nodeid, callback) return nodeid
def _parse_add_args(*args): if isinstance(args[0], ua.NodeId): return args[0], args[1] elif isinstance(args[0], str) or isinstance(args[0], unicode): return ua.NodeId.from_string(args[0]), ua.QualifiedName.from_string(args[1]) elif isinstance(args[0], int): return ua.generate_nodeid(args[0]), ua.QualifiedName(args[1], args[0]) else: raise TypeError("Add methods takes a nodeid and a qualifiedname as argument, received %s" % args)
def _parse_add_args(*args): if isinstance(args[0], ua.NodeId): return args[0], args[1] elif isinstance(args[0], str): return ua.NodeId.from_string(args[0]), ua.QualifiedName.from_string(args[1]) elif isinstance(args[0], int): return ua.generate_nodeid(args[0]), ua.QualifiedName(args[1], args[0]) else: raise TypeError("Add methods takes a nodeid and a qualifiedname as argument, received %s" % args)
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 _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)