Restart OpenEms Edge via Controller

Hallo zusammen,

Ich würde gerne in einem Controller eine Exception einbauen, die wenn sie geworfen wird, das OpenEms Edge neustartet.

Kann mir jemand mit dem Code dafür auf die Sprünge helfen?

Beste Grüße,
Dominik Bauer

Hallo Dominik,

sowas sollte eigentlich nie erforderlich sein. Warum ist das notwendig?

Neustarten wäre in jedem Fall etwas, was außerhalb von OpenEMS Edge stattfinden müsste. Wenn die Java-Applikation z. B. über einen Systemd-Service verwaltet wird (wie hier in der Doku beschrieben), dann würde der Service immer neu gestartet werden, nachdem er sich beendet hat (Restart=always). Außerdem wird dort ein Watchdog aktiviert (WatchdogSec=60), der regelmäßig getriggert wird (siehe hier im CycleWorker).

Falls es wirklich notwendig ist, sehe zwei Ansätze:

  1. Der Controller sendet direkt ein system.exit() (https://www.baeldung.com/java-system-exit). Nachteil: das ist ziemlich brachial und könnte z. B. dafür sorgen, dass Dateien nicht richtig geschlossen werden, Daten verloren gehen, usw.
  2. Der Controller sorgt irgendwie dafür (z. B. über einen neuen Systemweiten Ausnahmefehler), dass der Watchdog nicht mehr getriggert wird - und damit nach 60 Sekunden neu gestartet wird.

Gruß,
Stefan

Hallo Stefan,

Beispielsweise wurde gestern der SOC der Batterie falsch ausgegeben, was durch einen Neustart behoben wurde.

Capture

Eine Exception, die den Raspberry neustartet, würde prinzipiell auch funktionieren.

Beste Grüße,
Dominik Bauer

Aus dem Screenshot kann ich den SOC-Fehler noch nicht ableiten. Wie sieht das Log in dem Zeitraum aus? Wurden “falsche” Werte gelesen (also z. B. > 100 %) oder keine Werte (“UNDEFINED”)? Wird bei einem Fehler bereits eine Exception geworfen?