Exemple #1
0
async def task(loop):
    # setup our server
    server = Server()
    await server.init()
    server.set_endpoint('opc.tcp://0.0.0.0:4840/freeopcua/server/')  #4840
    # setup our own namespace, not really necessary but should as spec
    uri = 'http://examples.freeopcua.github.io'
    idx = await server.register_namespace(uri)
    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    await objects.add_method(ua.NodeId("ServerMethod", 2),
                             ua.QualifiedName('ServerMethod', 2), func,
                             [ua.VariantType.Int64], [ua.VariantType.Int64])

    # populating our address space
    myobj = await objects.add_object(idx, 'MyObject')
    myvar = await myobj.add_variable(idx, 'MyVariable', 6.7)
    await myvar.set_writable()  # Set MyVariable to be writable by clients

    # starting!
    async with server:
        count = 0
        while True:
            await asyncio.sleep(1)
            count += 0.1
            await myvar.set_value(count)
Exemple #2
0
class HelloServer:
    def __init__(self, endpoint, name, model_filepath):
        self.server = Server()

        #  This need to be imported at the start or else it will overwrite the data
        self.server.import_xml(model_filepath)

        self.server.set_endpoint(endpoint)
        self.server.set_server_name(name)

        objects = self.server.get_objects_node()

        freeopcua_namespace = self.server.get_namespace_index("urn:freeopcua:python:server")
        hellower = objects.get_child("0:Hellower")
        hellower_say_hello = hellower.get_child("0:SayHello")

        self.server.link_method(hellower_say_hello, say_hello_xml)

        hellower.add_method(
            freeopcua_namespace, "SayHello2", say_hello, [ua.VariantType.Boolean], [ua.VariantType.String])

        hellower.add_method(
            freeopcua_namespace, "SayHelloArray", say_hello_array, [ua.VariantType.Boolean], [ua.VariantType.String])

    def __enter__(self):
        self.server.start()
        return self.server

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.server.stop()
Exemple #3
0
class HelloServer:
    def __init__(self, endpoint, name, model_filepath):
        self.server = Server()

        #  This need to be imported at the start or else it will overwrite the data
        self.server.import_xml(model_filepath)

        self.server.set_endpoint(endpoint)
        self.server.set_server_name(name)

        objects = self.server.get_objects_node()

        freeopcua_namespace = self.server.get_namespace_index(
            "urn:freeopcua:python:server")
        hellower = objects.get_child("0:Hellower")
        hellower_say_hello = hellower.get_child("0:SayHello")

        self.server.link_method(hellower_say_hello, say_hello_xml)

        hellower.add_method(freeopcua_namespace, "SayHello2", say_hello,
                            [ua.VariantType.Boolean], [ua.VariantType.String])

        hellower.add_method(freeopcua_namespace, "SayHelloArray",
                            say_hello_array, [ua.VariantType.Boolean],
                            [ua.VariantType.String])

    def __enter__(self):
        self.server.start()
        return self.server

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.server.stop()
Exemple #4
0
def start_server(url):
    server = Server()
    server.set_endpoint(url)
    name = "OPC UA Simulation Server"
    addspace = server.register_namespace(name)

    node = server.get_objects_node()

    lvl = node.add_object(addspace, "Level Sensors")
    lvl1 = lvl.add_variable(addspace, "LVL1", 5)
    lvl2 = lvl.add_variable(addspace, "LVL2", 6)
    lvl3 = lvl.add_variable(addspace, "LVL3", 7)
    lvl4 = lvl.add_variable(addspace, "LVL4", 8)
    lvl5 = lvl.add_variable(addspace, "LVL5", 9)
    lvl6 = lvl.add_variable(addspace, "LVL6", 10)

    flow = node.add_object(addspace, "Flow Sensors")
    flow1 = flow.add_variable(addspace, "FLOW1", 1)
    flow2 = flow.add_variable(addspace, "FLOW2", 2)
    flow3 = flow.add_variable(addspace, "FLOW3", 3)
    flow4 = flow.add_variable(addspace, "FLOW4", 4)

    pump = node.add_object(addspace, "Pump Actuators")
    pump1 = pump.add_variable(addspace, "PUMP1", 0.1)
    pump2 = pump.add_variable(addspace, "PUMP2", 0.2)
    pump3 = pump.add_variable(addspace, "PUMP3", 0.3)
    pump4 = pump.add_variable(addspace, "PUMP4", 0.4)
    pump5 = pump.add_variable(addspace, "PUMP5", 0.5)
    pump6 = pump.add_variable(addspace, "PUMP6", 0.6)

    server.start()
    return server
class Servidor_OPCUA:
    def __init__(self):
        self.server = Server()
        self.server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/")
        self.server.set_server_name("Stack IIoT")
        self.namespaces = {}
        self.objects = self.server.get_objects_node()

    # Para agregar un nuevo namespace
    def new_namespace(self, uri, namespace, nombre):
        idx = self.server.register_namespace(uri)
        print('New namespace: {}'.format(idx))
        Namespace = namespace(
            self.objects, idx,
            self.server)  # Se declaran todas las variables del nuevo namespace
        self.namespaces[nombre] = Namespace

    def start(self):
        global alarma, valor_alarma, mensaje_alarma
        self.server.start()
        for nombre, namespace in self.namespaces.items():
            namespace.subscripciones()
        # Se incia el loop del servidor
        try:
            while True:
                time.sleep(0.1)
                for nombre, namespace in self.namespaces.items():
                    namespace.monitorea_alarma()
        finally:
            self.server.stop()
Exemple #6
0
def main():
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    server_namespace = "http://examples.freeopcua.github.io"
    address_space = server.register_namespace(server_namespace)

    # get Objects node, this is where we should put our custom stuff
    objects_node = server.get_objects_node()

    # Add the ocp objects (vars, features,...)
    # cresting the first object
    my_first_object = objects_node.add_object(address_space, "MyFirstObject")

    ##creating an array
    my_array = ChargeControllerObject.add_variable(address_space, "MyArray",
                                                   [6.7, 7.9])
    # the variable could be hard typed
    my_hardtyped_array = ChargeControllerObject.add_variable(
        address_space, "MyHardtypedArray", ua.Variant([],
                                                      ua.VariantType.Float))

    # starting!
    server.start()
    print("Server starting ...")

    while True:
        time.sleep(1)

        ## update array variables
        burst = [random.random() for _ in range(1024)]
        my_array.set_value(burst)
        my_hardtyped_array.set_value(burst)
