Controller Generic JsonLogic

Hallo,

meine Gruppe und Ich nutzen das openEMS für ein Uni-Projekt. Unser Ziel ist es den Speicher für eine PV-Anlage so zu regeln, dass die Residuallast = 0 gilt. Bisher werden die Befehle (Laden/Entladen) über einen MQTT-Explorer an den Speicher durch einen Einplatinencomputer übergeben.

wir haben die MQTT Bridge sowie die TelemetryMqttComponent für den Speicher erfolgreich konfiguriert. Es wird alles wie erwartet angezeigt. Als nächstes habe wir vor gehabt den Controller Generic JsonLogic zu nutzen, um mit der JsonLogic den Speicher zu steuern.
Bevor wir das umsetzen, haben wir zunächst versucht dem Speicher erst einmal abhängig vom Speicherstand (Soc) zu laden oder zu entladen. Leider zeigt der Speicher diesbezüglich keine Reaktion der ausgewählte setpoint wird nicht gesetzt. Auch im MQTT-Explorer gibt es keine Änderung.

Daher meine Frage: Wieso reagiert der Speicher nicht auf den im JsonLogic implementierten setpoint ? Sind weitere Einstellungen notwendig, um die Controller JsonLogic zu nutzen, oder reicht es im allgemeinen aus, nach der Code JsonLogic Implementierung auf speichern zu klicken ?

Leider kann ich nur ein Bild hochladen.:

Hallo,

leider ist deine JsonLogic-Rule falsch. So wärs richtig:

{
   "if":[
      {
         "<":[
            {
               "var":"_sum/EssSoc"
            },
            50
         ]
      },
      [
         [
            "ess0/SetActivePowerEquals",
            -3000
         ]
      ],
      [
         [
            "ess0/SetActivePowerEquals",
            2000
         ]
      ]
   ]
}

Der “Ess.SMA.SunnyIsland” (ich gehe wegen deinem Alias davon aus, dass du den verwendest), hat zwar intern einen “SetActivePower” Channel, dieser darf aber nicht direkt beschrieben werden, sondern man muss den “SetActivePowerEquals”-Channel dafür verwenden. Dann wird die applyPower()-Methode mit den korrekten Werten aufgerufen, die dann wiederum den SetActivePower-Channel (und SetControlMode und SetReactivePower) beschreibt:

Ich persönlich rate vom JsonLogic-Controller eher ab und empfehle euch, einen Controller in Java zu schreiben. Am einfachsten ist es, sich z. B. den Balancing-Controller zu nehmen und dort ein paar Zeilen umzuprogrammieren (hier → openems/Balancing.java at develop · OpenEMS/openems · GitHub). In Java habt ihr langfristig einfach mehr Möglichkeiten, z. B. um eine Hysterese einzubauen usw.

Gruß,
Stefan
(und halte uns gerne über euer Projekt am Laufenden; gerne veröffentlichen wir auch z. B. eine Projektdoku oder ähnliches auf unserer Internetseite)

Vielen Dank für Ihre Rückmeldung. Sehr gerne würden wir unsere Dokumentation anschließend teilen.
Wie Sie gesagt haben, haben wir die Balancing-Controller wie folgt konfiguriert:

