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

wip

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