APC Back-UPS ES 550G

Hallo,

ich habe nun schon einiges über APC UPSe hier im Forum gelesen. Leider passt kein Artikel so richtig zu meiner.
Hat jemand das auslesen der Log Files auch schon mal mit der „Back-UPS ES 550G“ versucht ? Meine Software der UPS ist die „PowerChute Personal Edition 2.0“
Thanks
Claus

Meine Software der UPS ist die „PowerChute Personal Edition 2.0“

damit geht es nicht.

Apcupsd, a daemon for controlling APC UPSes

Diese kannst Du installieren und konfigurieren und dann entsprechend auslesen und in IPS integrieren.

erledigt , sorry

Hello again,
da heute Nacht ein mehrstündiger Stromausfall mein IPS lahmlegte, den die USV leider nicht komplett stützen konnte und der Weg via Sys_GetBattery NICHT funktionierte, suche ich nun nach einer funktionierenden Alarmierung.

Das Einbinden von apcupsd mittels Client Socket erzeugt nur permanente Socket Auf- und Abbaumeldungen.

Wie habt ihr diese Integration gelöst (Die USV wird vom WHS „nur“ als Batterie geführt) … ?

PS: der Dienst und die TrayApp liefern schlüssige Werte - dieser Teil läuft also. Muss evtl. die apcupsd.conf angepasst werden (wie / wo ?) ?

USV ist eine APC Back-UPS ES 550

PS: die Notebook Batterie wird über Sys_GetBattery bestens „gemonitort“ - brauche ich aber nicht :mad:

Dank & Gruß

Tom

Besser geht es mit „apcaccess status“ (aus dem apcupsd-Packet) und dann die Ausgabe auswerten. Die Alarmierung sollte der APCUPSD auch selber hinkriegen. Dazu muss man natürlich die Config anpassen. Ist aber in der Doku beschrieben.

Tommi

Hallo Namensvetter,

kannst Du das bitte ein wenig detaillieren ?!
Mir fehlt gerade der Ansatz - wo finde ich bzw. was ist „apcaccess status“

Habe das APC Thema im guten Glauben zuuuu laaaange ruhen lassen (war ja genug Strom da - bis heute) - daher betrachte mich besser als Neueinsteiger (DAU wollte ich vermeiden) :smiley:

Dank & Gruß vorab

Tom

apcaccess(.exe) ist ein Kommandozeilen-Programm, welches sich im bin-Verzeichnis von apcupsd befinden sollte. Die Funktion status liefert den gleichen Text, der sich auch im Tray befindet.
Man(n) kann nun aus PHP dieses Programm starten und die Ausgabe entsprechend auswerten. Wenn sich die USV an einer anderen Maschine mit apcupsd befindet, kann man auch diese damit abfragen.

Tommi

Hallo tom

Hab auch vor langer Zeit mal versucht einen Back_UPS 650 CS mit Apcups in IPS einzubinden, aber irgenwie hat bei mir Apcups nicht funktioniert. Kurze Rede langer Sinn habs nach dem Eintrag heute nochmal probiert und tatsächlich da hat sich was getan bei Apcups.

Wenn bei Dir das APCtray Werte liefert kann man die auch mit IPS über den Clientsocket auslesen. Habs nur auf die schnelle probiert aber ich bekomm alle Werte ausgelesen.

Das Problem mit dem Zurücksetzen/Schließen des Sockets ist mir aber auch aufgefallen. Hab ich dann so umgangen indem ich den CientSocket nur fürs auslesen öffne und nachdem er mir die Werte geschickt hat ihn wieder schließe. Ob der Socket vielleicht offen bleibt wenn man regelmässig Daten abruft oder ob es überhaupt Probleme bereitet wenn er zurückgesetzt wird weiß ich gerade nicht, bzw. müsst man mal ausprobieren.
Zum Abrufen der Daten muss man einmal chr(0).chr(6) und danach status an den Port 3551 schicken. (einfach durch mithören des Trays rausgefunden). Als Antwort bekommst Du dann die Daten des UPS. Ist alles nur quick&dirt getestet da ich noch weg muss, aber ich dachte schreibs schnell hier rein bevor Du dich mit was anderem rumquälst.

