async def _create_custom_type(self, idx, name, basetype, properties, variables, methods): base_t = _get_node(self.iserver.isession, basetype) custom_t = await base_t.add_object_type(idx, name) for prop in properties: datatype = None if len(prop) > 2: datatype = prop[2] await 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] await custom_t.add_variable(idx, variable[0], ua.get_default_value(variable[1]), varianttype=variable[1], datatype=datatype) for method in methods: await custom_t.add_method(idx, method[0], method[1], method[2], method[3]) return custom_t
def _add_design_node(self, base_struct, idx, el): try: struct_node = base_struct.get_child(f"{idx}:{el.name}") except ua.UaError: logger.warning("Could not find struct %s under %s", el.name, base_struct) return for field in el.fields: if hasattr(ua.ObjectIds, field.uatype): dtype = self.server_mgr.get_node( getattr(ua.ObjectIds, field.uatype)) else: dtype = self._get_datatype_from_string(idx, field.uatype) if not dtype: logger.warning("Could not find datatype of name %s %s", field.uatype, type(field.uatype)) return vtype = data_type_to_variant_type(dtype) val = ua.get_default_value(vtype) node = struct_node.add_variable(idx, field.name, val, varianttype=vtype, datatype=dtype.nodeid) if field.array: node.write_value_rank(ua.ValueRank.OneDimension) node.set_array_dimensions([1])
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)()
async def create_custom_data_type(self, idx, name, basetype=ua.ObjectIds.BaseDataType, properties=None, description=None) -> Coroutine: if properties is None: properties = [] base_t = _get_node(self.iserver.isession, basetype) custom_t = await base_t.add_data_type(idx, name, description) for prop in properties: datatype = None if len(prop) > 2: datatype = prop[2] await custom_t.add_property(idx, prop[0], ua.get_default_value(prop[1]), varianttype=prop[1], datatype=datatype) return custom_t