Commit 122b99da authored by Christian Bergmiller's avatar Christian Bergmiller

wip

parent af2d044d
......@@ -515,6 +515,7 @@ class Client(object):
return subscription
def get_namespace_array(self):
"""COROUTINE"""
ns_node = self.get_node(ua.NodeId(ua.ObjectIds.Server_NamespaceArray))
return ns_node.get_value()
......@@ -555,4 +556,5 @@ class Client(object):
return len(uries) - 1
def load_type_definitions(self, nodes=None):
"""COROUTINE"""
return load_type_definitions(self, nodes)
......@@ -247,7 +247,6 @@ class Node:
attributeid is a member of ua.AttributeIds
datavalue is a ua.DataValue object
"""
_logger.info('Node set_attribute %r %r %r', self, attributeid, datavalue)
attr = ua.WriteValue()
attr.NodeId = self.nodeid
attr.AttributeId = attributeid
......
......@@ -236,7 +236,7 @@ from opcua import ua
return
def load_type_definitions(server, nodes=None):
async def load_type_definitions(server, nodes=None):
"""
Download xml from given variable node defining custom structures.
If no node is given, attemps to import variables from all nodes under
......@@ -247,14 +247,14 @@ def load_type_definitions(server, nodes=None):
"""
if nodes is None:
nodes = []
for desc in server.nodes.opc_binary.get_children_descriptions():
for desc in await server.nodes.opc_binary.get_children_descriptions():
if desc.BrowseName != ua.QualifiedName("Opc.Ua"):
nodes.append(server.get_node(desc.NodeId))
structs_dict = {}
generators = []
for node in nodes:
xml = node.get_value()
xml = await node.get_value()
xml = xml.decode("utf-8")
generator = StructGenerator()
generators.append(generator)
......@@ -270,9 +270,9 @@ def load_type_definitions(server, nodes=None):
# register classes
# every children of our node should represent a class
for ndesc in node.get_children_descriptions():
for ndesc in await node.get_children_descriptions():
ndesc_node = server.get_node(ndesc.NodeId)
ref_desc_list = ndesc_node.get_references(refs=ua.ObjectIds.HasDescription, direction=ua.BrowseDirection.Inverse)
ref_desc_list = await ndesc_node.get_references(refs=ua.ObjectIds.HasDescription, direction=ua.BrowseDirection.Inverse)
if ref_desc_list: #some server put extra things here
name = _clean_name(ndesc.BrowseName.Name)
if not name in structs_dict:
......
......@@ -230,7 +230,7 @@ async def get_base_data_type(datatype):
raise ua.UaError("Datatype must be a subtype of builtin types {0!s}".format(datatype))
def get_nodes_of_namespace(server, namespaces=None):
async def get_nodes_of_namespace(server, namespaces=None):
"""
Get the nodes of one or more namespaces .
Args:
......@@ -241,7 +241,7 @@ def get_nodes_of_namespace(server, namespaces=None):
"""
if namespaces is None:
namespaces = []
ns_available = server.get_namespace_array()
ns_available = await server.get_namespace_array()
if not namespaces:
namespaces = ns_available[1:]
......
......@@ -87,7 +87,7 @@ class XmlExporter(object):
addr_idx_to_xml_idx[addr_idx] = xml_idx + 1
return addr_idx_to_xml_idx
def _get_ns_idxs_of_nodes(self, nodes):
async def _get_ns_idxs_of_nodes(self, nodes):
"""
get a list of all indexes used or references by nodes
"""
......@@ -95,7 +95,7 @@ class XmlExporter(object):
for node in nodes:
node_idxs = [node.nodeid.NamespaceIndex]
node_idxs.append(node.get_browse_name().NamespaceIndex)
node_idxs.extend(ref.NodeId.NamespaceIndex for ref in node.get_references())
node_idxs.extend(ref.NodeId.NamespaceIndex for ref in await node.get_references())
node_idxs = list(set(node_idxs)) # remove duplicates
for i in node_idxs:
if i != 0 and i not in idxs:
......@@ -329,8 +329,8 @@ class XmlExporter(object):
# insert behind the namespace element
self.etree.getroot().insert(1, aliases_el)
def _add_ref_els(self, parent_el, obj):
refs = obj.get_references()
async def _add_ref_els(self, parent_el, obj):
refs = await obj.get_references()
refs_el = Et.SubElement(parent_el, 'References')
for ref in refs:
......
......@@ -528,7 +528,7 @@ class Server:
exp.build_etree(nodes)
return exp.write_xml(path)
def export_xml_by_ns(self, path, namespaces=None):
async def export_xml_by_ns(self, path, namespaces=None):
"""
Export nodes of one or more namespaces to an XML file.
Namespaces used by nodes are always exported for consistency.
......@@ -541,7 +541,7 @@ class Server:
"""
if namespaces is None:
namespaces = []
nodes = get_nodes_of_namespace(self, namespaces)
nodes = await get_nodes_of_namespace(self, namespaces)
self.export_xml(nodes, path)
def delete_nodes(self, nodes, recursive=False):
......@@ -618,4 +618,5 @@ class Server:
self.iserver.isession.add_method_callback(node.nodeid, callback)
def load_type_definitions(self, nodes=None):
"""COROUTINE"""
return load_type_definitions(self, nodes)
......@@ -257,7 +257,7 @@ def uawrite():
print(args)
def uals():
async def uals():
parser = argparse.ArgumentParser(description="Browse OPC-UA node and print result")
add_common_args(parser)
parser.add_argument("-l",
......@@ -277,46 +277,46 @@ def uals():
args.long_format = 1
client = Client(args.url, timeout=args.timeout)
client.set_security_string(args.security)
client.connect()
await client.set_security_string(args.security)
await client.connect()
try:
node = get_node(client, args)
print("Browsing node {0} at {1}\n".format(node, args.url))
if args.long_format == 0:
_lsprint_0(node, args.depth - 1)
await _lsprint_0(node, args.depth - 1)
elif args.long_format == 1:
_lsprint_1(node, args.depth - 1)
await _lsprint_1(node, args.depth - 1)
else:
_lsprint_long(node, args.depth - 1)
finally:
client.disconnect()
await client.disconnect()
sys.exit(0)
print(args)
def _lsprint_0(node, depth, indent=""):
async def _lsprint_0(node, depth, indent=""):
if not indent:
print("{0:30} {1:25}".format("DisplayName", "NodeId"))
print("")
for desc in node.get_children_descriptions():
for desc in await node.get_children_descriptions():
print("{0}{1:30} {2:25}".format(indent, desc.DisplayName.to_string(), desc.NodeId.to_string()))
if depth:
_lsprint_0(Node(node.server, desc.NodeId), depth - 1, indent + " ")
await _lsprint_0(Node(node.server, desc.NodeId), depth - 1, indent + " ")
def _lsprint_1(node, depth, indent=""):
async def _lsprint_1(node, depth, indent=""):
if not indent:
print("{0:30} {1:25} {2:25} {3:25}".format("DisplayName", "NodeId", "BrowseName", "Value"))
print("")
for desc in node.get_children_descriptions():
for desc in await node.get_children_descriptions():
if desc.NodeClass == ua.NodeClass.Variable:
val = Node(node.server, desc.NodeId).get_value()
val = await Node(node.server, desc.NodeId).get_value()
print("{0}{1:30} {2!s:25} {3!s:25}, {4!s:3}".format(indent, desc.DisplayName.to_string(), desc.NodeId.to_string(), desc.BrowseName.to_string(), val))
else:
print("{0}{1:30} {2!s:25} {3!s:25}".format(indent, desc.DisplayName.to_string(), desc.NodeId.to_string(), desc.BrowseName.to_string()))
if depth:
_lsprint_1(Node(node.server, desc.NodeId), depth - 1, indent + " ")
await _lsprint_1(Node(node.server, desc.NodeId), depth - 1, indent + " ")
def _lsprint_long(pnode, depth, indent=""):
......
......@@ -90,7 +90,7 @@ class Tests(unittest.TestCase):
@connect
def test_get_namespace_array(self, client):
array = client.get_namespace_array()
array = await client.get_namespace_array()
self.assertTrue(len(array) > 0)
@connect
......
......@@ -119,7 +119,7 @@ async def test_enumstrings_getvalue(server, client):
async def test_custom_enum_struct(server, client):
client.load_type_definitions()
await client.load_type_definitions()
ns = await client.get_namespace_index('http://yourorganisation.org/struct_enum_example/')
myvar = client.get_node(ua.NodeId(6009, ns))
val = await myvar.get_value()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment