APC USV-Daten einlesen

Hallo,

In Lübeck gibt es des öfteren Stromschwankungen, die dann bei ungesicherten Servern den einen oder anderen Absturz verursachen. Mein Bruder hat in seinem Ladengeschäft daher seine IT-Anlage ordentlich mit einer USV gesichert. Bei der USV handelt es sich um eine APC Smart-UPS SC450 RM. Da ich natürlich diese Daten gerne in IP-Symcon haben wollte um Graphen zu erstellen habe ich ein Script geschrieben, das die Logdatei des beigelegten Programmes APC PowerChute Business Edition auswertet. Da die USV zu den kleineren Varianten gehört werden einige Felder mit N/A in die Logdatei geschrieben. Die habe ich daher auskommentiert, aber für die Benutzer mit einer größeren Variante mit reingestellt.

Eine passende Seite fürs WebFront gibt es unter http://www.ip-symcon.de/forum/f56/apc-usv-webfront-6839/ zu sehen.
Für die V1 hat gwanjek unter http://www.ip-symcon.de/forum/f7/usv-datenlog-ip-symcon-einlesen-4575/ ein Script mit identischer Funktionalität bereit gestellt.

<?
/*
Einlesen der Logfile aus APC PowerChute Business Edition
========================================================

Anleitung:
- LogFile und LogInterval anpassen
- Bei Bedarf auskommentierte Zeilen aktivieren und Positionen anpassen
- Execute drücken, um den automatischen Timer zu erstellen
*/

$LogFile     = "C:\\Programme\\APC\\PowerChute Business Edition\\agent\\DataLog";
$LogInterval = 20;    // Minuten (Standard: 20)

if(file_exists($LogFile))
{
    $lines = file($LogFile);
    $data = explode("	", $lines[count($lines) - 1]);
    $ts = strtotime($data[0]);

    if(date("d.m.Y H:i:s", $ts) != GetValueString(CreateVariableByName($IPS_SELF, "Last Time", 3)))
    {
        SetValueString(CreateVariableByName($IPS_SELF, "Last Time", 3), date("d.m.Y H:i:s", $ts));
        SetValueFloat(CreateVariableByName($IPS_SELF, "Maximum Line Voltage", 2), strToFloat($data[1]));
        SetValueFloat(CreateVariableByName($IPS_SELF, "Minimum Line Voltage", 2), strToFloat($data[2]));
        SetValueFloat(CreateVariableByName($IPS_SELF, "Line Voltage", 2), strToFloat($data[3]));
        SetValueFloat(CreateVariableByName($IPS_SELF, "Output Voltage", 2), strToFloat($data[4]));
        SetValueFloat(CreateVariableByName($IPS_SELF, "Battery Voltage", 2), strToFloat($data[5]));
        SetValueFloat(CreateVariableByName($IPS_SELF, "Output Frequency", 2), strToFloat($data[6]));
        SetValueFloat(CreateVariableByName($IPS_SELF, "UPS Load", 2), strToFloat($data[7]));
        //SetValueFloat(CreateVariableByName($IPS_SELF, "UPS Internal Temperature", 2), strToFloat($data[8]));
        //SetValueFloat(CreateVariableByName($IPS_SELF, "Probe 1 Temperature", 2), strToFloat($data[8]));
        //SetValueFloat(CreateVariableByName($IPS_SELF, "Probe 1 Humidity", 2), strToFloat($data[8]));
        //SetValueFloat(CreateVariableByName($IPS_SELF, "Probe 2 Temperature", 2), strToFloat($data[8]));
        //SetValueFloat(CreateVariableByName($IPS_SELF, "Probe 2 Humidity", 2), strToFloat($data[8]));
    }
    
    // Offset berechnen und Timer stellen
   IPS_SetScriptTimer($IPS_SELF, ($ts + $LogInterval * 60 + 10) - time());
}

function strToFloat($value)
{
    return (float)(str_replace(",", ".", $value));
}

function CreateVariableByName($id, $name, $type)
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "This Variable was created by Script #$IPS_SELF");
   }
   return $vid;
}
?>