SNMP Client - Geräte-Status von NAS (QNAP, Synology) oder SNMP Servern allg. auslesen

Jap … und zwar in diesen beiden Funktionen:

- public function update()
- private function getSNMPType($oid)

Hi mesa,

Hier das komplette Skript. Hast du noch ne Idee?

<? 
// ***************************************************************************** 
// ** Script zum Auslesen der MIB von SNMP Server 
// ** Die Idee stammt von hardlog aus dem Symcon Forum (https://www.symcon.de/forum/threads/26977-Status-der-Synology-DS-per-Script-auslesen?p=247930#post247930) 
// ** läuft so nur unter Windows, da das Komandozeilenprogramm "ssmnpq.exe" 
// ** benötig: genanntes Programm hier http://www.digigrupp.com/ssnmpq/ downloaden 
// ** in einen beliebigen Ornder entpacken und den Ornder in diesem Script 
// ** entsprechend anpassen 
// ** Bei NAS-Servern wie Synology / QNAP muss der SNMP-Dienst aktiviert werden. 
// ** Den Standardport am SNMP Server bitte nicht ändern. 
// ** 
// ** Dieses Skript funktioniert folgendermaßen: 
// ** Du konfigurierst, welche Werte deines SNMP Servers du gerne auslesen, 
// ** möchtest (siehe "registerSNMPObj" weiter unten). 
// ** Das Skript wird den Datentyp der SNMP Daten ermitteln und als IPS-Variablen 
// ** unterhalb des Skriptes anlegen (sofern diese nicht bereits existieren.) 
// ** Der Name der Variable entspricht der von dir benannten "Beschreibung" für 
// ** den SNMP-Wert. 
// ** Die Werte der Variablen werden mit jeder Ausführung des Skripts aktualisiert. 
// ** 
// ** Das Skript legt benötigte Variablenprofile an. Diese sind mit einem Präfix 
// ** "SNMP_" versehen. Beispielsweise "SNMP_CapacityMB". 
// ***************************************************************************** 

/** 
KONFIGURATION der SNMP Verbindung 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
**/ 
$host          = "192.170.5.86";     // IP Adresse deines SNMP Servers (QNAP, Synology, etc.) 
$community     = "public";                // SNMP Community 
$binary        = "C:\IP-Symcon\automatic\SnmpGet\SnmpGet.exe";            // Pfad zum SNMP Binary 
#$binary        = "snmpget";            // Pfad zum SNMP Binary
#$binary        = "C:\IP-Symcon\automatic\ssnmpq\ssnmpq.exe";
$debug         = false;                    // Bei true werden Debuginformationen (echo) ausgegeben 

$snmp = new SNMP($host, $community, $binary, $debug);          //DIESE ZEILE NICHT VERÄNDERN! 

/** 
KONFIGURATION abzurufender Werte 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

mit $snmp->registerSNMPObj($oid, $desc, $convertType) kannst du angeben, 
welche Daten per SNMP abgerufen werden sollen. 
Die Funktion benötigt drei Parameter: 

Parameter1 ($oid): 
------------------ 
die ID des Wertes am SNMP Server (Mit dem iReasoning MIB Browser kannst du mit 
einem Windowsprogramm angenehm nach gültigen ID's in deinem System suchen. 
http://www.ireasoning.com 

Die vorbelegten OIDs basieren auf den Werten meiner QNAP und müssen evtl. 
angepasst werden. 

Parameter2 ($desc): 
------------------- 
Die Bezeichnung legt fest, wie die IPS-Variable genannt werden soll. 

Bitte berücksichtige, dass jede OID und jede Bezeichnung eindeutig sein müssen 
(keine doppelten Einträge). Ausserdem löscht das Skript keine einmal erstellten 
Variablen. D.h. wenn du eine Bezeichnung umbenennst, denn musst du die "alte" 
Variable manuell löschen. 

Parameter 3 (convertType) 
------------------------- 
dieser Parameter ist optional. Wird er nicht gesetzt oder als "none" übergeben, 
werden die Daten "wie empfangen" in der zugehörigen IPS-Variable gespeichert. 

In einigen Fällen ist dies jedoch nicht erwünscht. Beispielsweise liefert eine 
QNAP als freie Festplattenkapazität den Wert inkl. der Mengeneinheit als Text: 
3.96 TB. Damit ist eine geeignete Weiterverarbeitung in IPS sowie ein Logging 
der Variable ausgeschlossen. 

Um das zu ändern beinhaltet das Skript einige "Converter". In diesem Fall auf 
die Rohdaten der QNAP abgestimmt. Der Converter "Capacity" wandelt MB/GB/TB 
(Megabyte, Gigabyte, Terrabyte)-Strings in Megabyte Zahlen um. 
Aus "3.96 TB" werden "3960000". 

Derzeit verfügbare Converter: 
CapacityMB (Speichergrößen in Megabyte als Float) 
CapacityGB(Speichergrößen in Megabyte als Float) 
CapacityTB (Speichergrößen in Megabyte als Float) 
Temperature (Celsius Temperatur als Integer) 
FanSpeed (RPM als Integer) 
SmartStatus (S.M.A.R.T Informationen der HDD, Ergebnis ist Boolean => gut / schlecht) 

**/ 


$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.12.0", "ModelName"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.2.0", "SystemTotalMem", "CapacityMB"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.3.0", "SystemFreeMem", "CapacityMB"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.4.1", "SysVolumeTotalSize", "CapacityGB"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.1", "SysVolumeFreeSize", "CapacityGB"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.4.0", "SystemUptime"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.5.0", "CPU-Temperature", "Temperature"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.6.0", "System-Temperature", "Temperature"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.15.1.3.1", "System-FanSpeed", "FanSpeed"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.1", "HDTemperature1", "Temperature"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.2", "HDTemperature2", "Temperature"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.3", "HDTemperature3", "Temperature"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.4", "HDTemperature4", "Temperature"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.1", "HDSmartInfo1", "SmartStatus"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.2", "HDSmartInfo2", "SmartStatus"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.3", "HDSmartInfo3", "SmartStatus"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.4", "HDSmartInfo4", "SmartStatus"); 
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.1.0", "CPU usage", "Percent"); 

// ***** ab hier nichts mehr ändern 
$snmp->update(); 

class SNMP 
{ 
    //Objekteigenschaften 
    protected $host;                   //SNMP Serveradresse 
    protected $community;              //SNMP Community 
    protected $binary;                 //Dateipfad zur ssnmpq.exe 
    public    $debug = false;          //Bei true werden Debuginformationen ausgegeben 
    protected $snmpobj=array();        //array registrierter snmp objekte welche beim server abgefragt werden 

    //IPS Datentypen 
    const tBOOL     = 0; 
    const tINT      = 1; 
    const tFLOAT    = 2; 
    const tSTRING   = 3; 

    public function __construct($host, $community, $binary, $debug) { 
        $this->host         = $host; 
        $this->community    = $community; 
        $this->binary       = $binary; 
        $this->debug        = $debug; 


        //Prüfe ob Variablenprofile existieren und erstelle diese wenn nötig 
        $this->createVariableProfile("SNMP_Percent", self::tFLOAT, "", " %", 2); 
        $this->createVariableProfile("SNMP_CapacityMB", self::tFLOAT, "", " MB", 0); 
        $this->createVariableProfile("SNMP_CapacityGB", self::tFLOAT, "", " GB", 0); 
        $this->createVariableProfile("SNMP_CapacityTB", self::tFLOAT, "", " TB", 0); 
        $this->createVariableProfile("SNMP_Temperature", self::tINT, "", " °C", 0); 
        $this->createVariableProfile("SNMP_FanSpeed", self::tINT, "", " RPM", 0); 
        if (!IPS_VariableProfileExists("SNMP_SmartStatus")) { 
            $this->createVariableProfile("SNMP_SmartStatus", self::tBOOL, "", "", 0); 
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 1, "Gut", "", 0x00FF04); 
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 0, "Defekt", "", 0xFF0000); 
        } 
    } 

    private function createVariableProfile($name, $type, $pre, $suff, $digits) { 
        if (!IPS_VariableProfileExists($name)) { 
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "INFO - VariablenProfil ".$name." existiert nicht und wird angelegt."); 
            IPS_CreateVariableProfile($name, $type); 
            IPS_SetVariableProfileDigits($name, $digits); 
            IPS_SetVariableProfileText($name, $pre, $suff); 
        } 
    } 

    public function registerSNMPObj($oid, $desc, $convertType = "none") { 

        //prüfe auf doppelte Einträge beim Registrieren neuer SNMP Objekte 
        foreach($this->snmpobj as $obj) { 
            if ($desc==$obj->desc) { 
                if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "ERROR - registerSNMPObj: Variable description ".$desc." already exists, it must be unique!"); 
                exit; 
            } 
            if ($oid==$obj->OID) { 
                if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "ERROR - registerSNMPObj: Variable OID ".$oid." already exists, it must be unique!"); 
                exit; 
            } 
        } 

        //prüfe ob IPS Variablen für SNMP Objekt existiert (Variablenname entspricht description) 
        $parentID = IPS_GetParent($_IPS['SELF']); // übergeordnete Kategorie als Basis 
//        $parentID = $_IPS['SELF']; 
        $ips_var = @IPS_GetVariableIDByName($desc, $parentID); 
        if ($ips_var == false) { 
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Variable ".$desc." not found - create IPSVariable"); 

            if ($convertType == "none") 
                $type = $this->getSNMPType($oid); 
            if ($convertType == "CapacityMB" || $convertType == "CapacityGB" || $convertType == "CapacityTB" || $convertType == "Percent") 
                $type = self::tFLOAT; 
            if ($convertType == "Temperature") 
                $type = self::tINT; 
            if ($convertType == "FanSpeed") 
                $type = self::tINT; 
            if ($convertType == "SmartStatus") 
                $type = self::tBOOL; 
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Type of OID ".$oid." is ".$type); 

            $ips_var = IPS_CreateVariable($type); 
            IPS_SetName($ips_var, $desc); 
            IPS_SetParent($ips_var, $parentID); 

            //Verknüpfe Variablenprofil mit neu erstellter Variable 
            if ($convertType == "CapacityMB") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityMB"); 
            if ($convertType == "CapacityGB") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityGB"); 
            if ($convertType == "CapacityTB") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityTB"); 
            if ($convertType == "Temperature") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_Temperature"); 
            if ($convertType == "FanSpeed") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_FanSpeed"); 
            if ($convertType == "SmartStatus") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_SmartStatus"); 
            if ($convertType == "Percent") 
                IPS_SetVariableCustomProfile($ips_var, "SNMP_Percent"); 
        } 

        $count = count($this->snmpobj); 
        array_push($this->snmpobj, new SNMPObj($oid, $desc, $convertType, $ips_var)); 
        $count = count($this->snmpobj); 
        if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "New SNMPObj registered, now monitoring ".$count." snmp variables"); 
    } 

    //startet eine Abfrage am SNMP Server und aktualisiert die IPS-Variablen der registrierten 
    //SNMP Objekte 
    public function update() { 
        if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Updating ".count($this->snmpobj)." variable(s)"); 

        foreach ($this->snmpobj as $obj) { 
//            $oid = ltrim($obj->OID,"."); 
            $oid = $obj->OID; 
            #$exec_param =" -v1 -O v -c ".$this->community." ".$this->host." ". $oid .""; 
	    	$exec_param =" -v:1 -r:".$this->host." -t:10 -c:".$this->community." -o:".$oid."";
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Execute SNMP-Query: ".$this->binary.$exec_param); 
            $result = str_replace('"', '', trim(system($this->binary.$exec_param)));
            
            $pos_start = stripos ($result, ":");  
            $result = substr($result, $pos_start+1); 
            
            $obj->value = $result; 

            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Result of ".$obj->desc.": ".$obj->value); 

            if ($obj->convertType == "Percent") $obj->value = $this->convertPercent($obj->value, "%"); 
            if ($obj->convertType == "CapacityMB") $obj->value = $this->convertCapacity($obj->value, "MB"); 
            if ($obj->convertType == "CapacityGB") $obj->value = $this->convertCapacity($obj->value, "GB"); 
            if ($obj->convertType == "CapacityTB") $obj->value = $this->convertCapacity($obj->value, "TB"); 
            if ($obj->convertType == "Temperature") $obj->value = $this->convertTemperature($obj->value); 
            if ($obj->convertType == "FanSpeed") $obj->value = $this->convertFanSpeed($obj->value); 
            if ($obj->convertType == "SmartStatus") $obj->value = $this->convertSmartStatus($obj->value); 

            SetValue($obj->ips_var, $obj->value); 
        } 
    } 

    //prüfe um welchen SNMP Rückgabetyp es sich handelt 
    //returns 3 => String / 1 => Integer / 2 => Float 
    private function getSNMPType($oid) { 
        $oid = ltrim($oid,"."); 
	#$exec_param =" -v1 -O v -c ".$this->community." ".$this->host." ". $oid .""; 
		$exec_param =" -v:1 -r:".$this->host." -t:10 -c:".$this->community." -o:".$oid."";
        $result = system($this->binary.$exec_param); 
        $pos_start = stripos ($result, " = "); 
        $pos_end = stripos ($result, ': "'); 
        $type = substr($result, $pos_start, $pos_end - $pos_start); 
        switch($type) { 
            case "STRING": 
                return self::tSTRING; 
            case "Integer": 
                return self::tINT; 
            case "Timeticks": 
                return self::tFLOAT; 
            default: 
                return self::tSTRING; 
        } 
    } 

    //returns -1 on error 
    private function convertCapacity($input, $unit) { 
        $pos = stripos($input, "MB"); 
        if ($pos === false) { 
            $pos = stripos($input, "GB"); 
            if ($pos === false) { 
                $pos = stripos($input, "TB"); 
                if ($pos === false) { 
                    return -1; 
                } else { 
                    $funit = "TB"; 
                } 
            } else { 
                $funit = "GB"; 
            } 
        } else { 
            $funit = "MB"; 
        } 

        $result = substr($input, 0, $pos); 
        $result = trim($result); 

        switch ($funit) { 
            case "GB": 
            $result = $result*1000; 
            break; 
            case "TB": 
            $result = $result*1000*1000; 
            break; 
        } 

        switch($unit) { 
            case "MB": 
            return round($result); 
            case "GB": 
            return round($result / 1000); 
            case "TB"; 
            return round($result / 1000000); 
        } 
    } 

    //returns -1 on error 
    private function convertTemperature($input) { 
        $pos = stripos($input, "C"); 
        if ($pos === false) { 
            $result = -1; 
        } else { 
            $result = substr($input, 0, $pos); 
            $result = round(trim($result)); 
        } 
        return $result; 
    } 

    private function convertPercent($input) { 
        $pos = stripos($input, "%"); 
        if ($pos === false) { 
            $result = -1; 
        } else { 
            $result = substr($input, 0, $pos); 
            $result = trim($result); 
        } 
        return $result; 
    } 

    //returns -1 on error 
    private function convertFanSpeed($input) { 
        $pos = stripos($input, "RPM"); 
        if ($pos === false) { 
            $result = -1; 
        } else { 
            $result = substr($input, 0, $pos); 
            $result = round(trim($result)); 
        } 
        return $result; 
    } 

    private function convertSmartStatus($input) { 
        $pos = stripos($input, "GOOD") + stripos($input, "Normal"); 
        if ($pos === false) { 
            return false; 
        } else { 
            return true; 
        } 
    } 

} 

class SNMPObj 
{ 
    //Objekteigenschaften 
    public $OID;                   //SNMP Message ID 
    public $desc;                  //Beschreibung 
    public $value;                 //Wert 
    public $convertType;           //Typ-Converter 
    public $ips_var;               //ID der IPS-Variable welche den SNMP Wert speichert 

    public function __construct($OID, $desc, $convertType, $ips_var) { 
        $this->OID            = $OID; 
        $this->desc           = $desc; 
        $this->convertType    = $convertType; 
        $this->ips_var        = $ips_var; 
    } 
} 
?>

Es könnte sein, dass die Parameter und die Anführungszeichen nicht so richtig passen.

Laut SnmpGet Beispiel ist -c in Anführungsstrichen.

Hast du in der Zeile

$snmp = new SNMP($host, $community, $binary, $debug);  

mal ein "1, " davor geschrieben?

Laut Doku ist der Aufbau (inzwischen?) etwas anders.

Wobei das folgende Script bei mir mit der aktuellen IPS Beta auf dem PI problemlos läuft.


<?
// *****************************************************************************
// ** Script zum Auslesen der MIB von SNMP Server
// ** Die Idee stammt von hardlog aus dem Symcon Forum (https://www.symcon.de/forum/threads/26977-Status-der-Synology-DS-per-Script-auslesen?p=247930#post247930)
// ** läuft so nur unter Windows, da das Komandozeilenprogramm "ssmnpq.exe"
// ** benötig: genanntes Programm hier http://www.digigrupp.com/ssnmpq/ downloaden
// ** in einen beliebigen Ornder entpacken und den Ornder in diesem Script
// ** entsprechend anpassen
// ** Bei NAS-Servern wie Synology / QNAP muss der SNMP-Dienst aktiviert werden.
// ** Den Standardport am SNMP Server bitte nicht ändern.
// **
// ** Dieses Skript funktioniert folgendermaßen:
// ** Du konfigurierst, welche Werte deines SNMP Servers du gerne auslesen,
// ** möchtest (siehe "registerSNMPObj" weiter unten).
// ** Das Skript wird den Datentyp der SNMP Daten ermitteln und als IPS-Variablen
// ** unterhalb des Skriptes anlegen (sofern diese nicht bereits existieren.)
// ** Der Name der Variable entspricht der von dir benannten "Beschreibung" für
// ** den SNMP-Wert.
// ** Die Werte der Variablen werden mit jeder Ausführung des Skripts aktualisiert.
// **
// ** Das Skript legt benötigte Variablenprofile an. Diese sind mit einem Präfix
// ** "SNMP_" versehen. Beispielsweise "SNMP_CapacityMB".
// *****************************************************************************

/**
KONFIGURATION der SNMP Verbindung
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**/
$host          = "172.16.100.254"; 	// IP Adresse deines SNMP Servers (QNAP, Synology, etc.)
$community     = "xxx";				// SNMP Community
$binary        = "/usr/bin/snmpget";			// Pfad zum SNMP Binary
$debug         = false;					// Bei true werden Debuginformationen ausgegeben

$snmp = new SNMP($host, $community, $binary, $debug);          //DIESE ZEILE NICHT VERÄNDERN!

