Hallo!
Inspiriert durch HJHs Variablen Austausch (Danke für das Beispiel!) bin ich nun zu einer variablen Methode gelangt, wie ich Daten zwischen IPS Systemen austauschen kann.
Das ganze ist sicher noch nicht perfekt, aber läuft nun seit einigen Tagen ganz passabel bei mir. Vielleicht kanns ja der eine oder andere auch gebrauchen.
Ziel:
Datenaustausch IPS1.0 -> IPS2.0 (nur in Richtung IPS2.0)
Datenaustausch zwischen IPS2.0<->IPS2.0 (in beiden Richtungen möglich)
Getriggerten Variablen auf Senderseite (egal welchen Typs) sollen auch automatisch am empfangenden System erstellt werden mit den Werten darin.
Den angelegten Variablen wird am empfangenden System die Endung „.exchange“ angefügt zur Unterscheidung
Hintergrundinfo:
Der Datenaustausch basiert auf einem Client/ServerSocket Prinzip wobei ich mal dem Sendersystem den ServerSocket und dem Empfängersystem den ClientSocket eingerichtet habe. Damit habe ich dann auch keine Probleme mit Verbindungsabbrüchen auf der Socketverbindung wenn IPS1.0 das Sendersystem ist.
Hier nun die Scripts:
Fangen wir mal mit einem IPS 1.0 Sendersystem an …
VarExchangeServerscript_IPS10.ips.php:
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : VarExchangeServerscript_IPS10.ips.php
Trigger : OnUpdate von Variablen die übermittelt werden sollen
Funktion : Nachbildung des Variable Exchange Addin aus IPS10 nach IPS20
// Script auf Server Seite von IPS1.0 System (Sender)
Einrichtung auf IPS1.0 Sender-Seite:
1. eine ServerSocket Instanz anlegen (Port > 1024 wählen)
2. ServerSocket ID unten im Script anpassen
3. auf IPS2.0 der Empfängerseite nun die Einstellungen vornehmen
4. nach bestehender SocketVerbindung nun die gewünschten Variablen
hier auf diesem Script triggern
*/
if ($IPS_SENDER == "Variable") {
$varname = $IPS_VARIABLE;
switch(IPS_GetVariableType($varname)){
case 'Boolean':
$value = GetValueBoolean($varname);
$type = "0";
break;
case 'Integer':
$value = GetValueInteger($varname);
$type = "1";
break;
case 'Float':
$value = GetValueFloat($varname);
$type = "2";
break;
case 'String':
$value = GetValueString($varname);
$type = "3";
break;
// Ubekanntes wird mit nachfolgenden Defaults versehen
default:
$value = "";
$type = -1;
break;
}
// für debugging
// echo $varname. "|". serialize($type). "|". serialize($value);
// nur Senden, wenn ein gültiger Variablentyp erkannt wurde
if ($type != -1) {
// hier die ServerSocket Instanz ID anpassen
SSCK_SendText(18059, $varname. "|". serialize($type). "|". serialize($value).chr(13)); // "|" Separator und Datensatzende CR
}
}
?>
dann das Script auf IPS 2.0 Empfängerseite …
VarExchangeClientscript.ips.php:
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : VarExchangeClientscript.ips.php
Trigger :
Funktion : Nachbildung des Variable Exchange Addin aus IPS10 nach IPS20
// Script auf Client Seite (Empfänger)
Einrichtung auf IPS2.0 Empfänger-Seite:
1. zurerst auf Serverseite (Sender-Seite) die Einstellungen vornehmen
2. dann diesen Script anlegen
3. eine Register Variable anlegen und als übgeordnete Instanz eine Client Socket einrichten.
Dabei IP-Adresse und Port des Server Sockets vom Sender angeben.
4. Auf der nun angelegten Register Variable diesen Script als Ziel Script auswählen.
*/
// für Debugging aufdrehen
//echo $IPS_VALUE;
// Defaultwert für Variablenextension
$varextend = ".exchange";
// es können mehrere Variablen in einem Stream geschickt werden aufgrund
// gleichzeitiger Ausführung des Senderscripts, daher Auftrennung der
// Datensätze
$array1 = explode(chr(13), $IPS_VALUE); // den empfangenen String auftrennen
// der Datensatz Trenner ist CR
for ( $i = 0; $array1[$i]; $i++ ) {
$array2 = explode("|", $array1[$i]); // Feldtrenner innerhalb jedes Datensatzes ist "|"
$varname = $array2[0]; // Name der übergebenen Variable
$type = unserialize($array2[1]); // Type der übergebenen Variable
$value = unserialize($array2[2]); // Daten der übergebenen Variable
// passende Variable finden bzw. neu anlegen falls nicht vorhanden
// Fehlermeldung mit @ unterdrücken
$varid = @IPS_GetVariableID($varname.$varextend);
// falls nicht vorhanden Variable anlegen im Root Stamm von IP-Symcon
if ($varid == false){
// neue Variable anlegen
$varid = IPS_CreateVariable(intval($type));
// Abbruch, falls Anlegen nicht möglich war
if ($varid == false) {
return;
}
// Namen der Variable ändern
IPS_SetName($varid,$varname.$varextend);
}
// übergebenen Wert in Variable schreiben
SetValue($varid , $value);
}
?>
Das ganze läßt sich dann auch noch als Sendersystem auf IPS2.0 einrichten, dann diesen Script verwenden:
VarExchangeServerscript_IPS20.ips.php:
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : VarExchangeServerscript_IPS20.ips.php
Trigger : OnUpdate von Variablen die übermittelt werden sollen
Interval :
Funktion : Nachbildung des Variable Exchange Addin für Variablenaustausch zwischen zwei IPS20 Systemen
// Script auf Server Seite von IPS2.0 System (Sender)
Einrichtung auf IPS2.0 Sender-Seite:
1. eine ServerSocket Instanz anlegen (Port > 1024 wählen)
2. ServerSocket ID unten im Script anpassen
3. auf IPS2.0 der Empfängerseite nun die Einstellungen vornehmen
4. nach bestehender SocketVerbindung nun die gewünschten Variablen
hier auf diesem Script triggern
*/
if ($IPS_SENDER == "Variable") {
$varid = $IPS_VARIABLE;
$varobj = IPS_GetObject($varid);
$varname = $varobj['ObjectName'];
$varobj2 = IPS_GetVariable($varid);
// Typ auswerten und Werte dementsprechend holen
switch($varobj2['VariableValue']['ValueType']){
case 0:
$value = GetValueBoolean($varid);
$type = "0";
break;
case 1:
$value = GetValueInteger($varid);
$type = "1";
break;
case 2:
$value = GetValueFloat($varid);
$type = "2";
break;
case 3:
$value = GetValueString($varid);
$type = "3";
break;
// Ubekanntes wird mit nachfolgenden Defaults versehen
default:
$value = "";
$type = -1;
break;
}
// für debugging
// echo $varname. "|". serialize($type). "|". serialize($value);
// nur Senden, wenn ein gültiger Variablentyp erkannt wurde
if ($type != -1) {
// hier die ServerSocket Instanz ID anpassen
SSCK_SendText(15364 /*[VarExchangeServerSocket-Test]*/, $varname. "|". serialize($type). "|". serialize($value).chr(13)); // "|" Separator und Datensatzende CR
}
}
?>
Grüße,
Josef.