Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix: Node.set_value() does not work with enumerations #888

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Bugfix: Node.set_value() does not work with enumerations
If a client tries to set a enum variable without explicitly force the data type it becomes implicit converted to a ua.Variant.Int64. The server expects an Int32 for an enum value. This is why set_value() crashes if you try to set an enum value using a integer literal like "set_value(2)".

The enumeration seems to need a special treadment at this point. See ua_utils.py def data_type_to_variant_type().

If no data type was given in method set_value(), this change checks the data type of the node object and automatically converts the value argument to the correct target data type of the server.
MarcoH82 authored Sep 9, 2019
commit 66c0fd4edce62dff64a63256893d096376dc11b0
8 changes: 8 additions & 0 deletions opcua/common/node.py
Original file line number Diff line number Diff line change
@@ -209,13 +209,21 @@ def set_value(self, value, varianttype=None):
elif isinstance(value, ua.Variant):
datavalue = ua.DataValue(value)
datavalue.SourceTimestamp = datetime.utcnow()
elif varianttype is None:
# Use the data type of the node (self) if no data type is given.
varianttype = self.get_data_type_as_variant_type()
datavalue = ua.DataValue(ua.Variant(value, varianttype))
datavalue.SourceTimestamp = datetime.utcnow()
else:
datavalue = ua.DataValue(ua.Variant(value, varianttype))
datavalue.SourceTimestamp = datetime.utcnow()

self.set_attribute(ua.AttributeIds.Value, datavalue)

set_data_value = set_value

set_data_value = set_value

def set_writable(self, writable=True):
"""
Set node as writable by clients.