Http Request in welcher Phase

Hallo Community und Entwickler

Ich frage Daten von meinem BMS per asynchronem http Request ab.
Das Ergebnis kommt als CompletableFuture zurück und ich würde folgendes ausführen:

CompletableFuture<JsonObject> S = GetStatusAsync();

S.thenAccept(Status ->	{
	this.setStatus(Status);
});

In welcher Phase bzw. bei welchem Event sollte ich die Abfrage ausführen, wenn ich nicht jedesmal einen ganzen Scheduler-Zyklus verliere, bevor die Daten in Channels geschrieben werden.

Vielen Dank
Sebastian

Hallo,

am besten ist es, wenn die Daten so kurz wie möglich vor dem BEFORE_PROCESS_IMAGE event zur Verfügung stehen, weil beim “Switch Process Image” die Daten vom nextValue zum value kopiert werden.

Schaubild:

https://openems.github.io/openems.io/openems/latest/edge/architecture.html#_cycle

Code:

Gruß,
Stefan

Hallo Stefan

Sehr schön. Gibt es dazu einen Vor-Event oder muss man intern versuchen, den richtigen Rythmus zu finden.
Z.B: 8 Sekunden nach dem letzten BEFORE_PROCESS_IMAGE, wenn der Scheduler alle 10 Sekunden feuert?

Hallo Sebastian,

über ein Event lässt sich das leider nicht lösen, weil dieses ja nichts über die Event-Handler weiß - also auch nicht, wie lange die Ausführung dauert.

Ich arbeite gerade selbst aktiv daran, dieses Scheduling der Lese- und Schreib-Tasks für Modbus neu zu optimieren. Hier mein aktueller Arbeitsstand - vielleicht taugt das ja als Beispiel: openems/ModbusWorker.java at 5e95c40f68b2254714622ef5b0098fe7a01365f6 · OpenEMS/openems · GitHub

Gruß,
Stefan

Hallo Stefan

OK, verstehe.
Es gibt keinen Event aber natürlich habt Ihr dafür schon einen Algorithmus implementiert.

Wäre es evtl. sinnvoll, das Verfahren nicht nur für ModbusWorker sondern für alle verfübar zu machen, die Daten kurz vor BEFORE_PROCESS_IMAGE bereitstellen möchten.

Daraus käme dann der event N_SECONDS_BEFORE_PROCESS_IMAGE

Viele Grüße
Sebastian

Hallo Sebastian,

ja stimmt, generell bin ich ein Freund von Vereinheitlichung und wiederwendbarem Code. Wir schauen jetzt mal, dass wir die Modbus-Bridge entsprechend optimieren und vielleicht fällt daraus so ein ‘generalisierter’ Code ab.

Separate Events halte ich nicht für den richtigen Weg. Wir sprechen hier ohnehin eher von Millisekunden als von Sekunden… und dann wäre die Frage in welchem Raster man die Events macht. Vielleicht könnte es aber einen spezialisierten AbstractWorker geben, der das löst. Muss mal drüber nachdenken…

Gruß,
Stefan