Exemple #7
0
    def __init__(self):

        server = Server()
        server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

        # setup our own namespace, not really necessary but should as spec
        uri = "http://examples.freeopcua.github.io"
        idx = server.register_namespace(uri)

        # get Objects node, this is where we should put our nodes
        objects = server.get_objects_node()

        # populating our address space
        myobj = objects.add_object(idx, "MyObject")
        myvar1 = myobj.add_variable(idx, "MyVariable1", 1)
        myvar2 = myobj.add_variable(idx, "MyVariable2", 2)
        myvar3 = myobj.add_variable(idx, "MyVariable3", 3)
        myvar4 = myobj.add_variable(idx, "MyVariable4", 4)
        myvar5 = myobj.add_variable(idx, "MyVariable5", 5)

        myvar1.set_writable()  # Set MyVariable to be writable by clients
        myvar2.set_writable()  # Set MyVariable to be writable by clients
        myvar3.set_writable()  # Set MyVariable to be writable by clients
        myvar4.set_writable()  # Set MyVariable to be writable by clients
        myvar5.set_writable()  # Set MyVariable to be writable by clients

        self.server = server
Exemple #8
0
def run_opcua_server():
    """
    Creates the OPC/UA server and starts it.
    """

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://localhost:26543/example/server")

    # setup our own namespace, not really necessary but should as spec
    uri = "https://github.com/nathanagood/aws-greengrass-samples"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()  # Set MyVariable to be writable by clients

    # starting!
    server.start()

    try:
        count = 0
        while True:
            time.sleep(5)
            count += 1
            logger.debug('Setting value: %s', count)
            myvar.set_value(count)
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()
Exemple #9
0
def createOPCUA():
    global server
    server = Server()

    url = "opc.tcp://10.148.6.70:4840"
    server.set_endpoint(url)

    name = "MOTOR_SIMULATION"
    addspace = server.register_namespace(name)

    node = server.get_objects_node()

    Param = node.add_object(addspace, "Parameters")

    Temp = Param.add_variable(addspace, "Temperature", 0)
    Vibr = Param.add_variable(addspace, "Vibration", 0)
    Curr = Param.add_variable(addspace, "Current", 0)
    Rpm = Param.add_variable(addspace, "Rate Per Minute", 0)

    Temp.set_writable()
    Vibr.set_writable()
    Curr.set_writable()
    Rpm.set_writable()

    server.start()
    print("Server started at {}".format(url))
    return [Temp, Vibr, Curr, Rpm]
Exemple #10
0
def server_opc():
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/vm_opc")

    server.set_server_name("Servidor notificaciones vm")
    # setup our own namespace, not really necessary but should as spec
    uri = "notif VM"

    idx = server.register_namespace(uri)
    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "notif_vm")

    event_id = myobj.add_variable(idx, "ID evento", float(0))
    #    new_st.set_writable()

    tss = myobj.add_variable(idx, "Timestamp", datetime.datetime.now())
    #    new_st.set_writable()

    progresiva = myobj.add_variable(idx, "Progresiva", float(-1))

    estado_alarma = myobj.add_variable(idx, "Estado alarma", 'inicio')

    criticidad = myobj.add_variable(idx, "Criticidad", float(-1))

    ack_bit = myobj.add_variable(idx, "ACK bit", False)
    ack_bit.set_writable()

    alarma_activa = myobj.add_variable(idx, "Alarma presente", False)
    # starting!
    tags = {
        'id': event_id,
        'tss': tss,
        'prog': progresiva,
        'st': estado_alarma,
        'crit': criticidad,
        'ack': ack_bit,
        'active': alarma_activa
    }
    server.start()
    try:
        while True:
            if np.random.uniform() >= 0.5:
                tags['id'].set_value(float(np.random.randint(500)))
                tags['tss'].set_value(datetime.datetime.now())
                tags['st'].set_value(choice(['inicio', 'cambio', 'fin']))

            else:
                print 'Bit ACK: ', tags['ack'].get_value(
                ), datetime.datetime.now()
                time.sleep(3)
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()
Exemple #11
0
def start():
    mServer = Server()
    mServer.set_endpoint(URL)
    mServer.set_security_policy([
        ua.SecurityPolicyType.NoSecurity,
        ua.SecurityPolicyType.Basic256Sha256_SignAndEncrypt,
        ua.SecurityPolicyType.Basic256Sha256_Sign
    ])

    address_space = mServer.register_namespace(NAMESPACE_NAME)
    root_node = mServer.get_objects_node()
    params = root_node.add_object(address_space, "Parameters")
    start_time = params.add_variable(address_space, "start_time",
                                     start_timestamp)

    data = root_node.add_object(address_space, "data")

    pump = data.add_object(address_space, "Pump")
    temperature = 20 + random.randint(0, 10)
    pump_temp_var = pump.add_variable(address_space, "temperature",
                                      temperature)
    pump_temp_vup = VarUpdater(
        pump_temp_var)  # just  a dummy class update a variable

    pump_temp_unit = pump.add_variable(address_space, "unit", "°C")
    pump_status = pump.add_variable(address_space, "status", False)
    pump_status.set_writable()
    level = 12
    pump_level = pump.add_variable(address_space, "level", level)
    pump_level.set_writable()

    sleep_period = 0.5
    # Start the server
    mServer.start()
    print("Server started at {}".format(URL))

    print("root_node: " + root_node.__str__())
    print("params: " + params.__str__())
    print("pump: " + pump.__str__())
    # print(""+pump)

    # enable following if you want to subscribe to nodes on server side
    handler = SubHandler()
    sub = mServer.create_subscription(500, handler)
    handle = sub.subscribe_data_change(pump_level)

    # IMPORTANT: This should be started after the mServer.start()
    pump_temp_vup.start()
    try:
        while True:
            time.sleep(sleep_period)
    finally:
        # close connection, remove subscriptions, etc
        pump_temp_vup.stop()  # should be stopped
        mServer.stop()