/**
KONFIGURATION abzurufender Werte
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

mit $snmp->registerSNMPObj($oid, $desc, $convertType) kannst du angeben,
welche Daten per SNMP abgerufen werden sollen.
Die Funktion benötigt drei Parameter:

Parameter1 ($oid):
------------------
die ID des Wertes am SNMP Server (Mit dem iReasoning MIB Browser kannst du mit
einem Windowsprogramm angenehm nach gültigen ID's in deinem System suchen.
http://www.ireasoning.com

Die vorbelegten OIDs basieren auf den Werten meiner QNAP und müssen evtl.
angepasst werden.

Parameter2 ($desc):
-------------------
Die Bezeichnung legt fest, wie die IPS-Variable genannt werden soll.

Bitte berücksichtige, dass jede OID und jede Bezeichnung eindeutig sein müssen
(keine doppelten Einträge). Ausserdem löscht das Skript keine einmal erstellten
Variablen. D.h. wenn du eine Bezeichnung umbenennst, denn musst du die "alte"
Variable manuell löschen.

Parameter 3 (convertType)
-------------------------
dieser Parameter ist optional. Wird er nicht gesetzt oder als "none" übergeben,
werden die Daten "wie empfangen" in der zugehörigen IPS-Variable gespeichert.

In einigen Fällen ist dies jedoch nicht erwünscht. Beispielsweise liefert eine
QNAP als freie Festplattenkapazität den Wert inkl. der Mengeneinheit als Text:
3.96 TB. Damit ist eine geeignete Weiterverarbeitung in IPS sowie ein Logging
der Variable ausgeschlossen.

Um das zu ändern beinhaltet das Skript einige "Converter". In diesem Fall auf
die Rohdaten der QNAP abgestimmt. Der Converter "Capacity" wandelt MB/GB/TB
(Megabyte, Gigabyte, Terrabyte)-Strings in Megabyte Zahlen um.
Aus "3.96 TB" werden "3960000".

Derzeit verfügbare Converter:
CapacityMB (Speichergrößen in Megabyte als Float)
CapacityGB(Speichergrößen in Megabyte als Float)
CapacityTB (Speichergrößen in Megabyte als Float)
Temperature (Celsius Temperatur als Integer)
FanSpeed (RPM als Integer)
SmartStatus (S.M.A.R.T Informationen der HDD, Ergebnis ist Boolean => gut / schlecht)

**/

$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.12.0", "ModelName");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.2.0", "SystemTotalMem", "CapacityMB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.3.0", "SystemFreeMem", "CapacityMB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.4.1", "SysVolumeTotalSize", "CapacityGB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.1", "SysVolumeFreeSize", "CapacityGB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.4.0", "SystemUptime");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.5.0", "CPU-Temperature", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.6.0", "System-Temperature", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.15.1.3.1", "System-FanSpeed", "FanSpeed");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.1", "HDTemperature1", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.2", "HDTemperature2", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.3", "HDTemperature3", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.4", "HDTemperature4", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.1", "HDSmartInfo1", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.2", "HDSmartInfo2", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.3", "HDSmartInfo3", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.4", "HDSmartInfo4", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.1.0", "CPU usage", "Percent");

// ***** ab hier nichts mehr ändern
$snmp->update();

class SNMP
{
    //Objekteigenschaften
    protected $host;                   //SNMP Serveradresse
    protected $community;              //SNMP Community
    protected $binary;                 //Dateipfad zur ssnmpq.exe
    public	  $debug = false;          //Bei true werden Debuginformationen ausgegeben
    protected $snmpobj=array();        //array registrierter snmp objekte welche beim server abgefragt werden

    //IPS Datentypen
    const tBOOL     = 0;
    const tINT      = 1;
    const tFLOAT    = 2;
    const tSTRING   = 3;

    public function __construct($host, $community, $binary, $debug) {
        $this->host         = $host;
        $this->community    = $community;
        $this->binary       = $binary;
        $this->debug        = $debug;


        //Prüfe ob Variablenprofile existieren und erstelle diese wenn nötig
        $this->createVariableProfile("SNMP_Percent", self::tFLOAT, "", " %", 2);
        $this->createVariableProfile("SNMP_CapacityMB", self::tFLOAT, "", " MB", 0);
        $this->createVariableProfile("SNMP_CapacityGB", self::tFLOAT, "", " GB", 0);
        $this->createVariableProfile("SNMP_CapacityTB", self::tFLOAT, "", " TB", 0);
        $this->createVariableProfile("SNMP_Temperature", self::tINT, "", " °C", 0);
        $this->createVariableProfile("SNMP_FanSpeed", self::tINT, "", " RPM", 0);
        if (!IPS_VariableProfileExists("SNMP_SmartStatus")) {
            $this->createVariableProfile("SNMP_SmartStatus", self::tBOOL, "", "", 0);
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 1, "Gut", "", 0x00FF04);
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 0, "Defekt", "", 0xFF0000);
        }
    }

    private function createVariableProfile($name, $type, $pre, $suff, $digits) {
        if (!IPS_VariableProfileExists($name)) {
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "INFO - VariablenProfil ".$name." existiert nicht und wird angelegt.");
            IPS_CreateVariableProfile($name, $type);
            IPS_SetVariableProfileDigits($name, $digits);
            IPS_SetVariableProfileText($name, $pre, $suff);
        }
    }

    public function registerSNMPObj($oid, $desc, $convertType = "none") {

        //prüfe auf doppelte Einträge beim Registrieren neuer SNMP Objekte
        foreach($this->snmpobj as $obj) {
            if ($desc==$obj->desc) {
                if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "ERROR - registerSNMPObj: Variable description ".$desc." already exists, it must be unique!");
                return(1);
            }
            if ($oid==$obj->OID) {
                if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "ERROR - registerSNMPObj: Variable OID ".$oid." already exists, it must be unique!");
                return(1);
            }
        }

        //prüfe ob IPS Variablen für SNMP Objekt existiert (Variablenname entspricht description)
		$parentID = IPS_GetParent($_IPS['SELF']); // übergeordnete Kategorie als Basis
//        $parentID = $_IPS['SELF'];
        $ips_var = @IPS_GetVariableIDByName($desc, $parentID);
        if ($ips_var == false) {
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Variable ".$desc." not found - create IPSVariable");

            if ($convertType == "none")
	            $type = $this->getSNMPType($oid);
            if ($convertType == "CapacityMB" || $convertType == "CapacityGB" || $convertType == "CapacityTB" || $convertType == "Percent")
   	         $type = self::tFLOAT;
            if ($convertType == "Temperature")
      	      $type = self::tINT;
            if ($convertType == "FanSpeed")
         	   $type = self::tINT;
            if ($convertType == "SmartStatus")
            	$type = self::tBOOL;
            if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Type of OID ".$oid." is ".$type);

            $ips_var = IPS_CreateVariable($type);
            IPS_SetName($ips_var, $desc);
            IPS_SetParent($ips_var, $parentID);

            //Verknüpfe Variablenprofil mit neu erstellter Variable
            if ($convertType == "CapacityMB")
   	         IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityMB");
            if ($convertType == "CapacityGB")
	            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityGB");
            if ($convertType == "CapacityTB")
            	IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityTB");
            if ($convertType == "Temperature")
         	   IPS_SetVariableCustomProfile($ips_var, "SNMP_Temperature");
            if ($convertType == "FanSpeed")
      	      IPS_SetVariableCustomProfile($ips_var, "SNMP_FanSpeed");
            if ($convertType == "SmartStatus")
   	         IPS_SetVariableCustomProfile($ips_var, "SNMP_SmartStatus");
            if ($convertType == "Percent")
	            IPS_SetVariableCustomProfile($ips_var, "SNMP_Percent");
        }

        $count = count($this->snmpobj);
        array_push($this->snmpobj, new SNMPObj($oid, $desc, $convertType, $ips_var));
        $count = count($this->snmpobj);
        if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "New SNMPObj registered, now monitoring ".$count." snmp variables");
    }

	//startet eine Abfrage am SNMP Server und aktualisiert die IPS-Variablen der registrierten
	//SNMP Objekte
	public function update() {
		if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Updating ".count($this->snmpobj)." variable(s)");

		foreach ($this->snmpobj as $obj) {
//            $oid = ltrim($obj->OID,".");
			$oid = $obj->OID;
			$exec_param = " -v1 -O vq -L n -t 2 -c ".$this->community." ".$this->host." ".$oid;
			if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Execute SNMP-Query: ".$this->binary.$exec_param);

//			$obj->value = str_replace('"', '', trim(system($this->binary.$exec_param)));
			$obj->value = str_replace('"', '', trim(IPS_Execute($this->binary, $exec_param, false, true)));

			if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Result of ".$obj->desc.": ".$obj->value);

			if ($obj->convertType == "Percent") $obj->value = $this->convertPercent($obj->value, "%");
			if ($obj->convertType == "CapacityMB") $obj->value = $this->convertCapacity($obj->value, "MB");
			if ($obj->convertType == "CapacityGB") $obj->value = $this->convertCapacity($obj->value, "GB");
			if ($obj->convertType == "CapacityTB") $obj->value = $this->convertCapacity($obj->value, "TB");
			if ($obj->convertType == "Temperature") $obj->value = $this->convertTemperature($obj->value);
			if ($obj->convertType == "FanSpeed") $obj->value = $this->convertFanSpeed($obj->value);
			if ($obj->convertType == "SmartStatus") $obj->value = $this->convertSmartStatus($obj->value);

			SetValue($obj->ips_var, $obj->value);
		}

	}

	//prüfe um welchen SNMP Rückgabetyp es sich handelt
	//returns 3 => String / 1 => Integer / 2 => Float
	private function getSNMPType($oid) {
		$oid = ltrim($oid,".");
		$exec_param =" -v 1 -O v -c ".$this->community." ".$this->host." ". $oid;
		$result = IPS_Execute($this->binary, $exec_param, false, true);
		$pos_start = stripos ($result, " = ");
		$pos_end = stripos ($result, ': "');
		$type = substr($result, $pos_start, $pos_end - $pos_start);
		switch($type) {
			case "STRING":
				return self::tSTRING;
			case "Integer":
				return self::tINT;
			case "Timeticks":
				return self::tFLOAT;
			default:
				return self::tSTRING;
		}
	}

	//returns -1 on error
	private function convertCapacity($input, $unit) {
		$pos = stripos($input, "MB");
		if ($pos === false) {
			$pos = stripos($input, "GB");
			if ($pos === false) {
				$pos = stripos($input, "TB");
				if ($pos === false) {
					return -1;
				} else {
					$funit = "TB";
				}
			} else {
				$funit = "GB";
			}
		} else {
			$funit = "MB";
		}

		$result = substr($input, 0, $pos);
		$result = trim($result);

		switch ($funit) {
			case "GB":
				$result = $result*1000;
				break;
			case "TB":
				$result = $result*1000*1000;
				break;
		}

		switch($unit) {
			case "MB":
				return round($result);
			case "GB":
				return round($result / 1000);
			case "TB";
				return round($result / 1000000);
		}
	}

	//returns -1 on error
	private function convertTemperature($input) {
		$pos = stripos($input, "C");
		if ($pos === false) {
			$result = -1;
		} else {
			$result = substr($input, 0, $pos);
			$result = round(trim($result));
		}
		return $result;
	}

	private function convertPercent($input) {
		$pos = stripos($input, "%");
		if ($pos === false) {
			$result = -1;
		} else {
			$result = substr($input, 0, $pos);
			$result = trim($result);
		}
		return $result;
	}

    //returns -1 on error
	private function convertFanSpeed($input) {
		$pos = stripos($input, "RPM");
		if ($pos === false) {
			$result = -1;
		} else {
			$result = substr($input, 0, $pos);
			$result = round(trim($result));
		}
		return $result;
	}

	private function convertSmartStatus($input) {
		$pos = stripos($input, "GOOD") + stripos($input, "Normal");
		if ($pos === false) {
			return false;
		} else {
			return true;
		}
	}
}

