Mitglied bei OpenEMS und Dokumentionen

Guten Morgen OpenEMS Team

Ich arbeite seit zwei Wochen mit OpenEMS Edge und UI und habe eigene Edge-Module und UI-Widgets implementiert.

Meine Informationen habe ich aus diversen Forenbeiträge und Codedurchwühlen gewonnen.
Nun würde ich gerne wissen, ob man durch eine Mitgliedschaft im OpenEMS e.V. weitere Dokumentationen bekommen kann und was die Voraussetzungen dafür sind.

Ich implementiere für eine mittelständische Firma die Steuerung für einen Energiecontainer. Wir sind also ein kommerzieller Nutzer von OpenEMS.

Außerdem habe ich eine grundsätzliche Frage zur Erweiterung von OpenEMS UI.

Nach meinem jetzigen Kenntnisstand implementiert man eigene Ansichten für Edge-Module, indem man in Widgets.WidgetFactory neue Bezeichner einfügt, die dann z.B. in LiveComponent.widgets.list[] verfügbar sind um eigene Angular-Klassen zu instanzieren.

Mir ist aber nicht ganz klar, wie UI die Beziehung zwischen Edge-Modulen und Angular-Klassen herstellt. Ein Beispiel ist glaube ich am anschaulichsten:

Edge:

@Component ( name = “Battery.Alice”; …)

UI:

// widget.ts:
Widgets.WidgetFactory {
  …
  ‘Battery.Alice’,
}

// live.module.ts:
#import BatteryAlice from {‘./battery/battery.alice.ts’};

@NgModule({

declarations:[
   BatteryAlice,
]})

// live.component.html
// Einbinden des neuen Widgets in die Live Ansicht:

<ng-container *ngFor = “let widgets of widgets.list [ngSwitch] = “widget.name”>
  <ion-col *ngSwitchCase=” ‘Battery.Allice’ ">
    <BatteryAlice> [componentId] = “widget.componentId” </BatteryAlice>
  </ion-col>
</ng-container>

// battery.alice.ts
// Implementierung der Angular Klasse BatteryAlice:

@Component({
  selector: BatteryAlice.SELECTOR,
  templateUrl: ‘./Battery.Alice.html’,
})

export class BatteryAlice extends StorageComponent {
  private static readonly SELECTOR = ‘BatteryAlice’;

}

Dieser Code funktioniert bei mir, aber entspricht das so den Vorstellungen von Euch als Entwicklern?
Was genau muss im Code oben identisch heißen?

‘Battery.Alice’ == [EDGE]Component.name ==? [UI]BatteryAlice.SELECTOR == ‘Battery.Alice’

  und/oder

‘Battery.Alice.ts’ ==? [EDGE]Component.name + ‘.ts’

Vielen Dank im Voraus!

Hallo Sebastian,

wir versuchen bei OpenEMS so offen und transparent wie möglich zu sein und verstecken funktional nichts “hinter einer Paywall”. Es gibt also leider auch mit einer Mitgliedschaft in der Association keine bessere Dokumentation. Aber man wird Teil eines Netzwerks rund um OpenEMS, das sich strategisch und praktisch mit der Weiterentwicklung beschäftigt und dazu regelmäßig Erfahrungen austauscht. Die Mitgliedsbeiträge sind deshalb auch so niedrig gewählt, damit hier keine künstliche Hürde entsteht. Gleichzeitig sind die Mitgliedsbeiträge aber auch zu gering, um davon Softwareentwickler oder Technische Redakteure zu bezahlen. Die Hoffnung ist, dass - im Sinne von Open-Source - die erfahrene Entwickler neuen Anwendern z. B. hier im Forum helfen oder Verbesserungen an der Doku via Pull-Request beitragen.


Die Recherche ist schon ziemlich komplett. Das Mapping zwischen Factory-ID (also dem Namen der in Java unter @Component(name="Battery.Alice";…)) und dem Angular Component Selector (selector: BatteryAlice.SELECTOR) passiert in der live.component.html bzw. in der history.component.ts.


@lukasrgr Vielleicht könntest du das mal noch näher hier ausführen :wink:

Hallo Stefan

