Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
opcua-asyncio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nikola Balog
opcua-asyncio
Commits
4268d685
Commit
4268d685
authored
May 08, 2020
by
oroulet
Committed by
oroulet
May 09, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rename get->read and set->write many places to better follow ua spec
parent
1d3dee64
Changes
35
Hide whitespace changes
Inline
Side-by-side
Showing
35 changed files
with
215 additions
and
215 deletions
+215
-215
asyncua/client/client.py
asyncua/client/client.py
+2
-2
asyncua/client/ua_client.py
asyncua/client/ua_client.py
+4
-4
asyncua/common/copy_node_util.py
asyncua/common/copy_node_util.py
+2
-2
asyncua/common/events.py
asyncua/common/events.py
+3
-3
asyncua/common/node.py
asyncua/common/node.py
+34
-34
asyncua/common/structures.py
asyncua/common/structures.py
+3
-3
asyncua/common/xmlexporter.py
asyncua/common/xmlexporter.py
+24
-24
asyncua/server/address_space.py
asyncua/server/address_space.py
+9
-9
asyncua/server/event_generator.py
asyncua/server/event_generator.py
+2
-2
asyncua/server/history_sql.py
asyncua/server/history_sql.py
+1
-1
asyncua/server/internal_server.py
asyncua/server/internal_server.py
+5
-5
asyncua/server/monitored_item_service.py
asyncua/server/monitored_item_service.py
+4
-4
asyncua/server/server.py
asyncua/server/server.py
+2
-2
asyncua/sync.py
asyncua/sync.py
+6
-6
asyncua/tools.py
asyncua/tools.py
+3
-3
examples/client-example.py
examples/client-example.py
+1
-1
examples/client-minimal-auth.py
examples/client-minimal-auth.py
+4
-4
examples/client-minimal.py
examples/client-minimal.py
+1
-1
examples/client_deleting.py
examples/client_deleting.py
+1
-1
examples/client_to_kepware.py
examples/client_to_kepware.py
+1
-1
examples/server-enum.py
examples/server-enum.py
+1
-1
examples/server-example.py
examples/server-example.py
+2
-2
examples/server-ua-python-mirror.py
examples/server-ua-python-mirror.py
+4
-4
examples/sync/client-example.py
examples/sync/client-example.py
+1
-1
examples/sync/client-minimal.py
examples/sync/client-minimal.py
+1
-1
examples/sync/client_to_prosys.py
examples/sync/client_to_prosys.py
+1
-1
examples/sync/server-example.py
examples/sync/server-example.py
+1
-1
examples/test_perf.py
examples/test_perf.py
+1
-1
test_external_server.py
test_external_server.py
+3
-3
tests/test_client.py
tests/test_client.py
+1
-1
tests/test_common.py
tests/test_common.py
+29
-29
tests/test_custom_structures.py
tests/test_custom_structures.py
+15
-15
tests/test_server.py
tests/test_server.py
+13
-13
tests/test_subscriptions.py
tests/test_subscriptions.py
+2
-2
tests/test_xml.py
tests/test_xml.py
+28
-28
No files found.
asyncua/client/client.py
View file @
4268d685
...
...
@@ -613,7 +613,7 @@ class Client:
Read the value of multiple nodes in one ua call.
"""
nodeids
=
[
node
.
nodeid
for
node
in
nodes
]
results
=
await
self
.
uaclient
.
get
_attributes
(
nodeids
,
ua
.
AttributeIds
.
Value
)
results
=
await
self
.
uaclient
.
read
_attributes
(
nodeids
,
ua
.
AttributeIds
.
Value
)
return
[
result
.
Value
.
Value
for
result
in
results
]
async
def
write_values
(
self
,
nodes
,
values
):
...
...
@@ -622,7 +622,7 @@ class Client:
"""
nodeids
=
[
node
.
nodeid
for
node
in
nodes
]
dvs
=
[
value_to_datavalue
(
val
)
for
val
in
values
]
results
=
await
self
.
uaclient
.
set
_attributes
(
nodeids
,
dvs
,
ua
.
AttributeIds
.
Value
)
results
=
await
self
.
uaclient
.
write
_attributes
(
nodeids
,
dvs
,
ua
.
AttributeIds
.
Value
)
for
result
in
results
:
result
.
check
()
...
...
asyncua/client/ua_client.py
View file @
4268d685
...
...
@@ -651,8 +651,8 @@ class UaClient:
response
.
ResponseHeader
.
ServiceResult
.
check
()
# nothing to return for this service
async
def
get
_attributes
(
self
,
nodeids
,
attr
):
self
.
logger
.
info
(
"
get
_attributes of several nodes"
)
async
def
read
_attributes
(
self
,
nodeids
,
attr
):
self
.
logger
.
info
(
"
read
_attributes of several nodes"
)
request
=
ua
.
ReadRequest
()
for
nodeid
in
nodeids
:
rv
=
ua
.
ReadValueId
()
...
...
@@ -664,12 +664,12 @@ class UaClient:
response
.
ResponseHeader
.
ServiceResult
.
check
()
return
response
.
Results
async
def
set
_attributes
(
self
,
nodeids
,
datavalues
,
attributeid
=
ua
.
AttributeIds
.
Value
):
async
def
write
_attributes
(
self
,
nodeids
,
datavalues
,
attributeid
=
ua
.
AttributeIds
.
Value
):
"""
Set an attribute of multiple nodes
datavalue is a ua.DataValue object
"""
self
.
logger
.
info
(
"
set
_attributes of several nodes"
)
self
.
logger
.
info
(
"
write
_attributes of several nodes"
)
request
=
ua
.
WriteRequest
()
for
idx
,
nodeid
in
enumerate
(
nodeids
):
attr
=
ua
.
WriteValue
()
...
...
asyncua/common/copy_node_util.py
View file @
4268d685
...
...
@@ -41,7 +41,7 @@ async def _copy_node(server, parent_nodeid, rdesc, nodeid, recursive):
async
def
_rdesc_from_node
(
parent
,
node
):
results
=
await
node
.
get
_attributes
([
results
=
await
node
.
read
_attributes
([
ua
.
AttributeIds
.
NodeClass
,
ua
.
AttributeIds
.
BrowseName
,
ua
.
AttributeIds
.
DisplayName
,
])
nclass
,
qname
,
dname
=
[
res
.
Value
.
Value
for
res
in
results
]
...
...
@@ -65,7 +65,7 @@ async def _read_and_copy_attrs(node_type, struct, addnode):
"BodyLength"
,
"TypeId"
,
"SpecifiedAttributes"
,
"Encoding"
,
"IsAbstract"
,
"EventNotifier"
,
)]
attrs
=
[
getattr
(
ua
.
AttributeIds
,
name
)
for
name
in
names
]
results
=
await
node_type
.
get
_attributes
(
attrs
)
results
=
await
node_type
.
read
_attributes
(
attrs
)
for
idx
,
name
in
enumerate
(
names
):
if
results
[
idx
].
StatusCode
.
is_good
():
if
name
==
"Value"
:
...
...
asyncua/common/events.py
View file @
4268d685
...
...
@@ -126,7 +126,7 @@ async def select_clauses_from_evtype(evtypes):
selected_paths
=
[]
for
evtype
in
evtypes
:
for
prop
in
await
get_event_properties_from_type_node
(
evtype
):
browse_name
=
await
prop
.
get
_browse_name
()
browse_name
=
await
prop
.
read
_browse_name
()
if
browse_name
not
in
selected_paths
:
op
=
ua
.
SimpleAttributeOperand
()
op
.
AttributeId
=
ua
.
AttributeIds
.
Value
...
...
@@ -199,8 +199,8 @@ async def get_event_obj_from_type_node(node):
curr_node
=
node
while
curr_node
.
nodeid
.
Identifier
!=
parent_identifier
:
for
prop
in
await
curr_node
.
get_properties
():
name
=
(
await
prop
.
get
_browse_name
()).
Name
val
=
await
prop
.
get
_data_value
()
name
=
(
await
prop
.
read
_browse_name
()).
Name
val
=
await
prop
.
write
_data_value
()
self
.
add_property
(
name
,
val
.
Value
.
Value
,
val
.
Value
.
VariantType
)
parents
=
await
curr_node
.
get_referenced_nodes
(
refs
=
ua
.
ObjectIds
.
HasSubtype
,
direction
=
ua
.
BrowseDirection
.
Inverse
,
includesubtypes
=
True
)
...
...
asyncua/common/node.py
View file @
4268d685
...
...
@@ -77,56 +77,56 @@ class Node:
def
__hash__
(
self
):
return
self
.
nodeid
.
__hash__
()
async
def
get
_browse_name
(
self
):
async
def
read
_browse_name
(
self
):
"""
Get browse name of a node. A browse name is a QualifiedName object
composed of a string(name) and a namespace index.
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
BrowseName
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
BrowseName
)
return
result
.
Value
.
Value
async
def
get
_display_name
(
self
):
async
def
read
_display_name
(
self
):
"""
get description attribute of node
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
DisplayName
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
DisplayName
)
return
result
.
Value
.
Value
async
def
get
_data_type
(
self
):
async
def
read
_data_type
(
self
):
"""
get data type of node as NodeId
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
DataType
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
DataType
)
return
result
.
Value
.
Value
async
def
get
_data_type_as_variant_type
(
self
):
async
def
read
_data_type_as_variant_type
(
self
):
"""
get data type of node as VariantType
This only works if node is a variable, otherwise type
may not be convertible to VariantType
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
DataType
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
DataType
)
return
await
data_type_to_variant_type
(
Node
(
self
.
server
,
result
.
Value
.
Value
))
async
def
get_access_level
(
self
):
"""
Get the access level attribute of the node as a set of AccessLevel enum values.
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
AccessLevel
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
AccessLevel
)
return
ua
.
AccessLevel
.
parse_bitfield
(
result
.
Value
.
Value
)
async
def
get_user_access_level
(
self
):
"""
Get the user access level attribute of the node as a set of AccessLevel enum values.
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
UserAccessLevel
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
UserAccessLevel
)
return
ua
.
AccessLevel
.
parse_bitfield
(
result
.
Value
.
Value
)
async
def
get
_event_notifier
(
self
):
async
def
read
_event_notifier
(
self
):
"""
Get the event notifier attribute of the node as a set of EventNotifier enum values.
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
EventNotifier
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
EventNotifier
)
return
ua
.
EventNotifier
.
parse_bitfield
(
result
.
Value
.
Value
)
async
def
set_event_notifier
(
self
,
values
):
...
...
@@ -136,23 +136,23 @@ class Node:
:param values: an iterable of EventNotifier enum values.
"""
event_notifier_bitfield
=
ua
.
EventNotifier
.
to_bitfield
(
values
)
await
self
.
set
_attribute
(
await
self
.
write
_attribute
(
ua
.
AttributeIds
.
EventNotifier
,
ua
.
DataValue
(
ua
.
Variant
(
event_notifier_bitfield
,
ua
.
VariantType
.
Byte
))
)
async
def
get
_node_class
(
self
):
async
def
read
_node_class
(
self
):
"""
get node class attribute of node
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
NodeClass
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
NodeClass
)
return
result
.
Value
.
Value
async
def
get_description
(
self
):
"""
get description attribute class of node
"""
result
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
Description
)
result
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
Description
)
return
result
.
Value
.
Value
async
def
read_value
(
self
):
...
...
@@ -162,32 +162,32 @@ class Node:
WARNING: on server side, this function returns a ref to object in ua database. Do not modify it if it is a mutable
object unless you know what you are doing
"""
result
=
await
self
.
get
_data_value
()
result
=
await
self
.
write
_data_value
()
return
result
.
Value
.
Value
get_value
=
read_value
# legacy compatibility
async
def
get
_data_value
(
self
):
async
def
write
_data_value
(
self
):
"""
Get value of a node as a DataValue object. Only variables (and properties) have values.
An exception will be generated for other node types.
DataValue contain a variable value as a variant as well as server and source timestamps
"""
return
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
Value
)
return
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
Value
)
async
def
set
_array_dimensions
(
self
,
value
):
async
def
write
_array_dimensions
(
self
,
value
):
"""
Set attribute ArrayDimensions of node
make sure it has the correct data type
"""
v
=
ua
.
Variant
(
value
,
ua
.
VariantType
.
UInt32
)
await
self
.
set
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
,
ua
.
DataValue
(
v
))
await
self
.
write
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
,
ua
.
DataValue
(
v
))
async
def
get
_array_dimensions
(
self
):
async
def
read
_array_dimensions
(
self
):
"""
Read and return ArrayDimensions attribute of node
"""
res
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)
res
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)
return
res
.
Value
.
Value
async
def
write_value_rank
(
self
,
value
):
...
...
@@ -195,13 +195,13 @@ class Node:
Set attribute ArrayDimensions of node
"""
v
=
ua
.
Variant
(
value
,
ua
.
VariantType
.
Int32
)
await
self
.
set
_attribute
(
ua
.
AttributeIds
.
ValueRank
,
ua
.
DataValue
(
v
))
await
self
.
write
_attribute
(
ua
.
AttributeIds
.
ValueRank
,
ua
.
DataValue
(
v
))
async
def
read_value_rank
(
self
):
"""
Read and return ArrayDimensions attribute of node
"""
res
=
await
self
.
get
_attribute
(
ua
.
AttributeIds
.
ValueRank
)
res
=
await
self
.
read
_attribute
(
ua
.
AttributeIds
.
ValueRank
)
return
res
.
Value
.
Value
async
def
write_value
(
self
,
value
,
varianttype
=
None
):
...
...
@@ -218,7 +218,7 @@ class Node:
data change event generated
"""
dv
=
value_to_datavalue
(
value
,
varianttype
)
await
self
.
set
_attribute
(
ua
.
AttributeIds
.
Value
,
dv
)
await
self
.
write
_attribute
(
ua
.
AttributeIds
.
Value
,
dv
)
set_data_value
=
write_value
# legacy compatibility
set_value
=
write_value
# legacy compatibility
...
...
@@ -236,14 +236,14 @@ class Node:
await
self
.
unset_attr_bit
(
ua
.
AttributeIds
.
UserAccessLevel
,
ua
.
AccessLevel
.
CurrentWrite
)
async
def
set_attr_bit
(
self
,
attr
,
bit
):
val
=
await
self
.
get
_attribute
(
attr
)
val
=
await
self
.
read
_attribute
(
attr
)
val
.
Value
.
Value
=
ua
.
ua_binary
.
set_bit
(
val
.
Value
.
Value
,
bit
)
await
self
.
set
_attribute
(
attr
,
val
)
await
self
.
write
_attribute
(
attr
,
val
)
async
def
unset_attr_bit
(
self
,
attr
,
bit
):
val
=
await
self
.
get
_attribute
(
attr
)
val
=
await
self
.
read
_attribute
(
attr
)
val
.
Value
.
Value
=
ua
.
ua_binary
.
unset_bit
(
val
.
Value
.
Value
,
bit
)
await
self
.
set
_attribute
(
attr
,
val
)
await
self
.
write
_attribute
(
attr
,
val
)
def
set_read_only
(
self
):
"""
...
...
@@ -252,7 +252,7 @@ class Node:
"""
return
self
.
set_writable
(
False
)
async
def
set
_attribute
(
self
,
attributeid
,
datavalue
):
async
def
write
_attribute
(
self
,
attributeid
,
datavalue
):
"""
Set an attribute of a node
attributeid is a member of ua.AttributeIds
...
...
@@ -267,7 +267,7 @@ class Node:
result
=
await
self
.
server
.
write
(
params
)
result
[
0
].
check
()
async
def
get
_attribute
(
self
,
attr
):
async
def
read
_attribute
(
self
,
attr
):
"""
Read one attribute of a node
result code from server is checked and an exception is raised in case of error
...
...
@@ -281,7 +281,7 @@ class Node:
result
[
0
].
StatusCode
.
check
()
return
result
[
0
]
async
def
get
_attributes
(
self
,
attrs
):
async
def
read
_attributes
(
self
,
attrs
):
"""
Read several attributes of a node
list of DataValue is returned
...
...
@@ -424,7 +424,7 @@ class Node:
path
=
[
Node
(
self
.
server
,
ref
.
NodeId
)
for
ref
in
path
]
path
.
append
(
self
)
if
as_string
:
path
=
[(
await
el
.
get
_browse_name
()).
to_string
()
for
el
in
path
]
path
=
[(
await
el
.
read
_browse_name
()).
to_string
()
for
el
in
path
]
return
path
async
def
_get_path
(
self
,
max_length
=
20
):
...
...
asyncua/common/structures.py
View file @
4268d685
...
...
@@ -239,10 +239,10 @@ async def load_type_definitions(server, nodes=None):
# generate and execute new code on the fly
generator
.
get_python_classes
(
structs_dict
)
# same but using a file that is imported. This can be usefull for debugging library
# name = node.
get
_browse_name().Name
# name = node.
read
_browse_name().Name
# Make sure structure names do not contain charaters that cannot be used in Python class file names
# name = _clean_name(name)
# name = "structures_" + node.
get
_browse_name().Name
# name = "structures_" + node.
read
_browse_name().Name
# generator.save_and_import(name + ".py", append_to=structs_dict)
# register classes
...
...
@@ -313,7 +313,7 @@ async def load_enums(server, env=None):
if env is None:
env = ua.__dict__
for node in nodes:
name = (await node.
get
_browse_name()).Name
name = (await node.
read
_browse_name()).Name
try:
c = await _get_enum_strings(name, node)
except ua.UaError as ex:
...
...
asyncua/common/xmlexporter.py
View file @
4268d685
...
...
@@ -36,13 +36,13 @@ class XmlExporter:
self
.
aliases
=
{}
self
.
_addr_idx_to_xml_idx
=
{}
node_
set
_attributes
=
OrderedDict
()
node_
set
_attributes
[
'xmlns:xsi'
]
=
'http://www.w3.org/2001/XMLSchema-instance'
node_
set
_attributes
[
'xmlns:uax'
]
=
'http://opcfoundation.org/UA/2008/02/Types.xsd'
node_
set
_attributes
[
'xmlns:xsd'
]
=
'http://www.w3.org/2001/XMLSchema'
node_
set
_attributes
[
'xmlns'
]
=
'http://opcfoundation.org/UA/2011/03/UANodeSet.xsd'
node_
write
_attributes
=
OrderedDict
()
node_
write
_attributes
[
'xmlns:xsi'
]
=
'http://www.w3.org/2001/XMLSchema-instance'
node_
write
_attributes
[
'xmlns:uax'
]
=
'http://opcfoundation.org/UA/2008/02/Types.xsd'
node_
write
_attributes
[
'xmlns:xsd'
]
=
'http://www.w3.org/2001/XMLSchema'
node_
write
_attributes
[
'xmlns'
]
=
'http://opcfoundation.org/UA/2011/03/UANodeSet.xsd'
self
.
etree
=
Et
.
ElementTree
(
Et
.
Element
(
'UANodeSet'
,
node_
set
_attributes
))
self
.
etree
=
Et
.
ElementTree
(
Et
.
Element
(
'UANodeSet'
,
node_
write
_attributes
))
async
def
build_etree
(
self
,
node_list
,
uris
=
None
):
"""
...
...
@@ -91,7 +91,7 @@ class XmlExporter:
for
node
in
nodes
:
node_idxs
=
[
node
.
nodeid
.
NamespaceIndex
]
try
:
node_idxs
.
append
((
await
node
.
get
_browse_name
()).
NamespaceIndex
)
node_idxs
.
append
((
await
node
.
read
_browse_name
()).
NamespaceIndex
)
except
UaError
:
self
.
logger
.
exception
(
"Error retrieving browse name of node %s"
,
node
)
raise
...
...
@@ -141,7 +141,7 @@ class XmlExporter:
Returns:
"""
node_class
=
await
node
.
get
_node_class
()
node_class
=
await
node
.
read
_node_class
()
if
node_class
is
ua
.
NodeClass
.
Object
:
await
self
.
add_etree_object
(
node
)
...
...
@@ -181,10 +181,10 @@ class XmlExporter:
return
bname
.
to_string
()
async
def
_add_node_common
(
self
,
nodetype
,
node
):
browsename
=
await
node
.
get
_browse_name
()
browsename
=
await
node
.
read
_browse_name
()
nodeid
=
node
.
nodeid
parent
=
await
node
.
get_parent
()
displayname
=
(
await
node
.
get
_display_name
()).
Text
displayname
=
(
await
node
.
read
_display_name
()).
Text
desc
=
await
node
.
get_description
()
if
desc
:
desc
=
desc
.
Text
...
...
@@ -192,7 +192,7 @@ class XmlExporter:
node_el
.
attrib
[
"NodeId"
]
=
self
.
_node_to_string
(
nodeid
)
node_el
.
attrib
[
"BrowseName"
]
=
self
.
_bname_to_string
(
browsename
)
if
parent
is
not
None
:
node_class
=
await
node
.
get
_node_class
()
node_class
=
await
node
.
read
_node_class
()
if
node_class
in
(
ua
.
NodeClass
.
Object
,
ua
.
NodeClass
.
Variable
,
ua
.
NodeClass
.
Method
):
node_el
.
attrib
[
"ParentNodeId"
]
=
self
.
_node_to_string
(
parent
)
self
.
_add_sub_el
(
node_el
,
'DisplayName'
,
displayname
)
...
...
@@ -206,7 +206,7 @@ class XmlExporter:
Add a UA object element to the XML etree
"""
obj_el
=
await
self
.
_add_node_common
(
"UAObject"
,
node
)
var
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
EventNotifier
)
var
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
EventNotifier
)
if
var
.
Value
.
Value
!=
0
:
obj_el
.
attrib
[
"EventNotifier"
]
=
str
(
var
.
Value
.
Value
)
await
self
.
_add_ref_els
(
obj_el
,
node
)
...
...
@@ -216,13 +216,13 @@ class XmlExporter:
Add a UA object type element to the XML etree
"""
obj_el
=
await
self
.
_add_node_common
(
"UAObjectType"
,
node
)
abstract
=
(
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
IsAbstract
)).
Value
.
Value
abstract
=
(
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
IsAbstract
)).
Value
.
Value
if
abstract
:
obj_el
.
attrib
[
"IsAbstract"
]
=
'true'
await
self
.
_add_ref_els
(
obj_el
,
node
)
async
def
add_variable_common
(
self
,
node
,
el
):
dtype
=
await
node
.
get
_data_type
()
dtype
=
await
node
.
read
_data_type
()
if
dtype
.
NamespaceIndex
==
0
and
dtype
.
Identifier
in
o_ids
.
ObjectIdNames
:
dtype_name
=
o_ids
.
ObjectIdNames
[
dtype
.
Identifier
]
self
.
aliases
[
dtype
]
=
dtype_name
...
...
@@ -231,7 +231,7 @@ class XmlExporter:
rank
=
await
node
.
read_value_rank
()
if
rank
!=
-
1
:
el
.
attrib
[
"ValueRank"
]
=
str
(
int
(
rank
))
dim
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)
dim
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)
if
dim
.
Value
.
Value
:
el
.
attrib
[
"ArrayDimensions"
]
=
","
.
join
([
str
(
i
)
for
i
in
dim
.
Value
.
Value
])
el
.
attrib
[
"DataType"
]
=
dtype_name
...
...
@@ -245,8 +245,8 @@ class XmlExporter:
await
self
.
_add_ref_els
(
var_el
,
node
)
await
self
.
add_variable_common
(
node
,
var_el
)
accesslevel
=
(
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
AccessLevel
)).
Value
.
Value
useraccesslevel
=
(
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
UserAccessLevel
)).
Value
.
Value
accesslevel
=
(
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
AccessLevel
)).
Value
.
Value
useraccesslevel
=
(
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
UserAccessLevel
)).
Value
.
Value
# We only write these values if they are different from defaults
# Not sure where default is defined....
...
...
@@ -255,10 +255,10 @@ class XmlExporter:
if
useraccesslevel
not
in
(
0
,
ua
.
AccessLevel
.
CurrentRead
.
mask
):
var_el
.
attrib
[
"UserAccessLevel"
]
=
str
(
useraccesslevel
)
var
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
MinimumSamplingInterval
)
var
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
MinimumSamplingInterval
)
if
var
.
Value
.
Value
:
var_el
.
attrib
[
"MinimumSamplingInterval"
]
=
str
(
var
.
Value
.
Value
)
var
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
Historizing
)
var
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
Historizing
)
if
var
.
Value
.
Value
:
var_el
.
attrib
[
"Historizing"
]
=
'true'
...
...
@@ -268,17 +268,17 @@ class XmlExporter:
"""
var_el
=
await
self
.
_add_node_common
(
"UAVariableType"
,
node
)
await
self
.
add_variable_common
(
node
,
var_el
)
abstract
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
IsAbstract
)
abstract
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
IsAbstract
)
if
abstract
.
Value
.
Value
:
var_el
.
attrib
[
"IsAbstract"
]
=
"true"
await
self
.
_add_ref_els
(
var_el
,
node
)
async
def
add_etree_method
(
self
,
node
):
obj_el
=
await
self
.
_add_node_common
(
"UAMethod"
,
node
)
var
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
Executable
)
var
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
Executable
)
if
var
.
Value
.
Value
is
False
:
obj_el
.
attrib
[
"Executable"
]
=
"false"
var
=
await
node
.
get
_attribute
(
ua
.
AttributeIds
.
UserExecutable
)
var
=
await
node
.
read
_attribute
(
ua
.
AttributeIds
.
UserExecutable
)
if
var
.
Value
.
Value
is
False
:
obj_el
.
attrib
[
"UserExecutable"
]
=
"false"
await
self
.
_add_ref_els
(
obj_el
,
node
)
...
...
@@ -286,7 +286,7 @@ class XmlExporter:
async
def
add_etree_reference_type
(
self
,
obj
):
obj_el
=
await
self
.
_add_node_common
(
"UAReferenceType"
,
obj
)
await
self
.
_add_ref_els
(
obj_el
,
obj
)
var
=
await
obj
.
get
_attribute
(
ua
.
AttributeIds
.
InverseName
)
var
=
await
obj
.
read
_attribute
(
ua
.
AttributeIds
.
InverseName
)
if
var
is
not
None
and
var
.
Value
.
Value
is
not
None
and
var
.
Value
.
Value
.
Text
is
not
None
:
self
.
_add_sub_el
(
obj_el
,
'InverseName'
,
var
.
Value
.
Value
.
Text
)
...
...
@@ -364,7 +364,7 @@ class XmlExporter:
await
self
.
member_to_etree
(
el
,
name
,
ua
.
NodeId
(
getattr
(
ua
.
ObjectIds
,
vtype
)),
getattr
(
val
,
name
))
async
def
value_to_etree
(
self
,
el
,
dtype_name
,
dtype
,
node
):
var
=
(
await
node
.
get
_data_value
()).
Value
var
=
(
await
node
.
write
_data_value
()).
Value
if
var
.
Value
is
not
None
:
val_el
=
Et
.
SubElement
(
el
,
'Value'
)
await
self
.
_value_to_etree
(
val_el
,
dtype_name
,
dtype
,
var
.
Value
)
...
...
asyncua/server/address_space.py
View file @
4268d685
...
...
@@ -50,7 +50,7 @@ class AttributeService:
#self.logger.debug("read %s", params)
res
=
[]
for
readvalue
in
params
.
NodesToRead
:
res
.
append
(
self
.
_aspace
.
get
_attribute_value
(
readvalue
.
NodeId
,
readvalue
.
AttributeId
))
res
.
append
(
self
.
_aspace
.
read
_attribute_value
(
readvalue
.
NodeId
,
readvalue
.
AttributeId
))
return
res
def
write
(
self
,
params
,
user
=
User
.
Admin
):
...
...
@@ -61,14 +61,14 @@ class AttributeService:
if
writevalue
.
AttributeId
!=
ua
.
AttributeIds
.
Value
:
res
.
append
(
ua
.
StatusCode
(
ua
.
StatusCodes
.
BadUserAccessDenied
))
continue
al
=
self
.
_aspace
.
get
_attribute_value
(
writevalue
.
NodeId
,
ua
.
AttributeIds
.
AccessLevel
)
ual
=
self
.
_aspace
.
get
_attribute_value
(
writevalue
.
NodeId
,
ua
.
AttributeIds
.
UserAccessLevel
)
al
=
self
.
_aspace
.
read
_attribute_value
(
writevalue
.
NodeId
,
ua
.
AttributeIds
.
AccessLevel
)
ual
=
self
.
_aspace
.
read
_attribute_value
(
writevalue
.
NodeId
,
ua
.
AttributeIds
.
UserAccessLevel
)
if
not
al
.
StatusCode
.
is_good
()
or
not
ua
.
ua_binary
.
test_bit
(
al
.
Value
.
Value
,
ua
.
AccessLevel
.
CurrentWrite
)
or
not
ua
.
ua_binary
.
test_bit
(
ual
.
Value
.
Value
,
ua
.
AccessLevel
.
CurrentWrite
):
res
.
append
(
ua
.
StatusCode
(
ua
.
StatusCodes
.
BadUserAccessDenied
))
continue
res
.
append
(
self
.
_aspace
.
set
_attribute_value
(
writevalue
.
NodeId
,
writevalue
.
AttributeId
,
writevalue
.
Value
))
res
.
append
(
self
.
_aspace
.
write
_attribute_value
(
writevalue
.
NodeId
,
writevalue
.
AttributeId
,
writevalue
.
Value
))
return
res
...
...
@@ -382,14 +382,14 @@ class NodeManagementService:
rdesc
.
IsForward
=
addref
.
IsForward
rdesc
.
NodeId
=
addref
.
TargetNodeId
if
addref
.
TargetNodeClass
==
ua
.
NodeClass
.
Unspecified
:
rdesc
.
NodeClass
=
self
.
_aspace
.
get
_attribute_value
(
rdesc
.
NodeClass
=
self
.
_aspace
.
read
_attribute_value
(
addref
.
TargetNodeId
,
ua
.
AttributeIds
.
NodeClass
).
Value
.
Value
else
:
rdesc
.
NodeClass
=
addref
.
TargetNodeClass
bname
=
self
.
_aspace
.
get
_attribute_value
(
addref
.
TargetNodeId
,
ua
.
AttributeIds
.
BrowseName
).
Value
.
Value
bname
=
self
.
_aspace
.
read
_attribute_value
(
addref
.
TargetNodeId
,
ua
.
AttributeIds
.
BrowseName
).
Value
.
Value
if
bname
:
rdesc
.
BrowseName
=
bname
dname
=
self
.
_aspace
.
get
_attribute_value
(
addref
.
TargetNodeId
,
ua
.
AttributeIds
.
DisplayName
).
Value
.
Value
dname
=
self
.
_aspace
.
read
_attribute_value
(
addref
.
TargetNodeId
,
ua
.
AttributeIds
.
DisplayName
).
Value
.
Value
if
dname
:
rdesc
.
DisplayName
=
dname
return
self
.
_add_unique_reference
(
sourcedata
,
rdesc
)
...
...
@@ -655,7 +655,7 @@ class AddressSpace:
self
.
_nodes
=
LazyLoadingDict
(
shelve
.
open
(
path
,
"r"
))
def
get
_attribute_value
(
self
,
nodeid
,
attr
):
def
read
_attribute_value
(
self
,
nodeid
,
attr
):
# self.logger.debug("get attr val: %s %s", nodeid, attr)
if
nodeid
not
in
self
.
_nodes
:
dv
=
ua
.
DataValue
()
...
...
@@ -671,7 +671,7 @@ class AddressSpace:
return
attval
.
value_callback
()
return
attval
.
value
def
set
_attribute_value
(
self
,
nodeid
,
attr
,
value
):
def
write
_attribute_value
(
self
,
nodeid
,
attr
,
value
):
# self.logger.debug("set attr val: %s %s %s", nodeid, attr, value)
node
=
self
.
_nodes
.
get
(
nodeid
,
None
)
if
node
is
None
:
...
...
asyncua/server/event_generator.py
View file @
4268d685
...
...
@@ -53,7 +53,7 @@ class EventGenerator:
if
not
self
.
event
.
SourceNode
:
self
.
event
.
SourceNode
=
emitting_node
.
nodeid
if
not
self
.
event
.
SourceName
:
self
.
event
.
SourceName
=
(
await
Node
(
self
.
isession
,
self
.
event
.
SourceNode
).
get
_browse_name
()).
Name
self
.
event
.
SourceName
=
(
await
Node
(
self
.
isession
,
self
.
event
.
SourceNode
).
read
_browse_name
()).
Name
await
emitting_node
.
set_event_notifier
([
ua
.
EventNotifier
.
SubscribeToEvents
])
refs
=
[]
...
...
@@ -98,6 +98,6 @@ class EventGenerator:
if
message
:
self
.
event
.
Message
=
ua
.
LocalizedText
(
message
)
elif
not
self
.
event
.
Message
:
self
.
event
.
Message
=
ua
.
LocalizedText
(
Node
(
self
.
isession
,
self
.
event
.
SourceNode
).
get
_browse_name
().
Text
)
self
.
event
.
Message
=
ua
.
LocalizedText
(
Node
(
self
.
isession
,
self
.
event
.
SourceNode
).
read
_browse_name
().
Text
)
self
.
isession
.
subscription_service
.
trigger_event
(
self
.
event
)
asyncua/server/history_sql.py
View file @
4268d685
...
...
@@ -204,7 +204,7 @@ class HistorySQLite(HistoryStorageInterface):
ev_aggregate_fields
.
extend
((
await
get_event_properties_from_type_node
(
event_type
)))
ev_fields
=
[]
for
field
in
set
(
ev_aggregate_fields
):
ev_fields
.
append
((
await
field
.
get
_display_name
()).
Text
)
ev_fields
.
append
((
await
field
.
read
_display_name
()).
Text
)
return
ev_fields
@
staticmethod
...
...
asyncua/server/internal_server.py
View file @
4268d685
...
...
@@ -235,7 +235,7 @@ class InternalServer:
"""
Set attribute Historizing of node to True and start storing data for history
"""
await
node
.
set
_attribute
(
ua
.
AttributeIds
.
Historizing
,
ua
.
DataValue
(
True
))
await
node
.
write
_attribute
(
ua
.
AttributeIds
.
Historizing
,
ua
.
DataValue
(
True
))
await
node
.
set_attr_bit
(
ua
.
AttributeIds
.
AccessLevel
,
ua
.
AccessLevel
.
HistoryRead
)
await
node
.
set_attr_bit
(
ua
.
AttributeIds
.
UserAccessLevel
,
ua
.
AccessLevel
.
HistoryRead
)
await
self
.
history_manager
.
historize_data_change
(
node
,
period
,
count
)
...
...
@@ -244,7 +244,7 @@ class InternalServer:
"""
Set attribute Historizing of node to False and stop storing data for history
"""
await
node
.
set
_attribute
(
ua
.
AttributeIds
.
Historizing
,
ua
.
DataValue
(
False
))
await
node
.
write
_attribute
(
ua
.
AttributeIds
.
Historizing
,
ua
.
DataValue
(
False
))
await
node
.
unset_attr_bit
(
ua
.
AttributeIds
.
AccessLevel
,
ua
.
AccessLevel
.
HistoryRead
)
await
node
.
unset_attr_bit
(
ua
.
AttributeIds
.
UserAccessLevel
,
ua
.
AccessLevel
.
HistoryRead
)
await
self
.
history_manager
.
dehistorize
(
node
)
...
...
@@ -253,7 +253,7 @@ class InternalServer:
"""
Set attribute History Read of object events to True and start storing data for history
"""
event_notifier
=
await
source
.
get
_event_notifier
()
event_notifier
=
await
source
.
read
_event_notifier
()
if
ua
.
EventNotifier
.
SubscribeToEvents
not
in
event_notifier
:
raise
ua
.
UaError
(
'Node does not generate events'
,
event_notifier
)
if
ua
.
EventNotifier
.
HistoryRead
not
in
event_notifier
:
...
...
@@ -280,12 +280,12 @@ class InternalServer:
"""
self
.
server_callback_dispatcher
.
removeListener
(
event
,
handle
)
def
set
_attribute_value
(
self
,
nodeid
,
datavalue
,
attr
=
ua
.
AttributeIds
.
Value
):
def
write
_attribute_value
(
self
,
nodeid
,
datavalue
,
attr
=
ua
.
AttributeIds
.
Value
):
"""
directly write datavalue to the Attribute, bypassing some checks and structure creation
so it is a little faster
"""
self
.
aspace
.
set
_attribute_value
(
nodeid
,
attr
,
datavalue
)
self
.
aspace
.
write
_attribute_value
(
nodeid
,
attr
,
datavalue
)
def
set_user_manager
(
self
,
user_manager
):
"""
...
...
asyncua/server/monitored_item_service.py
View file @
4268d685
...
...
@@ -74,7 +74,7 @@ class MonitoredItemService:
def
trigger_datachange
(
self
,
handle
,
nodeid
,
attr
):
self
.
logger
.
debug
(
"triggering datachange for handle %s, nodeid %s, and attribute %s"
,
handle
,
nodeid
,
attr
)
dv
=
self
.
aspace
.
get
_attribute_value
(
nodeid
,
attr
)
dv
=
self
.
aspace
.
read
_attribute_value
(
nodeid
,
attr
)
self
.
datachange_callback
(
handle
,
dv
)
def
_modify_monitored_item
(
self
,
params
:
ua
.
MonitoredItemModifyRequest
):
...
...
@@ -115,7 +115,7 @@ class MonitoredItemService:
params
.
ItemToMonitor
.
AttributeId
)
result
,
mdata
=
self
.
_make_monitored_item_common
(
params
)
ev_notify_byte
=
self
.
aspace
.
get
_attribute_value
(
params
.
ItemToMonitor
.
NodeId
,
ev_notify_byte
=
self
.
aspace
.
read
_attribute_value
(
params
.
ItemToMonitor
.
NodeId
,
ua
.
AttributeIds
.
EventNotifier
).
Value
.
Value
if
ev_notify_byte
is
None
or
not
ua
.
ua_binary
.
test_bit
(
ev_notify_byte
,
ua
.
EventNotifier
.
SubscribeToEvents
):
...
...
@@ -297,14 +297,14 @@ class WhereClauseEvaluator:
if
isinstance
(
op
,
ua
.
AttributeOperand
):
if
op
.
BrowsePath
:
return
getattr
(
event
,
op
.
BrowsePath
.
Elements
[
0
].
TargetName
.
Name
)
return
self
.
_aspace
.
get
_attribute_value
(
event
.
EventType
,
op
.
AttributeId
).
Value
.
Value
return
self
.
_aspace
.
read
_attribute_value
(
event
.
EventType
,
op
.
AttributeId
).
Value
.
Value
# FIXME: check, this is probably broken
if
isinstance
(
op
,
ua
.
SimpleAttributeOperand
):
if
op
.
BrowsePath
:
# we only support depth of 1
return
getattr
(
event
,
op
.
BrowsePath
[
0
].
Name
)
# TODO: write code for index range.... but doe it make any sense
return
self
.
_aspace
.
get
_attribute_value
(
event
.
EventType
,
op
.
AttributeId
).
Value
.
Value
return
self
.
_aspace
.
read
_attribute_value
(
event
.
EventType
,
op
.
AttributeId
).
Value
.
Value
if
isinstance
(
op
,
ua
.
LiteralOperand
):
return
op
.
Value
.
Value
self
.
logger
.
warning
(
"Where clause element % is not of a known type"
,
op
)
...
...
asyncua/server/server.py
View file @
4268d685
...
...
@@ -622,9 +622,9 @@ class Server:
"""
return
load_enums
(
self
)
def
set
_attribute_value
(
self
,
nodeid
,
datavalue
,
attr
=
ua
.
AttributeIds
.
Value
):
def
write
_attribute_value
(
self
,
nodeid
,
datavalue
,
attr
=
ua
.
AttributeIds
.
Value
):
"""
directly write datavalue to the Attribute, bypasing some checks and structure creation
so it is a little faster
"""
return
self
.
iserver
.
set
_attribute_value
(
nodeid
,
datavalue
,
attr
)
return
self
.
iserver
.
write
_attribute_value
(
nodeid
,
datavalue
,
attr
)
asyncua/sync.py
View file @
4268d685
...
...
@@ -236,8 +236,8 @@ class Server:
def
load_type_definitions
(
self
):
pass
def
set
_attribute_value
(
self
,
nodeid
,
datavalue
,
attr
=
ua
.
AttributeIds
.
Value
):
return
self
.
aio_obj
.
set
_attribute_value
(
nodeid
,
datavalue
,
attr
)
def
write
_attribute_value
(
self
,
nodeid
,
datavalue
,
attr
=
ua
.
AttributeIds
.
Value
):
return
self
.
aio_obj
.
write
_attribute_value
(
nodeid
,
datavalue
,
attr
)
class
EventGenerator
:
...
...
@@ -276,11 +276,11 @@ class Node:
return
self
.
aio_obj
.
nodeid
@
syncmethod
def
get
_browse_name
(
self
):
def
read
_browse_name
(
self
):
pass
@
syncmethod
def
get
_display_name
(
self
):
def
read
_display_name
(
self
):
pass
@
syncmethod
...
...
@@ -373,11 +373,11 @@ class Node:
pass
@
syncmethod
def
get
_node_class
(
self
):
def
read
_node_class
(
self
):
pass
@
syncmethod
def
get
_attributes
(
self
):
def
read
_attributes
(
self
):
pass
class
Subscription
:
...
...
asyncua/tools.py
View file @
4268d685
...
...
@@ -138,7 +138,7 @@ async def _uaread():
try
:
node
=
await
get_node
(
client
,
args
)
attr
=
await
node
.
get
_attribute
(
args
.
attribute
)
attr
=
await
node
.
read
_attribute
(
args
.
attribute
)
if
args
.
datatype
==
"python"
:
print
(
attr
.
Value
.
Value
)
elif
args
.
datatype
==
"variant"
:
...
...
@@ -282,7 +282,7 @@ async def _uawrite():
try
:
node
=
await
get_node
(
client
,
args
)
val
=
_val_to_variant
(
args
.
value
,
args
)
await
node
.
set
_attribute
(
args
.
attribute
,
ua
.
DataValue
(
val
))
await
node
.
write
_attribute
(
args
.
attribute
,
ua
.
DataValue
(
val
))
finally
:
await
client
.
disconnect
()
...
...
@@ -359,7 +359,7 @@ def _lsprint_long(pnode, depth, indent=""):
print
(
"{0:30} {1:25} {2:25} {3:10} {4:30} {5:25}"
.
format
(
"DisplayName"
,
"NodeId"
,
"BrowseName"
,
"DataType"
,
"Timestamp"
,
"Value"
))
print
(
""
)
for
node
in
pnode
.
get_children
():
attrs
=
node
.
get
_attributes
([
ua
.
AttributeIds
.
DisplayName
,
attrs
=
node
.
read
_attributes
([
ua
.
AttributeIds
.
DisplayName
,
ua
.
AttributeIds
.
BrowseName
,
ua
.
AttributeIds
.
NodeClass
,
ua
.
AttributeIds
.
WriteMask
,
...
...
examples/client-example.py
View file @
4268d685
...
...
@@ -41,7 +41,7 @@ async def main():
#var = client.get_node(ua.NodeId(1002, 2))
#var = client.get_node("ns=3;i=2002")
#print(var)
#var.
get
_data_value() # get value of node as a DataValue object
#var.
write
_data_value() # get value of node as a DataValue object
#var.read_value() # get value of node as a python builtin
#var.write_value(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type
#var.write_value(3.9) # set node value using implicit data type
...
...
examples/client-minimal-auth.py
View file @
4268d685
...
...
@@ -10,10 +10,10 @@ async def browse_nodes(node: Node):
"""
Build a nested node tree dict by recursion (filtered by OPC UA objects and variables).
"""
node_class
=
await
node
.
get
_node_class
()
node_class
=
await
node
.
read
_node_class
()
children
=
[]
for
child
in
await
node
.
get_children
():
if
await
child
.
get
_node_class
()
in
[
ua
.
NodeClass
.
Object
,
ua
.
NodeClass
.
Variable
]:
if
await
child
.
read
_node_class
()
in
[
ua
.
NodeClass
.
Object
,
ua
.
NodeClass
.
Variable
]:
children
.
append
(
await
browse_nodes
(
child
)
)
...
...
@@ -21,13 +21,13 @@ async def browse_nodes(node: Node):
var_type
=
None
else
:
try
:
var_type
=
(
await
node
.
get
_data_type_as_variant_type
()).
value
var_type
=
(
await
node
.
read
_data_type_as_variant_type
()).
value
except
ua
.
UaError
:
_logger
.
warning
(
'Node Variable Type could not be determined for %r'
,
node
)
var_type
=
None
return
{
'id'
:
node
.
nodeid
.
to_string
(),
'name'
:
(
await
node
.
get
_display_name
()).
Text
,
'name'
:
(
await
node
.
read
_display_name
()).
Text
,
'cls'
:
node_class
.
value
,
'children'
:
children
,
'type'
:
var_type
,
...
...
examples/client-minimal.py
View file @
4268d685
...
...
@@ -27,7 +27,7 @@ async def main():
var
=
await
root
.
get_child
([
"0:Objects"
,
f"
{
idx
}
:MyObject"
,
f"
{
idx
}
:MyVariable"
])
print
(
"My variable"
,
var
,
await
var
.
read_value
())
# print(var)
# var.
get
_data_value() # get value of node as a DataValue object
# var.
write
_data_value() # get value of node as a DataValue object
# var.read_value() # get value of node as a python builtin
# var.write_value(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type
# var.write_value(3.9) # set node value using implicit data type
...
...
examples/client_deleting.py
View file @
4268d685
...
...
@@ -22,7 +22,7 @@ if __name__ == "__main__":
results
=
client
.
delete_nodes
([
folder
,
var
])
try
:
#var.write_value(9.89) # just to check it does not work
var
.
get
_browse_name
()
var
.
read
_browse_name
()
except
ua
.
UaStatusCodeError
:
print
(
"The variable has been removed OK"
)
...
...
examples/client_to_kepware.py
View file @
4268d685
...
...
@@ -29,7 +29,7 @@ if __name__ == "__main__":
root
=
client
.
get_root_node
()
print
(
"Root is"
,
root
)
print
(
"childs of root are: "
,
root
.
get_children
())
print
(
"name of root is"
,
root
.
get
_browse_name
())
print
(
"name of root is"
,
root
.
read
_browse_name
())
objects
=
client
.
get_objects_node
()
print
(
"childs og objects are: "
,
objects
.
get_children
())
...
...
examples/server-enum.py
View file @
4268d685
...
...
@@ -67,7 +67,7 @@ if __name__ == "__main__":
es
=
myenum_type
.
add_property
(
0
,
"EnumStrings"
,
enum_to_stringlist
(
MyEnum
))
es
.
write_value_rank
(
1
)
es
.
set
_array_dimensions
([
0
])
es
.
write
_array_dimensions
([
0
])
# --------------------------------------------------------
# create object with enum variable
...
...
examples/server-example.py
View file @
4268d685
...
...
@@ -124,10 +124,10 @@ async def main():
await
myarrayvar
.
write_value
(
var
)
await
mydevice_var
.
write_value
(
"Running"
)
myevgen
.
trigger
(
message
=
"This is BaseEvent"
)
server
.
set
_attribute_value
(
myvar
.
nodeid
,
ua
.
DataValue
(
0.9
))
# Server side write method which is a bit faster than using write_value
server
.
write
_attribute_value
(
myvar
.
nodeid
,
ua
.
DataValue
(
0.9
))
# Server side write method which is a bit faster than using write_value
while
True
:
await
asyncio
.
sleep
(
0.1
)
server
.
set
_attribute_value
(
myvar
.
nodeid
,
ua
.
DataValue
(
sin
(
time
.
time
())))
server
.
write
_attribute_value
(
myvar
.
nodeid
,
ua
.
DataValue
(
sin
(
time
.
time
())))
finally
:
...
...
examples/server-ua-python-mirror.py
View file @
4268d685
...
...
@@ -29,7 +29,7 @@ class SubHandler(object):
def
datachange_notification
(
self
,
node
,
val
,
data
):
# print("Python: New data change event", node, val, data)
_node_name
=
node
.
get
_browse_name
()
_node_name
=
node
.
read
_browse_name
()
setattr
(
self
.
obj
,
_node_name
.
Name
,
data
.
monitored_item
.
Value
.
Value
.
Value
)
...
...
@@ -42,11 +42,11 @@ class UaObject(object):
def
__init__
(
self
,
asyncua_server
,
ua_node
):
self
.
asyncua_server
=
asyncua_server
self
.
nodes
=
{}
self
.
b_name
=
ua_node
.
get
_browse_name
().
Name
self
.
b_name
=
ua_node
.
read
_browse_name
().
Name
# keep track of the children of this object (in case python needs to write, or get more info from UA server)
for
_child
in
ua_node
.
get_children
():
_child_name
=
_child
.
get
_browse_name
()
_child_name
=
_child
.
read
_browse_name
()
self
.
nodes
[
_child_name
.
Name
]
=
_child
# find all children which can be subscribed to (python object is kept up to date via subscription)
...
...
@@ -62,7 +62,7 @@ class UaObject(object):
# if a specific attr isn't passed to write, write all OPC UA children
if
attr
is
None
:
for
k
,
node
in
self
.
nodes
.
items
():
node_class
=
node
.
get
_node_class
()
node_class
=
node
.
read
_node_class
()
if
node_class
==
ua
.
NodeClass
.
Variable
:
node
.
write_value
(
getattr
(
self
,
k
))
# only update a specific attr
...
...
examples/sync/client-example.py
View file @
4268d685
...
...
@@ -54,7 +54,7 @@ if __name__ == "__main__":
#var = client.get_node(ua.NodeId(1002, 2))
#var = client.get_node("ns=3;i=2002")
#print(var)
#var.
get
_data_value() # get value of node as a DataValue object
#var.
write
_data_value() # get value of node as a DataValue object
#var.read_value() # get value of node as a python builtin
#var.write_value(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type
#var.write_value(3.9) # set node value using implicit data type
...
...
examples/sync/client-minimal.py
View file @
4268d685
...
...
@@ -17,7 +17,7 @@ if __name__ == "__main__":
#var = client.get_node(ua.NodeId(1002, 2))
#var = client.get_node("ns=3;i=2002")
#print(var)
#var.
get
_data_value() # get value of node as a DataValue object
#var.
write
_data_value() # get value of node as a DataValue object
#var.read_value() # get value of node as a python builtin
#var.write_value(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type
#var.write_value(3.9) # set node value using implicit data type
...
...
examples/sync/client_to_prosys.py
View file @
4268d685
...
...
@@ -32,7 +32,7 @@ if __name__ == "__main__":
root
=
client
.
nodes
.
root
print
(
"Root is"
,
root
)
print
(
"childs of root are: "
,
root
.
get_children
())
print
(
"name of root is"
,
root
.
get
_browse_name
())
print
(
"name of root is"
,
root
.
read
_browse_name
())
objects
=
client
.
nodes
.
objects
print
(
"childs og objects are: "
,
objects
.
get_children
())
myfloat
=
client
.
get_node
(
"ns=4;s=Float"
)
...
...
examples/sync/server-example.py
View file @
4268d685
...
...
@@ -156,7 +156,7 @@ if __name__ == "__main__":
myarrayvar
.
write_value
(
var
)
mydevice_var
.
write_value
(
"Running"
)
myevgen
.
trigger
(
message
=
"This is BaseEvent"
)
server
.
set
_attribute_value
(
myvar
.
nodeid
,
ua
.
DataValue
(
9.9
))
# Server side write method which is a but faster than using write
server
.
write
_attribute_value
(
myvar
.
nodeid
,
ua
.
DataValue
(
9.9
))
# Server side write method which is a but faster than using write
embed
()
vup
.
stop
()
examples/test_perf.py
View file @
4268d685
...
...
@@ -33,7 +33,7 @@ async def mymain():
#nb = 100000
#start = time.time()
#for i in range(nb):
#server.
set
_attribute_value(myvar.nodeid, ua.DataValue(i))
#server.
write
_attribute_value(myvar.nodeid, ua.DataValue(i))
#await myvar.write_value(i)
print
(
"
\
n
Write frequency:
\
n
"
,
nb
/
(
time
.
time
()
-
start
))
...
...
test_external_server.py
View file @
4268d685
...
...
@@ -76,7 +76,7 @@ def test_find_endpoints(self):
# @connect
def
test_get_root
(
self
,
client
):
root
=
client
.
get_root_node
()
self
.
assertEqual
(
root
.
get
_browse_name
(),
ua
.
QualifiedName
(
"Root"
,
0
))
self
.
assertEqual
(
root
.
read
_browse_name
(),
ua
.
QualifiedName
(
"Root"
,
0
))
# @connect
def
test_get_root_children
(
self
,
client
):
...
...
@@ -92,7 +92,7 @@ async def test_get_namespace_array(self, client):
# @connect
def
test_get_server_node
(
self
,
client
):
srv
=
client
.
get_server_node
()
self
.
assertEqual
(
srv
.
get
_browse_name
(),
ua
.
QualifiedName
(
"Server"
,
0
))
self
.
assertEqual
(
srv
.
read
_browse_name
(),
ua
.
QualifiedName
(
"Server"
,
0
))
#childs = srv.get_children()
#assert len(childs) > 4)
...
...
@@ -100,7 +100,7 @@ def test_get_server_node(self, client):
def
test_browsepathtonodeid
(
self
,
client
):
root
=
client
.
get_root_node
()
node
=
root
.
get_child
([
"0:Objects"
,
"0:Server"
,
"0:ServerArray"
])
self
.
assertEqual
(
node
.
get
_browse_name
(),
ua
.
QualifiedName
(
"ServerArray"
,
0
))
self
.
assertEqual
(
node
.
read
_browse_name
(),
ua
.
QualifiedName
(
"ServerArray"
,
0
))
# @connect
def
test_subscribe_server_time
(
self
,
client
):
...
...
tests/test_client.py
View file @
4268d685
...
...
@@ -19,7 +19,7 @@ async def test_service_fault(server, admin_client):
async
def
test_objects_anonymous
(
server
,
client
):
objects
=
client
.
get_objects_node
()
with
pytest
.
raises
(
ua
.
UaStatusCodeError
):
await
objects
.
set
_attribute
(
ua
.
AttributeIds
.
WriteMask
,
ua
.
DataValue
(
999
))
await
objects
.
write
_attribute
(
ua
.
AttributeIds
.
WriteMask
,
ua
.
DataValue
(
999
))
with
pytest
.
raises
(
ua
.
UaStatusCodeError
):
await
objects
.
add_folder
(
3
,
'MyFolder'
)
...
...
tests/test_common.py
View file @
4268d685
...
...
@@ -160,7 +160,7 @@ async def test_delete_nodes_recursive2(opc):
await
opc
.
opc
.
delete_nodes
([
fold
],
recursive
=
True
)
for
node
in
mynodes
:
with
pytest
.
raises
(
ua
.
UaStatusCodeError
):
await
node
.
get
_browse_name
()
await
node
.
read
_browse_name
()
async
def
test_delete_references
(
opc
):
...
...
@@ -218,20 +218,20 @@ async def test_delete_references(opc):
async
def
test_server_node
(
opc
):
node
=
opc
.
opc
.
get_server_node
()
assert
ua
.
QualifiedName
(
'Server'
,
0
)
==
await
node
.
get
_browse_name
()
assert
ua
.
QualifiedName
(
'Server'
,
0
)
==
await
node
.
read
_browse_name
()
async
def
test_root
(
opc
):
root
=
opc
.
opc
.
get_root_node
()
assert
ua
.
QualifiedName
(
'Root'
,
0
)
==
await
root
.
get
_browse_name
()
assert
ua
.
LocalizedText
(
'Root'
)
==
await
root
.
get
_display_name
()
assert
ua
.
QualifiedName
(
'Root'
,
0
)
==
await
root
.
read
_browse_name
()
assert
ua
.
LocalizedText
(
'Root'
)
==
await
root
.
read
_display_name
()
nid
=
ua
.
NodeId
(
84
,
0
)
assert
nid
==
root
.
nodeid
async
def
test_objects
(
opc
):
objects
=
opc
.
opc
.
get_objects_node
()
assert
ua
.
QualifiedName
(
'Objects'
,
0
)
==
await
objects
.
get
_browse_name
()
assert
ua
.
QualifiedName
(
'Objects'
,
0
)
==
await
objects
.
read
_browse_name
()
nid
=
ua
.
NodeId
(
85
,
0
)
assert
nid
==
objects
.
nodeid
...
...
@@ -347,8 +347,8 @@ async def test_variant_array_dim(opc):
[[
5.0
,
5.0
,
5.0
,
5.0
],
[
7.0
,
8.0
,
9.0
,
01.0
],
[
1.0
,
1.0
,
1.0
,
1.0
]]]
v
=
await
objects
.
add_variable
(
3
,
'variableWithDims'
,
l
)
await
v
.
set
_array_dimensions
([
0
,
0
,
0
])
dim
=
await
v
.
get
_array_dimensions
()
await
v
.
write
_array_dimensions
([
0
,
0
,
0
])
dim
=
await
v
.
read
_array_dimensions
()
assert
[
0
,
0
,
0
]
==
dim
await
v
.
write_value_rank
(
0
)
...
...
@@ -357,7 +357,7 @@ async def test_variant_array_dim(opc):
v2
=
await
v
.
read_value
()
assert
l
==
v2
dv
=
await
v
.
get
_data_value
()
dv
=
await
v
.
write
_data_value
()
assert
[
2
,
3
,
4
]
==
dv
.
Value
.
Dimensions
l
=
[[[],
[],
[]],
[[],
[],
[]]]
...
...
@@ -365,7 +365,7 @@ async def test_variant_array_dim(opc):
v
=
await
objects
.
add_variable
(
3
,
'variableWithDimsEmpty'
,
variant
)
v2
=
await
v
.
read_value
()
assert
l
==
v2
dv
=
await
v
.
get
_data_value
()
dv
=
await
v
.
write
_data_value
()
assert
[
2
,
3
,
0
]
==
dv
.
Value
.
Dimensions
...
...
@@ -375,7 +375,7 @@ async def test_add_numeric_variable(opc):
nid
=
ua
.
NodeId
(
888
,
3
)
qn
=
ua
.
QualifiedName
(
'numericnodefromstring'
,
3
)
assert
nid
==
v
.
nodeid
assert
qn
==
await
v
.
get
_browse_name
()
assert
qn
==
await
v
.
read
_browse_name
()
async
def
test_add_string_variable
(
opc
):
...
...
@@ -384,7 +384,7 @@ async def test_add_string_variable(opc):
nid
=
ua
.
NodeId
(
'stringid'
,
3
)
qn
=
ua
.
QualifiedName
(
'stringnodefromstring'
,
3
)
assert
nid
==
v
.
nodeid
assert
qn
==
await
v
.
get
_browse_name
()
assert
qn
==
await
v
.
read
_browse_name
()
async
def
test_utf8
(
opc
):
...
...
@@ -397,7 +397,7 @@ async def test_utf8(opc):
assert
nid
==
v
.
nodeid
val2
=
await
v
.
read_value
()
assert
val
==
val2
bn2
=
await
v
.
get
_browse_name
()
bn2
=
await
v
.
read
_browse_name
()
assert
bn
==
bn2
...
...
@@ -416,10 +416,10 @@ async def test_null_variable(opc):
async
def
test_variable_data_type
(
opc
):
objects
=
opc
.
opc
.
get_objects_node
()
var
=
await
objects
.
add_variable
(
3
,
'stringfordatatype'
,
"a string"
)
val
=
await
var
.
get
_data_type_as_variant_type
()
val
=
await
var
.
read
_data_type_as_variant_type
()
assert
ua
.
VariantType
.
String
==
val
var
=
await
objects
.
add_variable
(
3
,
'stringarrayfordatatype'
,
[
"a"
,
"b"
])
val
=
await
var
.
get
_data_type_as_variant_type
()
val
=
await
var
.
read
_data_type_as_variant_type
()
assert
ua
.
VariantType
.
String
==
val
...
...
@@ -429,7 +429,7 @@ async def test_add_string_array_variable(opc):
nid
=
ua
.
NodeId
(
'stringarrayid'
,
3
)
qn
=
ua
.
QualifiedName
(
'stringarray'
,
9
)
assert
nid
==
v
.
nodeid
assert
qn
==
await
v
.
get
_browse_name
()
assert
qn
==
await
v
.
read
_browse_name
()
val
=
await
v
.
read_value
()
assert
[
'l'
,
'b'
]
==
val
...
...
@@ -440,7 +440,7 @@ async def test_add_numeric_node(opc):
qn
=
ua
.
QualifiedName
(
'AddNodeVar1'
,
3
)
v1
=
await
objects
.
add_variable
(
nid
,
qn
,
0
)
assert
nid
==
v1
.
nodeid
assert
qn
==
await
v1
.
get
_browse_name
()
assert
qn
==
await
v1
.
read
_browse_name
()
async
def
test_add_string_node
(
opc
):
...
...
@@ -449,7 +449,7 @@ async def test_add_string_node(opc):
nid
=
ua
.
NodeId
(
'AddNodeVar2Id'
,
3
)
v2
=
await
objects
.
add_variable
(
nid
,
qn
,
0
)
assert
nid
==
v2
.
nodeid
assert
qn
==
await
v2
.
get
_browse_name
()
assert
qn
==
await
v2
.
read
_browse_name
()
async
def
test_add_find_node_
(
opc
):
...
...
@@ -473,7 +473,7 @@ async def test_add_read_node(opc):
nid
=
ua
.
NodeId
(
102
,
2
)
assert
nid
==
o
.
nodeid
qn
=
ua
.
QualifiedName
(
'AddReadObject'
,
2
)
assert
qn
==
await
o
.
get
_browse_name
()
assert
qn
==
await
o
.
read
_browse_name
()
async
def
test_simple_value
(
opc
):
...
...
@@ -505,7 +505,7 @@ async def test_read_server_state(opc):
async
def
test_bad_node
(
opc
):
bad
=
opc
.
opc
.
get_node
(
ua
.
NodeId
(
999
,
999
))
with
pytest
.
raises
(
ua
.
UaStatusCodeError
):
await
bad
.
get
_browse_name
()
await
bad
.
read
_browse_name
()
with
pytest
.
raises
(
ua
.
UaStatusCodeError
):
await
bad
.
write_value
(
89
)
with
pytest
.
raises
(
ua
.
UaStatusCodeError
):
...
...
@@ -520,7 +520,7 @@ async def test_value(opc):
v
=
await
o
.
add_variable
(
3
,
'VariableValue'
,
var
)
assert
1.98
==
await
v
.
read_value
()
dvar
=
ua
.
DataValue
(
var
)
dv
=
await
v
.
get
_data_value
()
dv
=
await
v
.
write
_data_value
()
assert
ua
.
DataValue
==
type
(
dv
)
assert
dvar
.
Value
==
dv
.
Value
assert
dvar
.
Value
==
var
...
...
@@ -538,7 +538,7 @@ async def test_write_value(opc):
v2
=
await
v
.
read_value
()
assert
v2
==
var
.
Value
await
v
.
write_value
(
dvar
)
v3
=
await
v
.
get
_data_value
()
v3
=
await
v
.
write
_data_value
()
assert
v3
.
Value
==
dvar
.
Value
...
...
@@ -551,7 +551,7 @@ async def test_array_value(opc):
async
def
test_bool_variable
(
opc
):
o
=
opc
.
opc
.
get_objects_node
()
v
=
await
o
.
add_variable
(
3
,
'BoolVariable'
,
True
)
dt
=
await
v
.
get
_data_type_as_variant_type
()
dt
=
await
v
.
read
_data_type_as_variant_type
()
assert
ua
.
VariantType
.
Boolean
==
dt
val
=
await
v
.
read_value
()
assert
val
is
True
...
...
@@ -805,7 +805,7 @@ async def test_copy_node(opc):
p_t
=
await
devd_t
.
add_property
(
0
,
"sensorx_id"
,
"0340"
)
nodes
=
await
copy_node
(
opc
.
opc
.
nodes
.
objects
,
dev_t
)
mydevice
=
nodes
[
0
]
assert
ua
.
NodeClass
.
ObjectType
==
await
mydevice
.
get
_node_class
()
assert
ua
.
NodeClass
.
ObjectType
==
await
mydevice
.
read
_node_class
()
assert
4
==
len
(
await
mydevice
.
get_children
())
obj
=
await
mydevice
.
get_child
([
"0:controller"
])
prop
=
await
mydevice
.
get_child
([
"0:controller"
,
"0:state"
])
...
...
@@ -841,7 +841,7 @@ async def test_instantiate_1(opc):
nodes
=
await
instantiate
(
opc
.
opc
.
nodes
.
objects
,
dev_t
,
bname
=
"2:Device0001"
)
mydevice
=
nodes
[
0
]
assert
ua
.
NodeClass
.
Object
==
await
mydevice
.
get
_node_class
()
assert
ua
.
NodeClass
.
Object
==
await
mydevice
.
read
_node_class
()
assert
dev_t
.
nodeid
==
await
mydevice
.
get_type_definition
()
obj
=
await
mydevice
.
get_child
([
"0:controller"
])
prop
=
await
mydevice
.
get_child
([
"0:controller"
,
"0:state"
])
...
...
@@ -880,7 +880,7 @@ async def test_instantiate_string_nodeid(opc):
bname
=
"2:InstDevice"
)
mydevice
=
nodes
[
0
]
assert
ua
.
NodeClass
.
Object
==
await
mydevice
.
get
_node_class
()
assert
ua
.
NodeClass
.
Object
==
await
mydevice
.
read
_node_class
()
assert
dev_t
.
nodeid
==
await
mydevice
.
get_type_definition
()
obj
=
await
mydevice
.
get_child
([
"0:controller"
])
obj_nodeid_ident
=
obj
.
nodeid
.
Identifier
...
...
@@ -895,13 +895,13 @@ async def test_variable_with_datatype(opc):
v1
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
3
,
'VariableEnumType1'
,
ua
.
ApplicationType
.
ClientAndServer
,
datatype
=
ua
.
NodeId
(
ua
.
ObjectIds
.
ApplicationType
)
)
tp1
=
await
v1
.
get
_data_type
()
tp1
=
await
v1
.
read
_data_type
()
assert
tp1
==
ua
.
NodeId
(
ua
.
ObjectIds
.
ApplicationType
)
v2
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
3
,
'VariableEnumType2'
,
ua
.
ApplicationType
.
ClientAndServer
,
datatype
=
ua
.
NodeId
(
ua
.
ObjectIds
.
ApplicationType
)
)
tp2
=
await
v2
.
get
_data_type
()
tp2
=
await
v2
.
read
_data_type
()
assert
tp2
==
ua
.
NodeId
(
ua
.
ObjectIds
.
ApplicationType
)
...
...
@@ -919,7 +919,7 @@ async def test_enum(opc):
myvar
=
await
o
.
add_variable
(
2
,
"MyEnumVar"
,
ua
.
LocalizedText
(
"String1"
),
datatype
=
myenum_type
.
nodeid
)
# myvar.set_writable(True)
# tests
assert
myenum_type
.
nodeid
==
await
myvar
.
get
_data_type
()
assert
myenum_type
.
nodeid
==
await
myvar
.
read
_data_type
()
await
myvar
.
write_value
(
ua
.
LocalizedText
(
"String2"
))
...
...
@@ -950,7 +950,7 @@ async def test_base_data_type(opc):
assert
nint32
==
await
ua_utils
.
get_base_data_type
(
dtype2
)
ext
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
0
,
"MyExtensionObject"
,
ua
.
Argument
())
d
=
await
ext
.
get
_data_type
()
d
=
await
ext
.
read
_data_type
()
d
=
opc
.
opc
.
get_node
(
d
)
assert
opc
.
opc
.
get_node
(
ua
.
ObjectIds
.
Structure
)
==
await
ua_utils
.
get_base_data_type
(
d
)
assert
ua
.
VariantType
.
ExtensionObject
==
await
ua_utils
.
data_type_to_variant_type
(
d
)
...
...
tests/test_custom_structures.py
View file @
4268d685
...
...
@@ -182,13 +182,13 @@ async def test_data_type_dict_add_dictionary(srv):
add_dictionary
=
getattr
(
srv
.
dict_builder
,
'_add_dictionary'
)
dict_name
=
'TestDict'
dict_node
=
srv
.
srv
.
get_node
(
await
add_dictionary
(
dict_name
))
assert
await
dict_node
.
get
_browse_name
()
==
ua
.
QualifiedName
(
dict_name
,
srv
.
idx
)
assert
await
dict_node
.
get
_node_class
()
==
ua
.
NodeClass
.
Variable
assert
await
dict_node
.
read
_browse_name
()
==
ua
.
QualifiedName
(
dict_name
,
srv
.
idx
)
assert
await
dict_node
.
read
_node_class
()
==
ua
.
NodeClass
.
Variable
assert
(
await
dict_node
.
get_parent
()).
nodeid
==
ua
.
NodeId
(
ua
.
ObjectIds
.
OPCBinarySchema_TypeSystem
,
0
)
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
HasComponent
,
0
)
==
(
await
dict_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasComponent
))[
0
].
ReferenceTypeId
assert
await
dict_node
.
get_type_definition
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
DataTypeDictionaryType
,
0
)
assert
await
dict_node
.
get
_display_name
()
==
ua
.
LocalizedText
(
dict_name
)
assert
await
dict_node
.
get
_data_type
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
ByteString
)
assert
await
dict_node
.
read
_display_name
()
==
ua
.
LocalizedText
(
dict_name
)
assert
await
dict_node
.
read
_data_type
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
ByteString
)
assert
await
dict_node
.
read_value_rank
()
==
-
1
...
...
@@ -198,35 +198,35 @@ async def test_data_type_dict_create_data_type(srv):
assert
isinstance
(
created_type
,
StructNode
)
# Test data type node
type_node
=
srv
.
srv
.
get_node
(
created_type
.
data_type
)
assert
await
type_node
.
get
_browse_name
()
==
ua
.
QualifiedName
(
type_name
,
srv
.
idx
)
assert
await
type_node
.
get
_node_class
()
==
ua
.
NodeClass
.
DataType
assert
await
type_node
.
read
_browse_name
()
==
ua
.
QualifiedName
(
type_name
,
srv
.
idx
)
assert
await
type_node
.
read
_node_class
()
==
ua
.
NodeClass
.
DataType
assert
(
await
type_node
.
get_parent
()).
nodeid
==
ua
.
NodeId
(
ua
.
ObjectIds
.
Structure
,
0
)
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
HasSubtype
,
0
)
==
(
await
type_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasSubtype
))[
0
].
ReferenceTypeId
assert
await
type_node
.
get
_display_name
()
==
ua
.
LocalizedText
(
type_name
)
assert
await
type_node
.
read
_display_name
()
==
ua
.
LocalizedText
(
type_name
)
# Test description node
n
=
srv
.
srv
.
get_node
(
srv
.
dict_builder
.
dict_id
)
desc_node
=
await
n
.
get_child
(
f"
{
srv
.
dict_builder
.
_idx
}
:
{
type_name
}
"
)
assert
await
desc_node
.
get
_browse_name
()
==
ua
.
QualifiedName
(
type_name
,
srv
.
idx
)
assert
await
desc_node
.
get
_node_class
()
==
ua
.
NodeClass
.
Variable
assert
await
desc_node
.
read
_browse_name
()
==
ua
.
QualifiedName
(
type_name
,
srv
.
idx
)
assert
await
desc_node
.
read
_node_class
()
==
ua
.
NodeClass
.
Variable
assert
(
await
desc_node
.
get_parent
()).
nodeid
==
srv
.
dict_builder
.
dict_id
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
HasComponent
,
0
)
==
(
await
desc_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasComponent
))[
0
].
ReferenceTypeId
assert
await
desc_node
.
get_type_definition
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
DataTypeDescriptionType
,
0
)
assert
await
desc_node
.
get
_display_name
()
==
ua
.
LocalizedText
(
type_name
)
assert
await
desc_node
.
get
_data_type
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
String
)
assert
await
desc_node
.
read
_display_name
()
==
ua
.
LocalizedText
(
type_name
)
assert
await
desc_node
.
read
_data_type
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
String
)
assert
await
desc_node
.
read_value
()
==
type_name
assert
await
desc_node
.
read_value_rank
()
==
-
1
# Test object node
obj_node
=
(
await
type_node
.
get_children
(
refs
=
ua
.
ObjectIds
.
HasEncoding
))[
0
]
assert
await
obj_node
.
get
_browse_name
()
==
ua
.
QualifiedName
(
'Default Binary'
,
0
)
assert
await
obj_node
.
get
_node_class
()
==
ua
.
NodeClass
.
Object
assert
await
obj_node
.
read
_browse_name
()
==
ua
.
QualifiedName
(
'Default Binary'
,
0
)
assert
await
obj_node
.
read
_node_class
()
==
ua
.
NodeClass
.
Object
assert
(
await
obj_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasEncoding
))[
0
].
NodeId
==
type_node
.
nodeid
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
HasEncoding
,
0
)
==
(
await
obj_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasEncoding
))[
0
].
ReferenceTypeId
assert
await
obj_node
.
get_type_definition
()
==
ua
.
NodeId
(
ua
.
ObjectIds
.
DataTypeEncodingType
,
0
)
assert
await
obj_node
.
get
_display_name
()
==
ua
.
LocalizedText
(
'Default Binary'
)
assert
len
(
await
obj_node
.
get
_event_notifier
())
==
0
assert
await
obj_node
.
read
_display_name
()
==
ua
.
LocalizedText
(
'Default Binary'
)
assert
len
(
await
obj_node
.
read
_event_notifier
())
==
0
# Test links, three were tested above
struct_node
=
srv
.
srv
.
get_node
(
ua
.
NodeId
(
ua
.
ObjectIds
.
Structure
,
0
))
...
...
tests/test_server.py
View file @
4268d685
...
...
@@ -136,10 +136,10 @@ async def test_multiple_clients_with_subscriptions(server):
async
def
test_historize_events
(
server
):
srv_node
=
server
.
get_node
(
ua
.
ObjectIds
.
Server
)
assert
await
srv_node
.
get
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
assert
await
srv_node
.
read
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
srvevgen
=
await
server
.
get_event_generator
()
await
server
.
iserver
.
enable_history_event
(
srv_node
,
period
=
None
)
assert
await
srv_node
.
get
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
,
ua
.
EventNotifier
.
HistoryRead
}
assert
await
srv_node
.
read
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
,
ua
.
EventNotifier
.
HistoryRead
}
srvevgen
.
trigger
(
message
=
'Message'
)
await
server
.
iserver
.
disable_history_event
(
srv_node
)
...
...
@@ -358,10 +358,10 @@ async def test_create_custom_object_type_object_id(server):
variables
=
await
node_type
.
get_variables
()
assert
await
node_type
.
get_child
(
"2:VariableString"
)
in
variables
assert
ua
.
VariantType
.
String
==
(
await
(
await
node_type
.
get_child
(
"2:VariableString"
)).
get
_data_value
()).
Value
.
VariantType
await
(
await
node_type
.
get_child
(
"2:VariableString"
)).
write
_data_value
()).
Value
.
VariantType
assert
await
node_type
.
get_child
(
"2:MyEnumVar"
)
in
variables
assert
ua
.
VariantType
.
Int32
==
(
await
(
await
node_type
.
get_child
(
"2:MyEnumVar"
)).
get
_data_value
()).
Value
.
VariantType
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
ApplicationType
)
==
await
(
await
node_type
.
get_child
(
"2:MyEnumVar"
)).
get
_data_type
()
assert
ua
.
VariantType
.
Int32
==
(
await
(
await
node_type
.
get_child
(
"2:MyEnumVar"
)).
write
_data_value
()).
Value
.
VariantType
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
ApplicationType
)
==
await
(
await
node_type
.
get_child
(
"2:MyEnumVar"
)).
read
_data_type
()
methods
=
await
node_type
.
get_methods
()
assert
await
node_type
.
get_child
(
"2:MyMethod"
)
in
methods
...
...
@@ -544,23 +544,23 @@ async def test_load_enum_values(server):
async
def
check_eventgenerator_source_server
(
evgen
,
server
:
Server
):
server_node
=
server
.
get_server_node
()
assert
evgen
.
event
.
SourceName
==
(
await
server_node
.
get
_browse_name
()).
Name
assert
evgen
.
event
.
SourceName
==
(
await
server_node
.
read
_browse_name
()).
Name
assert
evgen
.
event
.
SourceNode
==
ua
.
NodeId
(
ua
.
ObjectIds
.
Server
)
assert
await
server_node
.
get
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
assert
await
server_node
.
read
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
refs
=
await
server_node
.
get_referenced_nodes
(
ua
.
ObjectIds
.
GeneratesEvent
,
ua
.
BrowseDirection
.
Forward
,
ua
.
NodeClass
.
ObjectType
,
False
)
assert
len
(
refs
)
>=
1
async
def
check_event_generator_object
(
evgen
,
obj
,
emitting_node
=
None
):
assert
evgen
.
event
.
SourceName
==
(
await
obj
.
get
_browse_name
()).
Name
assert
evgen
.
event
.
SourceName
==
(
await
obj
.
read
_browse_name
()).
Name
assert
evgen
.
event
.
SourceNode
==
obj
.
nodeid
if
not
emitting_node
:
assert
await
obj
.
get
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
assert
await
obj
.
read
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
refs
=
await
obj
.
get_referenced_nodes
(
ua
.
ObjectIds
.
GeneratesEvent
,
ua
.
BrowseDirection
.
Forward
,
ua
.
NodeClass
.
ObjectType
,
False
)
else
:
assert
await
emitting_node
.
get
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
assert
await
emitting_node
.
read
_event_notifier
()
==
{
ua
.
EventNotifier
.
SubscribeToEvents
}
refs
=
await
emitting_node
.
get_referenced_nodes
(
ua
.
ObjectIds
.
GeneratesEvent
,
ua
.
BrowseDirection
.
Forward
,
ua
.
NodeClass
.
ObjectType
,
False
)
assert
evgen
.
event
.
EventType
in
[
x
.
nodeid
for
x
in
refs
]
...
...
@@ -603,14 +603,14 @@ async def check_custom_type(ntype, base_type, server: Server, node_class=None):
includesubtypes
=
True
)
assert
base
==
nodes
[
0
]
if
node_class
:
assert
node_class
==
await
ntype
.
get
_node_class
()
assert
node_class
==
await
ntype
.
read
_node_class
()
properties
=
await
ntype
.
get_properties
()
assert
properties
is
not
None
assert
len
(
properties
)
==
2
assert
await
ntype
.
get_child
(
"2:PropertyNum"
)
in
properties
assert
(
await
(
await
ntype
.
get_child
(
"2:PropertyNum"
)).
get
_data_value
()).
Value
.
VariantType
==
ua
.
VariantType
.
Int32
assert
(
await
(
await
ntype
.
get_child
(
"2:PropertyNum"
)).
write
_data_value
()).
Value
.
VariantType
==
ua
.
VariantType
.
Int32
assert
await
ntype
.
get_child
(
"2:PropertyString"
)
in
properties
assert
(
await
(
await
ntype
.
get_child
(
"2:PropertyString"
)).
get
_data_value
()).
Value
.
VariantType
==
ua
.
VariantType
.
String
assert
(
await
(
await
ntype
.
get_child
(
"2:PropertyString"
)).
write
_data_value
()).
Value
.
VariantType
==
ua
.
VariantType
.
String
"""
...
...
tests/test_subscriptions.py
View file @
4268d685
...
...
@@ -433,7 +433,7 @@ async def test_events_default(opc):
assert
ev
is
not
None
# we did not receive event
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
BaseEventType
)
==
ev
.
EventType
assert
1
==
ev
.
Severity
assert
(
await
opc
.
opc
.
get_server_node
().
get
_browse_name
()).
Name
==
ev
.
SourceName
assert
(
await
opc
.
opc
.
get_server_node
().
read
_browse_name
()).
Name
==
ev
.
SourceName
assert
opc
.
opc
.
get_server_node
().
nodeid
==
ev
.
SourceNode
assert
msg
==
ev
.
Message
.
Text
assert
tid
==
ev
.
Time
...
...
@@ -500,7 +500,7 @@ async def test_events_CustomEvent(opc):
assert
ev
is
not
None
# we did not receive event
assert
etype
.
nodeid
==
ev
.
EventType
assert
serverity
==
ev
.
Severity
assert
(
await
opc
.
opc
.
get_server_node
().
get
_browse_name
()).
Name
==
ev
.
SourceName
assert
(
await
opc
.
opc
.
get_server_node
().
read
_browse_name
()).
Name
==
ev
.
SourceName
assert
opc
.
opc
.
get_server_node
().
nodeid
==
ev
.
SourceNode
assert
msg
==
ev
.
Message
.
Text
assert
tid
==
ev
.
Time
...
...
tests/test_xml.py
View file @
4268d685
...
...
@@ -42,7 +42,7 @@ async def test_xml_import(opc):
# Check if InputArgs are imported and can be read
node_path
=
[
"Types"
,
"ObjectTypes"
,
"BaseObjectType"
,
"1:MyObjectType"
,
"1:MyMethod"
,
"InputArguments"
]
o
=
await
opc
.
opc
.
get_root_node
().
get_child
(
node_path
)
input_arg
=
(
await
o
.
get
_data_value
()).
Value
.
Value
[
0
]
input_arg
=
(
await
o
.
write
_data_value
()).
Value
.
Value
[
0
]
assert
"Context"
==
input_arg
.
Name
...
...
@@ -105,18 +105,18 @@ async def test_xml_vars(opc, tmpdir):
await
opc
.
opc
.
delete_nodes
(
nodes
)
await
opc
.
opc
.
import_xml
(
tmp_path
)
assert
6.78
==
await
v
.
read_value
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
Double
)
==
await
v
.
get
_data_type
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
UInt16
)
==
await
a
.
get
_data_type
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
Double
)
==
await
v
.
read
_data_type
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
UInt16
)
==
await
a
.
read
_data_type
()
assert
await
a
.
read_value_rank
()
in
(
0
,
1
)
assert
[
6
,
1
]
==
await
a
.
read_value
()
assert
[[
1
,
2
],
[
3
,
4
]]
==
await
a2
.
read_value
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
UInt32
)
==
await
a2
.
get
_data_type
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
UInt32
)
==
await
a2
.
read
_data_type
()
assert
await
a2
.
read_value_rank
()
in
(
0
,
2
)
assert
[
2
,
2
]
==
(
await
a2
.
get
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)).
Value
.
Value
assert
[
2
,
2
]
==
(
await
a2
.
read
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)).
Value
.
Value
# assert a3.read_value(), [[]]) # would require special code ...
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
ByteString
)
==
await
a3
.
get
_data_type
()
assert
ua
.
NodeId
(
ua
.
ObjectIds
.
ByteString
)
==
await
a3
.
read
_data_type
()
assert
await
a3
.
read_value_rank
()
in
(
0
,
2
)
assert
[
1
,
0
]
==
(
await
a3
.
get
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)).
Value
.
Value
assert
[
1
,
0
]
==
(
await
a3
.
read
_attribute
(
ua
.
AttributeIds
.
ArrayDimensions
)).
Value
.
Value
async
def
test_xml_ns
(
opc
,
tmpdir
):
...
...
@@ -152,9 +152,9 @@ async def test_xml_ns(opc, tmpdir):
new_ns
=
await
opc
.
opc
.
register_namespace
(
"my_new_namespace"
)
new_nodes
=
await
opc
.
opc
.
import_xml
(
tmp_path
)
for
i
in
[
o
,
o50
,
o200
]:
await
i
.
get
_browse_name
()
await
i
.
read
_browse_name
()
with
pytest
.
raises
(
uaerrors
.
BadNodeIdUnknown
):
await
onew
.
get
_browse_name
()
await
onew
.
read
_browse_name
()
# since my_new_namesspace2 is referenced byt a node it should have been reimported
nss
=
await
opc
.
opc
.
get_namespace_array
()
assert
"bname_namespace"
in
nss
...
...
@@ -162,23 +162,23 @@ async def test_xml_ns(opc, tmpdir):
new_ns
=
await
opc
.
opc
.
register_namespace
(
"my_new_namespace"
)
bname_ns
=
await
opc
.
opc
.
register_namespace
(
"bname_namespace"
)
onew
.
nodeid
.
NamespaceIndex
=
new_ns
await
onew
.
get
_browse_name
()
await
onew
.
read
_browse_name
()
vnew2
=
(
await
onew
.
get_children
())[
0
]
assert
vnew2
.
nodeid
.
NamespaceIndex
==
new_ns
async
def
test_xml_float
(
opc
,
tmpdir
):
o
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
2
,
"xmlfloat"
,
5.67
)
dtype
=
await
o
.
get
_data_type
()
dv
=
await
o
.
get
_data_value
()
dtype
=
await
o
.
read
_data_type
()
dv
=
await
o
.
write
_data_value
()
tmp_path
=
tmpdir
.
join
(
"tmp_test_export-float.xml"
).
strpath
await
opc
.
opc
.
export_xml
([
o
],
tmp_path
)
await
opc
.
opc
.
delete_nodes
([
o
])
new_nodes
=
await
opc
.
opc
.
import_xml
(
tmp_path
)
o2
=
opc
.
opc
.
get_node
(
new_nodes
[
0
])
assert
o2
==
o
assert
await
o2
.
get
_data_type
()
==
dtype
assert
(
await
o2
.
get
_data_value
()).
Value
==
dv
.
Value
assert
await
o2
.
read
_data_type
()
==
dtype
assert
(
await
o2
.
write
_data_value
()).
Value
==
dv
.
Value
async
def
test_xml_bool
(
opc
,
tmpdir
):
...
...
@@ -193,7 +193,7 @@ async def test_xml_string(opc, tmpdir):
async
def
test_xml_string_with_null_description
(
opc
,
tmpdir
):
o
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
2
,
"xmlstring"
,
"mystring"
)
await
o
.
set
_attribute
(
ua
.
AttributeIds
.
Description
,
ua
.
DataValue
(
None
))
await
o
.
write
_attribute
(
ua
.
AttributeIds
.
Description
,
ua
.
DataValue
(
None
))
o2
=
await
_test_xml_var_type
(
opc
,
tmpdir
,
o
,
"string"
)
assert
await
o
.
get_description
()
==
await
o2
.
get_description
()
...
...
@@ -201,7 +201,7 @@ async def test_xml_string_with_null_description(opc, tmpdir):
async
def
test_xml_string_array
(
opc
,
tmpdir
):
o
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
2
,
"xmlstringarray"
,
[
"mystring2"
,
"mystring3"
])
node2
=
await
_test_xml_var_type
(
opc
,
tmpdir
,
o
,
"stringarray"
)
dv
=
await
node2
.
get
_data_value
()
dv
=
await
node2
.
write
_data_value
()
async
def
test_xml_guid
(
opc
,
tmpdir
):
...
...
@@ -373,36 +373,36 @@ async def test_xml_var_nillable(opc):
async
def
_test_xml_var_type
(
opc
,
tmpdir
,
node
:
Node
,
typename
:
str
,
test_equality
:
bool
=
True
):
dtype
=
await
node
.
get
_data_type
()
dv
=
await
node
.
get
_data_value
()
dtype
=
await
node
.
read
_data_type
()
dv
=
await
node
.
write
_data_value
()
rank
=
await
node
.
read_value_rank
()
dim
=
await
node
.
get
_array_dimensions
()
nclass
=
await
node
.
get
_node_class
()
dim
=
await
node
.
read
_array_dimensions
()
nclass
=
await
node
.
read
_node_class
()
tmp_path
=
tmpdir
.
join
(
f"tmp_test_export-
{
typename
}
.xml"
).
strpath
await
opc
.
opc
.
export_xml
([
node
],
tmp_path
)
await
opc
.
opc
.
delete_nodes
([
node
])
new_nodes
=
await
opc
.
opc
.
import_xml
(
tmp_path
)
node2
=
opc
.
opc
.
get_node
(
new_nodes
[
0
])
assert
node
==
node
assert
dtype
==
await
node2
.
get
_data_type
()
assert
dtype
==
await
node2
.
read
_data_type
()
if
test_equality
:
print
(
"DEBUG"
,
node
,
dv
,
node2
,
await
node2
.
read_value
())
assert
dv
.
Value
==
(
await
node2
.
get
_data_value
()).
Value
assert
dv
.
Value
==
(
await
node2
.
write
_data_value
()).
Value
assert
rank
==
await
node2
.
read_value_rank
()
assert
dim
==
await
node2
.
get
_array_dimensions
()
assert
nclass
==
await
node2
.
get
_node_class
()
assert
dim
==
await
node2
.
read
_array_dimensions
()
assert
nclass
==
await
node2
.
read
_node_class
()
return
node2
async
def
test_xml_byte
(
opc
,
tmpdir
):
o
=
await
opc
.
opc
.
nodes
.
objects
.
add_variable
(
2
,
"byte"
,
255
,
ua
.
VariantType
.
Byte
)
dtype
=
await
o
.
get
_data_type
()
dv
=
await
o
.
get
_data_value
()
dtype
=
await
o
.
read
_data_type
()
dv
=
await
o
.
write
_data_value
()
tmp_path
=
tmpdir
.
join
(
"export-byte.xml"
).
strpath
await
opc
.
opc
.
export_xml
([
o
],
tmp_path
)
await
opc
.
opc
.
delete_nodes
([
o
])
new_nodes
=
await
opc
.
opc
.
import_xml
(
tmp_path
)
o2
=
opc
.
opc
.
get_node
(
new_nodes
[
0
])
assert
o
==
o2
assert
dtype
==
await
o2
.
get
_data_type
()
assert
dv
.
Value
==
(
await
o2
.
get
_data_value
()).
Value
assert
dtype
==
await
o2
.
read
_data_type
()
assert
dv
.
Value
==
(
await
o2
.
write
_data_value
()).
Value
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment