Drucker-Status auslesen

Hallo - habt ihr vielleicht eine Idee, wie sich der Druckerstatus eines Netzwerkdruckers auslesen lässt? Wäre toll, wenn sich im Dashboard der Status der Toner, Photoleiter und Papiermagazine anzeigen ließe.

nette Grüße, Sven

könnte man da mit snmp ansetzen ?

Das wird’s wohl sein. Wenn ich das Richtig sehe, muss ich auf Port 162 traps empfangen können, wenn der Drucker ne Plaudertasche ist. Oder mit getbulk abfragen. Gibts dafür ein Schnüffelprogramm? Jedenfalls ersteinmal vielen dank für den Ansatz.

Ich lese meine Druckerdaten mit folgendem Script aus:

$host = "192.168.178.25";
$community = "public";

SetValueInteger(50947 /*[Zentral\LAN/WLAN\Drucker\Stand]*/,time());

// $ping = Sys_Ping($host, 1000);
// If ($ping <> 1) return;

$data = snmpget("$host","$community",".1.3.6.1.2.1.43.11.1.1.9.1.1"); //Tinte schwarz
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger(46800 /*[Zentral\LAN/WLAN\Drucker\Tinte_schwarz]*/,$data);

$data = snmpget("$host","$community",".1.3.6.1.2.1.43.11.1.1.9.1.2"); //Tinte gelb
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger(27807 /*[Zentral\LAN/WLAN\Drucker\Tinte_gelb]*/,$data);

$data = snmpget("$host","$community",".1.3.6.1.2.1.43.11.1.1.9.1.3"); //Tinte magenta
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger(22714 /*[Zentral\LAN/WLAN\Drucker\Tinte_magenta]*/,$data);

$data = snmpget("$host","$community",".1.3.6.1.2.1.43.11.1.1.9.1.4"); //Tinte cyan
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger(31038 /*[Zentral\LAN/WLAN\Drucker\Tinte_cyan]*/,$data);

$data = snmpget("$host","$community",".1.3.6.1.2.1.43.10.2.1.4.1.1"); //Zähler
$data = intval(str_replace("Counter32: ", "", $data));
SetValueInteger(43287 /*[Zentral\LAN/WLAN\Drucker\Seitenzahl]*/,$data);

Habe einen HP OfficeJet 8000 Pro

Gruß
Thorsten

Cool. Genauso hab ich nur das vorgestellt. Mal sehn, ob das auch mit meinem Epson Aculaser klappt, werde es Anfang der Woche ausprobieren. Vielen Dank.

Coole Idee, werde ich auch mal ausprobieren.

Auslesen über einen MIB Browser z.b. iReasoning. Gibt eine 30 Tage Demo.

Dann mit Walk und die Subtrees durch gehen. Ist wenn man aber nicht die genaue Beschreibung hat ein wenig Kaffeesatz lesen. Ich habe das gerade mal für meinen Espon Laser gemacht. Funktioniert.

Hallo Thorsten,

ich habe bisher die Website des HP Color LaserJet 2600n so ausgelesen und damit die aktueller Tonerstände bekommen:

<?

If (getValueBoolean(40903 /*[LAN\Netzwerk-Daten\HP ColorLaserJet 2600n]*/ ) == true)
	{
	$Antwort = file_get_contents("http://192.168.178.24/SSI/device_status_info.htm");

	$DruckerSchwarzArray = get_mark($Antwort, "KASSETTE FÜR SCHWARZ     *</font></td>");
		$DruckerSchwarz = $DruckerSchwarzArray[0];
	$DruckerGelbArray = get_mark($Antwort, "KASSETTE FÜR GELB     *</font></td>");
		$DruckerGelb = $DruckerGelbArray[0];
	$DruckerZyanArray = get_mark($Antwort, "KASSETTE FÜR ZYAN     *</font></td>");
		$DruckerZyan = $DruckerZyanArray[0];
	$DruckerMagentaArray = get_mark($Antwort, "KASSETTE FÜR MAGENTA     *</font></td>");
		$DruckerMagenta = $DruckerMagentaArray[0];

	SetValueString(38375 /*[LAN\HP ColorLaserJet 2600n\Kassette Schwarz]*/ , $DruckerSchwarz);
	SetValueString(43523 /*[LAN\HP ColorLaserJet 2600n\Kassette Magente]*/ , $DruckerMagenta);
	SetValueString(37002 /*[LAN\HP ColorLaserJet 2600n\Kassette Zyan]*/ , $DruckerZyan);
	SetValueString(52174 /*[LAN\HP ColorLaserJet 2600n\Kassette Gelb]*/ , $DruckerGelb);

	$Datum = GetValueString(23632 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelles Datum]*/ );
	$Uhrzeit = GetValueString(37001 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelle Uhrzeit]*/ );
	SetValueString(48292 /*[LAN\HP ColorLaserJet 2600n\Letzte Aktualisierung]*/ , $Datum." ".$Uhrzeit);
	}

// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu durchsuchende Gesamtstring,
// in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings und das Ende des zu suchende Abschnittes. Beispiel für den Text "<div>*</div></li>"
function get_mark($string,$mark)
{
    $ausgabe = array();
    $template = explode("*",$mark);
    $mark = $template[0];
    $end = $template[1];
    $string = strstr($string,$mark);

    $temp = explode($mark,$string);
    $a = 1;
        foreach ($temp as $tempx)
                    {
                    $tempx = explode($end,$tempx);
                    $tempx = $tempx[0];
                    if ($tempx)
                            {
                            array_push ($ausgabe,$tempx);
                            }
                    }
    return $ausgabe;
}


?>

Da Deine Version (ich kenne den Ansatz schon vom Thread der Switch-Auslesung , wußte aber nicht das er „übertragbar“ ist) interessanter erscheint, da ich dort interessantere Daten ziehen kann, habe ich Dein Skript nun auch bei mir ausprobiert. Leider bekomme ich für die Toner-Stände ganz andere Zahlen als auf der Website des Druckers…:confused:
Woran kann das liegen?

Joachim

passen denn die werte überhaupt? bei meinem epson kann ich die füllstände so abfragen aber der wert für gelb entspricht dem von schwarz.

Hallo Thorsten,

danke für das Skript.

Da ich in meinem Heimnetzwerk einige Geräte habe die sich per SNMP abfragen lassen habe ich mich gleich einmal hingesetzt und getestet. Bis auf den Eintrag für den Seiten haben bei meinem OKI 5600 DN auch alle gepasst.

Um es dem Einen oder Anderen leichter zu machen habe ich das Skript um einen Installer ergänzt. Sollte selbsterklärend sein. Bis auf die ersten 4 Einträge und natürlich eine evtl. Anpassung der MIB-Einträge braucht nicht geändert zu werden.

<?
$host   = "192.168.0.20";       //IP des Geräte das per SNMP ausgelesen werden soll
$community  = "public";          // Lesekennwort
$dummy_name = "Drucker Status";     // Name der Dummy-Instanz
$intervall  = 60;                   // Anfrageintervall in Minuten
//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];
//Installer
if ($IPS_SENDER == "Execute")
{
    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Auslese-Skript");
    $parentObject = IPS_GetObject($parentID);
    if ($parentObject['ObjectType'] !== 1)
    {
        $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($instanceID, $parentID);
        $parentID = $instanceID;
        IPS_SetParent($IPS_SELF, $parentID);
        IPS_SetName($instanceID, $dummy_name);
        IPS_SetIcon($instanceID, "Gauge");
    }
    IPS_SetScriptTimer($IPS_SELF, $intervall*60); // Anfrageintervall
    if(!IPS_VariableProfileExists(".TonerLevel")) {
       IPS_CreateVariableProfile(".TonerLevel", 1);
       IPS_SetVariableProfileText(".TonerLevel", "", " %");
       IPS_SetVariableProfileDigits(".TonerLevel", 0);
       IPS_SetVariableProfileIcon(".TonerLevel",  "Battery");
    }
    if(!IPS_VariableProfileExists(".PagesCount")) {
       IPS_CreateVariableProfile(".PagesCount", 1);
       IPS_SetVariableProfileText(".PagesCount", "", " Seiten");
       IPS_SetVariableProfileDigits(".PagesCount", 0);
       IPS_SetVariableProfileIcon(".PagesCount",  "Information");
    }
}
 
