async def _copy_node(server, parent_nodeid, rdesc, nodeid, recursive): addnode = ua.AddNodesItem() addnode.RequestedNewNodeId = nodeid addnode.BrowseName = rdesc.BrowseName addnode.ParentNodeId = parent_nodeid addnode.ReferenceTypeId = rdesc.ReferenceTypeId addnode.TypeDefinition = rdesc.TypeDefinition addnode.NodeClass = rdesc.NodeClass node_to_copy = make_node(server, rdesc.NodeId) attr_obj = getattr(ua, ua.NodeClass(rdesc.NodeClass).name + "Attributes") await _read_and_copy_attrs(node_to_copy, attr_obj(), addnode) res = (await server.add_nodes([addnode]))[0] added_nodes = [res.AddedNodeId] if recursive: descs = await node_to_copy.get_children_descriptions() for desc in descs: nodes = await _copy_node( server, res.AddedNodeId, desc, nodeid=ua.NodeId(NamespaceIndex=desc.NodeId.NamespaceIndex), recursive=True) added_nodes.extend(nodes) return added_nodes
async def read(self, parameters): self.logger.debug("read") request = ua.ReadRequest() request.Parameters = parameters data = await self.protocol.send_request(request) response = struct_from_binary(ua.ReadResponse, data) self.logger.debug(response) response.ResponseHeader.ServiceResult.check() # cast to Enum attributes that need to for idx, rv in enumerate(parameters.NodesToRead): if rv.AttributeId == ua.AttributeIds.NodeClass: dv = response.Results[idx] if dv.StatusCode.is_good(): dv.Value.Value = ua.NodeClass(dv.Value.Value) elif rv.AttributeId == ua.AttributeIds.ValueRank: dv = response.Results[idx] if dv.StatusCode.is_good() and dv.Value.Value in (-3, -2, -1, 0, 1, 2, 3, 4): dv.Value.Value = ua.ValueRank(dv.Value.Value) return response.Results
async def read_node_class(self): """ get node class attribute of node """ result = await self.read_attribute(ua.AttributeIds.NodeClass) return ua.NodeClass(result.Value.Value)