SNMP Geräte auslesen am Beispiel einer APC USV

Hallo zusammen,

da ich mehrer Geräte im Netzwerk habe, welche SNMP unterstützen, frage ich diese natürlich auch mit IPS ab.

Als erstes kopiert man sich die php_snmp.dll in das IPS Verzeichniss.
Danach trage ich immer noch in der php.ini die Extension ein:


extension = "php_snmp.dll"

Und nun mein Script am Beispiel einer USV von APC.
Dieses Script führe ich alle 5 Minuten aus.



<?

$host = "192.168.0.253";
$community = "public";

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.2.1.1.0"); //Batterie Status unknown(1),batteryNormal(2),batteryLow(3)
switch($data)
{
    case "1":
		SetValue(18144 /*[Homecontrol\Keller\Serverraum\USV\Batterie Status]*/ , "Unbekannt");
    break;
    case "2":
		SetValue(18144 /*[Homecontrol\Keller\Serverraum\USV\Batterie Status]*/ , "Normal");
    break;
    case "3":
		SetValue(18144 /*[Homecontrol\Keller\Serverraum\USV\Batterie Status]*/ , "Leer");
    break;
}

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.2.2.1.0"); //Batterie Kapazität (in %)
$data = str_replace("Gauge32: ", "", $data);
SetValue(40275 /*[Homecontrol\Keller\Serverraum\USV\Batterie Kapazität]*/ , $data." %");

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.2.2.4.0"); //Batterie tauschen noBatteryNeedsReplacing(1),batteryNeedsReplacing(2)
switch($data)
{
    case "1":
		SetValue(26685 /*[Homecontrol\Keller\Serverraum\USV\Batterie tauschen]*/ , "Nein - Batterie OK");
    break;
    case "2":
		SetValue(26685 /*[Homecontrol\Keller\Serverraum\USV\Batterie tauschen]*/ , "Ja - Bitte Batterie tauschen");
    break;
}

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.2.2.2.0"); //Batterie Temperatur (in °C)
$data = str_replace("Gauge32: ", "", $data);
SetValue(57938 /*[Homecontrol\Keller\Serverraum\USV\Batterie Temperatur]*/ , $data." °C");

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.4.2.1.0"); //Spannung am Ausgang (in Volt)
$data = str_replace("Gauge32: ", "", $data);
SetValue(57607 /*[Homecontrol\Keller\Serverraum\USV\Spannung am Ausgang]*/ , $data." V");

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.3.2.1.0"); //Spannung am Eingang (in Volt)
$data = str_replace("Gauge32: ", "", $data);
SetValue(32211 /*[Homecontrol\Keller\Serverraum\USV\Spannung am Eingang]*/ , $data." V");

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.4.2.3.0"); //Auslastung (in %)
$data = str_replace("Gauge32: ", "", $data);
SetValue(52663 /*[Homecontrol\Keller\Serverraum\USV\Auslastung]*/ , $data." %");

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.2.2.3.0"); //Batterielaufzeit bei Stromausfall
$pos1 = (strpos($data, '(')+1);
$pos2 = strpos($data, ')')-$pos1;
$data = ((substr($data, $pos1, $pos2)/60)/100);
SetValue(52551 /*[Homecontrol\Keller\Serverraum\USV\Batterielaufzeit bei Stromausfall]*/ , $data." Minuten");

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.4.1.1.0"); //APC Status ( liefert Wert von 1 bis 12 zurück )
switch($data)
{
    case "1":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Unbekannt");
    break;
    case "2":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "On Line");
    break;
    case "3":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Batterie Betrieb");
    break;
    case "4":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "on Smart Boost");
    break;
    case "5":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Timed Sleeping");
    break;
    case "6":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Software Bypass");
    break;
    case "7":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Aus");
    break;
    case "8":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Neustart");
    break;
    case "9":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Switched Bypass");
    break;
    case "10":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Hardware Failure Bypass");
    break;
    case "11":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "Sleeping Until Power Returns");
    break;
    case "12":
		SetValue(54468 /*[Homecontrol\Keller\Serverraum\USV\Status]*/ , "On Smart Trim");
    break;
}

