From 35e824a8f80380477da0109d3e043a80a09861b0 Mon Sep 17 00:00:00 2001
From: Susa Giogoli <su.giogoli@icloud.com>
Date: Wed, 12 Jul 2023 13:38:24 +0200
Subject: [PATCH] Enums can be generated now althought only with strings as
 varianttypes

---
 newmodeljsonparse.py |  31 +++++------
 writefile.py         | 120 +++++++++++++++++++++++++++++--------------
 2 files changed, 95 insertions(+), 56 deletions(-)

diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py
index e6ee926..2c85af9 100644
--- a/newmodeljsonparse.py
+++ b/newmodeljsonparse.py
@@ -22,11 +22,12 @@ def functionJsonDecod(functiondict):
 
 #Measurement class that can be instantiated using JsonDecod functions
 class Measurement:
-    def __init__(self, name, description, datatype, value, dimension, unit=None, range=None):
+    def __init__(self, name, description, datatype, value, uuid, dimension, unit=None, range=None):
         self.name = name
         self.description = description
         self.datatype = datatype
         self.range = range
+        self.uuid = uuid
         self.dimension = dimension
         self.unit = unit
         array = []
@@ -38,7 +39,7 @@ class Measurement:
 
 #Parameter class that can be instantiated using JsonDecod functions
 class Parameter:
-    def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False):
+    def __init__(self, name, description, datatype, dimension, value, uuid, rangevar=None, unit=None, default=None, constant=False):
         self.name = name
         self.description = description
         self.datatype = datatype
@@ -46,6 +47,7 @@ class Parameter:
         #     self.range = None
         # else:
         self.range = rangevar
+        self.uuid = uuid
         self.dimension = dimension
         self.unit = unit
         self.default = default
@@ -275,7 +277,7 @@ def getStreams(list1, component, jsoncomponents):
         return list1
 
 
-def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone):
+def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone, enumnodedict, enumvalues, enumnames):
     for obj in jsoninterfaces:
         rootobj = {}
         if obj["elementType"] == "interface":
@@ -292,16 +294,16 @@ def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponen
             objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements)
             #print(objmeasurementlist)
             measurementsobjs = getMeasurements(objmeasurementlist)
-            wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])])
+            wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])], enumnodedict, enumvalues, enumnames)
             variablelist = getVariables([], rootobj, jsoncomponents)
             variabledict[obj["uuid"]] = variablelist
             objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters)
             parameterobjs = getParameters(objparameterlist)
-            wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])])
+            wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])], enumnodedict, enumvalues, enumnames)
             objfunctionlist = getInterfaceparam([], rootobj, "functions", jsoncomponents, jsonfunctions)
             functionobj = getFunctions(objfunctionlist, jsonparameters, jsonmeasurements)
             wf.writefunction(functionobj, interfacesreturn[str(obj["name"])])
-            buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone)
+            buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone, enumnodedict, enumvalues, enumnames)
     return interfacesreturn, variabledict
 
 
@@ -377,26 +379,19 @@ def main():
                 jsoncomponents.append(obj)
             elif obj["elementType"] == "interface":
                 jsoninterfaces.append(obj)
-       
             elif obj["elementType"] == "enum":
                 jsonenums.append(obj)
-        returnComponents = buildComponents({}, {}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [])
+        returnvalenums = wf.writeenums(jsonenums)
+        enumnodedict = returnvalenums[0]
+        enumvalues = returnvalenums[1]
+        enumnames = returnvalenums[2]
+        returnComponents = buildComponents({}, {}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [], enumnodedict, enumvalues, enumnames)
         typesdict = returnComponents[0]
         variabledict = returnComponents[1]
-        print("Variabledict: ")
-        print(variabledict)
         returnval = instantiate(typesdict, jsoninterfaces, jsoncomponents)
         instantiatedict = returnval[0]
         eventsdict = returnval[1]
         streamsdict = returnval[2]
-        print("Streamsdict:")
-        print(streamsdict)
-        print("Instantiatedict: ")
-        print(instantiatedict)
-        print("Eventsdict: ")
-        print(eventsdict)
-        print("Parametersdict: ")
-        print(jsonparameters)
         generatordict = {}
         streamgendict = {}
         savestreamvaldict = {}
