@paresey: Danke für deine Antwort. Ich habe mein Modul noch einmal angepasst und verwende nun das LCN Gateway direkt. Das funktioniert soweit auch super!
Zu dem Punkt 2 habe ich das noch einmal getestet und kann bestätigen:
Wenn ich meine Module über das Module Control aktualisiere, dann gehen alle Einstellungen verloren. Das ist momentan etwas unschön, wenn ich neue Module erstelle oder andere anpasse…
Da es beim Datenaustausch mit IPS-Instanzen relativ leicht zu einen Lock kommen kann, würde ich mir eine Funktion ähnlich wie IPS_RunScript wünschen.
Hintergrund:
Werden Daten über einen IO empfangen, so wartet dieser IO auf die Beendigung des PHP-Threads im dem die Daten verarbeitet werden.
Wird im gleichen PHP-Thread nun versucht wieder Daten zu senden, kann es zu einem Lock kommen, wenn der PHP-Thread auf eine Antwort der Anfrage wartet.
Um nun den IO-Empfangs-Thread sauber zu beenden, hätte ich gerne eine Funktion, welche ich nach dem parsen der Empfangen Daten auf Korrektheit / Vollständigkeit, aufrufen kann um diese Nutzdaten in einem neuen Thread zu bearbeiten.
Aus PHP könnte ich aktuell nur IPS_RunScript nutzen, da alle anderen Befehle auf die abarbeitung desselben warten.
EDIT: Der Blindfisch hat jetzt ‚IPS_RunScriptText‘ gefunden Damit geht es dann…
Müssen die Module eigentlich immer einen Clientsocket oder Splitter nutzten oder kann man mit einem Modul auch eine Dummy Instanz installieren die dann mit Skripten mit dem Zielgerät kommuniziert?
Konkret geht es mir um die Dreambox und ein Gateway was ich momentan per http Befehlen steuere und die XML Antwort vom Gerät auswerte.
Wenn die Antwort sofort kommt, kannst du das völlig autark per PHP lösen; ohne I/O-Instanzen.
Sendet das Gerät aber auch Daten an IPS, ohne das du vorher eine Anfrage startest (also Events welche das Gerät von sich aus sendet), so brauchst du zwangsläufig eine I/O-Instanz.
Die PHP-Module sind ähnliche wie die Scripte an bestimmte Restriktionen gebunden.
IPS erzeugt zur Laufzeit die Instanz aus deinem Modul, wenn es aktuelle ein Aktion(*) ausführen soll, und sobald Diese abgeschlossen ist, exististiert die PHP-Instanz nicht mehr.
Ebenso bist du an das Script-Timeout gebunden, also in PHP einen Socket öffnen und dort auf Daten/Events warten geht nicht.
(*) Aktionen sind z.B. IPS-Startet, ausführen eines der PHP-Befehle der Instanz, Datenübergabe von Parent/Child, Variablen mit Aktionen etc…
Michael
PS: Na toll… nur weil meine Frau mich gerade dichtgetextet hat, war ich mal wieder viel zu langsam
Ja danke noch mal für die schnelle Antwort. Nun die Dreambox meldet ja nichts von alleine, es sei denn ich habe ihr eine Anfrage gestellt und bekomme dann ja unmittelbar eine Antwort per XML. Dann probiere ich das also mal ohne I/O Instanz.
Ich mag es halt ‚lieber‘ wenn Geräte mir ihre Änderungen direkt senden; so muss man weder pollen, noch muss ich darauf verzichten den korrekten Status nicht zu kennen.
Die nächsten (IPS-Modul) Pläne für meinen TV und Verstärker sind schon im Kopf vorhanden.
Der TV sendet mir z.B. die Lautstärke per UPnP-Event und der Verstärker sendet immer von alleine (solange ich den Socket offen lasse) wenn sich sein Status ändert.
wie Du am Anfang des Threads erkennen kannst war ein Modul für die Dreambox auch mein erstes Projekt (Link zum Github in Posting #4).
Leider waren seinerzeit noch einige Einschränkungen bei den Modulen. Sind diese nun im Großen und Ganzen behoben?
Hallo Joachim, ja das hatte ich schon gelesen aber irgendwie finde ich selbst nach deinem Hinweis den Link zu github immer noch nicht. Wahrscheinlich sehe ich den Wald vor Bäumen nicht. Posting 4 ist von Nall Chan und der Link in #7 führt bei mir ins Nirwana. Hast Du was auf Github was man sich mal anschauen kann dann würde ich ja da mit daran arbeiten.
Bisher tausche ich ja Informationen mit der Dreambox über file_get_contents(Command Dreambox) aus, weist Du zufällig wie man das auf einen Socket umstellt? Muss ich dann
nehmen? $result liefert mir einfach true, wie komme ich denn bei einem Client Socket an den XML Response der Dreambox? Brauche ich dazu eine Registervariable oder geht das mit irgendeinem Befehl? Könnte mir da mal jemand ein Beispiel für geben.
Also das macht gar kein Sinn.
Entweder du nutzt die internen PHP-Funktionen für den Datenaustausch (file_get_contents oder file etc…) oder die Datenanbindung über einen IPS-Parent.
Aber direkt mit CSCK_SendText an einen ClientSocket zu senden macht gar kein Sinn.
Zumal du mit einen PHP-Modul nicht aus einer RegVar empfangen kannst ohne wieder einen Workaround über ein Script zu bauen.
Danke für den Hinweis. Bisher habe ich wie gesagt bei Geräten die einen Request per http erhalten dies immer aus einem Script heraus gelöst mit file_get_contents und das Ergebiss dann im Script verarbeitet. Mit Sockets habe ich mich bisher nicht beschäftigt und daher davon keine Ahnung.
Hast Du eventuell ein Codebeispiel bzw. Grundgerüst wie man bei einem Gerät das per http Befehle empfängt und dann eine Antwort als XML anzeigt dies mit einem Socket umsetzt? Das ein Gerät den Status von sich aus meldet wenn es Änderungen im Status gibt ist natürlich ideal ich wüste jetzt aber nicht wie dies bei der Dreambox hinbekommen sollte.
Schau mal bei GitHub.
Mein Homematic Modul nutzt z.B. CURL, und wertet dann eine XML aus.
Das VoiceRSS nutzt file_get_content.
Und das SqueezeBoxModul nutzt einen I/O Parent.
Sockets sind das irgendwie alle, ist ja nur ein Oberbegriff.
Michael
Gibt es eigentlich eine Möglichkeit mit einem Modul auch Webseiten und Grafiken unter dem User Verzeichnis mit anzulegen? Ich frage deshalb weil ich für die Dreambox eine eigene Webseite zur Visualisierung nutze die Ihre Inhalte über Ajax mit IP-Symcon austauscht.