Neues Modul CUPS_Switch: Schalte ein Device ein bei neuem Druckauftrag

Begonnen von marvin78, 08 Oktober 2015, 14:59:18

Vorheriges Thema - Nächstes Thema

marvin78

Das hier ist ein weiteres Modul, bei dessen Entwicklung ich ein wenig über ein paar Aspekte der Modulentwicklung in FHEM lernen konnte. Das ganze kann man auch mit einer einfachen und sehr kurzen sub in der myUtils und einem at lösen, ich habe es jedoch in ein Modul unter Verwendung von Blocking.pm verpackt. Vielleicht hat jemand Interesse daran.

Das Modul definiert ein Device, welches einen CUPS* Drucksystem benötigt. CUPS muss auf dem FHEM Server installiert sein. Optimalerweise muss auch ein Drucker in CUPS eingerichtet sein. Das CUPS_Switch Device pollt die CUPS Auftragsliste nach Druckaufträgen für einen bestimmten Drucker und schaltet bei Vorhandensein eines Auftrags einen Schalter, eine Steckdose oder was auch immer benötigt wird, um den Drucker mit Strom zu versorgen. Nach einer einstellbaren Zeit wird das Device wieder ausgeschaltet. Das Modul erkennt dabei, ob das Device schon vor dem Auftrag eingeschaltet war, sodass das Device nicht ausgeschaltet wird, falls es vorher manuell eingeschaltet wurde.

Ein CUPS_Switch Device wird folgendermaßen definiert:

define <NAME> CUPS_Switch <CUPS-Printer-Name> <Switch-Device>[:<onCmd>:<offCmd> <host> <port>]


       
  • <CUPS-Printer-Name> ist der name des Druckers in CUPS (genau, kein Regex)
  • <Switch-Device> ist das zu schaltene Device
  • <onCmd> ist das on-Kommando für das Device (optional - default ist on)
  • <offCmd> ist das off-Kommando für das Device (optional - default ist off)
  • <host> kann ein entfernter CUPS Server sein oder auch localhost. Default ist localhost.
  • <port> ist optional und by default 631
Doku befindet sich im Modul.

Support für CUPS gibt es im Netz zu Hauf. Hier leider nicht.

Installation:

update all https://raw.githubusercontent.com/marvin78/FHEM-CUPS_Switch/master/controls_CUPS_Switch.txt

Download: https://github.com/marvin78/FHEM-CUPS_Switch


*CUPS ist das auf Standards basierte, Opensource-Drucksystem, welches von Apple für Mac OS® X und andere UNIX®-ähnliche Betriebssysteme entwickelt wird.

hawkeyexp

Hi,

ich bin durch Zufall über dein Modul gestolpert da ich noch paar Kleinigkeiten für meine "gebastelte" Lösung in myutils gesucht habe.
Das geniale: du hast als Modul geschreiben was ich in myutils auch veranstaltet habe - coole sache !
Allerdings hab ich noch die ein oder andere Anregung:
Du solltest noch eine Option einbauen damit auch ein Remote-Cups-Host angesprochen werden kann - wie wäre es du gibst immer bei der abfrage -h 127.0.0.1 mit falls kein Host im Modul definiert wird - und wenn doch übernimmst du die IP des gesetzten Hosts (-h 192.168.x.x)?
Ich hatte auch meine liebe Not mit den HP-Traibern unter Linux - in meinem Fall habe ich festgestellt, dass das Backend es garnicht mag wenn der USB-Drucker kommt und geht ("/usr/lib/cups/backend/hp failed " z.B. durch die Funksteckdose). Hier habe ich mir beholfen in dem ich ein kleines C-Programm nutze welches einen Reset des USB-Ports macht - und schon geht die Sache. Hier wäre es also Praktisch wenn man dem Modul noch einen Scriptaufruf etc. mitgeben könnten?

PS: Eine Statusausgabe in Fhemweb wäre noch praktisch - also die Info "Druckt" "Wartet" etc.

Bin mal gespannt was du davon hällst :-)

marvin78

Danke für die Rückmeldung.

Wie ich oben schon schrieb, ist sowas sicher einfacher und "billiger" mit ein paar subs (um es Non-Blocking zu haben, sonst reicht eine) zu lösen.

Das mit dem Remote-Host habe ich oben mal eingefügt (neue Version angehängt, Doku verändert).

Wenn man es genau nimmt, haben die Statusabfragen in einen .*_Switch Modul nicht zwingend etwas zu suchen. Außerdem "lügt" man bei pollenden Modulen hier auch sehr häufig. Ich denke drüber nach.