Component - ID : ctrlBalancing0
Alias : NÜP_0W_Controller
Is enabled? : ON
ESS-ID : ess0 (ID von “ESS simulated SMA SunnyIsland Storage System”
Grid-Meter-ID : meter0 (Zähler)
Target Grid Setpoint : 0

Wie empfangen wir nun den entsprechenden Setpoint der von dem Balancing-Controller gesendet wird ? Weil nach der Konfiguration hat sich noch nichts entsprechend geregelt. Wir würden gerne so vorgehen, dass wir durch einen MqttTelemetryComponent den Setpoint empfangen und diesen an den MQTT-Explorer weiterleiten, so dass da der Setpoint entsprechend gesetzt wird. Nur leider wie erwähnt wissen wir nicht wie wir den Setpoint vom Controller empfangen.

Beste Grüße

Hallo Stefan,

wir haben nach Deiner Empfehlung die Json Logic verworfen (und die bisherig versuchte Integration des Wechselrichters über MQTT, wir verwenden jetzt standardmäßig Modbus) und möchten es mit einem eigenen Java-Controller lösen.

Vorab wollen wir aber prinzipiell das ESS mit dem Standard-Controller (Controller Balancing Symmetric) zum Laufen kriegen und haben damit einige Probleme:

  • Zum einen sehen wir nicht, ob der Controller überhaupt arbeitet bzw. welchen Sollwert er setzt. Laut GitHub Sourcecode schreibt der Controller in den Channel “SetActivePowerEqualsWithPid” unserer ess1 Komponente (SunnyIsland SI6.0H-11), nur sehen wir bisher nirgends diesen gesetzten Sollwert.
    Unsere Erwartungshaltung wäre, dass die Channel “ess1/DebugSetActivePower” oder “ess1/ActivePower” von 0W verschiedene Werte lesen, wenn der ESS-Controller richtig arbeitet. Beide Channels lesen aber stets 0W.
  • Wenn wir testweise manuell Sollwerte vorgeben über “ess1/SetActivePower” konnten wir vor ein paar Tagen wenigstens so den Wechselrichter ansprechen. Mittlerweile funktioniert auch das nicht mehr da wir folgende Fehlermeldung im Log erhalten, deren plötzliches Auftreten wir uns nicht erklären können:

    Das Schreiben von Werten zum SunnyIsland schlägt fehl; das Lesen funktioniert weiterhin, da noch der korrekte SOC dargestellt wird.

Unsere Build-Version ist 22.9.0. Kann es an der nicht ganz aktuellen Version liegen?
Wir betreiben auch zwei Janitza Zähler per Modbus, welche ohne Fehler gut funktionieren.

Noch eine weitere Frage:
Ist es möglich eine zweite Bridge auf eine Komponente zu konfigurieren? Wir würden gerne alle Daten aus dem openEMS auch an unseren MQTT-Broker schicken, um diese extern zusammen mit anderen Daten aus dem Labor nochmals zu visualisieren. Die entsprechende Telemetry Component dazu ist auch bereits angelegt und konfiguriert (aber nicht enabled).

Viele Grüße,
Melik und Andreas

Hallo Woody,

was wir denn geschrieben, dass der “Illegal Data Value” kommt. die fehlermeldung sagt, dass der Wert kein “richtiger” ist.
im prinzip kannst detaileddebuglog auf eine komponente anwenden und dann siehst du im log mehr infos zu der komponente und welche Werte sie annimmt.
Schönen Gruß

Pauli

Hallo Pauli,

vielen Dank für deinen Vorschlag.

Allerdings gebt der ControllerDetailedDebugLog nichts für die konfigurierten Energiefluss-Controller aus, sondern (aktuell) nur für das Speichersystem.


Auffällig ist, dass das Schreiben sporadisch funktioniert…

Die Ausgaben des ControllerDetailedDebugLog geben nur Werte des SunnyIslands(ess1) aus. Im Wechsel manchmal die Netzfrequenz, die Netzspannung, den Batteriestrom und selten die Scheinleistung (ReactivePowerL1).

Gibt es evtl. noch andere Möglichkeiten den errechneten Sollwert der Energiefluss-Controller zu Debugzwecken auszugeben? Die verschiedenen Channel manuell zu beschrieben (direkt SetActivePower bzw. SetReactivePower) ging vor ca. einer Woche noch, jetzt tut sich da aber auch nichts mehr. Auch das Lesen der Debug-Channel der ess-Komponente brachte bisher keine Ergebnisse.

Dieser Error wird auch ab und zu ausgeben. Er hat etwas mit der max. Scheinleistung zu tun, allerdings kann ich nicht einordnen woher der Fehler genau kommt (als Text, da ich nur ein Bild pro post schicken kann):
Worker error. IllegalArgumentException: Conversion for [MAX_APPARENT_POWER] failed - Caused by: Cannot convert. Long [4294967295] is not fitting in Integer range.
von: io.openems.common.worker.AbstractWorker

Viele Grüße,
Andreas

Update:

Nachdem wir einen anderen Wechselrichter versucht haben und dieser funktioniert, gehen wir davon aus, dass es am Wechselrichter/einer veralteten oder defekten Netzwerkkarte des Geräts lag.

Anmerkung:
Es wäre äußerst hilftreich, wenn der DebugController bei einem Fehler/Warning (wie oben bei FC16 write) die gesendeten Daten anzeigen würde, um herauszufinden wieso die Daten “illegal value” haben könnten.
Per TCP-Paketanalyse haben wir dann irgendwann herausgefunden, dass die Meldung die Anwort des Wechselrichters war, obwohl korrekte Daten in korrektem Wertebereicht geschrieben wurden. Wir hätten uns leichter getan, wenn das direkt im DebugLog zu sehen gewesen wäre.

Viele Grüße,
Andreas

Hallo Andreas,

danke für das Status-Update.

Es ist eine größere Änderung an der Modbus-Bridge aktuell in der Pipeline:

Im aktuellen Entwicklungsstand gibt es dort eine “Verbose” Log-Funktion, mit der man auch die tatsächlich geschriebenen und gelesenen Werte im Log ausgeben kann:

Gruß,
Stefan