class SNMPObj {
	//Objekteigenschaften
	public $OID;                   //SNMP Message ID
	public $desc;                  //Beschreibung
	public $value;                 //Wert
	public $convertType;           //Typ-Converter
	public $ips_var;               //ID der IPS-Variable welche den SNMP Wert speichert

	public function __construct($OID, $desc, $convertType, $ips_var) {
		$this->OID            = $OID;
		$this->desc           = $desc;
		$this->convertType    = $convertType;
		$this->ips_var        = $ips_var;
	}
}
?>

Das mit den Parametern habe ich schon berücksichtigt:

$exec_param =" -v:1 -r:".$this->host." -t:10 -c:".$this->community." -o:".$oid."";

Ich glaube es hängt mit der Versionsmitgabe zusammen. Wenn ich dieses Skript ausführe:


<?
$host          = "localhost";     // IP Adresse deines SNMP Servers (QNAP, Synology, etc.) 
$community     = "public";                // SNMP Community 
$binary        = "C:\IP-Symcon\automatic\SnmpGet\SnmpGet.exe";            // Pfad zum SNMP Binary 
$debug         = false; 

$snmp = new SNMP(1, $host, $community,10,3);
print_r ($snmp);
?>

bekomme ich:

SNMP Object
(
    [info] => Array
        (
            [hostname] => 127.0.0.1
            [port] => 161
            [timeout] => 10
            [retries] => 3
        )

    [max_oids] => 
    [valueretrieval] => 0
    [quick_print] => 
    [enum_print] => 
    [oid_output_format] => 0
    [oid_increasing_check] => 1
    [exceptions_enabled] => 0
)

Führe ich hingegen dieses Skript aus:

$host          = "localhost";     // IP Adresse deines SNMP Servers (QNAP, Synology, etc.) 
$community     = "public";                // SNMP Community 
$binary        = "C:\IP-Symcon\automatic\SnmpGet\SnmpGet.exe";            // Pfad zum SNMP Binary 
$debug         = false; 

$snmp = new SNMP($host, $community, $binary, $debug);          //DIESE ZEILE NICHT VERÄNDERN! 
print_r ($snmp);

bekomme ich:

Fatal error:  Uncaught exception 'Exception' with message 'SNMP::__construct() expects parameter 1 to be long, string given' in C:\IP-Symcon\scripts\51975.ips.php:28
Stack trace:
#0 C:\IP-Symcon\scripts\51975.ips.php(28): SNMP->__construct('localhost', 'public', 'C:\\IP-Symcon\\au...', false)
#1 {main}
  thrown in C:\IP-Symcon\scripts\51975.ips.php on line 28
Abort Processing during Fatal-Error: Uncaught exception 'Exception' with message 'SNMP::__construct() expects parameter 1 to be long, string given' in C:\IP-Symcon\scripts\51975.ips.php:28
Stack trace:
#0 C:\IP-Symcon\scripts\51975.ips.php(28): SNMP->__construct('localhost', 'public', 'C:\\IP-Symcon\\au...', false)
#1 {main}
  thrown
   Error in Script C:\IP-Symcon\scripts\51975.ips.php on Line 28

oder:

$host          = "localhost";     // IP Adresse deines SNMP Servers (QNAP, Synology, etc.) 
$community     = "public";                // SNMP Community 
$binary        = "C:\IP-Symcon\automatic\SnmpGet\SnmpGet.exe";            // Pfad zum SNMP Binary 
$debug         = false; 

$snmp = new SNMP(1,$host, $community, $binary, $debug);          //DIESE ZEILE NICHT VERÄNDERN! 
print_r ($snmp);

dann:

Fatal error:  Uncaught exception 'Exception' with message 'SNMP::__construct() expects parameter 4 to be long, string given' in C:\IP-Symcon\scripts\51975.ips.php:28
Stack trace:
#0 C:\IP-Symcon\scripts\51975.ips.php(28): SNMP->__construct(1, 'localhost', 'public', 'C:\\IP-Symcon\\au...', false)
#1 {main}
  thrown in C:\IP-Symcon\scripts\51975.ips.php on line 28
Abort Processing during Fatal-Error: Uncaught exception 'Exception' with message 'SNMP::__construct() expects parameter 4 to be long, string given' in C:\IP-Symcon\scripts\51975.ips.php:28
Stack trace:
#0 C:\IP-Symcon\scripts\51975.ips.php(28): SNMP->__construct(1, 'localhost', 'public', 'C:\\IP-Symcon\\au...', false)
#1 {main}
  thrown
   Error in Script C:\IP-Symcon\scripts\51975.ips.php on Line 28

komisch, dass es am PI funktioniert. Oder wird da vielleicht noch ein älteres PHP verwendet?

Auf meinem 3.4 Server läuft das folgende Script ohne Probleme.


 <?
// *****************************************************************************
// ** Script zum Auslesen der MIB von SNMP Server
// ** Die Idee stammt von hardlog aus dem Symcon Forum (https://www.symcon.de/forum/threads/26977-Status-der-Synology-DS-per-Script-auslesen?p=247930#post247930)
// ** läuft so nur unter Windows, da das Komandozeilenprogramm "ssmnpq.exe"
// ** benötig: genanntes Programm hier http://www.digigrupp.com/ssnmpq/ downloaden
// ** in einen beliebigen Ornder entpacken und den Ornder in diesem Script
// ** entsprechend anpassen
// ** Bei NAS-Servern wie Synology / QNAP muss der SNMP-Dienst aktiviert werden.
// ** Den Standardport am SNMP Server bitte nicht ändern.
// **
// ** Dieses Skript funktioniert folgendermaßen:
// ** Du konfigurierst, welche Werte deines SNMP Servers du gerne auslesen,
// ** möchtest (siehe "registerSNMPObj" weiter unten).
// ** Das Skript wird den Datentyp der SNMP Daten ermitteln und als IPS-Variablen
// ** unterhalb des Skriptes anlegen (sofern diese nicht bereits existieren.)
// ** Der Name der Variable entspricht der von dir benannten "Beschreibung" für
// ** den SNMP-Wert.
// ** Die Werte der Variablen werden mit jeder Ausführung des Skripts aktualisiert.
// **
// ** Das Skript legt benötigte Variablenprofile an. Diese sind mit einem Präfix
// ** "SNMP_" versehen. Beispielsweise "SNMP_CapacityMB".
// *****************************************************************************

ini_set( 'max_execution_time', 90);

/**
KONFIGURATION der SNMP Verbindung
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**/
$host          = "172.16.100.254";                             // IP Adresse deines SNMP Servers (QNAP, Synology, etc.)
$community     = "xxx";                                     // SNMP Community
$binary        = "D:\\IP-Symcon\	ools\\ssnmpq\\ssnmpq.exe";       // Pfad zur ssnmpq.exe
$debug         = true;                                        // Bei true werden Debuginformationen (echo) ausgegeben

$snmp = new SNMP($host, $community, $binary, $debug);          //DIESE ZEILE NICHT VERÄNDERN!

/**
KONFIGURATION abzurufender Werte
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

mit $snmp->registerSNMPObj($oid, $desc, $convertType) kannst du angeben,
welche Daten per SNMP abgerufen werden sollen.
Die Funktion benötigt drei Parameter:

Parameter1 ($oid):
------------------
die ID des Wertes am SNMP Server (Mit dem iReasoning MIB Browser kannst du mit
einem Windowsprogramm angenehm nach gültigen ID's in deinem System suchen.
http://www.ireasoning.com

Die vorbelegten OIDs basieren auf den Werten meiner QNAP und müssen evtl.
angepasst werden.

Parameter2 ($desc):
-------------------
Die Bezeichnung legt fest, wie die IPS-Variable genannt werden soll.

Bitte berücksichtige, dass jede OID und jede Bezeichnung eindeutig sein müssen
(keine doppelten Einträge). Ausserdem löscht das Skript keine einmal erstellten
Variablen. D.h. wenn du eine Bezeichnung umbenennst, denn musst du die "alte"
Variable manuell löschen.

Parameter 3 (convertType)
-------------------------
dieser Parameter ist optional. Wird er nicht gesetzt oder als "none" übergeben,
werden die Daten "wie empfangen" in der zugehörigen IPS-Variable gespeichert.

In einigen Fällen ist dies jedoch nicht erwünscht. Beispielsweise liefert eine
QNAP als freie Festplattenkapazität den Wert inkl. der Mengeneinheit als Text:
3.96 TB. Damit ist eine geeignete Weiterverarbeitung in IPS sowie ein Logging
der Variable ausgeschlossen.

Um das zu ändern beinhaltet das Skript einige "Converter". In diesem Fall auf
die Rohdaten der QNAP abgestimmt. Der Converter "Capacity" wandelt MB/GB/TB
(Megabyte, Gigabyte, Terrabyte)-Strings in Megabyte Zahlen um.
Aus "3.96 TB" werden "3960000".

Derzeit verfügbare Converter:
CapacityMB (Speichergrößen in Megabyte als Float)
CapacityGB(Speichergrößen in Megabyte als Float)
CapacityTB (Speichergrößen in Megabyte als Float)
Temperature (Celsius Temperatur als Integer)
FanSpeed (RPM als Integer)
SmartStatus (S.M.A.R.T Informationen der HDD, Ergebnis ist Boolean => gut / schlecht)

**/

