def test_base_data_type(self): nint32 = self.opc.get_node(ua.ObjectIds.Int32) dtype = nint32.add_data_type(0, "MyCustomDataType") dtype2 = dtype.add_data_type(0, "MyCustomDataType2") self.assertEqual(ua_utils.get_base_data_type(dtype), nint32) self.assertEqual(ua_utils.get_base_data_type(dtype2), nint32) ext = self.opc.nodes.objects.add_variable(0, "MyExtensionObject", ua.Argument()) d = ext.get_data_type() d = self.opc.get_node(d) self.assertEqual(ua_utils.get_base_data_type(d), self.opc.get_node(ua.ObjectIds.Structure)) self.assertEqual(ua_utils.data_type_to_variant_type(d), ua.VariantType.ExtensionObject)
def _value_to_etree(self, el, type_name, dtype, val): if val is None: return if isinstance(val, (list, tuple)): if dtype.NamespaceIndex == 0 and dtype.Identifier <= 21: elname = "uax:ListOf" + type_name else: # this is an extentionObject: elname = "uax:ListOfExtensionObject" list_el = Et.SubElement(el, elname) for nval in val: self._value_to_etree(list_el, type_name, dtype, nval) else: dtype_base = get_base_data_type(self.server.get_node(dtype)) dtype_base = dtype_base.nodeid if dtype_base == ua.NodeId(ua.ObjectIds.Enumeration): dtype_base = ua.NodeId(ua.ObjectIds.Int32) type_name = ua.ObjectIdNames[dtype_base.Identifier] if dtype_base.NamespaceIndex == 0 and dtype_base.Identifier <= 21: type_name = ua.ObjectIdNames[dtype_base.Identifier] val_el = Et.SubElement(el, "uax:" + type_name) self._val_to_etree(val_el, dtype_base, val) else: self._extobj_to_etree(el, type_name, dtype, val)