Exemple #12
0
class TestCmdLines(unittest.TestCase):
    '''
    Test command lines
    '''
    @classmethod
    def setUpClass(self):
        self.srv = Server()
        self.srv_url = 'opc.tcp://localhost:%d' % port_num
        self.srv.set_endpoint(self.srv_url)
        objects = self.srv.get_objects_node()
        obj = objects.add_object(4, "directory")
        var = obj.add_variable(4, "variable", 1.999)
        var2 = obj.add_variable(4, "variable2", 1.777)
        var2.set_writable()
        self.srv.start()

    def test_uals(self):
        s = subprocess.check_output(
            ["python", "tools/uals", "--url", self.srv_url])
        self.assertIn(b"i=85", s)
        self.assertNotIn(b"i=89", s)
        self.assertNotIn(b"1.999", s)
        s = subprocess.check_output(
            ["python", "tools/uals", "--url", self.srv_url, "-d", "3"])
        self.assertIn(b"1.999", s)

    def test_uaread(self):
        s = subprocess.check_output([
            "python", "tools/uaread", "--url", self.srv_url, "--path",
            "0:Objects,4:directory,4:variable"
        ])
        self.assertIn(b"1.999", s)

    def test_uawrite(self):
        s = subprocess.check_output([
            "python", "tools/uawrite", "--url", self.srv_url, "--path",
            "0:Objects,4:directory,4:variable2", "1.789"
        ])
        s = subprocess.check_output([
            "python", "tools/uaread", "--url", self.srv_url, "--path",
            "0:Objects,4:directory,4:variable2"
        ])
        self.assertIn(b"1.789", s)
        self.assertNotIn(b"1.999", s)

    def test_uadiscover(self):
        s = subprocess.check_output(
            ["python", "tools/uadiscover", "--url", self.srv_url])
        self.assertIn(b"opc.tcp://localhost", s)
        self.assertIn(b"FreeOpcUa", s)
        self.assertIn(b"urn:freeopcua:python:server", s)

    @classmethod
    def tearDownClass(self):
        self.srv.stop()
Exemple #13
0
def main():
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    server_namespace = "http://examples.freeopcua.github.io"
    address_space = server.register_namespace( server_namespace )

    # get Objects node, this is where we should put our custom stuff
    objects_node = server.get_objects_node()

    # Add the ocp objects (vars, features,...)
    # cresting the first object
    my_first_object = objects_node.add_object(address_space, "MyFirstObject")


    # creating a default event object
    # The event object automatically will have members for all events properties
    # you probably want to create a custom event type, see other examples
    my_first_event_generator = server.get_event_generator()
    my_first_event_generator.event.Severity = 300

    # Creating a custom EVENT
    eventType = server.create_custom_event_type(
                    address_space,
                    'ThresholdEvent',
                    ua.ObjectIds.BaseEventType,
                    [
                        ('value',        ua.VariantType.Float),
                        ('alarmEnabled', ua.VariantType.Boolean),
                    ]
                )
    my_custom_event_generator = server.get_event_generator(eventType, my_first_object)


    # starting!
    server.start()
    print( "Server starting ...")

    rndEv = RandomEventsGenerator(my_first_event_generator)  # just  a stupide class update a variable
    rndEv.start()

    while True:
        time.sleep(1)

        sensor_value = random.random()
        threshold = 0.9

        if sensor_value > threshold:
            my_custom_event_generator.event.Message = ua.LocalizedText("Value is graeter than th")
            my_custom_event_generator.event.value =  ua.Variant(sensor_value, ua.VariantType.Float)
            my_custom_event_generator.event.alarmenabled =  ua.Variant( outputsEnabled , ua.VariantType.Boolean)
            my_custom_event_generator.event.Severity =  ua.Variant( 1 , ua.VariantType.Int32)
            my_custom_event_generator.trigger()
Exemple #14
0
def main():
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    server_namespace = "http://examples.freeopcua.github.io"
    address_space = server.register_namespace(server_namespace)

    # get Objects node, this is where we should put our custom stuff
    objects_node = server.get_objects_node()

    # Add the ocp objects (vars, features,...)
    # cresting the first object
    my_first_object = objects_node.add_object(address_space, "MyFirstObject")

    ## Two different methods definitions
    # First
    method_1_node = my_first_object.add_method(address_space,
                                               "method_1_description",
                                               odd_or_even,
                                               [ua.VariantType.Int32],
                                               [ua.VariantType.Boolean])

    # Second
    inarg_1 = ua.Argument()
    inarg_1.Name = "Argument_1"
    inarg_1.DataType = ua.NodeId(ua.ObjectIds.Float32)
    inarg_1.ValueRank = -1
    inarg_1.ArrayDimensions = []
    inarg_1.Description = ua.LocalizedText("Method argument 1 description")
    inarg_2 = ua.Argument()
    inarg_2.Name = "Argument_2"
    inarg_2.DataType = ua.NodeId(ua.ObjectIds.Float32)
    inarg_2.ValueRank = -1
    inarg_2.ArrayDimensions = []
    inarg_2.Description = ua.LocalizedText("Method argument 2 description")
    outarg = ua.Argument()
    outarg.Name = "Result"
    outarg.DataType = ua.NodeId(ua.ObjectIds.Float32)
    outarg.ValueRank = -1
    outarg.ArrayDimensions = []
    outarg.Description = ua.LocalizedText("Output argument description")

    method_2_node = my_first_object.add_method(address_space,
                                               "method_2_description",
                                               multiply, [inarg_1, inarg_2],
                                               [outarg])

    # starting!
    server.start()
    print("Server starting ...")

    while True:
        time.sleep(1)
