Variable Exchange in V2

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.

Hallo IPS Profi´s

ist die Methode, wie oben beschrieben, immer noch der aktuelle Stand des Datenaustauschs zweier IPS Systeme, besonders auch noch unter 2.1 oder gibts da schon was anderes?
Unter V1 gab`s dafür ja schon mal eine integrierte Lösung.

Hat jemand Erfahrung den Datenaustausch auch durchs Web zu machen? Ist hierfür eine VPN Verbindung notwendig?

Hintergrund meiner Frage ist, ich möchte Daten eines zweiten IPS Systems übers Web in ein anderes einlesen.

Grüße
Andrge