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.