APCUPSD-Auswertescript

Ich habe das bereits vorgestellte Script zur Auswertung der Daten von APC UPS in IPSymcon etwas erweitert.
Details habe ich hier abgelegt.

Guten Rutsch ins neue Jahr!
Tommi

Hi tommi,

Klasse Doku, leicht verständlich und nachvollziehbar. Habs gerade installiert und läuft!
Ein Problem gibts allerdings mit NOMPOWER, hier meldet mir das Script einen Fehler. ich habe daher die Zeilen 97, 104 und 115 auskommentiert. Scheinbar wird der Wert von meiner USV (SMART-UPS 750) nicht geliefert?

Schicke mir mal die Ausgabe von von apcupsd (logfile oder apcaccess). Ich muss wohl auch noch mehr Fehlerbehandlung machen.:rolleyes:
Tommi

Ich habe an gleicher Stelle eine neue Version bereitgestellt, da meine USV offenbar mehr Daten liefert als die Masse der anderen APC USV. So wird z.B. der Parameter NOMPOWER offensichtlich nur bei den RS-Modellen übertragen. Da dieser Wert zur Errechnung der aktuellen Leistung notwendig ist, habe ich eine Logik zur Ermittlung dieses Wertes aus dem Modellnamen eingebaut bzw. kann dieser Wert in einer IPS-Variable direkt gesetzt werden.
Außerdem wurden eine Reihe von zusätzlichen Prüfungen und eine neue Variablen-Logik eingebaut. Details im Script bzw. auf der Webseite.

Dank an Raketenschnecke für’s testen zu später Stunde.

Tommi

Hi Tommi,

nach dem gestrigen erfolgreichen Anpassen des Scripts Deinerseits habe ich noch eine Frage:
kannst Du kurz skizzieren wie man weitere Parameter aus der USV ausliest bzw. in IPS importiert?
Beispiel: ich habe das Script erweitert um den Parameter „BATTV“. Das Script legt nun die Variable an, schreibt aber keine Werte rein (Wert aktuell 0 V).

Eränzt habe ich:

Zeile 48 eingefügt:


47                           'OnLine'=>array('type'=>0,'profile'=>'~Alert.Reversed'),
48                           'BattV'=>array('type'=>1,'profile'=>'~Volt.230')

Zeile 135 eingefügt:


134	$online=null;
135	$bv=null;

Zeile 147 eingefügt:


146   if (isset($apc['TIMELEFT'])){ list($tl,$rest)=explode(' ',$apc['TIMELEFT'],2);}
147   if (isset($apc['BATTV'])){ list($bv,$rest)=explode(' ',$apc['BATTV'],2);}

lade Dir nochmal die Versíon von heute runter. Außerdem fehlt noch das Speichern in die Variable (ca. Zeile 200)

storevars($varids,'BattV',intval($bv));

Tommi

perfekt, danke dir. Mach ich heute Abend, muss jetzt mit den Hühnern Gassi gehen :slight_smile:

Hi Tommi,

kurze Rückmeldung: funktioniert perfekt! Ich habe noch die Variablen

BattV
BattCharge
MBattCHG

mit aufgenommen.
Nochmals herzlichen Dank für das Script!

Hi Tommi,

das Script lief eigentlich ganz gut in den letzten Wochen, aktuell häuft sich aber folgendes Problem (seit ca 2 Wochen):

ab und zu legt das Script eine weitere komplette APC-Kategorie an. Das einzige, was mir hier auffällt ist ist die differnzierende USV-ID:

  1. 001,052,1282

  2. ID der neu angelegten Kategorie: 001,051,1219

ich hatte neulich 4 zusätzlich angelegte Kategorieen. Blöd ist, das die gemeldeten Daten dann auch mit flscher ID-Zugehörigkeit geloggt werden (damit gehen die Daten verloren).

Hast Du ne Idee, woran das liegt?

