EIB/KNX OPC Export, ESF Import

Liebe Community,

da der ESF Import in der IPS nach wie vor nicht vorhanden ist, habe ich ein kleines PHP Script zum Import in die IPS geschrieben. Bitte um Nachsicht, da ich erst seit 3 Stunden PHP programmiere und IPS erst seit 2 Tagen besitze. Aber ansonsten keine Sorge, es sollte alles gehen…programmiere seit 23 Jahren in anderen Sprachen :wink:

Importiert einfach das unten stehende Skript in IPS, sucht dann nach der Variablen $ESFFileName und setzt den Wert auf den Pfad und den Dateinamen Eures OPC Exports aus der ETS. Danach Skript ausführen und freuen :smiley:

Wichtiger Hinweis
Solle ein Fehler mit „maximum time of execution exceeded“ o.ä. auftauchen, dann dauert der Import eurer ESF Datei länger als die max. Ausführungszeit, die für PHP Skripte erlaubt ist. In diesem Fall muss IPS beendet werden und die Zeit „max_execution_time=30“ in der Datei „php.ini“ im IP-Symcon Verzeichnis erhöht werden. Setzt den Wert z.B. auf 300, das entspricht dann ca. 5 Minuten, anstatt 30 Sekunden.

Grüße
Daniel

Updates
18.7.2010 Version 0.2alpha, Änderungen:
Kleine Bugfixes
Automatisches Updaten von GA und Löschen nicht mehr vorhandener GA beim erneuten Import


<?

 // Import für ESF Dateien
 // Version: 0.2alpha
 // Erzeugt: 11.7.2010
 // Author: Daniel R.
 
 
define("MyTag", "!$!");

function GetNext(&$line, &$next)
{
  $pos = strpos($line, '.');
  
  if ($pos == false) {
    $pos = strpos($line, "	");
  }

  if ($pos <> false)
  {
    $next = substr($line, 0, $pos);
    $line = substr($line, $pos+1, strlen($line)-$pos-1);
    return true;
    } else {
    return false;
  }
}

function CheckAddCat($Category, $PartentID)
{
  $id = @IPS_GetCategoryIDByName ($Category, $PartentID);
  
  if ($id == false)
  {
    $id = @IPS_GetCategoryIDByName (MyTag.$Category, $PartentID);
	 if ($id !== false) {
		// Tag entfernen...Kategorie ist noch in Verwendung
		IPS_SetName($id, $Category);
	 }
  }
  
  if ($id == false)
  {
	 $id = IPS_CreateCategory();
	 IPS_SetName($id, $Category);
	 IPS_SetParent($id, $PartentID);
  }
  return $id;
}

function TagInstance($catID)
{
  $allinst = IPS_GetInstanceList ();
  
  foreach ($allinst as $instID) {
	 
	 $ParID = IPS_GetParent($instID);
    if ($ParID == $catID) {
      if (strncmp(IPS_GetName($instID), MyTag, 3) != 0) {
  		    IPS_SetName($instID, MyTag.IPS_GetName($instID));
		  }
    }
  }
}

function TagTree($wurzelID, $depth)
{
  if ($depth < 2) {
    $allcat = IPS_GetCategoryList ();
  
    foreach ($allcat as $catID) {

  	   $ParID = IPS_GetParent($catID);
 	   if ($ParID == $wurzelID) {
 	   
        $n = IPS_GetName($catID);
		  if (strncmp($n, MyTag, 3) !== 0) {
  		    IPS_SetName($catID, MyTag.$n);
		  }
		  
		  $n = IPS_GetName($catID);
		  $dt = MyTag.MyTag;
		  $sl = strlen($n);
		  if (strncmp($n, $dt, 6) == 0) {
          IPS_SetName($catID, substr($n,3,$sl-3));
		  }
		  
		  TagTree($catID, $depth+1);
	   }
    }
  } else {
    TagInstance($wurzelID);
  }
}

function DeleteOldInstance($catID)
{
  $allinst = IPS_GetInstanceList ();

  foreach ($allinst as $instID) {

	 $ParID = IPS_GetParent($instID);
    if ($ParID == $catID) {
      if (strncmp(IPS_GetName($instID), MyTag, 3) == 0) {
  		    IPS_DeleteInstance($instID);
		  }
    }
  }
}

function DeleteOldTreeEntries($wurzelID, $depth)
{
  if ($depth < 2) {
    $allcat = IPS_GetCategoryList ();

    foreach ($allcat as $catID) {

  	   $ParID = IPS_GetParent($catID);
 	   if ($ParID == $wurzelID) {

        DeleteOldTreeEntries($catID, $depth+1);
        $n = IPS_GetName($catID);
		  if (strncmp($n, MyTag, 3) == 0) {
			 // Tag ist noch vorhanden...dieser Eintrag ist veraltet
  		    IPS_DeleteCategory($catID);
		  }
	   }
    }
  } else {
    DeleteOldInstance($wurzelID);
  }
}

