Dokumentation
Datenfluss
Beschreibung
Der Datenfluss soll erklären, wie Daten zwischen "Device <-> Splitter <-> I/O" in IP-Symcon versendet werden und was dafür eingerichtet werden muss.
Für eine einfache Erstellung eines Moduls inklusive des Datenflusses, wird die Nutzung des Modul-Generators empfohlen.
Typischer Aufbau
Datenflussrichtung
Es gibt 2 Datenflussrichtungen.
I/O zu Device
Diese Flussrichtung ist, wie in der Abbildung sichtbar, von der übgeordneten Instanz via SendDataToChildren zu den Children. Die ankommenden Daten werden innerhalb der Children von der überschreibaren Funktion ReceiveData verarbeitet.
Zwischen I/O und Device kann optional und falls nötig ein Splitter eingepflegt werden.
Device zu I/O
Diese Flussrichtung ist, wie in der Abbildung sichtbar, von der untergeordneten Instanz via SendDataToParent zu dem Parent. Die ankommenden Daten werden innerhalb des Parents von der überschreibaren Funktion ForwardData verarbeitet.
Zwischen Device und I/O kann optional und falls nötig ein Splitter eingepflegt werden.
I/O Module
Bei selbstentwickelten Modulen sind die GUIDs für Devices und Splitter in der jeweiligen module.json Datei anzugeben.
Diese können über den GUID Generator erstellt werden.
Seitens der I/O stehen folgende Datenpakete für I/O Typen zur Verfügung.
I/O Modul | Modul GUID | Unterstütze Datenpakete |
---|---|---|
Client Socket | {3CFF0FD9-E306-41DB-9B5A-9D06D38576C3} | Simpel |
HID | {E6D7692A-7F4C-441D-827B-64062CFE1C02} | Erweitert (Event) |
HTTP Client | {4CB91589-CE01-4700-906F-26320EFCF6C4} | Erweitert (HTTP Request) |
Multicast Socket | {BAB408E0-0A0F-48C3-B14E-9FB2FA81F66A} | Simpel Erweitert (Socket) |
Serial Port | {6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1} | Simpel |
Server Sent Event Client | {2FADB4B7-FDAB-3C64-3E2C-068A4809849A} | Erweitert (SSE) |
Server Socket | {8062CF2B-600E-41D6-AD4B-1BA66C32D6ED} | Simpel Erweitert (Socket) |
UDP Socket | {82347F20-F541-41E1-AC5B-A636FD3AE2D8} | Simpel Erweitert (Socket) Erweitert (UDP) |
Virtual I/O | {6179ED6A-FC31-413C-BB8E-1204150CF376} | Simpel Erweitert (Socket) |
WebSocket Client | {D68FD31F-0E90-7019-F16C-1949BD3079EF} | Simpel |
Datenpakete
Die Datenpakete werden JSONString kodiert.
Diese beinhalten einmal die GUID des Datenpakettyps und die eigentlichen Daten.
Über die GUID als Identifikator weiß das jeweilge Modul, welche Daten in dem Datenpaket sind und deren Formatierung.
Simpel
RX GUID: {018EF6B5-AB94-40C6-AA53-46943E824ACF}
TX GUID: {79827379-F36E-4ADA-8A95-5F8D1DC92FA9}
Parameter | Datentyp | Beschreibung |
---|---|---|
Buffer | String | Beliebiger Dateninhalt |
// Beispiel für das Senden an den Parent (TX Paket) vom Typ Simpel public function SendData() { $this->SendDataToParent(json_encode([ 'DataID' => "{79827379-F36E-4ADA-8A95-5F8D1DC92FA9}", 'Buffer' => utf8_encode("Hallo Welt String"), ])); } // Empfangene Daten vom Parent (RX Paket) vom Typ Simpel public function ReceiveData($JSONString) { $data = json_decode($JSONString); $data['Buffer'] = utf8_decode($Data['Buffer']); //Im Meldungsfenster zu Debug zwecken ausgeben IPS_LogMessage("DATA", print_r($data, true)); }
Erweitert (Event)
RX GUID: {FD7FF32C-331E-4F6B-8BA8-F73982EF5AA7}
TX GUID: {4A550680-80C5-4465-971E-BBF83205A02B}
Parameter | Datentyp | Beschreibung |
---|---|---|
Buffer | String | Beliebiger Dateninhalt |
EventID | Integer | ID für das Event |
// Beispiel für das Senden an den Parent (TX Paket) vom Typ Erweitert (Event) public function SendData() { $this->SendDataToParent(json_encode([ 'DataID' => "{4A550680-80C5-4465-971E-BBF83205A02B}", 'Buffer' => utf8_encode("Hallo Welt String"), 'EventID' => 123 ])); } // Empfangene Daten vom Parent (RX Paket) vom Typ Erweitert (Event) public function ReceiveData($JSONString) { $data = json_decode($JSONString); $data['Buffer'] = utf8_decode($Data['Buffer']); //Im Meldungsfenster zu Debug zwecken ausgeben IPS_LogMessage("DATA", print_r($data, true)); }
Erweitert (Socket)
RX GUID: {7A1272A4-CBDB-46EF-BFC6-DCF4A53D2FC7}
TX GUID: {C8792760-65CF-4C53-B5C7-A30FCC84FEFE}
Parameter | Datentyp | Beschreibung |
---|---|---|
Buffer | String | Beliebiger Dateninhalt |
Type | Integer | Typ der Verbindung (0 = Data, 1 = Connect, 2 = Disconnect) |
ClientIP | String | IP-Adresse der Verbindung |
ClientPort | Integer | Port der Verbindung |
// Beispiel für das Senden an den Parent (TX Paket) vom Typ Erweitert (Socket) public function SendData() { $this->SendDataToParent(json_encode([ 'DataID' => "{C8792760-65CF-4C53-B5C7-A30FCC84FEFE}", 'Buffer' => utf8_encode("Hallo Welt String"), 'Type' => 0, 'ClientIP' => "192.168.0.8", 'ClientPort' => 502 ])); } // Empfangene Daten vom Parent (RX Paket) vom Typ Erweitert (Socket) public function ReceiveData($JSONString) { $data = json_decode($JSONString); $data['Buffer'] = utf8_decode($Data['Buffer']); //Im Meldungsfenster zu Debug zwecken ausgeben IPS_LogMessage("DATA", print_r($data, true)); }
Erweitert (UDP)
RX GUID: {9082C662-7864-D5CA-863F-53999200D897}
TX GUID: {8E4D9B23-E0F2-1E05-41D8-C21EA53B8706}
Parameter | Datentyp | Beschreibung |
---|---|---|
Buffer | String | Beliebiger Dateninhalt |
ClientIP | String | IP-Adresse der Verbindung, wenn leer dann wird die im UDP Socket eingestellte Hostadresse genutzt. (Wird ignoriert, wenn Broadcast aktiv ist) |
ClientPort | Integer | Port der Verbindung, wenn auf 0 gesetzt wird der im UDP Socket eingestellte Port genutzt |
Broadcast | Boolean | Broadcast de-/aktiviert (False = Deaktiviert, True = Aktiviert) |
// Beispiel für das Senden an den Parent (TX Paket) vom Typ Erweitert (UDP) public function SendData() { $this->SendDataToParent(json_encode([ 'DataID' => "{8E4D9B23-E0F2-1E05-41D8-C21EA53B8706}", 'Buffer' => utf8_encode("Hallo Welt String"), 'ClientIP' => "192.168.0.8", 'ClientPort' => 502 'Broadcast' => false, ])); } // Empfangene Daten vom Parent (RX Paket) vom Typ Erweitert (UDP) public function ReceiveData($JSONString) { $data = json_decode($JSONString); $data['Buffer'] = utf8_decode($Data['Buffer']); //Im Meldungsfenster zu Debug zwecken ausgeben IPS_LogMessage("DATA", print_r($data, true)); }
Erweitert (SSE)
RX GUID: {5A709184-B602-D394-227F-207611A33BDF}
Parameter | Datentyp | Beschreibung |
---|---|---|
Event | String | Beliebiger Eventtyp |
Data | String | Beliebiger Dateninhalt |
Retry | String | In Millisekunden bis zu einem erneuten Sendeversuch |
ID | String | ID für das Event |
TX GUID: {79827379-F36E-4ADA-8A95-5F8D1DC92FA9}
TX wird nicht ausgewertet muss aber gesetzt sein
// Empfangene Daten vom Parent (RX Paket) vom Typ Erweitert (SSE) public function ReceiveData($JSONString) { $data = json_decode($JSONString); //Im Meldungsfenster zu Debug zwecken ausgeben IPS_LogMessage("DATA", print_r($data, true)); }
Weitere Informationen gibt es unter w3.org/TR/eventsource
Erweitert (HTTP Request)
RX GUID: {018EF6B5-AB94-40C6-AA53-46943E824ACF}
Parameter RX | Datentyp | Beschreibung |
---|---|---|
Buffer | String | Beliebiger Dateninhalt |
TX GUID: {D4C1D08F-CD3B-494B-BE18-B36EF73B8F43}
Parameter TX | Datentyp | Beschreibung |
---|---|---|
RequestMethod | String | GET oder POST |
RequestURL | String | URL der anzufragenden Webseite |
RequestData | String | Welcher Datenwert angefragt werden soll |
Timeout | Integer | Millisekunden bis ein Timeout kommt |
// Beispiel für das Senden an den Parent (TX Paket) vom Typ Erweitert (HTTP Request) public function SendData() { $this->SendDataToParent(json_encode([ 'DataID' => "{D4C1D08F-CD3B-494B-BE18-B36EF73B8F43}", 'RequestMethod' => utf8_encode("POST"), 'RequestURL' => utf8_encode("https://reqbin.com/echo/post/form"), 'RequestData' => utf8_encode("dummy-post-data"), 'Timeout' => 10000 ])); } // Empfangene Daten vom Parent (RX Paket) vom Typ Simpel public function ReceiveData($JSONString) { $data = json_decode($JSONString); $data['Buffer'] = utf8_decode($Data['Buffer']); //Im Meldungsfenster zu Debug zwecken ausgeben IPS_LogMessage("DATA", print_r($data, true)); }
Voraussetzung und Einrichtung
Die GUIDs für die verwendeten Datenpakettypen werden in der module.json definiert.
Damit ein Datenfluss zwischen 2 Instanzen etabliert werden kann, muss der Sendende bei dem passenden Requirement die genutzte Kommunikationsart eintragen.
Der Empfänger trägt seinerseits unter Implemented die GUID der Kommunikationsart ein.
Wenn mehrere GUIDs verschiedener Datenpakettypen in die module.json eingetragen werden, kann ein Modul auch mehrere Datenpakettypen interpretieren und verarbeiten.
Ebenfalls muss von jedem Child der jeweilige Parent via ConnectParent, RequireParent oder ForceParent eingerichtet sein.
Beispiel
Kommunikation zwischen I/O, Splitter und Device.
Das Device hat den Splitter als Parent und der Splitter hat das I/O als Parent.
Auszug aus den jeweiligen module.json
Beispiel GUIDs der Datenpakettypen:
IO_TX: {65465465-6546-6546-6546-65465465}
IO_RX: {AE3AE3A-AE3A-AE3A-AE3A-AE3AE3AE}
Device_TX: {78978978-7897-7897-7897-78978978}
Device_RX: {12312312-1231-1231-1231-12312312}
// Innerhalb des I/Os (Parent vom Splitter) // I/Os haben normalerweise keine weitere Parents. Somit sollte die Liste normalerweise leer sein. "parentRequirements": [], // GUID des Datenpakettyps, welches via SendDataToChildren genutzt wird "childRequirements": ["{AE3AE3A-AE3A-AE3A-AE3A-AE3AE3AE}"], // Liste GUIDs der Datenpakettypen auf die gehorcht wird. // Diese wird von der Funktion ForwardData (Daten kommen vom Child) verarbeitet. "implemented": ["{65465465-6546-6546-6546-65465465}"], // Innerhalb des Splitters (Parent vom Device, Child vom I/O) // GUID des Datenpakettyps, welches via SendDataToParent genutzt wird "parentRequirements": ["{65465465-6546-6546-6546-65465465}"], // GUID des Datenpakettyps, welches via SendDataToChildren genutzt wird "childRequirements": ["{12312312-1231-1231-1231-12312312}"], // Liste GUIDs der Datenpakettypen auf die gehorcht wird. // Diese wird in wird entweder von der Funktion ForwardData (Daten kommen vom Child) oder ReceiveData (Daten kommen vom Parent) verarbeitet. "implemented": ["{AE3AE3A-AE3A-AE3A-AE3A-AE3AE3AE}", "{78978978-7897-7897-7897-78978978}"], // Innerhalb des Device (Child vom Splitter) // GUID des Datenpakettyps, welches via SendDataToParent genutzt wird "parentRequirements": ["{78978978-7897-7897-7897-78978978}"], // Devices haben normalerweise keine weitere Children. Somit sollte die Liste normalerweise leer sein. "childRequirements": [], // Liste GUIDs der Datenpakettypen auf die gehorcht wird. // Diese wird von der Funktion ReceiveData (Daten kommen vom Parent) verarbeitet. "implemented": ["{12312312-1231-1231-1231-12312312}"],