Splitter und Client Socket

Hi,

ich möchte gerne etwas über einen IP/Client Socket ansteuern.
Und zwar möchte ich gerne für die Yeelights ein Plugin erstellen.
Hierbei müsste jede Yeelight via IP angesprochen werden.
Muss ich für jeden Client Socket einen separaten Splitter erzeugen?
Oder kann ein Splitter n Client Sockets „verwalten“?
Wie sieht dann die parent/child/implemented module.json aus?

Wie funktioniert denn genau die Kommunikation mit den Yeelights, direkt über einen Socket oder über HTTP?

Die Frage ist erstens brauchst Du überhaupt einen Splitter? Normalerweise ist der Aufbau ja ein I/O -> Splitter -> mehrere Instanzen. Eventeuell würde da ja auch eine Instanz und ein I/O reichen. Wenn jede Yeelight einen eigenen Socket braucht hätte dann auch jede Instanz seinen eigenen I/O.

Ein Splitter hat immer genau eine übergeordnete Instanz n Instanzen können aber einen Splitter als übergeordnete Instanz haben.

Ohne jetzt das im Detail angeschaut zu haben, aber Du bräuchtest Wohl eine Konfigurator Instanz und einen Multicast Socket. Über diesen kannst Du erst mal per SSDP die Geräte im Netzwerk suchen in die Geräte im Konfigurator übernehmen. Aus dem Konfigurator könntest Du dann eine Instanz mit dem passenden Client Socket erstellen. Alternativ lässt Du den ganzen teil mit SSDP weg wenn Du davon ausgehen kannst das der Nutzer so oder so die IP Adresse des Geräts kennt. Besser zu bedienen ist es sicher wenn die Geräte im Netzwerk gefunden werden.

Laut dem Protokoll sendet das Gerät auch Events (Notification).
Somit reicht es eine Geräte-Instanz zu bauen.
Als übergeordnete Instanz dann einen ClientSocket, damit diese Events empfangen werden können.
Die IP Adresse trägt der User im IO ein.
Den Port kannst du mit GetConfigurationForParent vorgeben.
Die GUIDs für den Datenaustausch sind die VirtualIO laut Doku:
Datenfluss — IP-Symcon :: Automatisierungssoftware

Wenn das soweit läuft, wäre natürlich ein eigenständiger Konfigurator, welcher die Geräte im Netz sucht sehr komfortabel.
Für die reine Funktion ist das aber Nebensache.
Michael

Danke für die schnellen Antworten!
Die Kommunikation zur Steuerung erfolgt direkt auf TCP Ebene.
Dann versuche ich mich mal an ein Device inkl. parent Socket.
Dokumentiert ist ja IP Symcon sehr gut, soweit ich das sehe :slight_smile:

Das Protokoll ist ja Json.
Kannst sonst etwas spicken beim Xiaomi Splitter.
Michael

Das mit GetConfigurationForParent() hat soweit geklappt.
Wenn ich jetzt meinen JSON String zusammenbaue, der zur Lampe gehen soll, versende ich dann dann einfach mit SendDataToParent? Oder benötige ich doch einen Splitter, der dann in der ForwardData-Methode auf den CSCK zugreifen kann?!

Einfach SendDataToParent.
Aber denk daran, du bekommst keinen Rückgabewert vom ClientSocket.
Die Antwort bekommst du dann im ReceiveData.

Michael

Bei mir hakt es noch (Invalid DataId)

Verbindung zum Virt I/O

  "parentRequirements": ["{79827379-F36E-4ADA-8A95-5F8D1DC92FA9}"],
  "childRequirements": [],
  "implemented": ["{018EF6B5-AB94-40C6-AA53-46943E824ACF}"],
  "prefix": "YCB"

Instanz eines Client Sockets

$this->RequireParent("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}"); // CLIENT SOCKET

Call

$this->SendDataToParent(json_encode(Array("DataID" => "{79827379-F36E-4ADA-8A95-5F8D1DC92FA9}", "Buffer" => $commandStr)));

Den Parameter Array habe ich mir ergooglet. Kann es sein, dass er für ein Socket Client anders aussehen sollte?
Wo finde ich die Doku dafür?

Die Doku sagt nur JsonStr.
Den Inhalt von allen VirtualIO ist immer nur Buffer (zuzüglich der DataID, welche es immer gibt).
Hier ist ein Beispiel in der Doku:
ForwardData — IP-Symcon :: Automatisierungssoftware

Sonst gibt es hier viele Beispiele:
GitHub - symcon/SymconTest: Symcon modules for demonstration and testing
Michael