class OPCUAServer(object):
    def __init__(self):
        self.server = None
        self.uri = ""
        self.idx = 0
        self.scan_thread = None
        self.scan_enable = False
        self.devices = []

        # setup our server
        self.server = Server()
        self.server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

        # setup our own namespace, not really necessary but should as spec
        uri = "http://examples.freeopcua.github.io"
        idx = self.server.register_namespace(uri)

        # import address space which has a device object
        self.server.import_xml("device.xml")

        # get Objects node
        objects = self.server.get_objects_node()

        # get the device object type so we can find all the devices in the address space
        hw_type = self.server.nodes.base_object_type.get_child("2:Device")
        device_nodes = find_o_types(objects, hw_type)

        # instantiate a device python object and make it an attribute of the server class
        # FIXME do your own organization, most likely an object oriented model
        for device_node in device_nodes:
            device = Device(self.server, device_node)
            setattr(self, device.b_name, device)
            # keep track of the device because so that we can update it cyclically using the driver
            self.devices.append(device)

    def _scan(self):
        while self.scan_enable:
            # update all device data from devices' configured driver, such as modbus)
            for device in self.devices:
                device.update()

            time.sleep(1)

    def scan_on(self):
        # Start the thread which handles the cyclic updates of devices
        self.scan_thread = threading.Thread(target=self._scan)
        # self.scan_thread.setDaemon(True)
        self.scan_enable = True
        self.scan_thread.start()

    def scan_off(self):
        # Stop the thread which handles cyclic updates
        self.scan_enable = False
        self.scan_thread.join()
Exemple #16
0
class MyDeviceServer(object):
    def __init__(self, endpoint, name):
        # Logging configuration
        self.logger = logging.getLogger('MyDeviceServer')
        self.logger.setLevel(logging.INFO)

        # Setup server
        self.server = Server()
        self.server.import_xml("MyDevice.xml")
        self.server.set_endpoint(endpoint)
        self.server.set_server_name(name)

        self.objects_node = self.server.get_objects_node()
        self.my_device_node = self.objects_node.get_child("0:MyDevice")
        self.my_device_toggle_b = self.my_device_node.get_child("0:ToggleB")
        self.my_device_toggle_c = self.my_device_node.get_child("0:ToggleC")
        self.my_device_toggle_d = self.my_device_node.get_child("0:ToggleD")

        self.server.link_method(self.my_device_toggle_b, self.toggle_b)
        self.server.link_method(self.my_device_toggle_c, self.toggle_c)
        self.server.link_method(self.my_device_toggle_d, self.toggle_d)

        self.my_variable_a = self.my_device_node.get_child("0:VariableA")
        self.my_variable_b = self.my_device_node.get_child("0:VariableB")
        self.my_variable_c = self.my_device_node.get_child("0:VariableC")
        self.my_variable_d = self.my_device_node.get_child("0:VariableD")
        self.my_variable_e = self.my_device_node.get_child("0:VariableE")

    @uamethod
    def toggle_b(self, parent):
        self.logger.info("Call Toggle B method")
        self.my_variable_b.set_value(not self.my_variable_b.get_value())

    @uamethod
    def toggle_c(self, parent):
        self.logger.info("Call Toggle C method")
        self.my_variable_c.set_value(not self.my_variable_c.get_value())

    @uamethod
    def toggle_d(self, parent):
        self.logger.info("Call Toggle D method")
        self.my_variable_d.set_value(not self.my_variable_d.get_value())

    def start(self):
        self.server.start()

    def stop(self):
        self.server.stop()

    def setVarA(self, intNumber):
        self.my_variable_a.set_value(intNumber)

    def setVarE(self, intNumber):
        self.my_variable_e.set_value(intNumber)
Exemple #17
0
 def start(self):
     server = Server()
     server.set_endpoint("opc.tcp://0.0.0.0:4840/thingsroot/server")
     server.set_server_name("ThingsRoot Example OpcUA Server")
     self.idx = server.register_namespace("http://opcua.thingsroot.com")
     self.objects = server.get_objects_node()
     self.server = server
     self.devices = _dict({})
     self.devices_sub_handle = _dict({})
     self.device_types = _dict({})
     # self.load_redis_db()
     server.start()
def create_Server_Basics(name, port):
    
    url = 'opc.tcp://0.0.0.0:' + port
    gebName = 'MEMAP_' + name
    server = Server()
    server.set_endpoint(url)
    server.set_server_name('MEMAP Mockup ' + name)
    idx = server.register_namespace(gebName)

    # Root node
    objects = server.get_objects_node()    
    return (server, url, idx, objects)
Exemple #19
0
class CTSServer:
    '''
    CTSClient class is the OpcUa client for the CTS OpcUa server.

    It also contains various high level function allowing to turn on and off
    leds, run scans, display the CTS status, load MC events in the CTS, etc...

    Input:
        - angle_cts : the configuration of the CTS (0., 120. or 240. degrees )

    '''
    def __init__(self, angle_cts):
        '''
        Initialise function for CTSClient

        Input:
            - angle_cts : the configuration of the CTS
            (0., 120. or 240. degrees)

        '''

        self.server = Server()
        self.cts = camtestsetup.CTS('config/cts_config_' +
                                    str(int(angle_cts)) + '.cfg',
                                    'config/camera_config.cfg',
                                    angle=angle_cts,
                                    connected=True)

        com.initialise_can(self.cts)

        # optional: setup logging
        logging.basicConfig(level=logging.WARN)
        self.logger = logging.getLogger("opcua.address_space")
        self.logger.setLevel(logging.DEBUG)

        self.server.set_endpoint(
            "opc.tcp://0.0.0.0:4843/cameratestsetup/server/")
        self.server.set_server_name("Camera Test Setup OpcUa Server")

        # setup our own namespace
        #uri = "http://isdc.unige.ch/"
        #idx = self.server.register_namespace(uri)

        # get Objects node, this is where we should put our custom stuff
        self.objects = self.server.get_objects_node()

        ## create the ua structure
        create_opcua_structure(self.cts, self.objects)

        # starting!
        ready = True
        self.server.start()
