super.__init__() either complains about too many positional arguments or KeyErrors

136 Views Asked by At

I'm trying to generate an FMU using pythonfmu, but I'm having problems with my init(). I've also added the main code, where the the class FmuGenerator gets initialized:

My Application opens a gui where I can enter the address of an OPC UA Server. After pushing the “connect” Button, my opcua_client.py gets the nodes of the server. Those get displayed in the gui. There, I can then select the nodes I want to integrate in my FMU. So far, all of this is working. Now I want to generate the FMU with my selected_nodes. But that's where the error occurs.

This is the code:

from pythonfmu import FmuBuilder, Fmi2Causality,Fmi2Variability, Fmi2Slave, Boolean, Integer, Real, String, Fmi2Initial
import subprocess
#    - Unabhängige Klasse, die für die Generierung des FMU-Objekts aus den ausgewählten Nodes verantwortlich ist.
#    - Nutzt `pythonfmu` zur Erstellung des FMU-Objekts.

class FmuGenerator(Fmi2Slave):
    input_nodes=[]
    author = "Till"
    description = "A Test FMU"

    def __init__(self, *args, **kwargs):
        super().__init__(*args,**kwargs)
        
        for node in self.input_nodes:
            display_text=(node)
            print(display_text)
        
        # Füge die Eingänge zum FMU hinzu
            self.register_variable(Integer(f"{node}",variability=Fmi2Variability.continuous,causality=Fmi2Causality.input, start=0.0))

        subprocess.run("pythonfmu build -f fmu_generator.py VSCode", shell=True)
    
    def generate_fmu(self, selected_nodes):
        # Code zur Erzeugung des FMU-Objekts
        #print(selected_nodes)
        self.input_nodes=selected_nodes
        #super().__init__()
        
        
        # for node in self.input_nodes:
        #     display_text=(node)
        #     print(display_text)
        
        # # Füge die Eingänge zum FMU hinzu
        #     self.register_variable(Integer(f"{node}",variability=Fmi2Variability.continuous,causality=Fmi2Causality.input, start=0.0))
        # #self.register_variable(Integer("input_2",variability=Fmi2Variability.continuous,causality=Fmi2Causality.input, start=0.0))
      
        self.__init__()
        # python command mit build?!
        pass

    def do_step(self, current_time, step_size):
        
        return True
#### this is the main Application:

from gui_manager import GUIManager
from node_manager import NodeManager
from fmu_generator import FmuGenerator

#    - Diese Klasse ist der Haupt-Controller der Anwendung. 
#    - Sie initialisiert die GUI und verwaltet den gesamten Workflow, einschließlich der Erstellung des FMU.
 

class Application:
    def __init__(self):

        self.gui_manager = GUIManager(self)
        self.node_manager = NodeManager()
        #self.fmu_generator = FmuGenerator()

    def start(self):
        self.gui_manager.show()

    def on_server_address_entered(self, address):
        nodes_list= self.node_manager.connect_and_retrieve_nodes(address)
        self.gui_manager.display_nodes(nodes_list)

    def on_nodes_selected(self, selected_nodes):
        self.fmu_generator = FmuGenerator()
        self.fmu_generator.generate_fmu(selected_nodes)

if __name__ == "__main__":
    app = Application()
    app.start()

Which returns the following Error:

Traceback (most recent call last):
  File "C:\Users\tbro03\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "c:\Users\tbro03\OneDrive - Staubli\Documents\Abschlussarbeit\VSCode\gui_manager.py", line 94, in select_nodes
    self.application.on_nodes_selected(self.selcted_nodes)
  File "c:\Users\tbro03\OneDrive - Staubli\Documents\Abschlussarbeit\VSCode\application.py", line 24, in on_nodes_selected
    self.fmu_generator = FmuGenerator(self)
                         ^^^^^^^^^^^^^^^^^^
  File "c:\Users\tbro03\OneDrive - Staubli\Documents\Abschlussarbeit\VSCode\fmu_generator.py", line 12, in __init__
    super().__init__(*args,**kwargs)
TypeError: Fmi2Slave.__init__() takes 1 positional argument but 2 were given

If I change it like this:

from pythonfmu import FmuBuilder, Fmi2Causality,Fmi2Variability, Fmi2Slave, Boolean, Integer, Real, String, Fmi2Initial
import subprocess
#    - Unabhängige Klasse, die für die Generierung des FMU-Objekts aus den ausgewählten Nodes verantwortlich ist.
#    - Nutzt `pythonfmu` zur Erstellung des FMU-Objekts.

class FmuGenerator(Fmi2Slave):
    input_nodes=[]
    author = "Till"
    description = "A Test FMU"

    def __init__(self, *args, **kwargs):
        super().__init__(**kwargs)
        
        for node in self.input_nodes:
            display_text=(node)
            print(display_text)
        
        # Füge die Eingänge zum FMU hinzu
            self.register_variable(Integer(f"{node}",variability=Fmi2Variability.continuous,causality=Fmi2Causality.input, start=0.0))

        subprocess.run("pythonfmu build -f fmu_generator.py VSCode", shell=True)
    
    def generate_fmu(self, selected_nodes):
        # Code zur Erzeugung des FMU-Objekts
        #print(selected_nodes)
        self.input_nodes=selected_nodes
        #super().__init__()
        
        
        # for node in self.input_nodes:
        #     display_text=(node)
        #     print(display_text)
        
        # # Füge die Eingänge zum FMU hinzu
        #     self.register_variable(Integer(f"{node}",variability=Fmi2Variability.continuous,causality=Fmi2Causality.input, start=0.0))
        # #self.register_variable(Integer("input_2",variability=Fmi2Variability.continuous,causality=Fmi2Causality.input, start=0.0))
      
        self.__init__()
        # python command mit build?!
        pass

    def do_step(self, current_time, step_size):
        
        return True

This returns the following:

Traceback (most recent call last):
  File "C:\Users\tbro03\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "c:\Users\tbro03\OneDrive - Staubli\Documents\Abschlussarbeit\VSCode\gui_manager.py", line 94, in select_nodes
    self.application.on_nodes_selected(self.selcted_nodes)
  File "c:\Users\tbro03\OneDrive - Staubli\Documents\Abschlussarbeit\VSCode\application.py", line 24, in on_nodes_selected
    self.fmu_generator = FmuGenerator(self)
                         ^^^^^^^^^^^^^^^^^^
  File "c:\Users\tbro03\OneDrive - Staubli\Documents\Abschlussarbeit\VSCode\fmu_generator.py", line 12, in __init__
    super().__init__(**kwargs)
  File "C:\Users\tbro03\AppData\Local\Programs\Python\Python312\Lib\site-packages\pythonfmu\fmi2slave.py", line 52, in __init__
    self.instance_name = kwargs["instance_name"]
                         ~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'instance_name'

I also tried __init__(instance_name=FmuGenerator), didnt help either. If someone knows what to do please let me know.

0

There are 0 best solutions below