def _create_custom_type(self, idx, name, basetype, properties, variables, methods): if isinstance(basetype, Node): base_t = basetype elif isinstance(basetype, ua.NodeId): base_t = Node(self.iserver.isession, basetype) else: base_t = Node(self.iserver.isession, ua.NodeId(basetype)) custom_t = base_t.add_object_type(idx, name) for prop in properties: datatype = None if len(prop) > 2: datatype = prop[2] custom_t.add_property(idx, prop[0], ua.get_default_value(prop[1]), varianttype=prop[1], datatype=datatype) for variable in variables: datatype = None if len(variable) > 2: datatype = variable[2] custom_t.add_variable(idx, variable[0], ua.get_default_value(variable[1]), varianttype=variable[1], datatype=datatype) for method in methods: custom_t.add_method(idx, method[0], method[1], method[2], method[3]) return custom_t
def get_default_value(uatype): if isinstance(uatype, ua.VariantType): return ua.get_default_values(uatype) elif hasattr(ua.VariantType, uatype): return ua.get_default_value(getattr(ua.VariantType, uatype)) else: return getattr(ua, uatype)()
def handle_write_source(self, incoming, value, source_time): "Receive a value change from an expression and update the server" #self.logger.debug( # "'Write source' event to %s. value: %s at %s", # incoming.key, # value, # source_time, #) nodeid = self.get_nodeid(incoming) incoming, varnode = self.get_source(nodeid) varianttype = self.get_varianttype(incoming) # Check if datatype is compatible with varianttype if isinstance(varianttype, ua.VariantType): if (varianttype == ua.VariantType.String) and (isinstance( value, str) or value is None): pass # string can be None or str elif not isinstance(value, type( ua.get_default_value(varianttype))): self.logger.error( "%s: Value %s is not compatible with datatype %r", nodeid, incoming.value_as_string, varianttype, ) varianttype = None datavalue = self.create_datavalue(value, varianttype, ua.StatusCodes.Good, source_time) varnode.set_value(datavalue)
def get_default_value(uatype): if isinstance(uatype, ua.VariantType): return ua.get_default_values(uatype) elif hasattr(ua.VariantType, uatype): return ua.get_default_value(getattr(ua.VariantType, uatype)) else: return getattr(ua, uatype)()
def create_custom_data_type(self, idx, name, basetype=ua.ObjectIds.BaseDataType, properties=None, description=None): if properties is None: properties = [] if isinstance(basetype, Node): base_t = basetype elif isinstance(basetype, ua.NodeId): base_t = Node(self.iserver.isession, basetype) else: base_t = Node(self.iserver.isession, ua.NodeId(basetype)) custom_t = base_t.add_data_type(idx, name, description) for prop in properties: datatype = None if len(prop) > 2: datatype = prop[2] custom_t.add_property(idx, prop[0], ua.get_default_value(prop[1]), varianttype=prop[1], datatype=datatype) return custom_t
def _create_custom_type(self, idx, name, basetype, properties, variables, methods): if isinstance(basetype, Node): base_t = basetype elif isinstance(basetype, ua.NodeId): base_t = Node(self.iserver.isession, basetype) else: base_t = Node(self.iserver.isession, ua.NodeId(basetype)) custom_t = base_t.add_object_type(idx, name) for prop in properties: datatype = None if len(prop) > 2: datatype = prop[2] custom_t.add_property(idx, prop[0], ua.get_default_value(prop[1]), varianttype=prop[1], datatype=datatype) for variable in variables: datatype = None if len(variable) > 2: datatype = variable[2] custom_t.add_variable(idx, variable[0], ua.get_default_value(variable[1]), varianttype=variable[1], datatype=datatype) for method in methods: custom_t.add_method(idx, method[0], method[1], method[2], method[3]) return custom_t