Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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)()
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
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)()
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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