Neuling - Einige Fragen bzgl. PHP-Modul Programmierung

Hallo zusammen,

ich mache zur Zeit die ersten Schritte mit der Entwicklung von PHP-Modulen, dazu hätte ich zur Zeit zwei Fragen.

[ol]
[li]Wie kann ich ein „Select“ welches ich in der json.form angelegt habe, mit verschiedenen Optionen aus PHP heraus füllen?[/li][li]Wie registriere ich in der module.php ein Client Socket und greife auf dieses zu?[/li][/ol]
Ich freue mich über Antworten und bedanke mich schon mal. :slight_smile:

Grüße,
Kai

Zu 1:
GetConfigurationForm — IP-Symcon :: Automatisierungssoftware
Wobei dynamisch bedeutet: Sobald die Instanz in der Console geöffnet wird, wird diese Methode aufgerufen. Änderungen sieht man also erst nach dem schließen und neu öffnen. (Beispiel wäre mein Kodi-Modul, der Configurator.)
Zu 2: RequireParent — IP-Symcon :: Automatisierungssoftware
Zugriff regelt IPS, dafür das hier nutzen: Datenfluss — IP-Symcon :: Automatisierungssoftware
Michael

Super danke, das probiere ich direkt aus. Das mit dem Socket werde ich bei dem nächsten Modul testen. :slight_smile:

Grüße,
Kai

Die ersten Schritte haben geklappt, vielen Dank für die Hilfe. :slight_smile:

KS_Modules/KS_SIS-Handball

Hat jemand evtl. noch ein paar Verbesserungsvorschläge?
Man kann sicherlich einiges eleganter lösen, ich würde mich freuen wenn ihr weitere Tipps für mich habt. :slight_smile:

Danke und Grüße,
Kai

Nun rätsel ich, wie ich das ganze ohne Scripts machen kann, ist das möglich?
Sodass zum Beispiel die Variablen nach einer gewissen Zeit (Timer) aus dem Modul befüllt werden. In meinem Beispiel wird ja zur Zeit alle 600 Sekunden ein Script ausgeführt, dies geht doch sicherlich auch direkt aus dem Modul?!

Sorry für so viele, wahrscheinlich „dumme“ Fragen. :banghead:

Edit: Ich habs hinbekommen.

Ich habe eine Funktion getTabelle() angelegt:


	private function getTabelle() {
				$xml = $this->loadHandballXML(4);
				$message = "Tabelle der 1. Herren:<br />";
				foreach ($xml->Platzierung as $platz) {
						$message .= $platz->Nr." ".$platz->Name;
						$message .= "<br />";
				}
				SetValue($this->GetIDForIdent("Tabelle") ,utf8_decode($message));
	}

Diese rufe ich in einer Funktion update() auf:


		public function update() {

			$this->getTabelle();
		}

Dann registriere ich einen Timer in der Create() Funktion:


$this->RegisterTimer("Update", 5000, 'sis_update();');

Wäre das so richtig, oder habe ich etwas nicht beachtet?

Grüße,
Kai

Nun geht es weiter mit den Fragen. :o

Wenn ich ein Modul habe, welches evtl. „Untermodule“ haben soll, aber es Einstellungen gibt, die für alle greifen sollen. Wie gehe ich da am besten vor? Ist für sowas der Splitter vorgesehen?

Grüße,
Kai

Jup. Entweder der Splitter holt die Daten , er hat auch den Timer, und versendet dann die Daten per SendToChildren.
Die Daten kommen dann im Child bei ReceiveData an.
Oder die Childs haben jeder einen individuellen Timer und holen dich dann per Rückgabewert von SendToParent die Daten vom Splitter.
Hängt immer davon ab wie dein Splitter extern arbeite.
Also ob er eh immer alle Daten hat/holt oder immer nur für ein Child.
Michael

Danke.
Ich versuche mir das anhand deines Kodi Modules anzuschauen, allerdings steige ich da nicht ganz durch.

Ich lege mir also ein Modul an welches als Splitter fungieren soll, zum Beispiel HandballSplitter.

Die Module.json:

{
        "id": "GUID die ich mir erzeuge",
        "name": "HandballSplitter",
        "type": 2,[b] <--- Type 2 für Splitter[/b]
        "vendor": "",
        "aliases": ["Handball Splitter"],
        "parentRequirements": ["[b]Welche GUID?[/b]"],
        "childRequirements": ["[b]Welche GUID?[/b]"],
        "implemented": ["[b]Welche GUID?[/b]", "[b]Welche GUID?[/b]"],
        "prefix": "HandballEinstellungen"
    }

Mit denn fettgedruckten Einträgen stehe ich leider noch auf Kriegsfuß. (Habe ich ehrlich gesagt noch nicht ganz verstanden)

Und in der module.php von dem Modul, welches auf den Splitter zugreifen soll gebe ich in der Create() Funktion dann folgendes mit:

  $this->ConnectParent("GUID vom Splitter");

Richtig?

Auf die Werte, welche in dem Splitter gesetzt werden greife ich dann wie zu? :confused:

Verzeiht mir für diese Newbie Fragen! :o

Grüße,
Kai

Kennst du die Seite?
Datenfluss — IP-Symcon :: Automatisierungssoftware
Da ist das mit den GUIDs erklärt, inkl. Link zu einem Generator.
Und Beispiele sind auf GitHub zu finden:
GitHub - paresy/SymconTest: Symcon modules for demonstration and testing
Michael

Ja, ich habe es mir auch schon ziemlich lange angeguckt und immer wieder gelesen.

Das Device wäre also mein Modul, der Splitter wäre die Ebene auf der ich „global“ Einstellungen für meine Module schreiben kann.