Vorab - ich bin derselbe SBartel wie SBartel_GFP :slight_smile:

Vielen Dank für Deine Erklärung. Wir werden dann vermutlich zeitnah Mitglied werden und hoffentlich bald eigene Komponenten und Unterstützung beisteuern können.

Und Danke für die Bestätigung meiner bisherigen Erkenntnisse. Dann kann ich meine Doku ja vervollständigen.

Ich hätte an dieser Stelle noch einen Vorschlag:
Der Einstieg ist für Neulinge (mich eingeschlossen) sehr schwer, weil mehrere komplexe Frameworks gleichzeitig erlernt werden müssen.

Die Grundideen kommen ja schon sehr schön in Eurer Doku raus, aber wenn es an die Implementierung geht, sind die vorhandenen Codes viel zu komplex, um ein einzelne Konzepte zum ersten Mal zu verstehen. Ich habe selber 40 Stunden im Code gestöbert und war kurz davor OpenEMS zu verfluchen.

Es wäre sehr hilfreich wenn es eine Sammlung von Code-Beispielen gäbe, die einzelene Konzepte in wenigen Zeilen vorstellen.
Ich, und bestimmt auch andere, würden bestimmt gerne mit Code-Snippets beitragen, die man in einem eigenen Forums/Doku-Bereich von Euch kuratiert auflisten könnte.

Mir fallen direkt Zehn Fragen ein, die ich erst jetzt vernünftig beantworten könnte:

Wie definiere ich einen Kanal zur Kommunikation mit UI und anderen Edge-Komponenten ?

Wie und wann wird meine Edge-Komponente aufgerufen, um Ihr Ding zu machen?

Wie verbinde ich ein ein eigenes Angular Widget mit meiner Edge-Komponente?

Wie behandle ich JsonRpc Requests in Edge ?

Wie liefere ich eine JsonRpc Fehler/Erfolgsmeldung an UI?
(und was ist ist eigentlich ein CompleteableFuture?)

Wie funktioniert <oe-flat-widget-line> und was bedeuten die [–] Parameter und woher kriegt |translate seine Informationen?

u.s.w.

Ich kenne die Antworten mittlerweile alle, aber viele hier sicher nicht.
Und Ich glaube, wenn man die Einstiegshürde in OpenEMS verringert, wird es schneller populär. Und das würde ich mir wirklich wünschen, weil es wirklich sehr sehr mächtig ist.

Dankt mal drüber nach.
Viele Grüße
Sebastian

1 Like

Hallo Sebastian,

Danke dafür. So sehe ich das auch und es macht immer wieder Mut, dass andere das auch so sehen. Es ist der Grund dafür, warum ich - neben meiner beruflichen Arbeit an dem Thema - auch so viel Freizeit reinstecke.

Für mich ist das Forum eine sehr wertvolle Dokumentation, auch weil sie so niedrigschwellig und praxisorientiert entsteht. “Blind” eine Doku zu schreiben, ist dagegen oft ziemlich schwer. Auch weil viel der Komplexität, der Fragen und Hürden gar nicht von OpenEMS kommen, sondern von anderen Frameworks, die wir verwenden, und die Doku entsprechend über das Internet verteilt ist. Ich nutze deshalb einfach mal deine Fragen hier um auf Threads im Forum, auf Code oder auf andere Doku zu verlinken:

Gruß,
Stefan

Hallo Stefan

Schön, dass Du direkt mal die Antworten eingefügt hast.

Wie Du sagst, ist das Forum ja voll von wertvollen Informationen.
Und die Core Concepts und Getting Started und sind sehr gut, um das Prinzip zu verstehen.

Bei mir als Entwickler kam dann sofort der Wunsch ein Test-Gerät zu implementieren und den Flow MeinGerät → Channels → UI → Widget → MeinTestParameter live zu beobachten.

Dafür hätte ich Code-Snippets gebraucht, die das in wenigen Zeilen beispielhaft zeigen.
Verweise nach Github gehen auch aber da muss man dann aus 500 Zeilen das wesentliche rausfischen. … und das Framework parallel mitlernen.


Danke auf jeden Fall, dass Du alle unsere Fragen so geduldig beantwortest.

Viele Grüße
Sebastian

1 Like