$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.12.0", "ModelName");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.2.0", "SystemTotalMem", "CapacityMB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.3.0", "SystemFreeMem", "CapacityMB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.4.1", "SysVolumeTotalSize", "CapacityGB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.1", "SysVolumeFreeSize", "CapacityGB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.4.0", "SystemUptime");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.5.0", "CPU-Temperature", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.6.0", "System-Temperature", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.15.1.3.1", "System-FanSpeed", "FanSpeed");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.1", "HDTemperature1", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.2", "HDTemperature2", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.3", "HDTemperature3", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.4", "HDTemperature4", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.1", "HDSmartInfo1", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.2", "HDSmartInfo2", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.3", "HDSmartInfo3", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.4", "HDSmartInfo4", "SmartStatus");
//$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.1.0", "CPU usage");

// ***** ab hier nichts mehr ändern
$snmp->update();

class SNMP
{
    //Objekteigenschaften
    protected $host;                   //SNMP Serveradresse
    protected $community;              //SNMP Community
    protected $binary;                 //Dateipfad zur ssnmpq.exe
    public $debug = false;             //Bei true werden Debuginformationen ausgegeben
    protected $snmpobj=array();    //array registrierter snmp objekte welche beim server abgefragt werden

    //IPS Datentypen
    const tBOOL     = 0;
    const tINT      = 1;
    const tFLOAT    = 2;
    const tSTRING   = 3;

    public function __construct($host, $community, $binary, $debug){
        $this->host         = $host;
        $this->community    = $community;
        $this->binary       = $binary;
        $this->debug        = $debug;


        //Prüfe ob Variablenprofile existieren und erstelle diese wenn nötig
        $this->createVariableProfile("SNMP_CapacityMB", self::tFLOAT, "", " MB");
        $this->createVariableProfile("SNMP_CapacityGB", self::tFLOAT, "", " GB");
        $this->createVariableProfile("SNMP_CapacityTB", self::tFLOAT, "", " TB");
        $this->createVariableProfile("SNMP_Temperature", self::tINT, "", " °C");
        $this->createVariableProfile("SNMP_FanSpeed", self::tINT, "", " RPM");
        if(!IPS_VariableProfileExists("SNMP_SmartStatus")){
            $this->createVariableProfile("SNMP_SmartStatus", self::tBOOL, "", "");
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 1, "Gut", "", 0x00FF04);
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 0, "Defekt", "", 0xFF0000);
        }
    }

    private function createVariableProfile($name, $type, $pre, $suff){
        if(!IPS_VariableProfileExists($name)){
            if($this->debug) echo "INFO - VariablenProfil $name existiert nicht und wird angelegt";
            IPS_CreateVariableProfile($name, $type);
            IPS_SetVariableProfileText($name, $pre, $suff);
        }
    }

    public function registerSNMPObj($oid, $desc, $convertType = "none"){

        //prüfe auf doppelte Einträge beim Registrieren neuer SNMP Objekte
        foreach($this->snmpobj as $obj){
            if($desc==$obj->desc){
                if($this->debug) echo "ERROR - registerSNMPObj: Variable description '$desc' already exists, it must be unique!";
                exit;
            }
            if($oid==$obj->OID){
                if($this->debug) echo "ERROR - registerSNMPObj: Variable OID '$oid' already exists, it must be unique!";
                exit;
            }
        }

        //prüfe ob IPS Variablen für SNMP Objekt existiert (Variablenname entspricht description)
        $parentID = $_IPS['SELF'];
        $ips_var = @IPS_GetVariableIDByName($desc, $parentID);
        if($ips_var == false){
            if($this->debug) echo "Variable '$desc' not found - create IPSVariable
";

            if($convertType == "none")
            $type = $this->getSNMPType($oid);
            if($convertType == "CapacityMB" || $convertType == "CapacityGB" || $convertType == "CapacityTB")
            $type = self::tFLOAT;
            if($convertType == "Temperature")
            $type = self::tINT;
            if($convertType == "FanSpeed")
            $type = self::tINT;
            if($convertType == "SmartStatus")
            $type = self::tBOOL;
            if($this->debug) echo "Type of OID '$oid' is $type 
";

            $ips_var = IPS_CreateVariable($type);
            IPS_SetName($ips_var, $desc);
            IPS_SetParent($ips_var, $parentID);

            //Verknüpfe Variablenprofil mit neu erstellter Variable
            if($convertType == "CapacityMB")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityMB");
            if($convertType == "CapacityGB")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityGB");
            if($convertType == "CapacityTB")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityTB");
            if($convertType == "Temperature")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_Temperature");
            if($convertType == "FanSpeed")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_FanSpeed");
            if($convertType == "SmartStatus")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_SmartStatus");
        }

        $count = count($this->snmpobj);
        array_push($this->snmpobj, new SNMPObj($oid, $desc, $convertType, $ips_var));
        $count = count($this->snmpobj);
        if($this->debug) echo "New SNMPObj registered, now monitoring '$count' snmp variables
";
    }

    //startet eine Abfrage am SNMP Server und aktualisiert die IPS-Variablen der registrierten
    //SNMP Objekte
    public function update(){
        if($this->debug) echo "Updating ". count($this->snmpobj) ." variable(s)
";

        foreach($this->snmpobj as $obj){
            $oid = ltrim($obj->OID,".");
            $exec_param =" /h:". $this->host ." /c:". $this->community ." /o:". $oid ." /v";
            if($this->debug) echo "Execute SNMP-Query: ". $this->binary, "$exec_param
";
            $obj->value = trim(IPS_Execute($this->binary, $exec_param, false, true));
            if($this->debug) echo "Result of ". $obj->desc .": ". $obj->value ."
";

            if($obj->convertType == "CapacityMB") $obj->value = $this->convertCapacity($obj->value, "MB");
            if($obj->convertType == "CapacityGB") $obj->value = $this->convertCapacity($obj->value, "GB");
            if($obj->convertType == "CapacityTB") $obj->value = $this->convertCapacity($obj->value, "TB");
            if($obj->convertType == "Temperature") $obj->value = $this->convertTemperature($obj->value);
            if($obj->convertType == "FanSpeed") $obj->value = $this->convertFanSpeed($obj->value);
            if($obj->convertType == "SmartStatus") $obj->value = $this->convertSmartStatus($obj->value);

            SetValue($obj->ips_var, $obj->value);
        }
    }

    //prüfe um welchen SNMP Rückgabetyp es sich handelt
    //returns 3 => String / 1 => Integer / 2 => Float
    private function getSNMPType($oid){
        $oid = ltrim($oid,".");
        $exec_param =" /h:". $this->host ." /c:". $this->community ." /o:". $oid;
        $result = IPS_Execute($this->binary, $exec_param, false, true);
        $pos_start = stripos ($result, "Type=");
        $pos_end = stripos ($result, "Value=");
        $type = substr($result, $pos_start + strlen("Type="), $pos_end - $pos_start);

        switch($type){
            case "OctetString":
            return self::tSTRING;
            case "Integer":
            return self::tINT;
            case "TimeTicks":
            return self::tFLOAT;
            default:
            return self::tSTRING;
        }
    }

    //returns -1 on error
    private function convertCapacity($input, $unit){
        $pos = stripos($input, "MB");
        if($pos === false) {
            $pos = stripos($input, "GB");
            if($pos === false) {
                $pos = stripos($input, "TB");
                if($pos === false) {
                    return -1;
                }else{
                    $funit = "TB";
                }
            } else{
                $funit = "GB";
            }
        }else{
            $funit = "MB";
        }

        $result = substr($input, 0, $pos);
        $result = trim($result);

        switch ($funit){
            case "GB":
            $result = $result*1000;
            break;
            case "TB":
            $result = $result*1000*1000;
            break;
        }

        switch($unit){
            case "MB":
            return round($result);
            case "GB":
            return round($result / 1000);
            case "TB";
            return round($result / 1000000);
        }
    }

    //returns -1 on error
    private function convertTemperature($input){
        $pos = stripos($input, "C");
        if($pos === false){
            $result = -1;
        }else{
            $result = substr($input, 0, $pos);
            $result = round(trim($result));
        }
        return $result;
    }

    //returns -1 on error
    private function convertFanSpeed($input){
        $pos = stripos($input, "RPM");
        if($pos === false){
            $result = -1;
        }else{
            $result = substr($input, 0, $pos);
            $result = round(trim($result));
        }
        return $result;
    }

    private function convertSmartStatus($input){
        $pos = stripos($input, "GOOD") + stripos($input, "Normal");
        if($pos === false){
            return false;
        }else{
            return true;
        }
    }

}

class SNMPObj
{
    //Objekteigenschaften
    public $OID;                   //SNMP Message ID
    public $desc;                  //Beschreibung
    public $value;                 //Wert
    public $convertType;           //Typ-Converter
    public $ips_var;               //ID der IPS-Variable welche den SNMP Wert speichert