Das mit dem Skript musst du mir genauer erklären. Was genau machst du da?

marvin78

Neue Version im ersten Post. Poll Intervall und die Zeit bis zum Aussschalten werden nun über Attribute eingestellt, nicht mehr über das Define.

knopf_piano

Hi,
ich klimper das über snmp-status-requests ab, kann mal bei Bedarf einen Beispielcode anhängen
zotac nano mit proxmox und ganz viel zeug drauf

aplatac

Hi,

könnt bitte jemand ein Beispiel angeben, meine CUPS-Warteschlange ist immer "0" obwohl eine Testseite drin hängt...
mein Drucker hätte folgende Adresse:
http://192.168.1.103:631/printers/HP_LaserJet_8150_Series
ich habe es mit und ohne "/printers/" versucht, ohne Erfolg, der Port wird ja automatisch angehängt.

danke :-)

knopf_piano

Mein Netzwerkdrucker hängt an einer homematic-steckdose (device: Printer_Vcc)
Alle x sec abfragen, ob in cups-queue was drin ist

###################################################
# Check cups-printer-queue -> switch on
###################################################
define Tmr_ActivatePrinterOnCupsQueue at +*00:00:30 {myCupsAbf("HP_Officejet_5740_series", "Printer_Vcc");;}

wenn nix drin ist (idle) dann abschalten

###################################################
# Check cups-printer-queue -> switch on
###################################################
define Tmr_CheckCupsStatus at +*00:00:30 {\
  if(ReadingsVal('Printer_Vcc', 'state', '') eq "on"){\
  {myCupsStatusIs("192.168.50.51", "Printer_Vcc");;}\
  }\
}


99_myUtils:
Drucker einschalten (http://forum.fhem.de/index.php/topic,10070.msg201697.html#msg201697)
...und über snmp-Abfrage, ob der drucker idle ist, wieder abschalten.

#Cups Drucker ein
sub myCupsAbf($$)
{
    my ($printer,$dummy) = @_;
    my $cupsws.=`lpstat -o $printer` ;
    if($cupsws =~ /$printer/) {fhem ("set $dummy on")};

    #if($cupsws =~ /$printer/) {fhem ("set $dummy on-for-timer $ontime")};
}

#Cups Druckerabfrage auf status idle/busy/timeout
sub myCupsStatusIs($$)
{
  my ($printer_ip,$dummy) = @_;
  my %hrPrinterStatus = (
1 => "other(1)",
2 => "unknown(2)",
3 => "idle(3)",
4 => "printing(4)",
5 => "warmup(5)"
);
  my $cupsws.=`snmpwalk -cC -v 1 -c public $printer_ip 1.3.6.1.2.1.25.3.5.1.1.1` ;
  if($cupsws =~ m/INTEGER/)
  {
    my (my $tmp, my $val) = split(/INTEGER:/, $cupsws);
    chomp($val);
    $val =~ s/ //g;
    #print "$val\n";
    #print "$hrPrinterStatus{$val}\n";
    if($val =~ m/3/) {fhem "set $dummy off";}
  }
  else
  {
    # this is for to get a definite active printer and not hit the 10s timer window to switch off
    sleep 40;
    #print "no printer found\n";
  }
}
zotac nano mit proxmox und ganz viel zeug drauf

marvin78

Zitat von: aplatac am 21 Oktober 2015, 21:32:07
Hi,

könnt bitte jemand ein Beispiel angeben, meine CUPS-Warteschlange ist immer "0" obwohl eine Testseite drin hängt...
mein Drucker hätte folgende Adresse:
http://192.168.1.103:631/printers/HP_LaserJet_8150_Series
ich habe es mit und ohne "/printers/" versucht, ohne Erfolg, der Port wird ja automatisch angehängt.

danke :-)

Dein Druckername in CUPS sollte keine Leerzeichen beinhalten. Das wird vom Modul nicht berücksichtigt. Trenner für das Define ist das Leerzeichen.

Eine Definition ohne Leerzeichen würde für dich so aussehen

define NAME CUPS_Switch HP_LaserJet_8150_Series Steckdose 192.168.1.103

@knopf_piano: Deine Lösung ist sicher prima, das hat hier jedoch wenig zu suchen. Hier geht es um das CUPS_Switch Modul. Danke.

knopf_piano

Werd in kürze mal das neue Modul probieren und dann mal schauen, ob ich umsteig.
zotac nano mit proxmox und ganz viel zeug drauf