def run_OPCUA_server_start():
    print("Starting OPC UA SERVER %s:%s" % (OPCUA_HOST, OPCUA_PORT))
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://%s:%s/freeopcua/server/" % (OPCUA_HOST, OPCUA_PORT))

    # setup our own namespace, not really necessary but should as spec
    uri = "http://examples.freeopcua.github.io"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    imms = objects.add_object(idx, "IMMS")

    imms_date = imms.add_variable(idx, "DATE", 0, varianttype=ua.VariantType.Double)
    imms_date.set_writable()

    imms_time = imms.add_variable(idx, "TIME", "", varianttype=ua.VariantType.String)
    imms_time.set_writable()

    imms_ActSimPara1 = imms.add_variable(idx, "ActSimPara1", 0, varianttype=ua.VariantType.Double)
    imms_ActSimPara1.set_writable()

    imms_ActSimPara2 = imms.add_variable(idx, "ActSimPara2", 0, varianttype=ua.VariantType.Double)
    imms_ActSimPara2.set_writable()

    imms_ActCntCyc = imms.add_variable(idx, "ActCntCyc", 0, varianttype=ua.VariantType.Double)
    imms_ActCntCyc.set_writable()

    imms_ActCntPrt = imms.add_variable(idx, "ActCntPrt", 0, varianttype=ua.VariantType.Double)
    imms_ActCntPrt.set_writable()

    imms_ActStsMach = imms.add_variable(idx, "ActStsMach", "", varianttype=ua.VariantType.String)
    imms_ActStsMach.set_writable()

    imms_ActTimCyc = imms.add_variable(idx, "ActTimCyc", 5, varianttype=ua.VariantType.Double)
    imms_ActTimCyc.set_writable()

    imms_SetCntMld = imms.add_variable(idx, "SetCntMld", 0, varianttype=ua.VariantType.Double)
    imms_SetCntMld.set_writable()

    imms_SetCntPrt = imms.add_variable(idx, "SetCntPrt", 0, varianttype=ua.VariantType.Double)
    imms_SetCntPrt.set_writable()

    imms_SetTimCyc = imms.add_variable(idx, "SetTimCyc", 0, varianttype=ua.VariantType.Double)
    imms_SetTimCyc.set_writable()

    # starting!
    server.start()
def run_simulation_server(steps):
    """
    This support function creates a simple OPC UA server with node listed in the config file
    :param steps: Lifecycle of the server
    :return:
    """

    with open('../src_test/config_test.yaml') as config_file:
        cfg = yaml.safe_load(config_file)

    # setup the server
    server = Server()
    server.set_endpoint(cfg['opcua']['url'])

    # setup the namespace
    uri = "http://examples.freeopcua.github.io"
    idx = server.register_namespace(uri)

    # get objects node
    objects = server.get_objects_node()

    # server start
    server.start()
    log_event(cfg, 'OPCUA TEST SERVER', '', 'INFO', 'OPC UA server started')

    # populating the address space
    myobj = objects.add_object(idx, "TestDataAssembly")

    nodes = []
    metrics = cfg['metrics']
    for metric in metrics:
        metric_id = metric['metric_id']
        meas = metric['measurement']
        tag = metric['tagname']
        var = metric['variable']
        ns = metric['nodeNamespace']
        id = metric['nodeId']
        method = metric['method']
        time_interval = metric['interval']
        node_str = 'ns=' + str(ns) + '; i=' + str(id)
        nodes.append(myobj.add_variable(node_str, var, -1))

    # update variable
    time.sleep(1)
    for it in range(steps):
        for node in nodes:
            node.set_value(node.get_value() + 1)
            time.sleep(0.5)
    time.sleep(2)
    server.stop()
    log_event(cfg, 'OPCUA TEST SERVER', '', 'INFO', 'OPC UA server stopped')
Exemple #22
0
def start_opc():
    """
    The function initializes an OPC server and creates required tags for WinCC.

    Args:
        (nil)

    Returns:
        tags: A list of OPC tags to be sent to WinCC.

        server: The initialised server itself is returned. Will be later used
                to stop the server.

    """

    # creates a 'local' server at port '8020'
    server = Server()
    server.set_endpoint("opc.tcp://127.0.0.1:8020/")

    uri = "gesture_control"
    idx = server.register_namespace(uri)
    objects = server.get_objects_node()
    obj = objects.add_object(idx, "GestureTest")

    # fan-1 tags
    a_sel = obj.add_variable(idx, "f1_sel", False)
    a_cmd = obj.add_variable(idx, "f1_cmd", False)
    a_sel.set_writable()
    a_cmd.set_writable()

    # fan-2 tags
    b_sel = obj.add_variable(idx, "f2_sel", False)
    b_cmd = obj.add_variable(idx, "f2_cmd", False)
    b_sel.set_writable()
    b_cmd.set_writable()

    # fan-3 tags
    c_sel = obj.add_variable(idx, "f3_sel", False)
    c_cmd = obj.add_variable(idx, "f3_cmd", False)
    c_sel.set_writable()
    c_cmd.set_writable()

    tags = [a_sel, a_cmd, b_sel, b_cmd, c_sel, c_cmd]

    # start server
    server.start()

    return tags, server
def main():

    FORMAT = '%(asctime)-15s - %(message)s'
    logging.basicConfig(filename='opcua.log',
                        level=logging.DEBUG,
                        format=FORMAT)
    # logging.basicConfig(level=logging.DEBUG, format=FORMAT)

    # log = LoggerUtility.get_logger("dht11.log")

    # log.info("**************************** START ****************************")

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    uri = "http://paolopasqua.site"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    d = sOPCUA_DHT(sOPCUA_DHT.DHT11, "test", "D24")
    d.register_to_server(idx, objects)

    #26 19 13 6
    r1 = sOPCUA_Relay(26, "1")
    r1.register_to_server(idx, objects)

    r2 = sOPCUA_Relay(19, "2")
    r2.register_to_server(idx, objects)

    r3 = sOPCUA_Relay(13, "3")
    r3.register_to_server(idx, objects)

    r4 = sOPCUA_Relay(6, "4")
    r4.register_to_server(idx, objects)

    shutdown = False

    try:
        server.start()
        while not shutdown:
            pass
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()
Exemple #24
0
def create_Server_Basics(objectName, ems, port):

    url = 'opc.tcp://0.0.0.0:' + port
    gebName = objectName + ems
    server = Server()
    server.set_endpoint(url)
    server.set_server_name(objectName + '_OPCUA_Server_' + ems)
    idx = server.register_namespace(gebName)
    '''
    server.set_security_policy([
                ua.SecurityPolicyType.NoSecurity,
                ua.SecurityPolicyType.Basic256Sha256_SignAndEncrypt,
                ua.SecurityPolicyType.Basic256Sha256_Sign])
    '''

    # Root node
    objects = server.get_objects_node()
    return (server, url, idx, objects)