Also eine Registervariable und nen ClientSocket anlegen mit Port 3551(Standart bei Apcups).
Das Abrufscript (z.B. getriggert alle minute) ist

CSCK_SetOpen(52898 /*[Client Socket APC]*/,true);
IPS_ApplyChanges(52898);

RegVar_SendText(50816 /*[Testcenter\Register Variable APC]*/, chr(0).chr(6));

RegVar_SendText(50816 /*[Testcenter\Register Variable APC]*/,"status");


und bei der Registervarliablen dann einfach dieses Script einfügen bzw. irgendwie die Gewonnenen Daten auswerten

print_r ($IPS_VALUE);
CSCK_SetOpen(52898 /*[Client Socket APC]*/,false);
IPS_ApplyChanges(52898);

Hoffe Du kannst was damit anfangen und schreibst vielleicht auch wie Du die Auswertung gelöst hast.

Gruß Jannis

Zum Abrufen der Daten muss man einmal chr(0).chr(6)

Aah, das hat mir noch gefehlt.
Hiermal ein kleines Grundgerüst.
Registervariable und Clientsocket sind Standard.
Tommi

<?php
 //IPS Variablen IDs
 $id=16591 /*[APC Client Socket]*/;
 $reg=39883 /*[APC-RegVar]*/;