function convertEIBtype($EIBtyp, &$gf, &$gi)
{
	$gf = "";
	$gi = "";
	if ($EIBtyp != "")
	{
     $gi = "Standard";
	  switch ($EIBtyp) {
		 case "EIS 1 'Switching' (1 Bit)":
			$gf = "Switch";
		   break;
		 case "EIS 2 'Dimming - position' (1 Bit)":
         $gf = "PriorityPosition";
		   break;
		 case "EIS 2 'Dimming - control' (4 Bit)":
         $gf = "DimControl";
		   break;
		 case "EIS 2 'Dimming - value' (8 Bit)":
         $gf = "DimValue";
         $gi = "Percent";
		   break;
		 case "EIS 3 'Time' (3 Byte)":
         $gf = "Time";
         $gi = "TimeOnly";
		   break;
		 case "Uncertain (3 Byte)";
		 case "EIS 4 'Date' (3 Byte)":
         $gf = "Date";
		   break;
		 case "Uncertain (2 Byte)";
		 case "EIS 5 'Value' (2 Byte)":
         $gf = "Value";
		   break;
		 case "Uncertain (1 Byte)";
		 case "EIS 6 'Scaling - percent' (8 Bit)":
         $gf = "Scale";
         $gi = "Percent";
		   break;
		 case "EIS 6 'Scaling - degree' (8 Bit)":
         $gf = "Scale";
         $gi = "Degree";
		   break;
		 case "EIS 7 'Drive control' (1 Bit)":
         $gf = "DriveMove";
		   break;
		 case "EIS 8 'Priority - position' (1 Bit)":
         $gf = "Switch";
		   break;
		 case "EIS 8 'Priority - control' (2 Bit)":
         $gf = "PriorityControl";
         $gi = "Enhanced";
		   break;
		 case "EIS 9 'Float value' (4 Byte)":
         $gf = "FloatValue";
		   break;
		 case "EIS 10 '16Bit Counter' (2 Byte)":
         $gf = "16bitCounter";
		   break;
		 case "EIS 11 '32Bit Counter' (4 Byte)":
         $gf = "32bitCounter";
		   break;
		 case "EIS 12 'Access' (4 Byte)":
			die("EIS 12 Access not supported");
		   break;
		 case "EIS 13 'EIB-ASCII-Char' (8 Bit)":
         $gf = "Char";
		   break;
		 case "EIS 14 '8Bit Counter' (8 Bit)":
         $gf = "8bitCounter";
		   break;
		 case "EIS 15 'Character String' (14 Byte)":
			$gf = "String";
		   break;
		 default;
			return false;
			break;
	  }
	  return true;
	} else {
	return false;
	}
}


$ESFFileName = "d:/Privat/Hausbau/Software/Backup/EFH_Test.esf";
$fh = fopen($ESFFileName, 'r+') or die("Can't open file");

$KnxGroup = '{D62B95D3-0C5E-406E-B1D9-8D102E50F64B}';

/*
$Ki = IPS_CreateInstance($KnxGroup);
IPS_SetName($Ki, 'DummyKnxGA');
$alleFunktionen = IPS_GetFunctionList($Ki);
print_r($alleFunktionen);  
die('sodele');
*/
echo "Parse ESF Datei...
";
$line = fscanf ($fh, "%s
\r");
list ($projekt) = $line;
echo "Projekt: '$projekt'
";

$wurzel = CheckAddCat($projekt, 0);

TagTree($wurzel, 0);

while ($line = fgets($fh)) {

   GetNext(&$line, &$hauptgruppe);
   echo $hauptgruppe,":";
   GetNext(&$line, &$mittelgruppe);
   echo $mittelgruppe,":";
   GetNext(&$line, &$ga);
   echo $ga,":";
   GetNext(&$line, &$gabez);
   echo $gabez,":";
   GetNext(&$line, &$gatyp);
   echo $gatyp,":";
   GetNext(&$line, &$gaprio);
   echo $gaprio,":";
   //echo "
";
   
   if ($ipstyp = convertEIBtype($gatyp, $gf, $gi))
   {
     $HauptID = CheckAddCat($hauptgruppe, $wurzel);
     $MittelID = CheckAddCat($mittelgruppe, $HauptID);
     
     list($ga1, $ga2, $ga3) = sscanf($ga, "%d/%d/%d");

	  $Name = $ga.': '.$gabez;
     $Ki = @IPS_GetInstanceIDByName ($Name, $MittelID);
     if ($Ki == false) {
       $Ki = @IPS_GetInstanceIDByName (MyTag.$Name, $MittelID);
       
       if ($Ki !== false) {
			// Instanz in Verwendung
			IPS_SetName($Ki, $Name);
       }
     }
     
     if ($Ki == false) {
       $Ki = IPS_CreateInstance($KnxGroup);
       echo "Erzeuge ".$ga."
";
     } else
     {
       echo "Update ".$ga."
";
     };
     IPS_SetName($Ki, $Name);
     IPS_SetInfo($Ki, $ga);
     
     EIB_SetGroupFunction($Ki, $gf);
     EIB_SetGroupInterpretation($Ki, $gi);
     
     EIB_SetGroupAddress($Ki, $ga1, $ga2, $ga3);
     IPS_SetParent($Ki, $MittelID);
     
     IPS_ApplyChanges($Ki);
   } else {
	  if ($gatyp <> "")
	  {
	    echo "Fehler: Konvertierung EIB Typ ".$gatyp." gescheitert
";
	    } else {
	    
	    echo "
";
	    
	  }
   };
}

DeleteOldTreeEntries($wurzel, 0);
	 
echo "Parsen beendet.
";

fclose($fh);

?>

Hui, das wäre natürlich sehr nett… werde es heute oder morgen Abend gleich mal testen… Vorab schon mal vielen Dank!

Hallo,

vielen vielen Dank für das Srcipt. So etwas hat mir gefehlt. Ich hatte zwar viele Instanzen selbst eingeben aber dein Script ist genial und einfach dazu. Ich hatte übrigens auch ein Timout aber 190 Gruppenadressen müssen reichen.

Nochmal Danke
aus Warstein
McNelly

Ist das Script nicht [b]deshalb[/b] inzwischen überflüssig?

Gruß Helmut

Hallo,
kann es sein das der OPC export nur drei stufige Gruppenadressen hochladen kann?
Und wenn ja besteht die möglichkeit irgendwie die zeistufige Variante hochzuladen? Evtl. mit einem Script?

Bitte um Hilfe

Schon mal Danke im vorraus!

Marcus