    public function __construct($OID, $desc, $convertType, $ips_var){
        $this->OID                    = $OID;
        $this->desc                    = $desc;
        $this->convertType    = $convertType;
        $this->ips_var             = $ips_var;
    }
}
?>

Hallo,

bei mir läuft unter der 4.0 mit Windows 10 alles ohne Probleme. Ich habe ein QNAP-412

<?
// *****************************************************************************
// ** Script zum Auslesen der MIB von SNMP Server
// ** Die Idee stammt von hardlog aus dem Symcon Forum (https://www.symcon.de/forum/threads/26977-Status-der-Synology-DS-per-Script-auslesen?p=247930#post247930)
// ** läuft so nur unter Windows, da das Komandozeilenprogramm "ssmnpq.exe"
// ** benötig: genanntes Programm hier http://www.digigrupp.com/ssnmpq/ downloaden
// ** in einen beliebigen Ornder entpacken und den Ornder in diesem Script
// ** entsprechend anpassen
// ** Bei NAS-Servern wie Synology / QNAP muss der SNMP-Dienst aktiviert werden.
// ** Den Standardport am SNMP Server bitte nicht ändern.
// **
// ** Dieses Skript funktioniert folgendermaßen:
// ** Du konfigurierst, welche Werte deines SNMP Servers du gerne auslesen,
// ** möchtest (siehe "registerSNMPObj" weiter unten).
// ** Das Skript wird den Datentyp der SNMP Daten ermitteln und als IPS-Variablen
// ** unterhalb des Skriptes anlegen (sofern diese nicht bereits existieren.)
// ** Der Name der Variable entspricht der von dir benannten "Beschreibung" für
// ** den SNMP-Wert.
// ** Die Werte der Variablen werden mit jeder Ausführung des Skripts aktualisiert.
// **
// ** Das Skript legt benötigte Variablenprofile an. Diese sind mit einem Präfix
// ** "SNMP_" versehen. Beispielsweise "SNMP_CapacityMB".
// *****************************************************************************


/**
KONFIGURATION der SNMP Verbindung
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**/
$host          = "xxx.xxx.xxx.xxx";                                                         // IP Adresse deines SNMP Servers (QNAP, Synology, etc.)
$community     = "public";                                                                         // SNMP Community
$binary        = "C:\IP-Symcon\IPSTools\ssnmpq\ssnmpq.exe";    // Pfad zur ssnmpq.exe
$debug         = true;                                                                             // Bei true werden Debuginformationen (echo) ausgegeben

$snmp = new SNMP($host, $community, $binary, $debug);         //DIESE ZEILE NICHT VERÄNDERN!

/**
KONFIGURATION abzurufender Werte
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

mit $snmp->registerSNMPObj($oid, $desc, $convertType) kannst du angeben,
welche Daten per SNMP abgerufen werden sollen.
Die Funktion benötigt drei Parameter:

Parameter1 ($oid):
------------------
die ID des Wertes am SNMP Server (Mit dem iReasoning MIB Browser kannst du mit
einem Windowsprogramm angenehm nach gültigen ID's in deinem System suchen.
http://www.ireasoning.com

Die vorbelegten OIDs basieren auf den Werten meiner QNAP und müssen evtl.
angepasst werden.

Parameter2 ($desc):
-------------------
Die Bezeichnung legt fest, wie die IPS-Variable genannt werden soll.

Bitte berücksichtige, dass jede OID und jede Bezeichnung eindeutig sein müssen
(keine doppelten Einträge). Ausserdem löscht das Skript keine einmal erstellten
Variablen. D.h. wenn du eine Bezeichnung umbenennst, denn musst du die "alte"
Variable manuell löschen.

Parameter 3 (convertType)
-------------------------
dieser Parameter ist optional. Wird er nicht gesetzt oder als "none" übergeben,
werden die Daten "wie empfangen" in der zugehörigen IPS-Variable gespeichert.

In einigen Fällen ist dies jedoch nicht erwünscht. Beispielsweise liefert eine
QNAP als freie Festplattenkapazität den Wert inkl. der Mengeneinheit als Text:
3.96 TB. Damit ist eine geeignete Weiterverarbeitung in IPS sowie ein Logging
der Variable ausgeschlossen.

Um das zu ändern beinhaltet das Skript einige "Converter". In diesem Fall auf
die Rohdaten der QNAP abgestimmt. Der Converter "Capacity" wandelt MB/GB/TB
(Megabyte, Gigabyte, Terrabyte)-Strings in Megabyte Zahlen um.
Aus "3.96 TB" werden "3960000".

Derzeit verfügbare Converter:
CapacityMB (Speichergrößen in Megabyte als Float)
CapacityGB(Speichergrößen in Megabyte als Float)
CapacityTB (Speichergrößen in Megabyte als Float)
Temperature (Celsius Temperatur als Integer)
FanSpeed (RPM als Integer)
SmartStatus (S.M.A.R.T Informationen der HDD, Ergebnis ist Boolean => gut / schlecht)

**/

$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.12.0", "ModelName");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.2.0", "SystemTotalMem", "CapacityMB");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.3.0", "SystemFreeMem", "CapacityMB");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.17.1.4.1", "SysVolumeTotalSize", "CapacityGB");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.4.0", "SystemUptime");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.6.0", "System-Temperature", "Temperature");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.3.1", "HDTemperature1", "Temperature");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.3.2", "HDTemperature2", "Temperature");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.3.3", "HDTemperature3", "Temperature");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.3.4", "HDTemperature4", "Temperature");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.7.1", "HDSmartInfo1", "SmartStatus");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.7.2", "HDSmartInfo2", "SmartStatus");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.7.3", "HDSmartInfo3", "SmartStatus");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.11.1.7.4", "HDSmartInfo4", "SmartStatus");
$snmp->registerSNMPObj("1.3.6.1.4.1.24681.1.2.17.1.5.1", "HD1FreeSize", "CapacityGB");
#$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.2", "HD2FreeSize", "CapacityGB");
#$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.3", "HD3FreeSize", "CapacityGB");
#$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.4", "HD4FreeSize", "CapacityGB");



// ***** ab hier nichts mehr ändern
$snmp->update();

class SNMP
{
    //Objekteigenschaften
    protected $host;                   //SNMP Serveradresse
    protected $community;              //SNMP Community
    protected $binary;                 //Dateipfad zur ssnmpq.exe
    public $debug = false;             //Bei true werden Debuginformationen ausgegeben
    protected $snmpobj=array();    //array registrierter snmp objekte welche beim server abgefragt werden

    //IPS Datentypen
    const tBOOL        = 0;
    const tINT        = 1;
    const tFLOAT    = 2;
    const tSTRING    = 3;