Ich war der Meinung, das die APC ID pro UPS eindeutig ist. Ist sie aber nicht. Auf meiner Downloadseite findest Du eine neue Version, die dieses Problem addressiert. Ich habe bei mir das Feld Seriennummer genommen, man kann aber auch ein anderes Feld angeben (z.B. UPSNAME) Bitte auch den Text dazu beachten. Sag mal Bescheid, ob das bei Dir tut.

Tommi

wow, der Service ist ja der Hammer!

hab dein neues Script gerade bei mir integriert, um ein paar variablen ereitert und laufen lassen. Es hat wieder eine neue Kategorie angelegt, diesmal auch mit einer plausiblen SNR (NS9813xxxxxx). Die hab ich in die ID-Var der alten kategorie übertragen, die eben vom Script neu angelegte Kategorie gelöscht, es funktioniert also wie erwartet. Ich werd das mal die Tage genauer beobachten und melde mich :slight_smile:

Danke Dir für den schnellen Support!

Hi Tommi,

kurze Rückmeldung nach fast 24h Betrieb:

ich bekomme in unregelmässigen Abständen (in den verg. 24h 4 Mails) folgende Mail vom IPS-Logger:


IPS-Wrn-PHP  2011-01-23 02:00:02.277  Notice: Uninitialized string offset: 0 Error in Script C:\IP-Symcon\scripts\38999.ips.php on Line 373 
IPS-Wrn-PHP  2011-01-23 02:00:02.306  Notice: Uninitialized string offset: 1 Error in Script C:\IP-Symcon\scripts\38999.ips.php on Line 374 
IPS-Wrn-PHP  2011-01-23 02:00:02.341  Notice: Undefined index: APC Error in Script C:\IP-Symcon\scripts\38999.ips.php on Line 98

Da ich Dein Script (V0.6) etwas erweitert habe hier die betreffenden Codezeilen:

Zeile 98 (letzte Zeile)