Exemple #25
0
def main():
    # create Server object
    server = Server()

    # define ip address for the server. format: 'opc.tcp://[ip_address]'
    url = 'opc.tcp://0.0.0.0:4840/freeopcua/server/'
    server.set_endpoint(url)

    # define address space
    name = 'OPCUA_SIMULATION_SERVER'
    addspace = server.register_namespace(name)

    # get root node
    root_node = server.get_objects_node()

    # define node where we wish to run parameters
    # assign to address space and name it 'Parameters'
    obj = root_node.add_object(addspace, 'Parameters')

    # We will use three parameters: temperature, pressure, time
    temp_param = obj.add_variable(addspace, 'Temperature', 0)
    pres_param = obj.add_variable(addspace, 'Pressure', 0)
    time_param = obj.add_variable(addspace, 'Time', 0)

    # make variables writable
    temp_param.set_writable()
    pres_param.set_writable()
    time_param.set_writable()

    server.start()

    print(f'server started at {url}')

    try:
        count = 0
        while True:
            time.sleep(1)
            count += 0.1
            temp_param.set_value(random.random())
            pres_param.set_value(random.randint(1, 100))
            time_param.set_value(count)
    finally:
        # close connection, remove subcsriptions, etc
        server.stop()
class TestCmdLines(unittest.TestCase):

    '''
    Test command lines
    '''
    @classmethod
    def setUpClass(self):
        self.srv = Server()
        self.srv_url = 'opc.tcp://localhost:%d' % port_num
        self.srv.set_endpoint(self.srv_url)
        objects = self.srv.get_objects_node()
        obj = objects.add_object(4, "directory")
        var = obj.add_variable(4, "variable", 1.999)
        var2 = obj.add_variable(4, "variable2", 1.777)
        var2.set_writable()
        self.srv.start()

    def test_uals(self):
        s = subprocess.check_output(["python", "tools/uals", "--url", self.srv_url])
        self.assertIn(b"i=85", s)
        self.assertNotIn(b"i=89", s)
        self.assertNotIn(b"1.999", s)
        s = subprocess.check_output(["python", "tools/uals", "--url", self.srv_url, "-d", "3"])
        self.assertIn(b"1.999", s)

    def test_uaread(self):
        s = subprocess.check_output(["python", "tools/uaread", "--url", self.srv_url, "--path", "0:Objects,4:directory,4:variable"])
        self.assertIn(b"1.999", s)

    def test_uawrite(self):
        s = subprocess.check_output(["python", "tools/uawrite", "--url", self.srv_url, "--path", "0:Objects,4:directory,4:variable2", "1.789"])
        s = subprocess.check_output(["python", "tools/uaread", "--url", self.srv_url, "--path", "0:Objects,4:directory,4:variable2"])
        self.assertIn(b"1.789", s)
        self.assertNotIn(b"1.999", s)

    def test_uadiscover(self):
        s = subprocess.check_output(["python", "tools/uadiscover", "--url", self.srv_url])
        self.assertIn(b"opc.tcp://localhost", s)
        self.assertIn(b"FreeOpcUa", s)
        self.assertIn(b"urn:freeopcua:python:server", s)

    @classmethod
    def tearDownClass(self):
        self.srv.stop()
Exemple #27
0
def main():
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    server_namespace = "http://examples.freeopcua.github.io"
    address_space = server.register_namespace( server_namespace )

    # get Objects node, this is where we should put our custom stuff
    objects_node = server.get_objects_node()

    # Add the ocp objects (vars, features,...)
    # cresting the first object
    my_first_object = objects_node.add_object(address_space, "MyFirstObject")

    # create the fist variable
    my_first_variable = my_first_object.add_variable( address_space, "MyFirstVariable", 0.0 )
    # create a hardtyped variable
    my_hardtyped_variable = my_first_object.add_variable(address_space, "MyHardtypedVariable", 0, ua.VariantType.Float)

    # allow the clients to update variable value
    my_first_variable.set_writable()

    # starting!
    server.start()
    print( "Server starting ...")

    # count the cycles
    count = 0

    while True:
        count = count + 1
        time.sleep(1)

        # use the counter as a dummy value
        value = count

        # assign the value to the varibles
        my_first_variable.set_value( value )
        my_hardtyped_variable.set_value( value )
Exemple #28
0
def mymain():

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    uri = "http://examples.freeopcua.github.io"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()  # Set MyVariable to be writable by clients

    # starting!
    server.start()
    server.stop()
Exemple #29
0
def mymain():

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    uri = "http://examples.freeopcua.github.io"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients

    # starting!
    server.start()
    server.stop()
