Grundsätzliche Fragen zur Modulerstellung

Genau so ist es…nicht gedacht, richtig :wink:

Warum machst du so etwas ?
Wozu brauchst du im Child die IP-Adresse ?
Der Splitter / IO ist dafür gedacht mit der Außenwelt zu kommunizieren.

Du fragst also mit dem Child am Parent an: Hey gib mir mal die Daten zu GPIO xyz.
Der Parent holt sich (wie auch immer) die Daten und übergibt das Ergebnis an den Child.

Oder, und dass wäre in deinem Fall wohl besser,

Der Splitter/IO ließt periodisch die Daten ein und versendet sie mit SendDataToChildren an alle Childs.

Michael

…da hast Du mich aber ins Grübeln gebracht. Klar, könnte ich auch so machen. Alle „Sendungs-Funktionen“ wäre zentral im Parent.
Was mir noch nicht ganz klar ist an der Stelle: Wie muss der $JSON-String - so oder so - aussehen?

Joachim

Hier ist ein Beispiel.
https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/module/receivedata/
DataID ist Pflicht und muss die korrekte GUID enthalten (siehe hier ganz unten Datenfluss — IP-Symcon :: Automatisierungssoftware ).
Rest kannst du frei bestimmen.
Also auch mehr Felder mit Daten übergeben als nur das eine im Beispiel mit Buffer.
Michael

Hallo Michael,

ich habe Deinen Tipp mir noch mal durch den Kopf gehen lassen und für gut befunden. Alle „produktiven“ Funktionen sollten dann im Parent laufen. So weit habe ich jetzt schon wieder ein paar Fortschritte gemacht. Auch die „Hürde“ Kommunikation ist offenbar genommen…:wink:

…aber manchmal scheitert man ja an den ganz kleinen Dingen. Hier hält der Code immer wieder an mit dem Verweis dass „GetValue“ nicht korrekt verwendet wird:
[PHPIf ($this->GetValue(GetIDForIdent(„Status“)) == true) {]


"Status" ist eine der angelegten Variablen...
Habe ich hier einen Fehler im Syntax?:confused:

Joachim

Mach mal das $this bei GetValue weg.
Ist ja IPS-Funktion und keine Methode der ipsmodule-Klasse.
Und als Empfehlung, arbeite immer typensicher mit GetValueBoolean etc… Auch bei SetValue immer den Typ angeben. Erleichtert die Fehlersuche (meiner Meinung)
Michael

Hallo Michael,

wieder einen kleinen Schritt weiter! Vielen Dank!

Bei der ersten Version die ich auf die Schnelle zusammengestrickt hatte, lief die Kommunikation zwischen dem entfernten Raspberry Pi und dem IPS-Raspberry Pi über UDP. Das war für die Reaktionszeiten absolut im akzeptablen Bereich. Nun habe ich in dieser neuen Version die Server-Version von PIGPIO verwendet. Nun liegt die Reaktionszeit bei ungefähr zwei Sekunden - deutlich zu lang…
Dabei spielt es offenbar keine Rolle, ob ich den entfernten GPIO-Server anspreche oder den auf dem „eigenen“ IPS-Raspberry Pi. Das wundert mich…:eek:

Was bringt es ggf. das Python-Skript ausführbar zu machen?
Muss ich diese Datei dann zwangsläufig anders ansprechen?
Aktuell mache ich das so:

exec('sudo python '.IPS_GetKernelDir().'modules/SymconModules/IPS2GPIO/ips2gpio.py....

Gibt es hier noch Verbesserungspotential?

Joachim

Ich habe mich mit Python noch nicht auseinander gesetzt aber wenn möglich wäre es sicher das beste mit Python einen Socket zu öffnen und dann mit einem Socket von IPS zu kommunizieren.

Keine Ahnung was da wie jetzt bei dir wie kommuniziert und wer wenn worüber abfragt.
Von daher kann ich da dir auch keinen Rat geben.
Ich nutze keine Pi mit den GPIOs nur die alte lxCCU liegt hier noch auf Halde.
Michael

…Fonzo hat mich auf eine Idee gebracht. :slight_smile:
Wenn PIGPIO einen Server hat, kann ich vielleicht etwas direkt über einen IPS-Client-Socket senden…
Aber wie?
Hier habe ich tatsächlich eine Erläuterung gefunden, verstehe aber nicht, wie der zu sendende Befehl aussehen müsste.
Z.B. möchte ich die PWM auf GPIO 23 auf 255 setzen.
PWM wäre cmd 5
GPIO wäre 23
Dutycycle wäre 255
Aber wie wäre der korrekte zusammengesetzte String?

Joachim

…Fonzos Ansatz war Gold wert! Statt bisher einer Ausführungszeit von >2 Sek bin ich jetzt in der Regel < 0,2 Sek!

Was mich aber wieder vor eine neue Herausforderung stellt. Meine I/O-Instanz rutscht in der Hierarchie ab zu einem Splitter, ich benötige jetzt übergeordnet einen Client Socket…

Worauf muss ich da achten?
Nehme ich als übergeordnetes GUID die des IPS-Client Sockets? (erstelle also keine eigenes Formular)
Wie bekomme ich dann die eingegebenen Daten in den Splitter?
Muss ich die module.json und die module.php dann selbst machen?

Joachim

Umgekehrt, Nimm die Eigenschaften deines Splitters und setzte die des ClientSocket bei jedem Appylchanges neu.
Michael

…das war jetzt aber schnell! :slight_smile:

Für mich zur Erklärung:
Im jetzigen Splitter würde ich in

public function Create()

ein

$this->ConnectParent{"3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}");

(GUID des Client Socket) hinzufügen.
Die Kommunikation zwischen dem Splitter und des Client Socket müsste dann nach dem Datenflussdiagrammdiese sein:
Virtual I/O {018EF6B5-AB94-40C6-AA53-46943E824ACF} {79827379-F36E-4ADA-8A95-5F8D1DC92FA9} Kann für die Kommunikation von ClientSocket, SerialPort, UDPSocket und ServerSocket genutzt werden

Damit sollte es möglich sein, aus dem Splitter mit

$this->SendDataToParent(json_encode(Array("DataID" =>

die Daten dort zu setzen bzw. abzufragen?

Joachim

Die GUID kann ich dir jetzt nicht aus dem Kopf sagen… Aber so sollte es gehen.
Du musst aber bedenken dass du die Daten zum Socket und den Empfang vom Socket in verschiedenen Threads empfängst.
Somit brauchst du im Splitter jetzt eine Buffer-Variable in welche du Antwort des Sockets schreibst um sie nach SendToParent dort auslesen zu können.
Unübersichtliches Beispiel ist mein SqueezeBox Modul.
Michael

…habe schon gesehen:

// Zwangskonfiguration des ClientSocket

:wink:

IP und Port werden denn ja quasi im eigenen Modul und im Client Socket gepflegt. Eigentlich bräuchte man ja nur die „Funktion“ des Client Sockets…

Wie auch immer: Muss mal schauen wie es mit der Erweiterung jetzt läuft…

Joachim

Es soll mal kommen, dass die Einstellungen im IO dann ausgegraut werden wenn du eine Config vom Splitter vorgibst.
Michael

…hängt jetzt wieder an etwas anderem:

Fehlermeldung: Kann Repository nicht aktualisieren wenn lokale Änderungen vorgenommen wurden.

…hatte ja die Python-Datei ausführbar gemacht.

Wie bekomme ich das wieder hin?

Joachim

Den Eintrag im Module Control löschen und neu hinzufügen.
Instanzen bleiben erhalten, deine lokalen Änderungen aber nicht.
Michael

Du kannst die Python Datei zwar mit dem Modul von Github in ein Verzeichnis packen darfst diese aber nicht ändern. Daher solltest Du wenn das Modul vom user installiert wird die Python Datei in das User Verzeichnis kopieren. Dort kannst Du diese dann modifizieren. Bei einem Update des Moduls wird dann lediglich die Vorlage der Python Datei im Modul Verzeichnis wieder synchronisiert die sich ja aber nicht geändert hat.

Bloß nicht in das User Verzeichnis vom IPS-Webfront.
Wenn dann in den Script Ordner.
Oder soll es über den IPS-Webserver aufgerufen werden?!
Michael

…alles entspannt!:slight_smile:

Der Tipp von Michael hat funktioniert und die besagte Python-Datei ist sowieso obsolet - Danke Fonzos Tipp den Server direkt anzusprechen! (siehe oben)

Joachim