$ping = Sys_Ping($host, 1000);
If ($ping <> 1) return;
$vidblack  = CreateVariableByName($parentID, "Schwarz",   1, 1, ".TonerLevel");
$vidcyan  = CreateVariableByName($parentID, "Cyan",    1, 2, ".TonerLevel");
$vidmagenta = CreateVariableByName($parentID, "Magenta",   1, 3, ".TonerLevel");
$vidyellow  = CreateVariableByName($parentID, "Gelb",    1, 4, ".TonerLevel");
$vidpages  = CreateVariableByName($parentID, "Seitenanzahl",  1, 5, ".PagesCount");
 
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.9.1.1"); //Tinte schwarz
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger($vidblack, $data);
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.9.1.2"); //Tinte gelb
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger($vidyellow, $data);
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.9.1.3"); //Tinte magenta
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger($vidmagenta, $data);
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.9.1.4"); //Tinte cyan
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger($vidcyan, $data);
$data = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.9.1.9"); //Zähler
$data = intval(str_replace("INTEGER: ", "", $data));
SetValueInteger($vidpages, $data);
function CreateVariableByName($id, $name, $type, $position, $profile="", $hidden=false)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetPosition($vid, $position);
        IPS_SetHidden($vid, $hidden);
        IPS_SetVariableCustomProfile($vid, $profile);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}
 
?>

Hallo!

Habe einen Brother MFC-6490CW.

Leider übergibt er mir die Daten nicht und meldet immer:

Fatal error: Call to undefined function snmpget() in [TEST\Drucker\Status1\Drucker Status\Auslese-Skript] on line 47

Auf Line 47 steht bei mit der Befehl:
$data = snmpget("$host", „$community“,".1.3.6.1.2.1.43.11.1.1.8.1.1"); //Tinte schwarz

Gibt es bei dem Drucker diese Adresse gar nicht? bzw wie kann ich das prüfen?

Gruß
marc

Hast Du auch die php_snmp.dll in den extensions-Ordner gelegt?

Uff, da bräuchte ich eine „doofmann“-anleitung…sorry bin eher der elektroniker als der programmierer…vlt haben ja noch mehr das problem…
danke schonmal :wink:

Anhang entpacken, die Datei in das ext-Verzeichnis von IP-Symcon.

IP-Symcon einmal beenden und neu starten.

php_snmp.rar (111 KB)

Hallo Leute,

bei mir klappt das mal wieder nicht so richtig…:wink:

Ich habe das Beispiel von oben mal so für mich angepasst (Ausschnitt für Farbe Schwarz):

$data1 = snmpget("$host","$community",".1.3.6.1.2.1.43.11.1.1.8.1.1"); //Tinte schwarz
$data1 = intval(str_replace("INTEGER: ", "", $data1));
$data2 = snmpget("$host","$community",".1.3.6.1.2.1.43.11.1.1.9.1.1"); //Tinte schwarz
$data2 = intval(str_replace("INTEGER: ", "", $data2));
$TonerSchwarz = $data2/$data1*100;
echo $TonerSchwarz.", ";

Als Ergebnis kommt bei mir für meinen HP Color Laser Jet 2600n dann 8% in der Webansicht des Druckers wird jedoch 9% angezeigt (ist vielleicht nicht so dramatisch, war vor ein paar Tagen jedoch noch 14% zu 24%…). Für die Farben bekommt man im Skript auf 95%, 97.5%, 95% - auf der Website wird jedoch dreimal 97% angezeigt.:confused: Die Zahlen aus der Webansicht des Druckers erscheinen m.E. überhaupt nicht auf wenn man mit SnmpWalk schaut was „so geht“.

Kann mir jemand erklären, wie es zu diesen Abweichungen kommen kann?

Joachim

Ich würde sagen das Du die falschen Parameter abfragst.

Wirklich seltsam.

Habe es für Uwe (bmwm3) nach dem selben Schema gemacht da HP-Drucker ja 2 Werte liefern. Einmal die Kapazität und das andere mal die Restkapazität des Toners.

$data = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.9.1.1"); //Tinte schwarz
$data1 = snmpget("$host", "$community", ".1.3.6.1.2.1.43.11.1.1.8.1.1"); //Tinte schwarz
$data = intval(str_replace("INTEGER: ", "", $data));
$data1 = intval(str_replace("INTEGER: ", "", $data1));
SetValueInteger($vidblack, 100*$data/$data1);

Bis auf das die Reihenfolge der zugewiesenen OIDs eine andere ist haben wir hier die selbe Formel.

Restkapazität / Kapazität * 100

Hallo Werner,

und passen die Ergebnisse von Webansicht des Druckers und das Berechnungsergebnisse bei Dir übereinander?

Joachim

