Neue Funktion: Module

@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…

Daten zwischen IPS und PHP-Modulen können nicht mehr übergeben werden.
Fehlermeldung bei IPS_SendDataToParent (IPS_SendDataToChildren nicht getestet):


Warning:  Scripts cannot be started recursivly in the same thread in /usr/share/symcon/modules/...../module.php on line 58

Michael

Hallo Paresy,

wann ist denn die Einführung der Module in der Windows-Version geplant?

Joachim

Mit der bald kommenden Beta von Version 4.0 für Windows :slight_smile:

Wir arbeiten da gerade am Installer, der auch die Datenbank konvertiert ect…

paresy

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 :smiley: Damit geht es dann…

Michael

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.

Im einfachsten Fall brauchst du gar kein Splitter/IO. Schau dir mal als Beispiel das Sonos Modul an: SymconMisc/Sonos at master · paresy/SymconMisc · GitHub

paresy

Ah prima, danke das vereinfacht das Ganze. Ich schaue mir das mal an, mal sehen ob ich da was zusammengebastelt bekomme.

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 :smiley:

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.

Na dann… immer drauf los :slight_smile:

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.

Michael

PS: Hat jemand etwas Zeit für mich :D:p

Hallo Fonzo,

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?

Joachim

Ja… DAS würde mir auch mal wünschen… :D:p:D

Vielleicht sagt dazu Paresy mal was.

Die Liste hier ( Bekannte Bugs in den PHP-Modulen ) ist in letzter Zeit nicht kleiner geworden.
Ok, auch nicht länger. :slight_smile:

Michael (nun aber wech hier…)

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


$ipadr = "192.168.55.37";
$payload = "http://'.$ipadr.'/web/powerstate?.xml";
$result = CSCK_SendText($DREAMBOX_CLIENT_INSTANCE_ID , $payload);

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.

…auf die Schnelle:
Github

…war Posting #10:stuck_out_tongue:

Melde mich später noch mal, schau mal rein…

Joachim

Vielen Dank, ich schaue gerne mal rein komme aber wohl vor dem Wochenende nicht dazu Rückmeldung zu 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.

Michael

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.