Im Modul Daten senden

Moin, mein Modul ist mit einem übergeordneten ClientSocket verbunden. In einem php Script habe ich immer mit CSCK_SendText(InstanzID) an solch einen CS Strings versendet - wie z.B.

CSCK_SendText(12345,"Kuckuck
")

Wie mache ich das korrekt in einem Modul ? Für ein CSCK_SendText müsste ich ja die ID bekommen, oder macht man das mit SendDataToParent ? Und falls ja, wie geht das ?

Ja das macht man mit SendDataToParent.
Ist in der Doku beschrieben und ein Beispiel ist auch in den Testmodulen vorhanden.
Michael

Mit SendDataToParent an die übergeordnete GUID

Du kannst eventuell
PHP Modul Dataflow Generator
als Hilfestellung nutzten.

Danke für die Tipps. Ich bin wohl auf dem richtigen Weg. Leider kriege ich das nicht hin, die entscheidene Zeile:

    IPS_LogMessage("IOTest", "Sende TX Command.");
    $this->SendDataToParent(json_encode(Array("DataID" => "{B87AC955-F258-468B-92FE-F4E0866A9E18}", "Buffer" => utf8_encode("Data
"))));

Das Meldungsfenster wird natürlich gefüllt, also prozedur wird aufgerufen. Wenn ich "Data
" per CSCK_Sendtext sende, geht es auch.

So wie oben will es aber einfach nicht. Auch nicht ohne utf8_encode. Hab ich das im Dataflow richtig verstanden mit dieser GuID ? Ist das immer diese zum Senden an einen ClientSocket ?

Danke,
Tom

EDIT
mea culpa - man soll beim Proggen keinen Weißwein trinken. Die guid war trotz 3maliger Kontrolle einfach falsch.

Die üblichen Datenaustausch GUIDs für die IOs sind in der Doku beschrieben.
Ganz spezielle oder von anderen Modulen kannst du mit IPS_GetModule und der GUID vom Modul ermitteln. IPS_GetModule — IP-Symcon :: Automatisierungssoftware
Auf IPS_LogMessage solltest du tunlichst verzichten.
Die Debug Ausgabe, welche auch Rohdaten darstellen kann, wird mit der Methode SendDebug angesprochen.
Warnungen, Fehler usw kannst du mit LogMessage erzeugen.
SendDebug — IP-Symcon :: Automatisierungssoftware
LogMessage — IP-Symcon :: Automatisierungssoftware
Michael

Jo - die Meldungsausgabe fliegt natürlich raus, sobald ich weiß, was ich mache :stuck_out_tongue:

Ich habe noch ein Problem:

Wenn ich die Instanz neu erzeuge, so wird der Parent auf „Virtual IO“ eingestellt. Dann fliegt mir die Instanz sofort um die Ohren und meckert die SendDataToParent Zeile an, da „Emulation not found“ und die Instanz landet unbenannt im IPS Ordner - aber sie funktioniert. Ich muss dann erst das Parent auf meinen CS stellen, dann läuft es rund.

Liegt wahrscheinlich daran, dass beim Initialisieren die guid falsch ist - oder ? Wie mache ich das richtig ?

Code?
Im Create hast du z.B. RequireParent? Und welche GUID?
Wenn du z.B. einen ClientSocket haben willst, muss dessen Modul-GUID dort rein.
Michael

Mist, ich schnall das mit den GUIDs irgendwie nicht. Derzeitiger Stand ist hier zu sehen:

https://github.com/DarthWeber/IPSDarthWebersLCNExtensions/blob/master/LCNTastensperre/module.json
und
https://github.com/DarthWeber/IPSDarthWebersLCNExtensions/blob/master/LCNTastensperre/module.php

ich habe das so aus dem IOFilter Beispiel von Paresy übernommen. Das legt dann aber eben diese Virtual-IO an, die update-procedure fällt auf die Schn… (habe ich jetzt mit @ unterdrückt), dann stellt man den CS in dem Formular ein und es geht - hat aber eben auch diese Virtual-IO Leiche im Objektbaum.

Ich begreife auch mit dem Dataflow nicht, welche guid ich wie ändern muss.

Es gibt GUIDs für die verschiedenen Module (siehe IPS_GetModuleList).
Und es gibt GUIDs für den Datenaustausch, hier sogar pro Richtung.

Zuerst die Frage, was willst du als Parent nutzen?
ClientSocket?
So, oder so wird es ein Problem. Du weißt ja nicht welcher IO der vom LCN ist.
Der User muss also anschließend den korrekten Parent auswählen.
Um deinen Fehler beim senden zu unterbinden kannst du prüfen ob du einen Parent hast, und dieser Active ist.

Eventuell kannst du dich auch an das LCN Gateway hängen. Dann reicht ein ConnectParent im Create.
Allerdings sind hier dann andere GUIDs für das LCN Gateway nötig, und vermutlich ist das Datenpaket für SendDataToParent und ReceiveData komplett anders aufgebaut.
Ich habe nun kein LCN, kann also nicht testen.
Aber eine Vorlage mit den GUIDs kann ich heute Nachmittag zusammenstellen.
Blöd wäre wenn das LCN Gateway in IPS deine erhofften Daten nicht weitergeleitet.
Das müsstes du dann testen.
Michael

Hallo Michael,
die Daten die Tom haben möchte kommen im LCN-Gateway an, man muss die nur vorher per IPS abfragen.
Bei Tastensperren ist das abfragen :


$InstanzID = @IPS_GetInstanceIDByName("Client Socket LCN", $ParentID);
$TX_BUF= '>M000161.STX'.chr(10);    //Tastensperren abfragen
CSCK_SendText($InstanzID  ,$TX_BUF); 

Im Log vom LCN-Gateway kommt dann an : =M000161.TX255001000000
Da sind alle A Tasten gesperrt(255) und die Taste B1(001).

Bei den neuen LCN Schwellwerten hoffe ich immer noch, dass das IPS Team die mal mit reinbringt.

eigentlich funktioniert ja alles. Sowohl die Tastensperren als auch die 17er Schwellwerte.

Doof ist nur das Einrichten: Derzeit bekommt man eben durch das Modul auch einen neuen CS verpasst, der dann hinterher als Leiche im Objektbaum rungamnmelt. Das finde ich nicht so schön.

Ich weiß nur nicht, wie ich die module.json und/oder das php Modul machen muss, damit man beim Einrichten gleich einen vorhandenen CS auswählen darf.

Das Debug gibt aber keinen Aufschluss über den Datenaustausch und ob diese Daten auch weitergeleitete werden (in beide Richtungen).
Michael

Ich habe übrigens gar kein „LCN Gateway“ im Einsatz. Ist ja für den CS nicht zwingend erforderlich.

Der Datenaustausch funktioniert, Michael.

Damit ist es aber einfacher, es übernimmt das codieren der Sendung und das dekodieren der Antwort.
Michael

PHP Modul Dataflow Generator
Dann must Du Dich im GUID Dschungel nicht durchwühlen, sondern einfach den passenden Socket auswählen, dann wird Dir die passende GUID ausgewählt.

Das funktioniert hier nicht.
Dein Modul hat weder das LCN Gateway als Parent für Childs, noch die korrekten Felder für den Datenaustausch.
Michael

Achso… Wenn jemand bitte einen Debug des ClientSocket exportiert, kann ich es ohne LCN Hardware im IPS testen.
Michael

Stimmt, ich hatte fälschlicherweise angenommen es wird ein Clientsocket verwendet. Macht das denn Sinn weitere IOs noch mit zu Ergänzen in das Modul, wird so was oft benutzt?

@Michael,
hab dir mal nen dump per Mail gesendet.
=M000161.TX000000000000 ist die Antwort auf die Abfrage per STX.

Danke :slight_smile:

Ich habe da mal etwas zum testen und spielen.
Vielleicht in Zukunft für euch LCN Nutzer brauchbar.

Hängt sich an das LCN Gateway, somit wird es sauber in den Datenstrom zum LCN integriert (und nicht mit direktes Senden auf den Socket irgendwo zwischengeschoben).

Hoffe ich habe den Datenaustausch soweit korrekt interpretiert.


        $SendData = [
            'DataID'   => '{C5755489-1880-4968-9894-F8028FE1020A}',
            'Address'  => 0, // 0 => M, 1 => G
            'Segment'  => $this->ReadPropertyInteger('Segment'),
            'Target'   => $this->ReadPropertyInteger('Modul'),
            'Function' => $Function,
            'Data'     => $Data
        ];

$Address gibt wohl den Typ der Adresse an. Ist ein interger. 0 für ‚M‘, 1 für ‚G‘.
$Function ist dann z.B. ‚STX‘
Und $Data wäre der eigentliche Payload (oder hier leer).

Das hier erzeugt dann das gewünschte Telegramm:


$id = 12345; // $id von der Instanz 'LCN Test Modul'
LCNTest_SendTest($id,'STX','');

ReceiveFilter ist aktuell wie folgt; wobei Segment und Target aus den Einstellungen kommen.

.*"Message":2,"Segment":0,"Target":161,"Function":"TX".*

Ansonsten ist der Code sehr überschaubar.
Und gibt alles im Debug aus, Filter, SendData, Result von SendData (sofern vorhanden) und ReceiveData.
Hoffe es hilft :smiley:

Code liegt auf GitHub:
GitHub - Nall-chan/LCNTest: Testmodule

https://github.com/Nall-chan/LCNTest

Michael
PS: Könnte es sein, das Target abhängig von Address eine Modul oder Gruppen-Adresse ist? (Ich nix LCN, aber ist das eine logische Erklärung?)