aplatac

hm, so hab ich es gemacht:

define autocups CUPS_Switch HP_LaserJet_8150_Series HM_StDrucker 192.168.1.103

klappt aber nicht, der Job hängt in Cups fest (Drucker z.Z. nicht erreichbar) aber das
Modul meint es wäre nichts in der Warteschlange. Ich habe unter Cups alles was mit
Remonte zu tun hat erlaubt, aber irgendwie kann FHEM nichts sehen auf dem Cups.

marvin78

Ich habe die remote Variante nie getestet. Es ist möglich, dass die nicht überall funktioniert. Es ist schwer für mich, zu ermitteln, wo es hier hakt. ich nehme an, dass es ein Rechteproblem sein könnte.

Mach mal ein

lpstat -o

auf dem System, auf dem CUPS installiert ist und schaue ob dort wirklich ein Auftrag zum Druckernamen

ZitatHP_LaserJet_8150_Series

auftaucht.

BTW: Hast du mal ins Log geschaut? Kann CUPS_Switch überhaupt auf den Host zugreifen? Dreh verbose mal kurz auf 5 und schaue nach.

aplatac

Hi,
also zunächst musste ich feststellen, dass man den cups-client auf dem FHEM braucht, das hatte ich nicht auf dem Schirm, mein FHEM-Server ist eine VM mit minimal debian. Also client nachgeschoben aber das wars noch nicht,das log sagt:
lpstat: invalid destination name in list "HP_LaserJet_8150_Series"

auf der Cups-Server sehe ich mit lpstat -o das an die Aufträge je eine laufende Nummer gehängt wird:
"HP_LaserJet_8150_Series-4" könnte es das sein?"

marvin78

Die laufende Nummer ist ok. Es wird der Bestandteil geprüft. Eigentlich sollte es auch remote gehen. Aber wie ich schon schrieb, das ist ungetestet.

Es könnte auch an den Unterstrichen liegen. Ich habe das gerade nicht im Blick, weil ich nicht zu Hause bin. Probiere doch mal einen Druckernamen wie:

HPLaserJet8150Series

aplatac

also erreichen kann er jetzt den Cupsserver wie es aussieht aber den Job sieht er scheinbar nicht

2015.10.22 20:51:49 4: name: /fhem?detail=autocups / RL:2293 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2015.10.22 20:51:49 4: FHEMWEB:192.168.1.21:63312 GET /fhem?cmd={AttrVal(%22autocups%22,%22room%22,%22%22)}&XHR=1; BUFLEN:0
2015.10.22 20:51:49 5: Cmd: >{AttrVal("autocups","room","")}<
2015.10.22 20:51:49 4: name: /fhem?cmd={AttrVal(%22autocups%22,%22room%22,%22%22)}&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2015.10.22 20:51:49 4: FHEMWEB:192.168.1.21:63312 GET /fhem?XHR=1&inform=type=status;filter=autocups;since=1445539908;fmt=JSON×tamp=1445539882530; BUFLEN:0
2015.10.22 20:51:50 4: BlockingCall created child (30616), uses telnetForBlockingFn to connect back
2015.10.22 20:51:50 4: CUPS_Switch (autocups) - DoGetSpool with LaserJet and host 192.168.1.103:631
2015.10.22 20:51:50 4: Connection accepted from telnet:127.0.0.1:54680
2015.10.22 20:51:50 5: Cmd: >{CUPS_Switch_ProcessGetSpool('autocups|LaserJet|absent')}<
2015.10.22 20:51:50 4: CUPS_Switch (autocups) - ProcessGetSpool
2015.10.22 20:51:53 4: Connection closed for FHEMWEB:192.168.1.21:63312: EOF
2015.10.22 20:51:53 4: Connection accepted from FHEMWEB:192.168.1.21:63313
2015.10.22 20:51:53 4: FHEMWEB:192.168.1.21:63313 GET /fhem/FileLog_logWrapper?dev=Logfile&type=text&file=fhem-2015-10.log; BUFLEN:0

aplatac

wenn ich vom FHEM-Server aus:

patrick@debian:~$ lpstat -h 192.168.1.103:631 -o 8150ND
8150ND-14               admin             1024   Fr 23 Okt 2015 00:00:07 CEST

ausführe, so werden anstehende Jobs angezeigt. Nicht wundern, habe noch mal den Drucknamen
geändert. Ich hatte den fhem-benutzer in Verdacht aber auch als fhem bekomme ich die Warteschleife angezeigt.