    public function __construct($host, $community, $binary, $debug){
        $this->host         = $host;
        $this->community     = $community;
        $this->binary         = $binary;
        $this->debug         = $debug;


        //Prüfe ob Variablenprofile existieren und erstelle diese wenn nötig
        $this->createVariableProfile("SNMP_CapacityMB", self::tFLOAT, "", " MB");
        $this->createVariableProfile("SNMP_CapacityGB", self::tFLOAT, "", " GB");
        $this->createVariableProfile("SNMP_CapacityTB", self::tFLOAT, "", " TB");
        $this->createVariableProfile("SNMP_Temperature", self::tINT, "", " °C");
        $this->createVariableProfile("SNMP_FanSpeed", self::tINT, "", " RPM");
        if(!IPS_VariableProfileExists("SNMP_SmartStatus")){
            $this->createVariableProfile("SNMP_SmartStatus", self::tBOOL, "", "");
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 1, "Gut", "", 0x00FF04);
            IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 0, "Defekt", "", 0xFF0000);
        }
    }

    private function createVariableProfile($name, $type, $pre, $suff){
        if(!IPS_VariableProfileExists($name)){
            if($this->debug) echo "INFO - VariablenProfil $name existiert nicht und wird angelegt";
            IPS_CreateVariableProfile($name, $type);
            IPS_SetVariableProfileText($name, $pre, $suff);
        }
    }

    public function registerSNMPObj($oid, $desc, $convertType = "none"){

        //prüfe auf doppelte Einträge beim Registrieren neuer SNMP Objekte
        foreach($this->snmpobj as $obj){
            if($desc==$obj->desc){
                if($this->debug) echo "ERROR - registerSNMPObj: Variable description '$desc' already exists, it must be unique!";
                exit;
            }
            if($oid==$obj->OID){
                if($this->debug) echo "ERROR - registerSNMPObj: Variable OID '$oid' already exists, it must be unique!";
                exit;
            }
        }

        //prüfe ob IPS Variablen für SNMP Objekt existiert (Variablenname entspricht description)
        $parentID = $_IPS['SELF'];
        $ips_var = @IPS_GetVariableIDByName($desc, $parentID);
        if($ips_var == false){
            if($this->debug) echo "Variable '$desc' not found - create IPSVariable
";

            if($convertType == "none")
            $type = $this->getSNMPType($oid);
            if($convertType == "CapacityMB" || $convertType == "CapacityGB" || $convertType == "CapacityTB")
            $type = self::tFLOAT;
            if($convertType == "Temperature")
            $type = self::tINT;
            if($convertType == "FanSpeed")
            $type = self::tINT;
            if($convertType == "SmartStatus")
            $type = self::tBOOL;
            if($this->debug) echo "Type of OID '$oid' is $type 
";

            $ips_var = IPS_CreateVariable($type);
            IPS_SetName($ips_var, $desc);
            IPS_SetParent($ips_var, $parentID);

            //Verknüpfe Variablenprofil mit neu erstellter Variable
            if($convertType == "CapacityMB")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityMB");
            if($convertType == "CapacityGB")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityGB");
            if($convertType == "CapacityTB")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityTB");
            if($convertType == "Temperature")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_Temperature");
            if($convertType == "FanSpeed")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_FanSpeed");
            if($convertType == "SmartStatus")
            IPS_SetVariableCustomProfile($ips_var, "SNMP_SmartStatus");
        }

        $count = count($this->snmpobj);
        array_push($this->snmpobj, new SNMPObj($oid, $desc, $convertType, $ips_var));
        $count = count($this->snmpobj);
        if($this->debug) echo "New SNMPObj registered, now monitoring '$count' snmp variables
";
    }

    //startet eine Abfrage am SNMP Server und aktualisiert die IPS-Variablen der registrierten
    //SNMP Objekte
    public function update(){
        if($this->debug) echo "Updating ". count($this->snmpobj) ." variable(s)
";

        foreach($this->snmpobj as $obj){
            $oid = ltrim($obj->OID,".");
            $exec_param =" /h:". $this->host ." /c:". $this->community ." /o:". $oid ." /v /t:1000";
            if($this->debug) echo "Execute SNMP-Query: ". $this->binary, "$exec_param
";
            $obj->value = trim(IPS_Execute($this->binary, $exec_param, false, true));
            if($this->debug) echo "Result of ". $obj->desc .": ". $obj->value ."
";

            if($obj->convertType == "CapacityMB") $obj->value = $this->convertCapacity($obj->value, "MB");
            if($obj->convertType == "CapacityGB") $obj->value = $this->convertCapacity($obj->value, "GB");
            if($obj->convertType == "CapacityTB") $obj->value = $this->convertCapacity($obj->value, "TB");
            if($obj->convertType == "Temperature") $obj->value = $this->convertTemperature($obj->value);
            if($obj->convertType == "FanSpeed") $obj->value = $this->convertFanSpeed($obj->value);
            if($obj->convertType == "SmartStatus") $obj->value = $this->convertSmartStatus($obj->value);

            SetValue($obj->ips_var, $obj->value);
        }
    }

    //prüfe um welchen SNMP Rückgabetyp es sich handelt
    //returns 3 => String / 1 => Integer / 2 => Float
    private function getSNMPType($oid){
        $oid = ltrim($oid,".");
        $exec_param =" /h:". $this->host ." /c:". $this->community ." /o:". $oid;
        $result = IPS_Execute($this->binary, $exec_param, false, true);
        $pos_start = stripos ($result, "Type=");
        $pos_end = stripos ($result, "Value=");
        $type = substr($result, $pos_start + strlen("Type="), $pos_end - $pos_start);

        switch($type){
            case "OctetString":
            return self::tSTRING;
            case "Integer":
            return self::tINT;
            case "TimeTicks":
            return self::tFLOAT;
            default:
            return self::tSTRING;
        }
    }

    //returns -1 on error
    private function convertCapacity($input, $unit){
        $pos = stripos($input, "MB");
        if($pos === false) {
            $pos = stripos($input, "GB");
            if($pos === false) {
                $pos = stripos($input, "TB");
                if($pos === false) {
                    return -1;
                }else{
                    $funit = "TB";
                }
            } else{
                $funit = "GB";
            }
        }else{
            $funit = "MB";
        }

        $result = substr($input, 0, $pos);
        $result = trim($result);

        switch ($funit){
            case "GB":
            $result = $result*1000;
            break;
            case "TB":
            $result = $result*1000*1000;
            break;
        }

        switch($unit){
            case "MB":
            return round($result);
            case "GB":
            return round($result / 1000);
            case "TB";
            return round($result / 1000000);
        }
    }

    //returns -1 on error
    private function convertTemperature($input){
        $pos = stripos($input, "C");
        if($pos === false){
            $result = -1;
        }else{
            $result = substr($input, 0, $pos);
            $result = round(trim($result));
        }
        return $result;
    }

    //returns -1 on error
    private function convertFanSpeed($input){
        $pos = stripos($input, "RPM");
        if($pos === false){
            $result = -1;
        }else{
            $result = substr($input, 0, $pos);
            $result = round(trim($result));
        }
        return $result;
    }

    private function convertSmartStatus($input){
        $pos = stripos($input, "GOOD");
        if($pos === false){
            return false;
        }else{
            return true;
        }
    }

}

class SNMPObj
{
    //Objekteigenschaften
    public $OID;                     //SNMP Message ID
    public $desc;                    //Beschreibung
    public $value;                   //Wert
    public $convertType;          //Typ-Converter
    public $ips_var;                   //ID der IPS-Variable welche den SNMP Wert speichert

    public function __construct($OID, $desc, $convertType, $ips_var){
        $this->OID                    = $OID;
        $this->desc                    = $desc;
        $this->convertType    = $convertType;
        $this->ips_var             = $ips_var;
    }
}
?>


Grüße
Björn

Wir nutzen auch beide ssnmpq.exe unter Windows, vielleicht solltest du das mal testen ;).

MfG
Ralf

Das ist echt schräg. Habe es jetzt nochmal mit der ssnmpq.exe versucht, ein altes Backup mit IPS4.0 ausgegraben, und dein Skript laufen lassen … leider immer wieder der selbe Fehler :rolleyes: Seltsam …

Hallo,

ich wollte nur anmerken, dass nach dem Update von 4.0 auf 4.1 und Win10 alles unverändert funktioniert.

Das Auslesen der SNMP Daten funktioniert.

Grüße
Björn

Nach langer langer Suche habe ich ein komplett frisches IPS4.1 aufgesetzt und das SNMP-Skript laufen lassen. Was soll ich sagen … Es läuft! Was schlussendlich der Grund war, kann ich nicht sagen.
Habe anschließend nach und nach mein „altes“ System wieder hergestellt.

Hier meine Vorgehensweise:

Dateien/Ordner von meinem Letztstandbackup kopiert:[HR][/HR]/scripts
/modules
/media
/db
settings.json
[HR][/HR]
Zwischendurch immer wieder das SNMP-Skript probiert ob es noch läuft.

Hallo,

Hat jemand einen funktionierendes Script für den Client snmpget unter Windows?

Wenn nicht weiss jemand wo ich noch das Programm ssnmpq.exe finden kann. Der Link auf Seite 1 funktioniert nicht und in meine Suche hat keine Ergebnisse gebracht

Gruss,

Such ich auch gerade. Oder hat jemand eine alternative am laufen? Z.B die von Net-SNMP ?

Würde ungern auf ein totes Pferd setzen.

Sorry für den Link. Ist nicht für WindowsUser.

PS: es gibt doch eine Win Version, allerdings eine ältere. Bin grade am DownLoad.

Werde berichten.

bekommt man das auch auf der Symbox zum laufen ?

Frohes neues Zusammen,

(IPS 4.1 unter Windows Server 2013R2)

mit dem Script probiere ich schon länger.
In einen anderem Script https://www.symcon.de/forum/threads/18158-Auslesen-einer-APC-SmartUPS-USV-mit-ssnmp benutze ich ssnmp2 schon länger erfolgreich. Habe es auch schon für andere Geräte adaptiert. Aber diese Modulare Script gefällt mir gut für weitere Erweiterungen.

Nur bei diesem Script funktioniert es nicht, manuelles Aufrufen funktioniert und liefert die richtigen Werte.

Bei der Script-Ausführung kommt jedoch immer folgende Fehlermeldung:

Notice: A non well formed numeric value encountered in C:\IP-Symcon\scripts\55359.ips.php on line 32

Fatal error: Uncaught exception ‚Exception‘ with message ‚Unknown SNMP protocol version‘ in C:\IP-Symcon\scripts\55359.ips.php:32
Stack trace:
#0 C:\IP-Symcon\scripts\55359.ips.php(32): SNMP->__construct(‚xxxxxxxx.20‘, ‚xxxxxxx‘, ‚C:\ip-symcon\ss…‘, 1)
#1 {main}
thrown in C:\IP-Symcon\scripts\55359.ips.php on line 32
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Unknown SNMP protocol version‘ in C:\IP-Symcon\scripts\55359.ips.php:32
Stack trace:
#0 C:\IP-Symcon\scripts\55359.ips.php(32): SNMP->__construct(‚xxxxxx.20‘, ‚xxxxxxxx‘, ‚C:\ip-symcon\ss…‘, 1)
#1 {main}
thrown
Error in Script C:\IP-Symcon\scripts\55359.ips.php on Line 32

Ändere ich das binary auf eine nicht vorhandene Datei (doppel \ bringt auch keine Änderung)

**/
$host          = "xx.yy.zz.20";                                         // IP Adresse deines SNMP Servers (QNAP, Synology, etc.)
$community     = "xxxxx";                                                 // SNMP Community
$binary        = "C:\ip-symcon\ssnmpq\ssnmp2dfhgjdhk.exe";    // <-- gibbet nich!
// $binary = "C:\ip-symcon\ssnmpq\ssnmpq2.exe";
$debug         = true;                                                     // Bei true werden Debuginformationen (echo) ausgegeben

$snmp = new SNMP($host, $community, $binary, $debug);    

kommt die gleiche Fehlermeldung:

Notice: A non well formed numeric value encountered in C:\IP-Symcon\scripts\55359.ips.php on line 32

Fatal error: Uncaught exception ‚Exception‘ with message ‚Unknown SNMP protocol version‘ in C:\IP-Symcon\scripts\55359.ips.php:32
Stack trace:
#0 C:\IP-Symcon\scripts\55359.ips.php(32): SNMP->__construct(‚xxxxxxxx20‘, ‚xxxxxxxx‘, ‚C:\ip-symcon\ss…‘, 1)
#1 {main}
thrown in C:\IP-Symcon\scripts\55359.ips.php on line 32
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message ‚Unknown SNMP protocol version‘ in C:\IP-Symcon\scripts\55359.ips.php:32
Stack trace:
#0 C:\IP-Symcon\scripts\55359.ips.php(32): SNMP->__construct(‚xxxxxxxxx20‘, ‚xxxxxxx‘, ‚C:\ip-symcon\ss…‘, 1)
#1 {main}
thrown
Error in Script C:\IP-Symcon\scripts\55359.ips.php on Line 32