94	//parsen
95	   if (isset($apc['APC']) && preg_match("/^(\d+),(\d+),(\d+)/",$apc['APC'])) {
96			parse_apc($apc);
97		}else {
98			ips_logmessage('APC','no valid data:'.$apc['APC']);

Zeile 373/374:


369 function format_data($text){
370   	$entry=explode("
",$text); //Satztrenner
371		$apc=array();
372		foreach($entry as $line) {
373			$p1=ord($line[0]); //immer 00
374			$p2=ord($line[1]); //Kennziffer

Es sieht so aus, als ob da mal Leerzeilen dazwischen sind.
Na gut, kann man auch noch prüfen.
Bitte den Abschnitt ab Zeile 97 wie folgt ersetzen:

}else {
		   $msg='no valid data';
			if (isset($apc['APC'])) $msg.':'.$apc['APC'];
			ips_logmessage('APC',$msg);
		}

und später hinter Zeile 372 eine Zeile einfügen


foreach($entry as $line) {
		   if (! $line || strlen($line)<2) continue;
			$p1=ord($line[0]); //immer 00

Viele Grüße
Tommi

jau, habs eingefügt, die ersten 4 durchläufe verliefen problemlos. Mlede mich morgen nochmal, mal sehen ob der Status dann auch noch der selbe ist :slight_smile:

Besten Dank!

Hi Tommi,

mein Status nach 24h Betrieb: keinerlei Fehlermeldungen mehr!
:smiley:

Hallo Tommi,

erstmal vielen Dank für das geniale APC-Script.

Hallo Raketenschnecke,

danke für Deine Ergänzungen.

Ich habe das Script gestern entdeckt und nachdem ich den Konflikt APCUPSD <-> PowerChute auf meinem Windows-Rechner gelöst und die Dämon-Einstellungen hingebracht habe, war der Rest in IPS dank der hervorragenden Doku von Tommi kein Problem. Auch die Ergänzung von BATTV ist gelungen.

Nun habe ich die Kategorie „APC“ im Webfront auf der ersten Ebene stehen, aber da mein Webfront recht voll ist und die USV nicht die wichtigste Anzeige ist, soll die Kategorie ein oder zwei Ebenenen tiefer. Ich habe gelesen, dass die Struktur so bleiben muss, suche nun aber doch nach einer Lösung. Alles mit Links tiefer zu legen erscheint mir nicht der richtige Weg.

Das Script geht wohl von einer „Parent-ID = 0“ aus und setzt mir deswegen die Kategorie oben rein. Mit der Sortierung habe ich „APC“ bereits nach rechts verschoben. Nun überlege ich, ob man die ID einer Unterkategorie nicht im Script vorgeben und somit die Struktur nach unten bewegen kann.

Nochmals Danke für die hervoragende Unterstützung, ich als IPS-Neuling finde jeden Tag etwas für mein IPS und habe viel „Spielspass“ mit meiner Haussteuerung (Mischung aus EIB/HM/FS20). Das Forum ist genial und sehr lebendig und Dank TAPATALK täglich auf meinem Handy aktualisiert.

Viele Grüße aus dem verschneiten Unterallgäu
Harry

Hi Harry,

Vorschlag: leg dir eine neue Kategorie mit Namen „WFE“ an. Hierdrin legst du wiederum eine neue Kategorie mit Namen „APC USV“ an. In diese Kategorie legst du Links aller Variablen der APC, die du im Webfront sehen möchtest.
Anschliessend kannst du diese neue APC-USV Kategorie mit maximaler Flexibilität im Webfront positionieren. Ebenso kannst du Anordnungen unabhängig von der ursprünglichen Struktur sortieren.

Im Bild 1 siehst du eine solche Struktur als Beispiel, ich habe hier die USV-Kategorie unter WFE/IPS-Maintenance stehen, im Bild 2 die 1:1 View der Kategorie „IPS-Maintenance“ mit Unterkategorie „USV“.

Das Schöne an einem Script ist, das man es selbst anpassen kann :wink:
Andere Nutzer möchten z.B. gar keine Kategorien haben, sondern Dummy-Instancen dafür nutzen. Aber im Gegensatz zu echten Modulen kann jeder die Vorlage umbauen oder ausschlachten, wie er will. Allerdings kann ich dann nur noch sehr eingeschränkt supporten. Primär schreibt man ja die Scripte für sich selbst.

Die verwendeten IPS-Funktionen benötigen eine Parent-ID. Der Einfachheit halber habe ich die IPS-Root genommen, weil es die immer gibt. So funktioniert dieser Teil auf jeden Fall. Man kann natürlich auch eine beliebige andere ParentID entweder fest verdrahten oder aus einer Funktion ermitteln. Ich werde aber die ParentID-Definition in der nächsten Version nach oben in die Konfig-Sektion schieben, damit man das an einer Stelle ändern kann.

Tommi

Hallo Zusammen,

vielen Dank für Eure Anmerkungen.

@Raketenschnecke:
Danke für den Link-Tipp, aber genau den Aufwand wollte ich mir sparen.

@Tommi:
„Die Null muss stehen“ - gerade beginnt das Bayern-Spiel.

Ich habe ab Zeile 273 die Null gegen meine neue Kategorie-ID getauscht

 [b]//master category[/b]
 $master=@IPS_GetObjectIDByName($cat,$GLOBALS['parentid']);
 [b]//no master cat, create new[/b]
 if (!$master) {
    	$master=IPS_CreateCategory();
	 IPS_SetName($master,$cat);
	 IPS_SetParent($master,$GLOBALS['parentid']);

Und oben im Konf-Bereich:

 $GLOBALS['parentid']=12751;

Das sollte es gewesen sein, ich hoffe die eine Stelle reicht.

Nochmals: ein geniales Script, das auf Anhieb funktionierte und die vorgegeben Struktur ist für die meisten Nutzer optimal. Sehr gute Arbeit von Dir!

Viele Grüße - jetzt ist Anpfiff
Harry

Ich habe die Änderungen und Erweiterungen der letzten Tage in einer neuen Version Online gestellt und die Doku entsprechend angepasst.

@Harry
Anpassungen waren soweit korrekt. Ich habe bei mir allerdings noch eine Prüfung eingebaut.

Tommi