Klar, sonst hätte ich es hier nicht geschrieben. :slight_smile:

Ich glaube der Drucker von Uwe hat die Bezeichnung HP CP1515, die MIB bzw. deren OIDs sollten insbesondere bei einem Herstellern immer die selben sein.

Hallo Werner,

hier mal ein Auszug von dem - wie ich meine - relevanten Bereich vom „SmnpWalk“:


OID=.1.3.6.1.2.1.43.11.1.1.2.1.1, Type=Integer, Value=1
OID=.1.3.6.1.2.1.43.11.1.1.2.1.2, Type=Integer, Value=2
OID=.1.3.6.1.2.1.43.11.1.1.2.1.3, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.2.1.4, Type=Integer, Value=4
OID=.1.3.6.1.2.1.43.11.1.1.3.1.1, Type=Integer, Value=1
OID=.1.3.6.1.2.1.43.11.1.1.3.1.2, Type=Integer, Value=2
OID=.1.3.6.1.2.1.43.11.1.1.3.1.3, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.3.1.4, Type=Integer, Value=4
OID=.1.3.6.1.2.1.43.11.1.1.4.1.1, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.4.1.2, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.4.1.3, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.4.1.4, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.5.1.1, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.5.1.2, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.5.1.3, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.5.1.4, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.11.1.1.6.1.1, Type=OctetString, Value=Black Toner Cartridge HP Q6000A
OID=.1.3.6.1.2.1.43.11.1.1.6.1.2, Type=OctetString, Value=Cyan Toner Cartridge HP Q6001A
OID=.1.3.6.1.2.1.43.11.1.1.6.1.3, Type=OctetString, Value=Magenta Toner Cartridge HP Q6003A
OID=.1.3.6.1.2.1.43.11.1.1.6.1.4, Type=OctetString, Value=Yellow Toner Cartridge HP Q6002A
OID=.1.3.6.1.2.1.43.11.1.1.7.1.1, Type=Integer, Value=13
OID=.1.3.6.1.2.1.43.11.1.1.7.1.2, Type=Integer, Value=13
OID=.1.3.6.1.2.1.43.11.1.1.7.1.3, Type=Integer, Value=13
OID=.1.3.6.1.2.1.43.11.1.1.7.1.4, Type=Integer, Value=13
OID=.1.3.6.1.2.1.43.11.1.1.8.1.1, Type=Integer, Value=50
OID=.1.3.6.1.2.1.43.11.1.1.8.1.2, Type=Integer, Value=40
OID=.1.3.6.1.2.1.43.11.1.1.8.1.3, Type=Integer, Value=40
OID=.1.3.6.1.2.1.43.11.1.1.8.1.4, Type=Integer, Value=40
OID=.1.3.6.1.2.1.43.11.1.1.9.1.1, Type=Integer, Value=4
OID=.1.3.6.1.2.1.43.11.1.1.9.1.2, Type=Integer, Value=38
OID=.1.3.6.1.2.1.43.11.1.1.9.1.3, Type=Integer, Value=39
OID=.1.3.6.1.2.1.43.11.1.1.9.1.4, Type=Integer, Value=38
OID=.1.3.6.1.2.1.43.12.1.1.2.1.1, Type=Integer, Value=1
OID=.1.3.6.1.2.1.43.12.1.1.2.1.2, Type=Integer, Value=2
OID=.1.3.6.1.2.1.43.12.1.1.2.1.3, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.12.1.1.2.1.4, Type=Integer, Value=4
OID=.1.3.6.1.2.1.43.12.1.1.3.1.1, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.12.1.1.3.1.2, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.12.1.1.3.1.3, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.12.1.1.3.1.4, Type=Integer, Value=3
OID=.1.3.6.1.2.1.43.12.1.1.4.1.1, Type=OctetString, Value=black
OID=.1.3.6.1.2.1.43.12.1.1.4.1.2, Type=OctetString, Value=cyan
OID=.1.3.6.1.2.1.43.12.1.1.4.1.3, Type=OctetString, Value=magenta
OID=.1.3.6.1.2.1.43.12.1.1.4.1.4, Type=OctetString, Value=yellow

Von daher denke ich schon, dass ich die richtigen Werte habe. Vergleicht man den reelen mit den Werten, den man dieser OID in den zugänglichen Publikationen zuschreibt passt es eigentlich…

Ich kann mir den Unterschied nicht erklären…:confused:

Joachim