def start_opcua_server():
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/sirris/server/")

    # setup our own namespace, not really necessary but should as spec
    uri = "http://examples.sirris.github.io"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "AMIF_oven")
    myvar = myobj.add_variable(idx, "oven_temperature", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients
    # q.put(myvar)

    # starting!
    server.start()

    return myvar
class HelloServer:
    def __init__(self, endpoint, name, model_filepath):
        self.server = Server()

        #  This need to be imported at the start or else it will overwrite the data
        self.server.import_xml(model_filepath)

        self.server.set_endpoint(endpoint)
        self.server.set_server_name(name)

        objects = self.server.get_objects_node()
	
	ESP8266=self.server.get_node("ns=0;i=20005")
	print("ESP8266: ")
	print(ESP8266)	

	#death_button=ESP8266.get_children()
	watering_status=ESP8266.get_value()
	print(watering_status)
	switch_method=self.server.get_node("ns=0;i=20006")
        freeopcua_namespace = self.server.get_namespace_index("urn:freeopcua:python:server")
#        hellower = objects.get_child("0:Hellower")
#        hellower_say_hello = hellower.get_child("0:SayHello")
	self.server.link_method(switch_method, switch_mtd)
#        self.server.link_method(hellower_say_hello, say_hello_xml)

#        hellower.add_method(
#            freeopcua_namespace, "SayHello2", say_hello, [ua.VariantType.Boolean], [ua.VariantType.String])

#        hellower.add_method(
#            freeopcua_namespace, "SayHelloArray", say_hello_array, [ua.VariantType.Boolean], [ua.VariantType.String])

    def __enter__(self):
        self.server.start()
        return self.server

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.server.stop()
Exemple #32
0
def main():
    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    server_namespace = "http://examples.freeopcua.github.io"
    address_space = server.register_namespace(server_namespace)

    # get Objects node, this is where we should put our custom stuff
    objects_node = server.get_objects_node()

    # Add the ocp objects (vars, features,...)
    # cresting the first object
    my_first_object = objects_node.add_object(address_space, "MyFirstObject")

    ## creating a property
    my_first_property = my_first_object.add_property(address_space,
                                                     "MyFirstProperty",
                                                     "Epever")
    my_second_property = my_first_object.add_property(address_space,
                                                      "MySecondProperty",
                                                      "Tracer 2210A MPPT")

    # starting!
    server.start()
    print("Server starting ...")

    # count the cycles
    count = 0

    while True:
        count = count + 1
        time.sleep(1)

        # use the counter as a dummy value
        value = count
Exemple #33
0
def setup_server():
   '''
  To avoid problems with opc toolbox from matlab use one of the following
  to indicate the host ip:
     - '192.168.0.183' change if needed
     - 'pi.local' mdns name
     DO NOT USE '0.0.0.0' or localhost!!!
   '''
   # setup our server
   server = Server()
   server.set_endpoint("opc.tcp://pi.local:4840/opcua")

   # setup our own namespace, not really necessary but should as spec
   uri = "http://examples.freeopcua.github.io"
   idx = server.register_namespace(uri)

   # get Objects node, this is where we should put our nodes
   objects = server.get_objects_node()

   # populating our address space
   myobj = objects.add_object(idx, "MyCar")
   myvar = myobj.add_variable(idx, "RPM", 0)
   myvar.set_writable()    # Set MyVariable to be writable by clients
   return server, myvar
Exemple #34
0
from opcua import ua, Server
from opcua.server.history_sql import HistorySQLite


if __name__ == "__main__":

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # setup our own namespace, not really necessary but should as spec
    uri = "http://examples.freeopcua.github.io"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our custom stuff
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", ua.Variant(0, ua.VariantType.Double))
    myvar.set_writable()  # Set MyVariable to be writable by clients

    # Creating a custom event: Approach 1
    # The custom event object automatically will have members from its parent (BaseEventType)
    etype = server.create_custom_event_type(2, 'MyFirstEvent', ua.ObjectIds.BaseEventType,
                                            [('MyNumericProperty', ua.VariantType.Float),
                                             ('MyStringProperty', ua.VariantType.String)])
    # create second event
    etype2 = server.create_custom_event_type(2, 'MySecondEvent', ua.ObjectIds.BaseEventType,
                                             [('MyOtherProperty', ua.VariantType.Float)])
Exemple #35
0
class OPCServer(object):
    
    def __init__(self, settings):
        super(OPCServer, self).__init__()
        server_settings = settings.get("server")
        objects = settings.get("objects")
        
        self._endpoint = server_settings["endpoint"]
        self._name = server_settings["name"]
        self._namespace = server_settings["namespace"]
    
        self._init_server()
        
        
        for o in objects:
            self._add_object(o["name"])
            for variable, value in o["ro_variables"].items():
                self._add_variable(o["name"], variable, value)
            for variable, value in o["rw_variables"].items():
                self._add_variable(o["name"], variable, value, True)
        
    def start(self):
        if self._server:
            self._server.start()

    def _init_server(self):
        self._server = Server()
        self._server.set_endpoint(self._endpoint)
        self._server.set_server_name(self._name)
        self._index = self._server.register_namespace(self._namespace)
        
        _log.info("Index: %r" % (self._index,))
        self._objects_node = self._server.get_objects_node()
        _log.info("Node: %r" % (self._objects_node))
        self._objects = {}
        _log.info("Endpoints: %r" % (self._server.get_endpoints()))
        
    def stop(self):
        self._server.stop()
        
    def _add_object(self, object_name):
        self._objects[object_name] = { 'object': self._objects_node.add_object(self._index, object_name), 'variables' : {}}
        
    def _add_variable(self, object_name, variable_name, value, writable=False):
        obj = self._objects.get(object_name, None)
        if obj.get('object', None):
            var = self._objects_node.add_variable(self._index, variable_name, str(value))
            obj['variables'][variable_name] = var
            if writable:
                var.set_writable()
            return True
        return False
        
    def _get_variable(self, object_name, variable_name):
        obj = self._objects.get(object_name)
        if obj.get('object', None):
            var = obj['variables'].get(variable_name, None)
            return var
        return None
                        
    def set_value(self, object_name, variable_name, value):
        var = self._get_variable(object_name, variable_name)
        if var:
            var.set_value(str(value))
            return True
        return False
            
    def get_value(self, object_name, variable_name):
        var = self._get_variable(object_name, variable_name)
        if var:
            return var.get_value()
        return None
Exemple #36
0
def uaserver():
    parser = argparse.ArgumentParser(description="Run an example OPC-UA server. By importing xml definition and using uawrite command line, it is even possible to expose real data using this server")
    # we setup a server, this is a bit different from other tool so we do not reuse common arguments
    parser.add_argument("-u",
                        "--url",
                        help="URL of OPC UA server, default is opc.tcp://0.0.0.0:4840",
                        default='opc.tcp://0.0.0.0:4840',
                        metavar="URL")
    parser.add_argument("-v",
                        "--verbose",
                        dest="loglevel",
                        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
                        default='WARNING',
                        help="Set log level")
    parser.add_argument("-x",
                        "--xml",
                        metavar="XML_FILE",
                        help="Populate address space with nodes defined in XML")
    parser.add_argument("-p",
                        "--populate",
                        action="store_true",
                        help="Populate address space with some sample nodes")
    parser.add_argument("-c",
                        "--disable-clock",
                        action="store_true",
                        help="Disable clock, to avoid seeing many write if debugging an application")
    parser.add_argument("-s",
                        "--shell",
                        action="store_true",
                        help="Start python shell instead of randomly changing node values")
    parser.add_argument("--certificate",
                        help="set server certificate")
    parser.add_argument("--private_key",
                        help="set server private key")
    args = parser.parse_args()
    logging.basicConfig(format="%(levelname)s: %(message)s", level=getattr(logging, args.loglevel))

    server = Server()
    server.set_endpoint(args.url)
    if args.certificate:
        server.load_certificate(args.certificate)
    if args.private_key:
        server.load_private_key(args.private_key)
    server.disable_clock(args.disable_clock)
    server.set_server_name("FreeOpcUa Example Server")
    if args.xml:
        server.import_xml(args.xml)
    if args.populate:
        @uamethod
        def multiply(parent, x, y):
            print("multiply method call with parameters: ", x, y)
            return x * y

        uri = "http://examples.freeopcua.github.io"
        idx = server.register_namespace(uri)
        objects = server.get_objects_node()
        myobj = objects.add_object(idx, "MyObject")
        mywritablevar = myobj.add_variable(idx, "MyWritableVariable", 6.7)
        mywritablevar.set_writable()    # Set MyVariable to be writable by clients
        myvar = myobj.add_variable(idx, "MyVariable", 6.7)
        myarrayvar = myobj.add_variable(idx, "MyVarArray", [6.7, 7.9])
        myprop = myobj.add_property(idx, "MyProperty", "I am a property")
        mymethod = myobj.add_method(idx, "MyMethod", multiply, [ua.VariantType.Double, ua.VariantType.Int64], [ua.VariantType.Double])

    server.start()
    try:
        if args.shell:
            embed()
        elif args.populate:
            count = 0
            while True:
                time.sleep(1)
                myvar.set_value(math.sin(count / 10))
                myarrayvar.set_value([math.sin(count / 10), math.sin(count / 100)])
                count += 1
        else:
            while True:
                time.sleep(1)
    finally:
        server.stop()
    sys.exit(0)
Exemple #37
0
def run(nodejson, endpoint, namespace, description):

    # now setup our server
    server = Server()
    #server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/")
    server.set_endpoint(endpoint)
    server.set_server_name(description)

    # setup our own namespace
    uri = namespace
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our custom stuff
    objects = server.get_objects_node()

    variables = {}
    
    nodeId = 5
    
    def add_variable(f, vals, nodeId):
        for x in vals:
            k = x if isinstance(x, str) or isinstance(x, unicode) else x.keys()[0]
            #v = f.add_variable("ns=6;i=600%d" % nodeId, k, ua.Variant([], ua.VariantType.Float))
            v = f.add_variable("ns=6;i=600%d" % nodeId, x, ua.Variant([], ua.VariantType.Float))
            # nodeid, browsename, value, [variant type]
            #v = f.add_variable("ns=6;s=%s" % x, x, ua.Variant([], ua.VariantType.Float))
            v.set_writable()
            variables[k] = v
            nodeId = nodeId+1
            
        return nodeId
    
    
    def add_folder(p, pid, val, nodeId):
        for n, v in val.items():
            mf = p.add_folder("ns=%d;i=%d00%d" % (pid, pid, nodeId), n)
            #mf = p.add_folder("ns=%d;s=%s" % (pid, n), n)
            
            if isinstance(v, list) or isinstance(v, tuple):
                nodeId = add_variable(mf, v, nodeId+1)
            else:
                nodeId = add_folder(mf, pid+1, v, nodeId+1)

        return nodeId
    
    # populating our address space
    add_folder(objects, 5, nodejson, nodeId)
                
    
    '''
    myobj = objects.add_object(idx, "MyObject")
    
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients
    myarrayvar = myobj.add_variable(idx, "myarrayvar", [6.7, 7.9])
    myarrayvar = myobj.add_variable(idx, "myStronglytTypedVariable", ua.Variant([], ua.VariantType.UInt32))
    myprop = myobj.add_property(idx, "myproperty", "I am a property")
    mymethod = myobj.add_method(idx, "mymethod", func, [ua.VariantType.Int64], [ua.VariantType.Boolean])
    
                
    inargx = ua.Argument()
    inargx.Name = "x"
    inargx.DataType = ua.NodeId(ua.ObjectIds.Int64)
    inargx.ValueRank = -1
    inargx.ArrayDimensions = []
    inargx.Description = ua.LocalizedText("First number x")
    inargy = ua.Argument()
    inargy.Name = "y"
    inargy.DataType = ua.NodeId(ua.ObjectIds.Int64)
    inargy.ValueRank = -1
    inargy.ArrayDimensions = []
    inargy.Description = ua.LocalizedText("Second number y")
    outarg = ua.Argument()
    outarg.Name = "Result"
    outarg.DataType = ua.NodeId(ua.ObjectIds.Int64)
    outarg.ValueRank = -1
    outarg.ArrayDimensions = []
    outarg.Description = ua.LocalizedText("Multiplication result")

    multiply_node = myobj.add_method(idx, "multiply", multiply, [inargx, inargy], [outarg])
    '''
    # starting!
    server.start()
    #print("Available loggers are: ", logging.Logger.manager.loggerDict.keys())
    
    return server, variables