def create_object(parent, nodeid, bname, objecttype=None): """ create a child node object arguments are nodeid, browsename, [objecttype] or namespace index, name, [objecttype] if objectype is given (a NodeId) then the type node is instantiated inclusive its child nodes """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) if objecttype is not None: objecttype = node.Node(parent.server, objecttype) nodes = instantiate(parent, objecttype, nodeid, bname)[0] return nodes else: return node.Node(parent.server, _create_object(parent.server, parent.nodeid, nodeid, qname, ua.ObjectIds.BaseObjectType))
def _create_object(server, parentnodeid, nodeid, qname, objecttype): addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = qname addnode.ParentNodeId = parentnodeid #TODO: maybe move to address_space.py and implement for all node types? if not objecttype: addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasSubtype) addnode.NodeClass = ua.NodeClass.ObjectType attrs = ua.ObjectTypeAttributes() attrs.IsAbstract = True else: if node.Node( server, parentnodeid).get_type_definition() == ua.ObjectIds.FolderType: addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.Organizes) else: addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasComponent) addnode.NodeClass = ua.NodeClass.Object addnode.TypeDefinition = ua.NodeId(objecttype) attrs = ua.ObjectAttributes() attrs.EventNotifier = 0 attrs.Description = ua.LocalizedText(qname.Name) attrs.DisplayName = ua.LocalizedText(qname.Name) attrs.WriteMask = 0 attrs.UserWriteMask = 0 addnode.NodeAttributes = attrs results = server.add_nodes([addnode]) results[0].StatusCode.check() return results[0].AddedNodeId
def create_property(parent, nodeid, bname, val, varianttype=None, datatype=None): """ create a child node property args are nodeid, browsename, value, [variant type] or idx, name, value, [variant type] """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) var = ua.Variant(val, varianttype) if datatype and isinstance(datatype, int): datatype = ua.NodeId(datatype, 0) if datatype and not isinstance(datatype, ua.NodeId): raise RuntimeError( "datatype argument must be a nodeid or an int refering to a nodeid" ) return node.Node( parent.server, _create_variable(parent.server, parent.nodeid, nodeid, qname, var, datatype=datatype, isproperty=True))
def _create_method(parent, nodeid, qname, callback, inputs, outputs): addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = qname addnode.NodeClass = ua.NodeClass.Method addnode.ParentNodeId = parent.nodeid addnode.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 addnode.NodeAttributes = attrs results = parent.server.add_nodes([addnode]) results[0].StatusCode.check() method = node.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 create_data_type(parent, nodeid, bname, description=None): """ Create a new data type to be used in new variables, etc .. arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = qname addnode.NodeClass = ua.NodeClass.DataType addnode.ParentNodeId = parent.nodeid addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasSubtype) #addnode.TypeDefinition = ua.NodeId(ua.ObjectIds.BaseDataVariableType) # No type definition for types attrs = ua.DataTypeAttributes() if description is None: attrs.Description = ua.LocalizedText(qname.Name) else: attrs.Description = ua.LocalizedText(description) attrs.DisplayName = ua.LocalizedText(qname.Name) attrs.WriteMask = 0 attrs.UserWriteMask = 0 attrs.IsAbstract = False # True mean they cannot be instanciated addnode.NodeAttributes = attrs results = parent.server.add_nodes([addnode]) results[0].StatusCode.check() return node.Node(parent.server, results[0].AddedNodeId)
def _create_method(parent, nodeid, qname, callback, inputs, outputs): addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = qname addnode.NodeClass = ua.NodeClass.Method addnode.ParentNodeId = parent.nodeid addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasComponent) #node.TypeDefinition = ua.NodeId(ua.ObjectIds.BaseObjectType) attrs = ua.MethodAttributes() attrs.Description = ua.LocalizedText(qname.Name) attrs.DisplayName = ua.LocalizedText(qname.Name) attrs.WriteMask = 0 attrs.UserWriteMask = 0 attrs.Executable = True attrs.UserExecutable = True addnode.NodeAttributes = attrs results = parent.server.add_nodes([addnode]) results[0].StatusCode.check() method = node.Node(parent.server, results[0].AddedNodeId) create_property(method, ua.NodeId(), ua.QualifiedName("InputArguments", 0), [_vtype_to_argument(vtype) for vtype in inputs], varianttype=ua.VariantType.ExtensionObject, datatype=ua.ObjectIds.Argument) create_property(method, ua.NodeId(), ua.QualifiedName("OutputArguments", 0), [_vtype_to_argument(vtype) for vtype in outputs], varianttype=ua.VariantType.ExtensionObject, datatype=ua.ObjectIds.Argument) parent.server.add_method_callback(method.nodeid, callback) return results[0].AddedNodeId
def _create_object(server, parentnodeid, nodeid, qname, objecttype): addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = qname addnode.ParentNodeId = parentnodeid if node.Node(server, parentnodeid).get_type_definition() == ua.NodeId( ua.ObjectIds.FolderType): addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.Organizes) else: addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasComponent) addnode.NodeClass = ua.NodeClass.Object if isinstance(objecttype, int): addnode.TypeDefinition = ua.NodeId(objecttype) else: addnode.TypeDefinition = objecttype attrs = ua.ObjectAttributes() attrs.EventNotifier = 0 attrs.Description = ua.LocalizedText(qname.Name) attrs.DisplayName = ua.LocalizedText(qname.Name) attrs.WriteMask = 0 attrs.UserWriteMask = 0 addnode.NodeAttributes = attrs results = server.add_nodes([addnode]) results[0].StatusCode.check() return results[0].AddedNodeId
def create_variable(parent, nodeid, bname, val, varianttype=None, datatype=None): """ create a child node variable args are nodeid, browsename, value, [variant type], [data type] or idx, name, value, [variant type], [data type] """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) var = ua.Variant(val, varianttype) if datatype and not isinstance(datatype, ua.NodeId): raise RuntimeError() return node.Node( parent.server, _create_variable(parent.server, parent.nodeid, nodeid, qname, var, datatype=datatype, isproperty=False))
def create_object(parent, *args): """ create a child node object arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_add_args(*args) objecttype = ua.ObjectIds.BaseObjectType if (len(args) == 3): objecttype = args[2] try: if isinstance(objecttype, int): objecttype = ua.NodeId(objecttype) elif isinstance(objecttype, ua.NodeId): objecttype = objecttype elif isinstance(objecttype, str): objecttype = ua.NodeId.from_string(objecttype) else: raise RuntimeError() return nodeid, qname except ua.UaError: raise except Exception as ex: raise TypeError( "This provided objecttype takes either a index, nodeid or string. Received arguments {} and got exception {}" .format(args, ex)) return node.Node( parent.server, _create_object(parent.server, parent.nodeid, nodeid, qname, objecttype))
def create_folder(parent, nodeid, bname): """ create a child node folder arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) return node.Node(parent.server, _create_object(parent.server, parent.nodeid, nodeid, qname, ua.ObjectIds.FolderType))
def create_object_type(parent, nodeid, bname): """ Create a new object type to be instanciated in address space. arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) return node.Node(parent.server, _create_object_type(parent.server, parent.nodeid, nodeid, qname))
def create_reference_type(parent, nodeid, bname, symmetric=True, inversename=None): """ Create a new reference type args are nodeid and browsename or idx and name """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) return node.Node(parent.server, _create_reference_type(parent.server, parent.nodeid, nodeid, qname, symmetric, inversename))
def create_subtype(parent, *args): """ create a child node subtype arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_add_args(*args) return node.Node( parent.server, _create_object(parent.server, parent.nodeid, nodeid, qname, None))
def create_folder(parent, *args): """ create a child node folder arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_add_args(*args) return node.Node( parent.server, _create_folder(parent.server, parent.nodeid, nodeid, qname))
def create_object(parent, *args): """ create a child node object arguments are nodeid, browsename or namespace index, name """ nodeid, qname = _parse_add_args(*args) return node.Node( parent.server, _create_object(parent.server, parent.nodeid, nodeid, qname, ua.ObjectIds.BaseObjectType))
def create_variable_type(parent, nodeid, bname, datatype): """ Create a new variable type args are nodeid, browsename and datatype or idx, name and data type """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) if datatype and isinstance(datatype, int): datatype = ua.NodeId(datatype, 0) if datatype and not isinstance(datatype, ua.NodeId): raise RuntimeError("Data type argument must be a nodeid or an int refering to a nodeid, received: {}".format(datatype)) return node.Node(parent.server, _create_variable_type(parent.server, parent.nodeid, nodeid, qname, datatype))
def create_variable(parent, *args): """ create a child node variable args are nodeid, browsename, value, [variant type] or idx, name, value, [variant type] """ nodeid, qname = _parse_add_args(*args[:2]) val = _to_variant(*args[2:]) return node.Node( parent.server, _create_variable(parent.server, parent.nodeid, nodeid, qname, val, isproperty=False))
def create_method(parent, *args): """ create a child method object This is only possible on server side!! args are nodeid, browsename, method_to_be_called, [input argument types], [output argument types] or idx, name, method_to_be_called, [input argument types], [output argument types] if argument types is specified, child nodes advertising what arguments the method uses and returns will be created a callback is a method accepting the nodeid of the parent as first argument and variants after. returns a list of variants """ nodeid, qname = _parse_nodeid_qname(*args[:2]) callback = args[2] if len(args) > 3: inputs = args[3] else: inputs = [] if len(args) > 4: outputs = args[4] else: outputs = [] return node.Node(parent.server, _create_method(parent, nodeid, qname, callback, inputs, outputs))
def create_reference_type(parent, nodeid, bname): """ Create a new reference type args are nodeid and browsename or idx and name """ nodeid, qname = _parse_nodeid_qname(nodeid, bname) addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = qname addnode.NodeClass = ua.NodeClass.Variable addnode.ParentNodeId = parent.nodeid addnode.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasSubtype) attrs = ua.ReferenceTypeAttributes() attrs.IsAbstract = False attrs.Description = ua.LocalizedText(qname.Name) attrs.DisplayName = ua.LocalizedText(qname.Name) attrs.AccessLevel = ua.AccessLevel.CurrentRead.mask attrs.UserAccessLevel = ua.AccessLevel.CurrentRead.mask addnode.NodeAttributes = attrs results = parent.server.add_nodes([addnode]) results[0].StatusCode.check() return node.Node(parent.server, results[0].AddedNodeId)