Go-e (OpenEMS Ready: coming soon)

Hallo Christian,

danke für deine Rückfrage. Um einen gemeinsamen Kontext zu schaffen, bitte ich dich vorab kurz diese Beschreibung dieser Kategorie durchzulesen. Ich versuche dort die Idee hinter dem OpenEMSReady-Unterforum zu erklären.

Bei dem aktuellen goE-Treiber ist aus meiner Sicht daher nichts “schief gelaufen” und es wundert mich nicht, dass das System bei dir gut läuft.
Da wir mit dem Treiber in kommerziellen Produkten arbeiten wollen, stellen wir andere Anforderungen an die Zuverlässigkeit. Das Problem des Treibers versteckt sich im Event-Handling. OpenEMS ruft die Methode handleEvent() aller aktiven Componenten auf welche das EventHandler-Interface implementieren. Damit wird auch der Eventhandler der goE Implementierung aufgerufen, sobald das Bundle aktiviert wird. OpenEMS ruft die Eventhandler streng sequentiell und zyklisch auf. Das ist einer der großen Vorteile von OpenEMS, da dadurch im Allgemeinen die Synchronisierung der Komponenten enorm vereinfacht wird. Erkauft wird dieser Vorteil durch die Konvention, dass alle Komponenten, welche das EventHandler Interface implementieren, niemals die Methode handleEvent() blockieren. Denn wird die Methode von einer Komponente blockiert bleibt mehr oder weniger das ganze OpenEMS-System stehen.

Genau dieses Verhalten haben wir nun in der Methode GoeChargerHomeImpl.java:handleEvent(). Dort wird this.goeapi.getStatus() aufgerufen. Dieser Aufruf wartet so lange bis die Antwort von der Ladesäule gekommen ist. Die Wartezeit fällt im Normalfall nicht auf. Gerade bei z.B. einer WLAN Verbindung zur Ladesäule kann es aber gelegentlich zu Störungen im ein/zweistelligen Sekundenbereich kommen. In dieser Zeit kann OpenEMS nicht auf Veränderungen im Stromnetz reagieren, da andere Controller ebenfalls so lange “einfrieren”.

OpenEMS bietet hierfür eine einfache Lösung. Die blockierende Funktionalität in der handleEvent() Methode kann über einen sogenannten Worker-Thread ausgelagert werden. Das ist die Idee hinter dem Pull Request. Dort gibt es einen neuen WorkerThread GoeChargerWorker. Dieser Worker-Thread wird im bisherigen Eventhandler in der handleEvent() Methode nun in jedem Zyklus angestoßen und kann dann in aller Ruhe die Informationen von der Ladesäule abholen.

Leider habe ich meinen PullRequest falsch eingereicht. Daher ist die Änderung noch nicht im offiziellen Repository integriert. Ich hoffe in den nächsten Tagen etwas Zeit zu finden um den Pull Request zu schließen und einen neuen sauberen PullRequest zu stellen.

1 Like