leider konnte ich mit der Suche kein Thema finden, was mir bei einer aktuellen Frage weiterhilft. Gleichzeitig bin ich noch nicht lang genug im OpenEMS Code drin, um das aus meiner Expertise beantworten zu können. Daher freue ich mich über “sachdienliche Hinweise” und euer Schwarmwissen.
Aktuelle Frage zum Modbus Coding: Ist es von der Architektur des OpenEMS her möglich eine Componente zu bauen, deren Modbus Definition z.B. aus einer CSV eingelesen wird? Darüber hinaus interessiert mich auch warum es ggf. keinen Sinn macht sowas zu implementieren.
Anmerkungen: Als langjähriger Java Entwickler würde ich behaupten, dass das aus folgenden Gründen geht.
Die ChannelIds sind Enums, die ein Interface implementieren und auf einer String ID aufbauen (=> kann man dynamisch anlegen).
Die Modbus Definition mappen im Wesentlichen Modbus Register auf Channel IDs (=> kann man auch dynamisch erzeugen).
Die Modbus Bridge liest eh alle Modbus Register eines Geräts ein, dass per IP und Port verbunden worden ist, da man aktuell keinen Offset konfigurieren kann.
Habe ich die OpenEMS Architektur inkl. der zugehörigen Code Module da richtig verstanden?
Wenn du aber natürlich der Meinung bist, dass du das in einer Komponente abbilden kannst und willst, dann darfst du gerne einen PR erstellen - beachte jedoch bitte, dass dann die Register auch die Skalierungen von OpenEMS abbilden sollten. Genau da liegt für viele “"End-User” ja das Problem. Diese kennen OpenEMS nicht und wollen sich (vermutlich) dann auch nicht mit Skalierungen rumärgern, sondern die Adressen eintragen und gut - das funktioniert aber eben aus oben genannten Gründen nicht.
Vorschlag: Um die Aufwände besser einschätzen zu können, möchte ich der Community gern kurzfristig ein UML Klassendiagramm und ggf.ein Aktivitätsdiagramm in diesem Thread einstellen. Dann kann man besser Pros und Cons diskutieren und wir können die Hinweise aus der Community in das Konzept einfließen lassen.
Mit Code lesen hab ich so überhaupt keine Probleme. Das mit den Einheiten an den Enums ist mir bekannt. Manchmal macht es schon Sinn statt Stichworten wie z.B. “Skalierung” die qualifizierte Bezeichnung zu verwenden. Skalierung kann recht viel sein, ja, es kann sich auch auf Einheiten beziehen.
Ich teile die Anmerkungen von @Sn0w3y; das war bisher immer der Grund, warum wir uns gegen eine “generische Modbus-Implementierung” und für spezifische Implementierungen entschieden haben. Jedes Gerät hat leider seine Tücken - erst recht, wenn es nicht nur eine lesende, sondern auch schreibende Einbindung sein soll. Selbst SunSpec ist nicht so gut und eindeutig, dass das immer klappt.
Am Ende werden bei einer generischen Implementierung immer irgendwo im Internet CSV-Dateien geteilt werden. Dann hätte ich zumindest lieber direkt Code in der Versionskontrolle.
Das heißt natürlich nicht, dass es technisch nicht möglich wäre oder für deinen Use-Case die falsche Lösung wäre. Falls du es machen möchtest, würde ich aber nicht CSV verwenden, sondern eine besser definierte Syntax, z. B. JSON.