Wie nehme ich Daten in einem PHP Modul in einer Funktion über den Datenfluss entgegen

Ich möchte ganz banal mit einer Funktion Daten abholen und die Funktion soll diese Daten als Ausgabe der Funktion zurückgeben. Mit so was wie Curl ist das ja auch simpel, da schicke ich Daten und bekomme dann das Ergebnis in die Funktion zurück.

Wie funktioniert so was aber über den Datenaustausch wenn ich nicht nur eine Variable in IP-Symcon setzten will sondern Daten direkt an die aufrufende Funktion zurückgeben? Die Daten werden ja über ForwardData zum Parent geschickt, die Antwort kommt ja aber über RecieveData vom IO zurück. Wie bekomme ich nun den Rückgabewert in die aufrufende Funktion?

Kommt auf den Parent an.
Ist es eine Modul welches du selbst schreibst oder ein IPS-Splitter, bekommst du das Ergebnis als Rückgabewert von SendDataToParent.
In deinem eigenen Parent-Modul musst du dazu die Rückgabe mit Return im ForwardData zurückgeben.

Ist es aber eine IPS-IO, so kommt dort nie etwas zurück (außer jetzt der WWWReader).
Ist auch logisch, weil Sockets und SerialPort wissen ja nicht auf was sie ‚warten‘ und dann zurück geben sollen.

Das musst du dann selber im ReceiveData des Childs erwarten und in einen Buffer schreiben.
Deine SendeFunktion kann diesen Buffer dann auslesen.

Michael

Ist ein UDP Socket, das macht das Ganze aber kompliziert wenn ich den Socket selber erstelle komme ich direkt dran, wenn ich ein UDP Socket von IPS nutze brauche ich also ein Buffer. Wie funktioniert das mit dem Buffer? Dann kann ich ja nicht einfach abfragen sondern muss zyklisch den Buffer abfragen bis die Antwort erhalten ist oder? Hast Du da ein Beispiel für?

Ein Beispiel ist gut.
Jedes Modul von mir welches einen Splitter enthält macht das.
Der Splitter macht den Sync zwischen versendeten und empfangenen Daten.
Je nach Protokoll der Nutzdaten ist die Art wie ich es genau mache unterschiedlich.
Basis ist immer eine Queue (Array serialize im Buffer) mit den versendeten bzw auf die zu wartenden Indexes, Befehle, sonstwas.
Bei ReceiveData wird nachgesehen ob es in dieser Queue einen Slot gibt wo die Antwort reinkommt.

Meistens habe ich eine Send Funktion im Splitter, welche zuerst diesen Slot in der Queue erstellt, dann die Daten versendet per SendDataToParent und dann wartet bis der Slot mit der Antwort befüllt wurde.

Beispiele sind z.B. LMSSplitter von Squeezebox (Beta Branch), Kodi-Splitter, Xiaomi-Gateway, Plugwise-Splitter…

Eine ganz simple Lösung für eine serielle 1:1 Verbindung habe ich im MS35 Modul.
Dort wird einfach kurz gewartet ob etwas im Buffer steht. Funktioniert aber nicht unbedingt bei dir. Hier ist die Besonderheit dass das Gerät nie von sich aus etwas antwortet.

Ist die Frage ob du überhaupt einen IPS-IO brauchst. Sendet das Gerät von sich aus spontan Daten?
Wenn nein, bleib beim PHP-Socket.

Michael

Sofern das Gerät also nicht Daten sendet sondern ich immer Daten Anfrage ist es dann wohl einfacher ein PHP Socket zu nutzen, oder?

Ja. IPS-IOs brauchst du wenn du immer auf Empfang reagieren musst.
Wenn das Gerät von sich aus nix sendet, kannst du es mit PHP lösen.
Ausnahme ist der SerialPort, weil denn kannst imho aus PHP nicht ansprechen.
Michael