//Standard-Regvar Handling
 if ($IPS_SENDER == "RegisterVariable")
{
   // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($reg);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;
  RegVar_SetBuffer($reg, $data);
}else{
//Nicht registervariable, also manuell
//socket öffnen
	CSCK_SetOpen($id,true);
	IPS_ApplyChanges($id);
//befehl senden
	RegVar_SendText($reg,chr(0).chr(6)."status");
//warten
	sleep (1);
//Socket schliessen
	CSCK_SetOpen($id,false);
	IPS_ApplyChanges($id);
//Rückgabe abholen
	$data  = RegVar_GetBuffer($reg);
//RegVar bereinigen
	RegVar_SetBuffer($reg, "");
//loggen
	$log=fopen('apc.log',"a+");
	if ($log) {
	   	$d=date("r");
			fwrite($log,$data);
 			fflush($log);
			fclose($log);
	}
//Daten auswerten
	$entry=explode("
",$data); //Satztrenner
	$apc=array();
	foreach($entry as $line) {
		$p1=ord($line[0]); //immer 00
		$p2=ord($line[1]); //Kennziffer
		if ($p2>0) {
			$content=substr($line,2);
		//Key /Value Paare durch ':' getrennt
			if (strpos($content,":")>0) {
				list($key,$value)=explode(":",$content,2);
				print "$key:$value
"; //debug
				$apc[trim($key)]=trim($value);
			}
		}
	}
//Status auswerten
	if (isset($apc['STATUS'])) {
		print 'USV '.($apc['STATUS']=='ONLINE')?'OK':'FEHLER';
	}
}
?>

Erst einmal Danke für die konstruktiven Anregungen,

wg. des „Nicht-Wieder-Anlaufens (WHS Belinea o.center)“ ziehe ich gerade auf einen neuen ELV Mini-PC (XP) um. Das wird etwas dauern - mein (USV) Feedback kommt somit etwas später.

Wie gesagt - besten Dank for resonance !!!

Gruß Tom

Funktioniert wunderbar - Danke Jungs :loveips:

Hallo Zusammen,

ich würde gerne dieses Thema noch mal aufleben lassen. Nach dem ich jetzt ein APC UPS RS 550 habe. Wollt ich natürlich die aktuellen Daten im IPS haben. So bin ich auf dieses Thema gekommen.

So weit so gut ich hab auch schon einiges ans laufen bekommen und bin schon soweit das ich auch tatsächlich Daten von der APC abrufen kann.

Doch leider scheitere ich jetzt daran die Daten weiter zu verarbeiten.

Was soll das Endergebnis sein…

Anzeige des Ladezustands
Anzeige der Akkulaufzeit
Anzeige der aktuellen Last
Anzeige ob online oder offline

Wie ist der aktuelle Stand…

Ich hab den Clientsocket erstellt und Funktioniert
Ich hab die Registervariable erstellt und Funktioniert
Ich verwende folgendes Script:

<?php
 //IPS Variablen IDs
 $id=51495 /*[USV]*/;
 $reg=19983 /*[USV\RegVarUSV]*/;
//Standard-Regvar Handling
 if ($_IPS['SENDER'] == "RegisterVariable")
{
   // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($reg);
  // neu empfangene Daten an $data anhängen
  $data .= $_IPS['VALUE'];
  RegVar_SetBuffer($reg, $data);
}else{
//Nicht registervariable, also manuell
//socket öffnen
    CSCK_SetOpen($id,true);
    IPS_ApplyChanges($id);
//befehl senden
    RegVar_SendText($reg,chr(0).chr(6)."status");
//warten
    sleep (1);
//Socket schliessen
    CSCK_SetOpen($id,false);
    IPS_ApplyChanges($id);
//Rückgabe abholen
    $data  = RegVar_GetBuffer($reg);
//RegVar bereinigen
    RegVar_SetBuffer($reg, "");
    
    
//loggen
    $log=fopen('apc.log',"a+");
    if ($log) {
           $d=date("r");
            fwrite($log,$data);
             fflush($log);
            fclose($log);
    }
//Daten auswerten
    $entry=explode("
",$data); //Satztrenner
    $apc=array();
    foreach($entry as $line) {
        $p1=ord($line[0]); //immer 00
        $p2=ord($line[1]); //Kennziffer
        if ($p2>0) {
            $content=substr($line,2);
        //Key /Value Paare durch ':' getrennt
            if (strpos($content,":")>0) {
                list($key,$value)=explode(":",$content,2);
                print "$key:$value
"; //debug
                $apc[trim($key)]=trim($value);
            }
        }
    }
    
    
//Status auswerten
    if (isset($apc['STATUS']))
	 	{
        print 'USV '.($apc['STATUS']=='ONLINE')?'OK':'FEHLER';
		SetValueBoolean(44134 /*[USV\USV]*/, false);
		}
		else
{
		SetValueBoolean(44134 /*[USV\USV]*/, true);
	 }
}


?>

Ich Daten aus der APC werden auch wie folgt in der apc.log abgelegt:

ATUS : ONLINE
LINEV : 229.0 Volts
LOADPCT : 7.0 Percent
BCHARGE : 94.0 Percent
TIMELEFT : 43.2 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME : 0 Seconds
SENSE : Medium
LOTRANS : 176.0 Volts
HITRANS : 282.0 Volts
ALARMDEL : 30 Seconds
BATTV : 14.2 Volts
LASTXFER : Low line voltage
NUMXFERS : 2
XONBATT : 2015-08-07 15:23:25 +0100
TONBATT : 0 Seconds
CUMONBATT: 155 Seconds
XOFFBATT : 2015-08-07 15:24:31 +0100
SELFTEST : NO
STATFLAG : 0x05000008
SERIALNO : 3B1510X31151
BATTDATE : 2015-08-07
NOMINV : 230 Volts
NOMBATTV : 12.0 Volts
NOMPOWER : 330 Watts
FIRMWARE : 857.L4 .I USB FW:L4
END APC : 2015-08-07 15:57:00 +0100
DATE : 2015-08-07 15:57:17 +0100
HOSTNAME : IPS-Server
VERSION : 3.14.13 (02 February 2015) mingw
UPSNAME : IPS-Server
CABLE : USB Cable
DRIVER : USB UPS Driver
UPSMODE : Stand Alone
STARTTIME: 2015-08-07 14:33:32 +0100
MODEL : Back-UPS RS 550G
STATUS : ONLINE
LINEV : 229.0 Volts
LOADPCT : 7.0 Percent
BCHARGE : 95.0 Percent
TIMELEFT : 43.7 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME : 0 Seconds
SENSE : Medium
LOTRANS : 176.0 Volts
HITRANS : 282.0 Volts
ALARMDEL : 30 Seconds
BATTV : 14.2 Volts
LASTXFER : Low line voltage
NUMXFERS : 2
XONBATT : 2015-08-07 15:23:25 +0100
TONBATT : 0 Seconds
CUMONBATT: 155 Seconds
XOFFBATT : 2015-08-07 15:24:31 +0100
SELFTEST : NO
STATFLAG : 0x05000008

Nun die Frage… wie kann ich mir die einzelnen Daten rauspicken und in entsprechende Variable schreiben?
Ich bin leider noch nicht so ganz fit bei der Programmierung und würde mich sehr über eure Hilfe freuen.

Schonmal vielen Dank euch!

Gruß
mirank

Hi!

Hast du die USV über USB bei dir am Computer oder wie hast du die angeschlossen? Habe das Thema auch gerade hinter mir, ich habe es damit in meinem LAN gelöst:
Auswertescript für NUT USV Daten

Alternativ gibt es aber auch noch ein Powershell-Skript von einem User, der über WMI die USV Daten abfragt und in sein IPS bringt.
Ein universelles Script zur Anbindung einer UPS USV an IP-Symcon

Aber ich finde WinNUT eine gute Geschichte…da hat man alle Daten schön im LAN.
http://csociety.ecn.purdue.edu/~delpha/winnut/release2.0.0b/

Grüße,
Chris

Vom gleichen Autor wie das NUT-Script, gibt es auch das APCUPSD-Script.

Das macht genau dass was du möchtest.

Läuft bei mir auch schon ca 2Jahre.

Michael

Danke euch schonmal für die Infos. Werd mich heute gleich mal dran versuchen. Gruß Mirank

So ich hab jetzt das APCUPSD Auswertescript wie hier http://www.tdressler.net/ipsymcon/apcupsd_ips.html beschrieben eingerichtet.

Es sind auch alle Variablen usw. angelegt worden. Aber beim zweiten aufruf des Scripts geht’s schon nicht mehr.

Ich bekomm dann im Log von IPS die Meldung

08.08.2015 13:36:02*| APC*| Identifier SERIALNO not found

 oder 

08.08.2015 13:37:02*| APC*| no valid data

und die folge ist das natürlich die Variablen nicht mehr aktualisiert werden.

Angelegt hab ich das ganze wie folgt


Und hier ist das Script dazu.

<?php
/**
RegVar-Script für APCUPSD status text
[www.tdressler.net- IPSymcon Erweiterungen](www.tdressler.net/ipsymcon)
V0.9 13.11.2011
*/
 #######Begin Config
 //IPS Variablen IDs
 $regvars=array(19983 /*[USV\RegVarUSV]*/);
 $GLOBALS['parent']=0; //parent ID of master category
 $GLOBALS['catname']='APCUPSD'; //master category name
 $GLOBALS['idname']='SERIALNO'; //unique ID parameter

 $logfile='apc.log';
 ######End Config
/*
hardcoded NOMPOWER values related to Modelname digit value
                             !!!
first line Smart-UPS 700 ->480W
*/
 $nomvals=array(
   700=>480,
     750=>500, //smart ups xxx
    1000=>670,
     1500=>980,
     2200=>1580,
     3000=>2700,
     420=>260, //Smart ups SC xxx
     450=>280,
     620=>390,
     350=>210, //Back UPS CS/ES
     400=>240,
     500=>300,
     550=>330,
    800=>540); //Back UPS RS

$GLOBALS['nomvals']=$nomvals;
$vartypes=array(
    'ID'=>array('type'=>3,'profile'=>''),
    'VoltIn'=>array('type'=>1,'profile'=>'~Volt.230'),
    'FreqIn'=>array('type'=>2,'profile'=>'Freq.netz'),
    'VoltOut'=>array('type'=>1,'profile'=>'~Volt.230'),
    'LoadPct'=>array('type'=>1,'profile'=>'~Battery.100'),
    'Charged'=>array('type'=>1,'profile'=>'~Battery.100'),
    'Watt'=>array('type'=>1,'profile'=>'~Watt.3680'),
    'NomPower'=>array('type'=>1,'profile'=>'~Watt.3680'),
    'TimeLeft'=>array('type'=>2,'profile'=>'Time.min'),
    'LastOn'=>array('type'=>3,'profile'=>'~String'),
    'Model'=>array('type'=>3,'profile'=>'~String'),
    'Name'=>array('type'=>3,'profile'=>'~String'),
    'Status'=>array('type'=>3,'profile'=>'~String'),
   'Temperatur'=>array('type'=>2,'profile'=>'~Temperature'),
   'OnLine'=>array('type'=>0,'profile'=>'~Alert.Reversed')
);
$GLOBALS['vartypes']=$vartypes;
$GLOBALS['varids']=null;

 //NonStandard Profiles (needed for Webfront)
check_profile('Time.min',2,null,' min',null,null,null,1);
check_profile('Freq.netz',2,null,' Hz',45,55,1,1);
            //Standard-Regvar Handling
 if ( $_IPS['SENDER'] == "RegisterVariable")
{
    $reg=$_IPS['INSTANCE'];
   // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
      $data  = RegVar_GetBuffer($reg);
      // neu empfangene Daten an $data anhängen
      $data .= $_IPS['VALUE'];
      RegVar_SetBuffer($reg, $data);
}else{
    foreach($regvars as $reg)
    {
        $in=null;
         $id=IPS_GetParent($reg);
    //Nicht registervariable, also manuell
    //socket öffnen
        //CSCK_SetOpen($id,true);
        IPS_SetProperty($id,"Open",true);
        IPS_ApplyChanges($id);
    //befehl senden
        RegVar_SendText($reg,chr(0).chr(6)."status");
    //warten
        sleep (1);
    //Socket schliessen
        //CSCK_SetOpen($id,false);
        IPS_SetProperty($id,"Open",false);
        IPS_ApplyChanges($id);
    //Rückgabe abholen
        $in  = RegVar_GetBuffer($reg);
    //RegVar bereinigen
        RegVar_SetBuffer($reg, "");
    //Ausgabe in Array wandeln
       $apc=format_data($in);
    //loggen
        logge($logfile,$apc);
    //parsen
       if (isset($apc['APC']) && preg_match("/^(\d+),(\d+),(\d+)/",$apc['APC'])) {
            parse_apc($apc);
        }else {
           $msg='no valid data';
            if (isset($apc['APC'])) ':'.$msg.$apc['APC'];
            ips_logmessage('APC',$msg);
        }
    }
}
/**
* parses APCUPSD status parameter
* @param array APC parameter
*/
function parse_apc($apc) {

    $catname=$GLOBALS['catname'];
    $nomvals=$GLOBALS['nomvals'];
    $idname=$GLOBALS['idname'];
    //extract data into array

    //Status auswerten
    $vartypes=$GLOBALS['vartypes'];
    $varids=null;
    //define null values as default
    $status=null;
    $model=null;
    $name=null;
    $lv=null;
    $lf=null;
    $ov=null;
    $lpct=null;
    $temp=null;
    $np=null;
    $dev=null;
    $load=null;
    $online=null;
    $lo=null;
    $ch=null;
    //try to update values with real parameter from APC
    if (isset($apc[$idname])){
        $dev=$apc[$idname];
    }else{
       IPS_LOGMessage('APC',"Identifier $idname not found");
       return;
    }
    if (isset($apc['LINEV'])) { list($lv,$rest)=explode(' ',$apc['LINEV'],2);}
    if (isset($apc['LINEFREQ'])) {list($lf,$rest)=explode(' ',$apc['LINEFREQ'],2);}
    if (isset($apc['OUTPUTV'])){ list($ov,$rest)=explode(' ',$apc['OUTPUTV'],2);}
    if (isset($apc['LOADPCT'])){list($lpct,$rest)=explode(' ',$apc['LOADPCT'],2);}
    if (isset($apc['ITEMP'])){list($temp,$rest)=explode(' ',$apc['ITEMP'],2);}
   if (isset($apc['MODEL'])) {$model=$apc['MODEL'];}
   if (isset($apc['STATUS'])) {$status=$apc['STATUS'];}
   if (isset($apc['UPSNAME'])) {$name=$apc['UPSNAME'];}
   if (isset($apc['TIMELEFT'])){ list($tl,$rest)=explode(' ',$apc['TIMELEFT'],2);}
   if (isset($apc['BCHARGE'])){ list($ch,$rest)=explode(' ',$apc['BCHARGE'],2);}
    //retrieve nominal power from APC
    if (isset($apc['NOMPOWER'])) {
               //value is supplied by APC
                list($np,$rest)=explode(' ',$apc['NOMPOWER'],2);
    }else{
               //try to use hardcoded power table based on digits in model name(ex. SMART UPS 750)
               if (!is_null($model)) {
                    preg_match("/(\d{3,4})/",$model,$result);
                    if (isset($result[0]) && (isset($nomvals[$result[0]]))){
                        $np=$nomvals[$result[0]];
                        //IPS_Logmessage('APC',"$model: NOMPOWER from Model=$np");
                    }
                 }
    }

    //format last on battery value, if any
    if (isset($apc['XONBATT'])) {
                list($date,$time, $rest)=explode(' ',$apc['XONBATT'],4);
                $lo="$date $time";
    }
    $online=($status=='ONLINE');
    $sensorname=$model;
    if ((is_null($model)) || (is_null($dev))) {
               IPS_Logmessage('APC',"Missing Modelname ($model) od DeviceID($dev)");
    }else{
          $GLOBALS['varids']=null;
         IPS_Logmessage('APC',"Dev:$dev Name: $sensorname");
            get_ips_vars($dev,$vartypes,$catname,$sensorname);
            $varids=$GLOBALS['varids'];
            if (is_null($varids)) {
               //Error, no vars created
               IPS_LogMessage($catname,'No VarIDs!');
            }else{
                //give $np a pseudo value to fill variable, if not found until now
               if (is_null($np)){ $np=500;}
            //NominalPower defined in IPS has priority over Device Value
                $np=(isset($varids['NomPower']['val']) &&($varids['NomPower']['val']>0))?$varids['NomPower']['val']:$np;
                //calculate current power based on nominal power and load percent values if available
                if ((! is_null($np)) && (! is_null($lpct))) {
                    $load=$np*$lpct/100;
                }
            //store
                storevars($varids,'OnLine',$online);
                storevars($varids,'Status',$status);
                storevars($varids,'Model',$model);
                storevars($varids,'Name',$name);
                storevars($varids,'NomPower',$np);
                storevars($varids,'LastOn',$lo);
                storevars($varids,'VoltIn',$lv);
                storevars($varids,'FreqIn',$lf);
                storevars($varids,'VoltOut',$ov);
                storevars($varids,'LoadPct',$lpct);
                storevars($varids,'Watt',$load);
                storevars($varids,'TimeLeft',$tl);
                storevars($varids,'Charged',$ch);
                storevars($varids,'Temperatur',$temp);
            }
    }
}
/**
* Check if is Varaible available and store value
* deletes variable if value is null, meens parameter not supplied by apc
* recreate variable if value is set, but no variable ID, means value supplied now
* @param array current variable ids in tree
* @param string name of variable
* @param variant value to store
*/
function storevars($ids,$name,$val) {
    $vartypes=$GLOBALS['vartypes'];
    $parent=$ids['%parent%']['id'];
    $vid=isset($ids[$name]['id'])?$ids[$name]['id']:null;
    $typ=$vartypes[$name]['type'];
    //IPS_Logmessage('APC',"$vid:$name=$val"); //debug
    if (is_null($val)) {
       if (isset($vid)) {
          if (IPS_VariableExists($vid)) IPS_DeleteVariable($vid);
        }
    }else{
       //check value variable id
        if (is_null($vid)) {
           //not there, recreate
           $vid=createvarfromtypes($name,$parent);
           $pname=IPS_GetName($parent);
           IPS_Logmessage('APC',"$pname: Variable $name not found, recreated as ID $vid");
        }
        //recheck
        if (isset($vid)) {
        switch ($typ) {
              case 2: $val=floatval($val);break;
              case 1:  $val=intval($val); break;
           }
            if (IPS_VariableExists($vid)) SetValue($vid,$val);
        }
    }
}
/**
* creates variables with help of typinfo array by name
* @param string name of variable
* @param integer parent ID of parent object
*/
function createvarfromtypes($name,$parent) {
    $vartypes=$GLOBALS['vartypes'];
    $typ=isset($vartypes[$name]['type'])?$vartypes[$name]['type']:null;
   $vid=null;
   if (($name>'')&&($parent>-1) && (!is_null($typ))) {
        $vid=IPS_CreateVariable($typ);
        ips_setname($vid,$name);
        ips_setParent($vid,$parent);
        if (isset($vartypes[$name]['profile'])) {
          $profile=$vartypes[$name]['profile'];
            IPS_SetVariableCustomProfile($vid,$profile);
        }
        $GLOBALS['varids'][$name]['id']=$vid;
        $GLOBALS['varids'][$name]['val']=0;
      ips_logmessage('APC',"Created Var $name: Parent:$parent, Type:$typ, ID:$vid");
   }else{
      ips_logmessage('APC',"Missing Values for create Var $name: Parent:$parent, Type:$typ");
    }
    return $vid;
}
/**
* IPS Variablen handler
* creates variables as needed
* returns assoc. Array with IPS Variable ID and Value
* @param integer Sensor Address
* @param array Array with Variable Names, Types and Profiles
* @param string Sensor Group Master Categorie Name
* @param string Sensor default name, will be extended with $addr
*/
function get_ips_vars($addr,$vartypes,$cat,$sens) {
     $varids=null;
     $parent=(isset($GLOBALS['parent']) && IPS_ObjectExists($GLOBALS['parent']))?$GLOBALS['parent']:0;
    //master category
     $master=@IPS_GetObjectIDByName($cat,$parent);
    //no master cat, create new
     if (!$master) {
       $master=IPS_CreateCategory();
       IPS_SetName($master,$cat);
       IPS_SetParent($master,$parent);
        if ($master>0) {
           IPS_LogMessage('APC', "Master category created, ID=$master
");
       }else{
            IPS_LogMessage('APC', "Can't create Master Category
");
            return null;
        }
     }
    //check childrens for varable with name "ID"
  $id=0;
  if ($master>0) {
  //get chilren sensors
   $Sensors=IPS_GetChildrenIDs($master);
   foreach($Sensors as $sid) {
       $name=IPS_GetName($sid);
      //print "$sid:".$name."
"; //debug
        //get vars for each sensor
        $vars=IPS_GetChildrenIDs($sid);
      foreach($vars as $vid) {
       $obj=IPS_GetObject($vid);
         $vname=$obj['ObjectName'];
         $typ=$obj['ObjectType'];
          //Variable
          if ($typ==2) { //Variable
             //if ID, here is the address
             if ($vname=="ID") {
                 $i=GetValue($vid);
                 //go out if matches, $id returns the sensor categorie id
                 if ($i===$addr) {
                    $id=$sid;
                    break;
                 }
             }
         }
      }
      if ($id>0) break;
   }
   //if variable ID doesnt exists assume we have to create all
    if ($id==0) {
        //Sensor with address $addr not found in IPS, create new sensor
       $id=ips_createCategory();
       ips_setName($id,$sens);
       ips_setParent($id,$master);
        //creates all needed variables for the new sensor
        foreach (array_keys($vartypes) as $name) {
           $vid=createvarfromtypes($name,$id);
         //preload variables
            SetValue($vid,0);
            $varids[$name]['id']=$vid;
          $varids[$name]['val']=0;
            //Store address in $ID for next time
         if ($name=='ID') {
             SetValue($vid,$addr);
             $varids[$name]['val']=$addr;
            }
        }
    }else{
       //found matching cat, collect ids and vals for this sensor
       $vars=IPS_GetChildrenIDs($id);
      foreach($vars as $vid) {
         $obj=IPS_GetObject($vid);
         $name=$obj['ObjectName'];
         $typ=$obj['ObjectType'];
         if ($typ==2) { //Variable
             $val=GetValue($vid);
             $varids[$name]['id']=$vid;
             $varids[$name]['val']=$val;
         }
      }
    }
    //store parent
    $varids['%parent%']['id']=$id;
    $GLOBALS['varids']=$varids;
    //returns IDs and Values of this Sensor, Name is Key
    return $varids;
 }
}
/**
*
* @param string $text output from apcupsd
* @return array $apc Array Key/Values
*/
function format_data($text){
       $entry=explode("
",$text); //Satztrenner
        $apc=array();
        foreach($entry as $line) {
           if (! $line || strlen($line)<2) continue;
            $p1=ord($line[0]); //immer 00
            $p2=ord($line[1]); //Kennziffer
            if ($p2>0) {
                    $content=substr($line,2);
                    //Key /Value Paare durch ':' getrennt
                    if (strpos($content,":")>0) {
                        list($key,$value)=explode(":",$content,2);
                        $apc[trim($key)]=trim($value);
                    }
            }
        }
        return $apc;
}
//#############################
/**
* do simple logging
* @param string $logfile Filename for logfile
* @param string $text
* @returns void
*/

function logge($logfile,$apc) {
    if (strlen($logfile)>0) {
        $log=fopen($logfile,"a+");
        if ($log) {
           $d=date("r");
           fwrite($log,"#----$d
");
          foreach ($apc as $key=>$value) {
             fwrite($log, "$key:$value
");
         }
             fflush($log);
            fclose($log);
        }
    }
}
/**
* Get ID by name if exists, else create
* @Param String Name
* @param integer Parent-ID
* @param integer Variable Typ (0..3)
* @return integer ID
*/
function getVid($name,$par,$typ) {
    $vid = @IPS_GetVariableIDByName($name, $par);
    if ($vid === false) {
        $vid=IPS_CreateVariable($typ);
        ips_setname($vid,$name);
        ips_setParent($vid,$par);
        setValue($vid,'');
    }
    return $vid;
}
/**
* Check profile by name if exists, else create
* @Param String Name
* @param integer Variable Typ (0..3)
* @param String prefix befor value
* @param String suffix after value
* @param integer min value
* @param integer max value
* @param integer step value
* @param integer digits for formatting
*/

function check_profile($pname,$typ,$prefix,$suffix,$min,$max,$step,$digit=0) {
if (!IPS_VariableProfileExists($pname)) {
    if (IPS_CreateVariableProfile($pname,$typ)) {
       IPS_SetVariableProfileText($pname,$prefix,$suffix);
        if (isset($min) && isset($max) && isset($step)) {
           IPS_SetVariableProfileValues($pname,$min,$max,$step);
       }
          if (isset($digit)) {
           IPS_SetVariableProfileDigits($pname,$digit);
       }
     }
}
}
?>

Ich hab jetzt das ganze zum 5 oder 6 mal neu aufgesetzt und auch die APCUPSD Software gefühlt 5 mal neu installiert doch das Ergebnis ist immer das gleiche?

Hat vielleicht jemand von euch eine Idee woran das liegen kann?
Ich bin jetzt mit meinem Latein erst mal am Ende. :confused:

Besten Dank schonmal für euche Hilfe.

Gruß
mirank

Scheinbar kommt nicht das an, was das Script erwartet
Als erstes bitte das erstellte apc.log checken, dort wird eine Debug-Ausgabe der dekodierten Daten erstellt. Dort muss u.a. das Feld SERIALNO drinstehen, weil darüber die Zuordnung der Instancen gemacht wird. Wenn das nicht gut aussieht, kannst Du auch noch ein Debug auf den Clientsocket starten. Wenn die Textzeilen zerissen sind, kann man noch eine Cutter-Instanz dazwischen hängen.
Außerdem:
Das Script wurde auch für eine ältere IPS Version erstellt. Es ist nicht auf die aktuelle Syntax angepasst. Ältere apcupsd Linux Pakete liefern auch nicht alle Felder aus. Wenn auf dem Socket gar nichts kommt, ist manchmal auch ein nicht oder nur local laufender Dienst, eine übereifrige Firewall oder auch ein Antivirenprogramm die Ursache. Hier sollte man mit apcaccess erstmal prüfen, ob auf dem IPS Rechner überhaupt was ankommt.

HTH
Tommi

Aus dem Kopf… ich musste bei mir die Wartezeit im Script etwas erhöhen, damit APCUPSD genug Zeit hatte mit Daten zu antworten.
Kann aber gerade nicht nachsehen :frowning:
Michael

Hallo Tommi, Hallo Michael,

erstmal danke für eure Hilfe.
Der Hinweis mit der Wartezeit im Script war glaub ich net schlecht.
Ich hab die Wartezeit in Zeile 83 von 1 auf 2 geändert.
Bis jetzt läuft es mal.

Ich bin gespannt ob das die endgültige Lösung war. Ich hoffe es mal.

Ich werds jetzt mal ne zeitlang beobachten.

Beste Grüße Michi