Was ist mit I/O? Benötige ich das?

Ich versuche es einfach mal abzubilden.

Mein Splitter SISHandballSplitter:
Module.json:

{
	"id": "{1F17C41E-F610-4327-A3A1-7E93B56AB6C2}",
	"name": "SISHandballSplitter",
	"type": 2,
	"vendor": "",
	"aliases":["SISHandball Splitter"],
	"parentRequirements": [""], <- bleibt leer, gibt ja nichts darüber 
	"childRequirements": ["{A5228F95-286E-4A3C-829F-042F6AFD00F8}"], <- guid, welche beim Modul in implemented eingetragen ist
	"implemented": ["{3D094C9F-E763-4B92-9673-98535A673DD9}"], <-guid, welche im Modul bei parentRequirements eingetragen ist
	"prefix": "sisSplitter"
}

Mein Modul SISHandballTabelle:

{
	"id": "{1886EA3B-9FC5-4B4A-B6A5-A859AECC48FE}",
	"name": "SISHandballTabelle",
	"type": 2,
	"vendor": "",
	"aliases": ["SISHandball Tabelle"],
	"parentRequirements": ["{3D094C9F-E763-4B92-9673-98535A673DD9}"],
	"childRequirements": [],
	"implemented": ["{A5228F95-286E-4A3C-829F-042F6AFD00F8}"],
	"prefix": "sisTabelle"
}

Ob du ein IO brauchst, Kannst nur du entscheiden :slight_smile:
Wenn du direkt Daten z.B aus einem Dienst ausliest ohne einen WWW Reader oder einen ClientSocket, brauchst du wohl keinen.
Kannst aber auch einfach deinen Splitter zum IO deklarieren und keine Splitter nutzen.
Globale Einstellungen gibt es nicht. Daten werden wie in meinem Post 7 ausgetauscht.
Dazu einfach mal den Code von Paresy aus GitHub ausprobieren / ansehen.
Michael

Danke dir. :slight_smile:
Sieht so aus, als hätte ich es hinbekommen. Unter den Meldungen sehe ich nun:

24.08.2016 16:54:05*| ReceiveData*| {"DataID":"{A5228F95-286E-4A3C-829F-042F6AFD00F8}","Buffer":{"Spielklasse":{"Liga" usw.

Nun muss ich die in meinem Modul aufbereiten und dann mal sehen ob es klappt. Vielen Dank für deine Geduld und deine Hilfe. :slight_smile:

Grüße,
Kai

Hallo Michael,

ich bin nun ein ganzes Stück weiter gekommen. :slight_smile:

GitHub - Schnittcher/KS_Modules
Dort gibt es die Module KS_HandballSplitter & S_SIS-HandballTabelle, würdest du dir vielleicht mal den Code ansehen und mir dazu eine Rückmeldung geben ob es so im Sinne des Erfinders ist?
Du wirst das Modul sicherlich nicht testen können, da du keine Zugangsdaten für SIS-Handball hast. Deswegen anbei mal ein paar Screenshots.

Danke nochmal vielmals für deine Hilfe!

Grüße,
Kai

Ich schaue es mir gerne mal an. Wird aber erst nächste Woche etwas, bin gerade ein paar Hundert Kilometer von einem IPS entfernt und genieße das super Wetter :smiley:
Michael
PS: Und gern geschehen.

Das ist echt nett von dir. Danke :slight_smile:
Wo bist du denn? Viel Spaß dann weiterhin im Urlaub. :slight_smile:

Ich werde mal noch ein, zwei Module dafür schreiben.

Grüße,
Kai

Das habe ich ja nun dank dir schon verstanden.
Jetzt bin ich an der Stelle angekommen, an der ich auf den Host zugreifen will, also wie wird die Verbindung geöffnet und wie sende ich Daten und empfange die Antwort?

Also das senden von Befehlen wäre ja so:

CSCK_SendText(ID des Moduls, "Beliebiger Datensatz");

Und wie finde ich am elegantesten die ID des Moduls heraus, mit GetIDForIdent?

Danke und Grüße,
Kai

Nein diese Befehle nutzt du in Modulen gar nicht.
Einfach mit SendDataToParent — IP-Symcon :: Automatisierungssoftware
deine Daten an den IO senden.
Schau mal hier durch, Da sind auch viele Fragen und Antworten, Welche dir bestimmt helfen.

Michael

Hallo,

also lege ich mir ein Modul namens „Name Client Socket“ an mit folgender module.json:

{
    "id": "GUID",
    "name": ""Name Client Socket",
    "type": 1,
    "vendor": "",
    "aliases":
    [
        "Name Client Socket"
    ],  
    "parentRequirements": [GUID],
    "childRequirements": [GUID],
    "implemented": [GUID],
    "prefix": "ABC"
}

Und in der module.php im Create:



    $this->RegisterPropertyString("IPAddress", "127.0.0.1");
    $this->RegisterPropertyBoolean("Open", false);

Hab ich mir anhand deines Beispiels (GitHub - Nall-chan/SymconModules) zusammengesucht.

Grüße,
Kai

Nimm lieber das Original
GitHub - Joey-1970/SymconModules
Mein Fork ist glaube ich veraltet.
Und wenn du einen ClientSocket als IO nutzen möchtest, brauchst du den nicht selbst als Modul erzeugen, der ist fertig in IPS verfügbar.
Michael

Super, danke!
Für Client Socket die Guid „3CFF0FD9-E306-41DB-9B5A-9D06D38576C3“ als Parent und dann gehts los.

Ich kann aber auch ein eigenes anlegen und da drin schon einige Daten aufbereiten, damit ich keinen Splitter benötige?

Grüße,
Kai