Schaltbefehle serialisieren, hintereinander abarbeiten

Ich brauche mal Tips zur Umsetzung.

Ich möchte gerne für mein NUKI Bridge Modul die Schaltbefehle serialisieren. Vielleicht ist die Bezeichnung „serialisieren“ nicht korrekt… Ich will sie nacheinander abarbeiten.

The Bridge can only handle one incoming request at a time and you therefore have to serialize repeated requests to the Bridge API.

Dies mache ich im Moment mit Semaphore:

//Enter semaphore
if (!IPS_SemaphoreEnter('Nuki_' . $this->InstanceID . '_SendDataToBridge', 5000)) {
 $this->SendDebug(__FUNCTION__, 'Abort, Semaphore reached!', 0);
 return json_encode(['httpCode' => 503, 'body' => []]);
 }

... Code der ausgeführt wird ...

//Leave semaphore
IPS_SemaphoreLeave('Nuki_' . $this->InstanceID . '_SendDataToBridge');

Im Moment beträgt die Wartezeit ja 5 Sekunden, vermutlich kann ich das auch nicht bis ins unendliche hochsetzen. (30 Sekunden? PHP Timeout?)

Wie löst ihr das?

Uli

Das ist doch eine absolut geeignete Anforderung für den Ablaufplan und sollte dort problemlos darstellbar sein.

Danke für den Hinweis, aber ich glaube, dass dies nicht für mein Modul geeignet ist.

Die Schaltbefehle die der User absetzt entsprechen ja nicht einer gleichbleibenden Reihenfolge.

Es geht darum, wenn die Befehle an die Bridge übermittelt werden, in der Reihenfolge abzuarbeiten, wie Sie eintreffen und mit der Voraussetzung, dass der nächste Befehl erst durchgeführt wird, wenn der Befehl zuvor erfolgreich abgearbeitet worden ist. Mitunter kann das auch schon mal etwas dauern.

Oder wie soll der Ablaufplan dies innerhalb eines Moduls das übernehmen?

Uli

Vielleicht ist das hier was für dich:

Natürlich muss weiterhin zwischen Lock und unlock die Antwort abgewartet werden.
Vorteil ist hier, die Wartezeit wird nicht durch die Semaphore selbst, sondern durch eine zufällige Wartezeit per IPS_Sleep realisiert.
Somit versuchen nicht alle wartenden Befehle auf einmal die Semaphore zu ergattern.
Michael

Hallo Michael,

vielen Dank, schaue ich mir mal an.

Schönes Wochenende

Uli

Hast du vielleicht noch ein Beispiel in welchem deiner Module du es nutzt? :blush:

Uli

In vielen :sweat_smile:

Einige davon wie plugwise, Squeezebox, Onkyo oder Xbee (und bestimmt noch andere) nutzen zusätzlich noch eine Send und Receive Queue. Wobei dies nur sinnvoll ist, wenn man halt mehrere Befehle senden kann und dann die Antworten zu den ausgehend Befehlen zuordnen will.

Das geht in deinem Fall ja nicht, weil ja nur immer ein Kommando gesendet und dann auf die Antwort gewartet werden muss.
Somit solltest du IPS_SemaphoreEnter und Leave einfach mit Lock und unlock ersetzen können.
Michael

Danke, probiere ich aus.

Uli