Und ab hier verstehe ich es nicht mehr?

Viele Grüße aus OBC

Udo

hallo
versuche es jetzt mit SnmpWalk v1.02
werde das script dann hier posten

gruss,

Hallo MichB,

an dem Script mit SnmpWalk v1.02 wäre ich auch interessiert. Bitte posten, wenn es läuft.
Danke

Gruß Alex

Hi, habe snmpget…


sudo apt-get update
sudo apt-get install snmpd
sudo apt-get install snmp

…auf dem Raspberry installiert auf dem auch die Symcon läuft.
Und frage so einfach die Werte aus, ohne das „große“ Script.


<?
// HDD Info 	>	1 = Normal (The disk is functioning normally)
// 			2 = Initialized (The disk has system partitions but no data)
// 			3 = NotInitialized (The disk is not partitioned)
// 			4 = SystemPartitionFailed (Partitions on the disk are damaged)
// 			5 = Crashed (The disk is damaged)
// Update Info >	1 = Available
// 			2 = Unavailable
// 			3 = Connecting
// 			4 = Disconnected
// 			5 = Others
// Raid Info >	1 = Normal (RAID is functioning normally) 
// 			2 = Repairing
// 			3 = Migrating
// 			4 = Expanding
// 			5 = Deleting
// 			6 = Creating
// 			7 = RaidSyncing
// 			8 = RaidParityChecking
// 			9 = RaidAssembling
// 			10 = Canceling
// 			11 = Degrade (Degrade is shown when a tolerable failure of disk(s) occurs)
// 			12 = Crashed (RAID has crashed and is now read-only)


// Daten per SNMP holen
$status_hdd1_temp = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.6.0'); 
$status_hdd2_temp = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.6.1'); 
$status_hdd3_temp = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.6.2'); 
$status_hdd4_temp = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.6.3'); 
$status_nas_temp = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.1.2.0'); 
$status_hdd1_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.5.0'); 
$status_hdd2_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.5.1'); 
$status_hdd3_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.5.2'); 
$status_hdd4_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.2.1.1.5.3'); 
$status_laufzeit_info = exec('snmpget -c public -v1 -O v 192.168.178.5 .1.3.6.1.2.1.25.1.1.0'); 
$status_firmware_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.1.5.3.0');
$status_model_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.1.5.1.0');
$status_sernumber_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.1.5.2.0');
$status_update_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.1.5.4.0');
$status_raid_info = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.4.1.6574.3.1.1.3.0');
$HDUnit = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.2.1.25.2.3.1.4.41');
$HDTotal = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.2.1.25.2.3.1.5.41');
$HDUsed = exec('snmpget -c public -v1 -O qv 192.168.178.5 .1.3.6.1.2.1.25.2.3.1.6.41');

//$MemAvailable = exec('snmpget -c public -v1 -O q -O v 192.168.178.5 .1.3.6.1.4.1.2021.4.11.0');
//$MemAvailableinMo = $MemAvailable / 100;
//$MemUsepercent = ($MemAvailableinMo * 100) / 1024;


// Daten berechnen
$status_laufzeit_info_cut = substr($status_laufzeit_info, -20,35);
$HDFree = ((($HDTotal - $HDUsed) * $HDUnit / 1024 / 1024 / 1024 / 1000 / 100 * 97.65));
$HDTotal2 = $HDTotal * $HDUnit / 1024 / 1024 / 1024 / 1000 / 100 * 97.65 ;
$HDUsed2 = $HDUsed * $HDUnit / 1024 / 1024 / 1024 / 1000 / 100 * 97.65;


// Zeitstempel für letzten Refresh
$time = exec('sudo date');

// Daten Variablen schreiben
SetValueInteger(34393 /*[Infos Webfront\Synology NAS\Temperatur HDD1]*/, $status_hdd1_temp); 
SetValueInteger(55303 /*[Infos Webfront\Synology NAS\Temperatur HDD2]*/, $status_hdd2_temp);
SetValueInteger(18355 /*[Infos Webfront\Synology NAS\Temperatur HDD3]*/, $status_hdd3_temp);
SetValueInteger(28059 /*[Infos Webfront\Synology NAS\Temperatur HDD4]*/, $status_hdd4_temp);
SetValueInteger(38448 /*[Infos Webfront\Synology NAS\NAS Temperatur]*/, $status_nas_temp);
SetValueInteger(16639 /*[Infos Webfront\Synology NAS\Info HDD1]*/, $status_hdd1_info);
SetValueInteger(44269 /*[Infos Webfront\Synology NAS\Info HDD2]*/, $status_hdd2_info);
SetValueInteger(48617 /*[Infos Webfront\Synology NAS\Info HDD3]*/, $status_hdd3_info);
SetValueInteger(59728 /*[Infos Webfront\Synology NAS\Info HDD4]*/, $status_hdd4_info);
SetValueString(34409 /*[Infos Webfront\Synology NAS\NAS Laufzeit]*/, $status_laufzeit_info_cut);
SetValueString(27747 /*[Infos Webfront\Synology NAS\Letzter Refresh]*/, $time);
SetValueFloat(25695 /*[Infos Webfront\Synology NAS\NAS Speicher verfügbar]*/, $HDTotal2);
SetValueFloat(32104 /*[Infos Webfront\Synology NAS\NAS Speicher frei]*/, $HDFree);
SetValueFloat(42040 /*[Infos Webfront\Synology NAS\NAS Speicher benutzt]*/, $HDUsed2);
SetValueString(38368 /*[Infos Webfront\Synology NAS\NAS Firmware]*/, $status_firmware_info);
SetValueString(50609 /*[Infos Webfront\Synology NAS\NAS Model]*/, $status_model_info);
SetValueString(37271 /*[Infos Webfront\Synology NAS\NAS Seriennumer]*/, $status_sernumber_info);
SetValueInteger(31503 /*[Infos Webfront\Synology NAS\Info Firmware Update]*/, $status_update_info); 
SetValueInteger(38959 /*[Infos Webfront\Synology NAS\Info RAID]*/, $status_raid_info); 

//Testausgabe
//echo "$time
$status_hdd1_temp
$status_hdd2_temp
$status_hdd3_temp
$status_hdd4_temp
$status_nas_temp
";
//echo "$status_laufzeit_info_cut
$status_model_info";
?>

…anlegen muss man die Variablen/Profile selber…

Hier noch die Anleitung von Synology zu den MIBs:
http://global.download.synology.com/download/Document/MIBGuide/Synology_DiskStation_MIB_Guide.pdf

Hab auch mal bissel getestet, vielleicht als Beispiel oder Anregung interessant:

<?

$host   = "x.x.x.x";       //IP des Geräte das per SNMP ausgelesen werden soll
$community  = "public";          // Lesekennwort

//System
$data = snmpget("$host", "$community", ".1.3.6.1.4.1.6574.1.2.0");
$sys_temp = intval(str_replace("INTEGER: ", "", $data));
$data = snmpget("$host", "$community", ".1.3.6.1.4.1.6574.1.5.2.0");
$data = str_replace('"', "", $data);
$sys_serial = str_replace("STRING: ", "", $data);
$data = snmpget("$host", "$community", ".1.3.6.1.4.1.6574.1.5.3.0");
$data = str_replace('"', "", $data);
$sys_dms = str_replace("STRING: ", "", $data);
$data = snmpget("$host", "$community", ".1.3.6.1.4.1.6574.1.5.4.0");
$sys_update = intval(str_replace("INTEGER: ", "", $data));
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.25.3.3.1.2.196609");
$sys_cpu = intval(str_replace("INTEGER: ", "", $data));

$data = snmpget("$host", "$community", ".1.3.6.1.2.1.25.1.1.0");
$data = str_replace("Timeticks: (", "", $data);
$data = intval(substr($data, 0, 9));
$sys_uptime = ($data / 100 / 60 / 60);


// DISK
$data = snmpget("$host", "$community", ".1.3.6.1.4.1.6574.2.1.1.6.0");
$hdd1_temp = intval(str_replace("INTEGER: ", "", $data));
$data = snmpget("$host", "$community", ".1.3.6.1.4.1.6574.2.1.1.6.1");
$hdd2_temp = intval(str_replace("INTEGER: ", "", $data));

$data = snmpget("$host", "$community", ".1.3.6.1.2.1.25.2.3.1.5.41");
$data_max = intval(str_replace("INTEGER: ", "", $data));
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.25.2.3.1.6.41");
$data_ist = intval(str_replace("INTEGER: ", "", $data));
$hdd_free = ($data_max - $data_ist) * 4096 / 1024 / 1024 / 1024;


//Variablen befüllen
SetValue(50939 /*[2_Program\Test1\Synology\Synology\HDD_Temp1]*/,$hdd1_temp);
SetValue(42590 /*[2_Program\Test1\Synology\Synology\HDD_Temp2]*/,$hdd2_temp);
SetValue(52741 /*[2_Program\Test1\Synology\Synology\Sys_Temp]*/, $sys_temp);
SetValue(37582 /*[2_Program\Test1\Synology\Synology\Sys_DMS]*/, $sys_dms);
SetValue(16348 /*[2_Program\Test1\Synology\Synology\Sys_Update]*/, $sys_update);
SetValue(43304 /*[2_Program\Test1\Synology\Synology\Sys_Serial]*/, $sys_serial);
SetValue(51231 /*[2_Program\Test1\Synology\Synology\Sys_Uptime]*/, $sys_uptime);
SetValue(55122 /*[2_Program\Test1\Synology\Synology\HDD_frei]*/, $hdd_free);
SetValue(45766 /*[2_Program\Test1\Synology\Synology\Sys_CPU]*/, $sys_cpu);

?>

Grüße
galleto