Commit 549ec004 authored by Olivier R-D's avatar Olivier R-D

allow to read DataValue from node. change a bit get_attribute method, fix a test for pypy

parent 25fdae58
...@@ -129,43 +129,50 @@ class Node(object): ...@@ -129,43 +129,50 @@ class Node(object):
composed of a string(name) and a namespace index. composed of a string(name) and a namespace index.
""" """
result = self.get_attribute(ua.AttributeIds.BrowseName) result = self.get_attribute(ua.AttributeIds.BrowseName)
return result.Value return result.Value.Value
def get_display_name(self): def get_display_name(self):
""" """
get description attribute of node get description attribute of node
""" """
result = self.get_attribute(ua.AttributeIds.DisplayName) result = self.get_attribute(ua.AttributeIds.DisplayName)
return result.Value return result.Value.Value
def get_data_type(self): def get_data_type(self):
""" """
get data type of node get data type of node
""" """
result = self.get_attribute(ua.AttributeIds.DataType) result = self.get_attribute(ua.AttributeIds.DataType)
return result.Value return result.Value.Value
def get_node_class(self): def get_node_class(self):
""" """
get node class attribute of node get node class attribute of node
""" """
result = self.get_attribute(ua.AttributeIds.NodeClass) result = self.get_attribute(ua.AttributeIds.NodeClass)
return result.Value return result.Value.Value
def get_description(self): def get_description(self):
""" """
get description attribute class of node get description attribute class of node
""" """
result = self.get_attribute(ua.AttributeIds.Description) result = self.get_attribute(ua.AttributeIds.Description)
return result.Value return result.Value.Value
def get_value(self): def get_value(self):
""" """
Get value of a node. Only variables(properties) have values. Get value of a node as a python type. Only variables(properties) have values.
An exception will be generated for other node types. An exception will be generated for other node types.
""" """
result = self.get_attribute(ua.AttributeIds.Value) result = self.get_data_value()
return result.Value return result.Value.Value
def get_data_value(self):
"""
Get value of a node as a python type. Only variables(properties) have values.
An exception will be generated for other node types.
"""
return self.get_attribute(ua.AttributeIds.Value)
def set_value(self, value, varianttype=None): def set_value(self, value, varianttype=None):
""" """
...@@ -186,6 +193,8 @@ class Node(object): ...@@ -186,6 +193,8 @@ class Node(object):
datavalue = ua.DataValue(ua.Variant(value, varianttype)) datavalue = ua.DataValue(ua.Variant(value, varianttype))
self.set_attribute(ua.AttributeIds.Value, datavalue) self.set_attribute(ua.AttributeIds.Value, datavalue)
set_data_value = set_value
def set_attribute(self, attributeid, datavalue): def set_attribute(self, attributeid, datavalue):
""" """
Set an attribute of a node Set an attribute of a node
...@@ -201,7 +210,7 @@ class Node(object): ...@@ -201,7 +210,7 @@ class Node(object):
def get_attribute(self, attr): def get_attribute(self, attr):
""" """
Get an attribute of a node Read one attribute of a node
""" """
rv = ua.ReadValueId() rv = ua.ReadValueId()
rv.NodeId = self.nodeid rv.NodeId = self.nodeid
...@@ -210,7 +219,7 @@ class Node(object): ...@@ -210,7 +219,7 @@ class Node(object):
params.NodesToRead.append(rv) params.NodesToRead.append(rv)
result = self.server.read(params) result = self.server.read(params)
result[0].StatusCode.check() result[0].StatusCode.check()
return result[0].Value return result[0]
def get_children(self, refs=ua.ObjectIds.HierarchicalReferences, nodeclassmask=ua.NodeClass.Unspecified): def get_children(self, refs=ua.ObjectIds.HierarchicalReferences, nodeclassmask=ua.NodeClass.Unspecified):
""" """
......
...@@ -50,10 +50,9 @@ def datetime_to_win_epoch(dt): ...@@ -50,10 +50,9 @@ def datetime_to_win_epoch(dt):
def win_epoch_to_datetime(epch): def win_epoch_to_datetime(epch):
(s, ns100) = divmod(epch - EPOCH_AS_FILETIME, HUNDREDS_OF_NANOSECONDS) (s, ns100) = divmod(epch - EPOCH_AS_FILETIME, HUNDREDS_OF_NANOSECONDS)
try: try:
# TDA, this generates exceptions on systems where RTC is really off
dt = datetime.utcfromtimestamp(s) dt = datetime.utcfromtimestamp(s)
except: except Exception as ex: #FIXME: find out what kind of exceptin is raised!!!
logger.debug("Exception occurred during conversion within 'win_epoch_to_datetime'.") logger.debug("Exception occurred during conversion within 'win_epoch_to_datetime'. %s", ex)
return datetime.now() return datetime.now()
dt = dt.replace(microsecond=(ns100 // 10)) dt = dt.replace(microsecond=(ns100 // 10))
return dt return dt
...@@ -850,12 +849,18 @@ class DataValue(FrozenClass): ...@@ -850,12 +849,18 @@ class DataValue(FrozenClass):
return obj return obj
def __str__(self): def __str__(self):
return 'DataValue(' + 'Encoding:' + str(self.Encoding) + ', ' + \ s = 'DataValue(Value:{})'.format(self.Value)
'Value:' + str(self.Value) + ', ' + \ if self.StatusCode is not None:
'StatusCode:' + str(self.StatusCode) + ', ' + \ s += ', StatusCode:{}'.format(self.StatusCode)
'SourceTimestamp:' + str(self.SourceTimestamp) + ', ' + \ if self.SourceTimestamp is not None:
'ServerTimestamp:' + str(self.ServerTimestamp) + ', ' + \ s += ', SourceTimestamp:{}'.format(self.SourceTimestamp)
'SourcePicoseconds:' + str(self.SourcePicoseconds) + ', ' + \ if self.ServerTimestamp is not None:
'ServerPicoseconds:' + str(self.ServerPicoseconds) + ')' s += ', ServerTimestamp:{}'.format(self.ServerTimestamp)
if self.SourcePicoseconds is not None:
s += ', SourcePicoseconds:{}'.format(self.SourcePicoseconds)
if self.ServerPicoseconds is not None:
s += ', ServerPicoseconds:{}'.format(self.ServerPicoseconds)
s += ')'
return s
__repr__ = __str__ __repr__ = __str__
...@@ -3,7 +3,7 @@ from distutils.command.install_data import install_data ...@@ -3,7 +3,7 @@ from distutils.command.install_data import install_data
setup (name = "freeopcua", setup (name = "freeopcua",
version = "0.9.3", version = "0.9.6",
description = "Pure Python OPC-UA client and server library", description = "Pure Python OPC-UA client and server library",
author = "Olivier Roulet-Dubonnet", author = "Olivier Roulet-Dubonnet",
author_email = "olivier.roulet@gmail.com", author_email = "olivier.roulet@gmail.com",
......
...@@ -456,6 +456,34 @@ class CommonTests(object): ...@@ -456,6 +456,34 @@ class CommonTests(object):
with self.assertRaises(Exception): with self.assertRaises(Exception):
bad.get_child(0, "myobj") bad.get_child(0, "myobj")
def test_value(self):
o = self.opc.get_objects_node()
var = ua.Variant(1.98, ua.VariantType.Double)
v = o.add_variable(3, 'VariableValue', var)
val = v.get_value()
self.assertEqual(1.98, val)
dvar = ua.DataValue(var)
dv = v.get_data_value()
self.assertEqual(ua.DataValue, type(dv))
self.assertEqual(dvar.Value, dv.Value)
self.assertEqual(dvar.Value, var)
def test_set_value(self):
o = self.opc.get_objects_node()
var = ua.Variant(1.98, ua.VariantType.Double)
dvar = ua.DataValue(var)
v = o.add_variable(3, 'VariableValue', var)
v.set_value(var.Value)
v1 = v.get_value()
self.assertEqual(v1, var.Value)
v.set_value(var)
v2 = v.get_value()
self.assertEqual(v2, var.Value)
v.set_data_value(dvar)
v3 = v.get_data_value()
self.assertEqual(v3.Value, dvar.Value)
def test_array_value(self): def test_array_value(self):
o = self.opc.get_objects_node() o = self.opc.get_objects_node()
v = o.add_variable(3, 'VariableArrayValue', [1, 2, 3]) v = o.add_variable(3, 'VariableArrayValue', [1, 2, 3])
...@@ -528,7 +556,7 @@ class CommonTests(object): ...@@ -528,7 +556,7 @@ class CommonTests(object):
clthandle, node, val, attr = msclt.future.result() clthandle, node, val, attr = msclt.future.result()
self.assertEqual(node, server_time_node) self.assertEqual(node, server_time_node)
delta = datetime.now() - val delta = datetime.now() - val
self.assertTrue(delta < timedelta(seconds=1)) self.assertTrue(delta < timedelta(seconds=2))
sub.unsubscribe(handle) sub.unsubscribe(handle)
sub.delete() sub.delete()
......
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