Tinten- oder Tonerstand abfragen mit Cups/ipptools

Begonnen von caldir65, 29 Oktober 2021, 21:46:21

Vorheriges Thema - Nächstes Thema

caldir65

Moin,

ich habe jetzt einmal, mit Unterstützung aus dem Forum, eine relativ universelle Tinten- oder Tonerstands-Abfrage mit Hilfe von Cups und ipptool.
Ausgangspunkt war dieser Artikel in der c't 10/2015 S.164 von Gerhard Muth und Dusan Zivadinovic.

Auf einem Linux-System ist das ipptool bereits vorhanden (sofern Cups installiert ist), unter Windows kann man es z.B. hier finden.
Weiterhin benötigt man noch die Listings aus dem c't-Artikel, die ich hier mit freundlicher Genehmigung von Dusan Zivadinovic als Paket hier mit anhänge.

Als erstes benötigt man die uri des Druckers, um ihn darunter ansprechen zu können. Sehr oft ist dies z.B.
ipp://<IP des eigenen Druckers>/ipp

Um den Tintenstand jetzt zu ermitteln, bedient man sich der im Paket enthaltenen Datei marker.ipp
desktop:~/tmp$ ipptool -tv ipp://192.168.1.121/ marker.ipp
"marker.ipp":
    Get-Printer-Attributes:
        attributes-charset (charset) = utf-8
        attributes-natural-language (naturalLanguage) = en
        printer-uri (uri) = ipp://192.168.1.121:631/
        requested-attributes (1setOf keyword) = marker-names,marker-levels
    marker                                                               [PASS]
        RECEIVED: 221 bytes in response
        status-code = successful-ok (successful-ok)
        attributes-charset (charset) = utf-8
        attributes-natural-language (naturalLanguage) = en
        marker-names (1setOf nameWithoutLanguage) = Photo Black ink,Cyan ink,Magenta ink,Yellow ink,Black ink
        marker-levels (1setOf integer) = 26,14,7,16,89

In diesem Beispiel sieht man das Ergebnis von meinem XP-7100. Bei anderen Druckern ist das Ergebnis davon abhängig, in wieweit der Hersteller ipp implementiert hat.
Sollte hier jetzt nichts kommen, kann man jetzt noch einmal schauen, ob die Drucker Uri stimmt (steht z.T. auch in der Druckereinrichtung in der Systemsteuerung, beginnt  mit ipp://<ip des Druckers> oder mit ipps://<ip des Druckers>
Es kann auch sein, daß der eigene Drucker leider kein ipp unterstützt ...

Jetzt benötigt man einen Dummy, um das Ergebnis auch als Device zu haben
define ipp_EPSON_XP7100

Wenn man jetzt das ipptool-Ergebnis in eine Datei umleitet, kann man diese Daten wiederum in die Readings unseres Dummy übertragen. Dafür wird aber noch eine Funktion in der 99_MyUlils.pm benötigt
sub ipp_fill_EPSON_XP7100 {
   my $filename = '/home/pi/tmp/EPSON_XP7100.txt';
   my ($err,@content) = FileRead({ FileName => $filename, ForceType => 'file' });
   return $err if $err;
   
   foreach my $line ( @content ){
      next if $line !~ /=/;
      $line =~ s/^\s+|\s+$//g;
      my ($readingName,$value) = split (/=/,$line);
      ($readingName,undef) = split (/\(/,$readingName);
      $readingName =~ s/^\s+|\s+$//g;
      $readingName = makeReadingName($readingName);
      $value =~ s/^\s+|\s+$//g;
      fhem("setreading ipp_EPSON_XP7100 $readingName $value");
   }
   my @colors = split(/,/,ReadingsVal('ipp_EPSON_XP7100','marker-names',''));
   my @levels = split(/,/,ReadingsVal('ipp_EPSON_XP7100','marker-levels',''));
   for (my $i = 0; $i <= $#colors; $i++) {
      my $colorName = $colors[$i];
      $colorName =~ s/.ink//i;
      $colorName = makeReadingName($colorName);
      fhem("setreading ipp_EPSON_XP7100 $colorName $levels[$i]");
   }
   return;
}


Mit {ipp_fill_EPSON_XP7100} werden die Readings angelegt oder aktualisiert.

Als nächstes habe ich ein Script angelegt, welches den Tintenstand abfragt und anschließend über die Konsole gleich das Ergebnis an fhem übergibt, erstellt. Weiter lasse ich dieses Script regelmäßig über einen cron-Eintrag auf dem fhem- Rechner im Hintergrund ausführen.
ipptool -tv ipp://192.168.1.121/ /home/pi/bin/marker.ipp > /home/pi/tmp/EPSON_XP7100.txt
perl /opt/fhem/fhem.pl 7072 passwort "{ipp_fill_EPSON_XP7100}"
(Um die Werte mit Script wie hier beschrieben zu übergeben, muß der Zugang über Telnet in fhem möglich sein...)

Jetzt habe ich schon einmal ein Device, welches die Tintenstände in den Readings beinhaltet. Um diese aber intuitiver ablesen zu können, habe ich noch mit Hilfe von DevStateIcons mir das Ergebnis visualisiert, dabei werden die einzenen Werte in der jeweiligen Farbe dargestellt, der Füllgrad ist über den Ring und die Zahl abzulesen:
attr ipp_EPSON_XP7100 devStateIcon {package ui_Table;
ring(::ReadingsVal("ipp_EPSON_XP7100","Magenta",0),0,100,330,330,'magenta',"100,1",undef,0,1).
ring(::ReadingsVal("ipp_EPSON_XP7100","Cyan",0),0,100,200,200,'cyan',"100,1",undef,0,1).
ring(::ReadingsVal("ipp_EPSON_XP7100","Yellow",0),0,100,60,60,'yellow',"100,1",undef,0,1).
ring(::ReadingsVal("ipp_EPSON_XP7100","Black",0),0,100,0,0,'black',"100,1",undef,0,1,"100,100,100,100,100").
ring(::ReadingsVal("ipp_EPSON_XP7100","Photo_Black",0),0,100,10,10,'ph-black',"100,1",undef,0,1,"100,100,100,100,100")
}


Vielleicht kann es ja jemand gebrauchen ...

Mein Dank gilt insbesondere den Usern betateilchen und Damian für ihre Unterstützung ...
Die "Entwicklung", die zu dieser hier vorgestellten Lösung geführt hat ist hier und hier zu finden.
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.