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
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
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);
?>