/*
1 = Unknown
2 = On Line
3 = On Battery
4 = On Smart Boost
5 = Timed Sleeping
6 = Software Bypass
7 = Off
8 = Rebooting
9 = Switched Bypass
10 = Hardware Failure Bypass
11 = Sleeping Until Power Returns
12 = On Smart Trim
*/

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.3.2.5.0"); //Grund fuer Umschalten auf Batteriebetrieb
switch($data)
{
    case "1":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "Kein Ereigniss");
    break;
    case "2":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "zu hohe Eingangsspannung");
    break;
    case "3":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "Spannungsabfall");
    break;
    case "4":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "Stromausfall(keine Eingangsspannung)");
    break;
    case "5":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "Geringer temporärer Leistungsabfall");
    break;
    case "6":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "Großer temporärer Leistungsabfall");
    break;
    case "7":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "kleine Spannungsspitze");
    break;
    case "8":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "große Spannungsspitze");
    break;
    case "9":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "USV Selbsttest");
    break;
    case "10":
		SetValue(11564 /*[Homecontrol\Keller\Serverraum\USV\Grund fuer Umschalten auf Batteriebetrieb]*/ , "Ausgleichen von Spannungsschwankungen");
    break;
}

$data = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.4.2.2.0"); //Frequenz Ausgangsspannung
$data = str_replace("Gauge32: ", "", $data);
SetValue(29664 /*[Homecontrol\Keller\Serverraum\USV\Frequenz Ausgangsspannung]*/ , $data." Hz");

$data1 = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.7.2.4.0"); //Datum des letzten Selbstests
$data2 = snmpget("$host","$community",".1.3.6.1.4.1.318.1.1.1.7.2.3.0"); //Ergebniss des letzten Selbstests
switch($data2)
{
    case "1":
		$data2 = "Erfolgreich";
    break;
    case "2":
		$data2 = "Fehler";
    break;
    case "4":
		$data2 = "in Bearbeitung";
    break;
    case "3":
		$data2 = "Unbekannt";
    break;
}
SetValue(54905 /*[Homecontrol\Keller\Serverraum\USV\letzter Selbsttest]*/ , $data1." ".$data2);


?>


Gruss
Michael

php_snmp.zip (106 KB)

Hallo Michael,

welche USV von APC verwendest Du und welche Geraete hast Du noch
die SNMP unterstuetzen?

VG
Stephan

Woher bekommt man denn bei SNMP Geräten diese Zahlencodes her?

„.1.3.6.1.4.1.318.1.1.1.7.2.4.0“

Hallo zusammen,

die OIDs findet man im Internet oder beim Hersteller.
Da ich ein bischen mit Nagios zu tun habe, suche ich immer bei Google
nach nagios + snmp.
z.B. snmp:start [Nagios-Wiki]

Ich habe eine Smart-UPS 750 mit Netzwerkinterface im Smart-Slot.
Weitere Geräte sind Switch, Firewall, Webcam, WAGO usw.

Gruss
Michael

Ich benutze php_snmp mit IPS 2.1,

Ich migrierted nach IPS 2.2. aber es funktioniert nicht. PHP 5.3.1 hat kein php_snmp.dll in dem package. Die neue Php 5.3.2 hat php_snmp.dll wieder in dem package.

Gibt es eine Lösung?

Den Versionsstring der 5.3.2-Datei auf 5.3.1 ändern, z.B. mit xnresourceeditor. Habe ich auch schon bei anderen Extensions machen müssen.
Leider hat sich herausgestellt, das die 5.3.1 sehr viele Probleme hat(te) und überall ein Update auf 5.3.2 oder Downgrade auf 5.2.xx empfohlen wird. Mal sehen, wann die „Schmerzgrenze“ bei Paresy erreicht ist.

Tommi

Ich nutze diese.

Gruss
Michael

php_snmp.zip (144 KB)

Vielen Dank für dieses Script, so kann ich mir die wichtigsten Daten der USV´s einfach anzeigen lassen.
Es hat auch sofort funktioniert, allerdings wurden bei einigen Variablen anfangs keine Werte eingelesen. Ich habe das Script deshalb für meine Bedürfnisse etwas angepasst, aber da ich kein großer Programmierer bin, würde ich darum bitten, das angehängte Script auf Korrektheit zu überprüfen. Vielleicht hätte man die Änderungen auch auf anderem Wege programmiertechnisch eleganter lösen können.

usv.txt (7.53 KB)

Hallo sanman,

vielen Dank für das Script. Funktioniert bei meiner Smart-UPS 1500 wunderbar.

Ich habs noch um folgendes erweitert:

$data = snmpget($host,$community,".1.3.6.1.4.1.318.1.1.1.4.3.6.0");
// upsHighPrecOutputEnergyUsage, The output energy usage of the UPS in hundredths of kWh.
$data = (int) str_replace("Gauge32: ", „“, $data);
$data = (float) $data / 100;

damit kannst du den Energieverbrauch der USV abrufen. Die Einheit ist kWh.

liebe Grüße
Wolfgang