diff --git a/writefile.py b/writefile.py
index d9cb673..ce64ffc 100644
--- a/writefile.py
+++ b/writefile.py
@@ -81,6 +81,27 @@ _logger = logging.getLogger('asyncua')
     measurementtype = await server.nodes.base_data_type.add_data_type(idx, "Measurement")
     parametertype = await server.nodes.base_data_type.add_data_type(idx, "Parameter")
 """)
+
+def writeenums(enumslist):
+    server = open("opcua-server.py", "a")
+    writeindent = "    "
+    returnvalues = {}
+    enumnodenames = {}
+    variantnames = {}
+    for enum in enumslist:
+        returnvallist = []
+        enumname = (enum["name"].lower()).replace(" ", "")
+        values = enum["values"]
+        for i in range(len(values)):
+            retval = str(i) + ":" + str(values[i])
+            returnvallist.append(retval)
+        server.write(writeindent + enumname + "= await new_enum(server, idx, \""+ str(enum["name"]) + "\", values=" + str(enum["values"]) + ")\n")
+        enumnodenames[enum["uuid"]] = enumname
+        returnvalues[enum["uuid"]] = returnvallist
+        variantnames[enum["uuid"]] = enum["name"]
+    return enumnodenames, returnvalues, variantnames
+
+
 def openobject(objname, description):
     server = open("opcua-server.py", "a")
     writeindent = "    "
@@ -107,27 +128,47 @@ def writecomponents(headnode, componentslist, typesdict):
         server.write(writeindent + "await " + objname + "." + "set_modelling_rule(True)\n")
 
 
-def writemeasurement(measurementobj, headnode):
+def writeenumobj(variable, headnode, enumnodedict, enumvaldict, enumvariantdict):
+    server = open("opcua-server.py", "a")
+    writeindent = "    "
+    uuid = variable.uuid
+    varname = (variable.name.lower()).replace(" ","") + "var"
+    server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx,  \"" + variable.name + "\", " + variable.value + ", datatype=" + enumnodedict[variable.uuid] + ".nodeid)\n")
+    server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
+    i = 0
+    for value in enumvaldict[variable.uuid]:
+        valname = "value" + str(i)
+        server.write(writeindent + valname + " = await " + varname + ".add_property(idx, \"" + str(value) + "\", \"" + str(value) + "\")\n")
+        server.write(writeindent + "await " + valname + "." + "set_modelling_rule(True)\n")
+        i += 1
+    return varname
+
+
+def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumvariantdict):
     server = open("opcua-server.py", "a")
     writeindent = "    "
     measurementdict = {}
     for i in measurementobj:
-        varianttype = getVariantType(i.datatype)
-        datatype = "measurementtype.nodeid"
-        varname = ((i.name).lower()).replace(" ", "") + "var"
-        measurementdict[i.name] = varname
-        server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
-            i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
-        server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
-        if i.range is not None and i.range != [None, None]:
-            rangename = "rangeprop"
-            server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n")
-            server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
-        if i.unit != "UNITLESS":
-            unitname = "unitprop"
-            server.write(
-                writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
-            server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
+        if i.datatype == "enum":
+            varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict)
+            measurementdict[i.name] = varname
+        else:
+            varianttype = getVariantType(i.datatype)
+            datatype = "measurementtype.nodeid"
+            varname = ((i.name).lower()).replace(" ", "") + "var"
+            measurementdict[i.name] = varname
+            server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
+                i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
+            server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
+            if i.range is not None and i.range != [None, None]:
+                rangename = "rangeprop"
+                server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n")
+                server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
+            if i.unit != "UNITLESS":
+                unitname = "unitprop"
+                server.write(
+                    writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
+                server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
 
         server.write(
             writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n")
@@ -137,32 +178,37 @@ def writemeasurement(measurementobj, headnode):
     return measurementdict
 
 
-def writeparameter(parameterobj, headnode):
+def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvariantdict):
     writeindent = "    "
     server = open("opcua-server.py", "a")
     parameterdict = {}
     for i in parameterobj:
-        varianttype = getVariantType(i.datatype)
-        datatype = "parametertype.nodeid"
-        varname = ((i.name).lower()).replace(" ", "") + "var"
-        parameterdict[i.name] = varname
-        server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
-            i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
-        server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
-        if i.range is not None and i.range != [None, None]:
-            rangename = "rangeprop"
-            server.write(
-                writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n")
-            server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
-        if i.unit != "UNITLESS":
-            unitname = "unitprop"
-            server.write(
-                writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
-            server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
+        if i.datatype == "enum":
+            varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict)
+            parameterdict[i.name] = varname
+        else:
+            varianttype = getVariantType(i.datatype)
+            datatype = "parametertype.nodeid"
+            varname = ((i.name).lower()).replace(" ", "") + "var"
+            parameterdict[i.name] = varname
+            server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
+                i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
+            server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
+            if i.range is not None and i.range != [None, None]:
+                rangename = "rangeprop"
+                server.write(
+                    writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n")
+                server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
+            if i.unit != "UNITLESS":
+                unitname = "unitprop"
+                server.write(
+                    writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
+                server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
 
         server.write(
             writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n")
-        server.write(writeindent + "await " + varname+ "description.set_modelling_rule(True)\n\n")
+        server.write(writeindent + "await " + varname + "description.set_modelling_rule(True)\n\n")
+    return parameterdict
 
 
 def writefunction(functionobj, headnode):
@@ -243,9 +289,7 @@ def writestreams(streams, component, streamslist, variablelist, jsonmeasurements
 
         if stream["streamType"] == "update":
             value = 0
-            print(variablelist)
             for variable in variablelist:
-                print(variable)
                 if variable["name"] == stream["measurement"]:
                     for measurement in jsonmeasurements:
                         if measurement["uuid"] == variable["value"]:
-- 
GitLab