FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Sturi2011 am 06 Januar 2013, 21:06:57

Titel: Druckersteuerung
Beitrag von: Sturi2011 am 06 Januar 2013, 21:06:57
Hallo,

in Zeiten von Pads und Laptops usw. reifte bei mir den Entschluss einen Homeserver zu installieren.
Dieser stellt wie üblich auch über CUPS Airprint und LPD Drucker zur Verfügung. Um nun nicht trotzdem
jedes Mal in den Keller zum Drucker zu müssen habe ich dieses kleine einfache Script geschrieben.

cups.sh
#! /bin/sh
SpoolLength=$(lpstat -o)
SpoolLengthVal=$(expr length "$SpoolLength")
if [ "$SpoolLengthVal" != "0" ]
then echo "1"
else echo "0"
fi


In Fhem frage ich das ganze so ab:
define CUPSDM dummy
define AT_CUPS_Dummy at +*00:01:00 {fhem("set CUPSDM ".`/opt/fhem/cups.sh`)}


Jetzt kann man mit On-for-timer oder über Intertechno den Drucker anknipsen
und nach einigen Minuten leerer Warteschlange wieder aus.

Gruß Andreas
Titel: Aw: Druckersteuerung
Beitrag von: MarkusN am 06 Januar 2013, 21:48:36
Hallo Andreas,

danke führe diesen Codeschnipsel. Sowas ähnliches habe ich schon länger vor umzusetzen. Cups inclusive AirPrint läuft schon auf meinem Pi, jetzt fehlt nur noch ein Aktor.
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 21 September 2014, 19:50:53
Hallo allerseits,
möchte einmal meine Lösung vorstellen.
Da mir das sh script nicht gefallen hat und ich mich eh mal etwas mit PERL beschäftigen wollte, habe ich mal eine sub für die 99_myUtils gebastelt.

#Cups Druckerabfrage
sub
myCupsAbf($$$)
{
my ($printer,$dummy,$ontime) = @_;
my $cupsws.=`lpstat -o $printer` ;
if($cupsws =~ /$printer/) {fhem ("set $dummy on-for-timer $ontime")};
#if($cupsws =~ /^$/) {fhem ("set $dummy off")};
}


und das ganze wird mittels dieser Zeile in der .cfg (bei mir nun alle 59 Sekunden) ausgelöst:

define CupsAbfWerk at +*00:00:59 {myCupsAbf("HP_CLJ_2605dn_cups", "PC_Drucker_Werk_SW", "1800");;}

"HP_CLJ_2605dn_cups"  steht für den Druckernamen unter CUPS
"PC_Drucker_Werk_SW" steht für den Aktor der geschaltet werden soll
und die "1800" ist die Zeit für die der Drucker angeschaltet werden soll.

also diese drei Variabelen müssen angegeben werden.

Gruß
Ingo
Titel: Antw:Druckersteuerung
Beitrag von: LuckyLuis am 01 Oktober 2014, 21:47:36
Hallo,

bisher hatte ich die Lösung aus dem ersten Beitrag umgesetzt (allerding mit 3 Rechnern im Netzwerk, die nicht immer an sind), jetzt aber festgestellt, dass dadurch die Reaktionszeit von FHEM sich immens verschlechtert (Überprüft via apptime). Nachdem ich diese Lösung deaktiviert habe, ist mein System wieder nutzbar. Anscheinend blockieren die Anfragen das System. Wie kann man eigentlich in FHEM steuern, ob ein Funktion das System lahmlegt, solange es läuft oder oder kann man gar eine Funktionn Parallel aufrufen? Ist die aus dem vorigen Beitrag vorgeschlagene Lösung in Bezug auf Belastung besser?

Vielen Dank für Antworten.

LuckyLuis
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 02 Oktober 2014, 07:34:28
hi LL,
bei mir ist der per apptime gemessene max wert ca.100, andere funktionen brauchen da bedeutend länger. kannst ja mal die von mir gepostete lösung testen und per apptime überprüfen. dann hätte wir einen vergleichbaren wert.
gruß ingo
Titel: Antw:Druckersteuerung
Beitrag von: LuckyLuis am 07 Oktober 2014, 23:18:24
Hi automatisierer,

habe endlich Zeit gefunden, Deine Sub zu testen. Dabei habe ich festgestellt, dass mein größtes Laufzeitproblem mit einem lpstat -h ServerIP -o mit einem ausgeschalteten Rechner ist. Sprich lpstat läuft zu lange. Eine TimeOut-Funktion wie bei Ping gibt es bei lpstat nicht. Habe div. Dinge probiert (cpan Time::Out), aber auch dass hilft nicht (wahrscheinlich mache ich was falsch). Ansonsten funktioniert Deine Sub wie gedacht.


#Cups Druckerabfrage
sub
myCupsQuqueQuery($$$$)
{
my ($host,$printer,$dummy,$ontime) = @_;
my $cupsws.= timeout 1 => sub {`lpstat -h $host -o` ; };
if($cupsws =~ /$printer/) {
fhem ("set $dummy on-for-timer $ontime")
};
}


Vielleicht hat ja jemand eine Idee wegen dem Timeout ....

Viele Grüße

LL
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 08 Oktober 2014, 20:16:31
hab das mit den drei rechnern iwie überlesen. wie sieht deine konfiguration denn aus?
ich habe cups und fhem auf dem raspi laufen. meine pc's und laptops und auch die handys und tablets drucken an cups auf dem raspi und der schickt es weiter an meine drucker. daher läuft die abfrage "lpstat" quasi nur raspi intern und nicht an andere rechner. daher läuft die abfrage nicht ins leere.
Titel: Antw:Druckersteuerung
Beitrag von: LuckyLuis am 11 Oktober 2014, 22:22:17
Habe einen MacMini als Server laufen, wollte aber (da ich einen Netzwerk-Multifunktionsdrucker nutze), das jeder Client separat den Drucker ansprechen kann.
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Oktober 2014, 13:36:10
oh ha, der angebissene apfel des verderbens...[emoji12] ok,  das umstellen auf einen cups server wäre ja nicht allzu schwierig. und birgt jabauch keinerlei nachteile.

ansonsten müsstest du eventuell auf den rechnern nen script laufen lassen, welches via http befehl über fhem den drucker einschaltet... wäre mir aber zu kompliziert. da würd ich eher den cups server auf dem mini_mac_dings_server laufen lassen.
Titel: Antw:Druckersteuerung
Beitrag von: LuckyLuis am 27 Oktober 2014, 22:43:53
Hi,

Habe das jetzt über das Presence-Modul gelöst. Keine Verzögerungen mehr.
Titel: Druckersteuerung
Beitrag von: Spezialtrick am 11 Februar 2015, 22:14:21
Zitat von: automatisierer am 21 September 2014, 19:50:53
Hallo allerseits,
möchte einmal meine Lösung vorstellen.
Da mir das sh script nicht gefallen hat und ich mich eh mal etwas mit PERL beschäftigen wollte, habe ich mal eine sub für die 99_myUtils gebastelt.

#Cups Druckerabfrage
sub
myCupsAbf($$$)
{
my ($printer,$dummy,$ontime) = @_;
my $cupsws.=`lpstat -o $printer` ;
if($cupsws =~ /$printer/) {fhem ("set $dummy on-for-timer $ontime")};
#if($cupsws =~ /^$/) {fhem ("set $dummy off")};
}


und das ganze wird mittels dieser Zeile in der .cfg (bei mir nun alle 59 Sekunden) ausgelöst:

define CupsAbfWerk at +*00:00:59 {myCupsAbf("HP_CLJ_2605dn_cups", "PC_Drucker_Werk_SW", "1800");;}

"HP_CLJ_2605dn_cups"  steht für den Druckernamen unter CUPS
"PC_Drucker_Werk_SW" steht für den Aktor der geschaltet werden soll
und die "1800" ist die Zeit für die der Drucker angeschaltet werden soll.

also diese drei Variabelen müssen angegeben werden.

Gruß
Ingo

Hallo Ingo,

nach dem Umzug auf einen Cubietruck wollte ich auch die Druckersteuerung umbauen und deine Lösung ausprobieren. Leider bekomme ich es nicht hin. Folgendes habe ich die 99_myUtils.pm eingefügt:

package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}
##########################################################
#Cups Druckerabfrage
sub
myCupsAbf($$$)
{
my ($printer,$dummy,$ontime) = @_;
my $cupsws.=`lpstat -o $printer` ;
if($cupsws =~ /$printer/) {fhem ("set $dummy on-for-timer $ontime")};
#if($cupsws =~ /^$/) {fhem ("set $dummy off")};
}
1;


Ist der Aufbau korrekt? Habe die Infos von dieser Seite:

http://www.fhemwiki.de/wiki/99_myUtils_anlegen

Meine Definition in Fhem sieht so aus:

#################################################################################
##### Drucker Steuerung #####
### Drucker Steckdose ###
define FHEMduino_PT2262_12_29 FHEMduino_PT2262 0FF00FFF0F 0F F0
attr FHEMduino_PT2262_12_29 IODev FHEMduino
attr FHEMduino_PT2262_12_29 ITrepetition 9
attr FHEMduino_PT2262_12_29 alias Samsung ML-2240
attr FHEMduino_PT2262_12_29 devStateIcon on.*:black_Steckdose.on off.*:black_Steckdose.off
attr FHEMduino_PT2262_12_29 group Samsung ML-2240
attr FHEMduino_PT2262_12_29 room Wohnzimmer

define CupsAbfWerk at +*00:00:59 {myCupsAbf("samsung_ML-2240_Series", "FHEMduino_PT2262_12_29", "240");;}


Findest du/ihr meinen Fehler?
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Februar 2015, 07:39:03
Hallo Spezialtrick,
joa, sieht gut aus.

Ezähl mal ein weng mehr...
Was für ein Device willst du da Schalten, kann das überhaupt 'on-for-timer', oder kann es evtl. nur 'on' und 'off'?
Stimmt der Druckername? was für eine Antwort bekommst du, wenn du 'lpstat -p' auf der Konsole eingibst?
Wie sieht deine Installation aus? Hast du auf dem Cubietruck Cups als Druckerserver laufen?

Gruß
Ingo

Titel: Antw:Druckersteuerung
Beitrag von: Rohan am 12 Februar 2015, 08:18:37
Moins,

Zitat von: Spezialtrick am 11 Februar 2015, 22:14:21
Findest du/ihr meinen Fehler?

Welchen Fehler? Was genau funktioniert denn nicht? Du schreibst ja lediglich:

Zitat von: Spezialtrick am 11 Februar 2015, 22:14:21
Leider bekomme ich es nicht hin.

Also "etwas" mehr Input wird da schon benötigt.

Gruß
Thomas

Titel: Antw:Druckersteuerung
Beitrag von: Mitch am 12 Februar 2015, 09:21:22
Ich habe mal eine "etwas andere" Frage dazu: geht bei jamdn Aiprint mit CUPS und iOS 8?

Meine iDevices sehen zwar den Drucker, aber es wird nichts gedruckt  >:(
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Februar 2015, 09:25:32
eiprint hab ich nicht, ich nutze es aber mit android, dass funzt prima!
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 10:53:55
Zitat von: automatisierer am 12 Februar 2015, 07:39:03
Hallo Spezialtrick,
joa, sieht gut aus.

Ezähl mal ein weng mehr...
Was für ein Device willst du da Schalten, kann das überhaupt 'on-for-timer', oder kann es evtl. nur 'on' und 'off'?
Stimmt der Druckername? was für eine Antwort bekommst du, wenn du 'lpstat -p' auf der Konsole eingibst?
Wie sieht deine Installation aus? Hast du auf dem Cubietruck Cups als Druckerserver laufen?

Gruß
Ingo

Hallo Ingo, hallo Rohan!

Vielen Dank für eure Antworten. Scheinbar habe ich gestern Abend schon etwas geschlafen. ^^

Das Problem ist, dass der Drucker nicht von der Steckdose eingeschaltet wird, wenn ein Druckauftrag ansteht. Leider kann ich die Ursache des Problems nur bedingt einschränken.

Auf dem Cubietruck ist Cups installiert und der Drucker ist auch konfiguriert. Der Drucker heißt "samsung_ML-2240_Series". Wenn ich den Drucker manuell einschalte, kann ich auch ohne Probleme drucken.

Bei der vorgeschaltenen Funksteckdose des Druckers handelt es sich um eine simple ELRO-Funksteckdose, die über einen Fhemduino angesteuert wird. Auch diese funktioniert manuell und "On-for-timer" kann ich ebenfalls problemlos ausführen.

Das Einzige, das nicht funktioniert, ist das automatische Ein-/Ausschalten des Druckers bei anliegendem Druckauftrag.

Ausgabe von lpstat -p:

root@cubie:/# lpstat -p
printer PDF is idle.  enabled since Wed 11 Feb 2015 05:20:10 PM CET
printer samsung_ML-2240_Series is idle.  enabled since Wed 11 Feb 2015 05:22:23 PM CET
root@cubie:/#


Könnt ihr mit den Angaben etwas anfangen?




Bzgl. AirPrint und iOS8: Bei mir wird der Drucker vom iPhone nicht mal gefunden.
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 11:03:31
Komischerweise ändert sich die Ausgabe von "lpstat -p" auch bei anliegendem Druckauftrag nicht. Dabei dürfte der Drucker in diesem Moment doch nicht im "Idle" sein, oder?
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Februar 2015, 11:06:04
keine ahnung. wenn du mit lpstat -o fragst, werden die drucker angezeigt die aufträge in der warteschlange haben.

druckst du denn auch über den cubietruck? oder hast du am rechner noch die direkte verbindung zum drucker eingestellt?
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 11:26:31
"lpstat -o" gibt mir leider nichts aus. Auch nicht wenn ein Druckauftrag anliegt. Da stimmt doch irgendwas nicht.

Am PC habe ich natürlich alles auf den Cubie umgestellt.

Vllt. sollte ich CUPS komplett entfernen und neu aufsetzen. Gibts da einen Befehl für um alles zu entfernen?
Titel: Antw:Druckersteuerung
Beitrag von: Rohan am 12 Februar 2015, 11:35:26
Moins,

lpstat -p

ZitatShows the printers and whether they are enabled for printing. If no printers are specified then all printers are listed.

lpstat -o

ZitatShows the jobs queued on the specified destinations. If no destinations are specified all jobs are shown.

Wenn deine Ausgaben leer sind, dann ist mMn cups nicht auskonfiguriert. Kannst du denn über cups überhaupt drucken? Was passiert, wenn du den Drucker ausgeschaltet hast und du Druckaufträge abschickst? Wie sind dann die Ausgaben?

Zudem liefert "lpstat" ohne weitere Angabe nur Informationen für den "current user", also den, der gerade diesen Befehl aufruft => siehe Option "-u User".

Gruß
Thomas
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Februar 2015, 11:44:14
druck doch mal ne testseite von der cups konfigurationsseite aus aus.
wenn lpstat -o bei anstehendem druckauftrag nix ausgibt, dann druckst du nicht über cups.
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 12:29:02
Zitat von: Rohan am 12 Februar 2015, 11:35:26

Wenn deine Ausgaben leer sind, dann ist mMn cups nicht auskonfiguriert. Kannst du denn über cups überhaupt drucken? Was passiert, wenn du den Drucker ausgeschaltet hast und du Druckaufträge abschickst? Wie sind dann die Ausgaben?

Zudem liefert "lpstat" ohne weitere Angabe nur Informationen für den "current user", also den, der gerade diesen Befehl aufruft => siehe Option "-u User".

Gruß
Thomas

Wenn ich einen Druckauftrag abschicke und der Drucker dabei aus ist, ändert sich an den Ausgaben nichts. lpstat -o gibt weiterhin nichts aus.

Zitatdruck doch mal ne testseite von der cups konfigurationsseite aus aus.
wenn lpstat -o bei anstehendem druckauftrag nix ausgibt, dann druckst du nicht über cups.

Eine Testseite über Cups auszudrucken klappt überhaupt nicht. Bekomme folgende Fehlermeldung:

Testseite drucken Samsung_ML-2240_Series Error

Testseite konnte nicht gedruckt werden:

Unsupported format "application/vnd.cups-pdf-banner".


Wie kann ich Cups von meinem Cubie so entfernen, dass keinerlei Rest verbleiben? Denke dass es sinnvoll ist Cups vollständig neuzuinstallieren. Ich habe auch keinen Zugriff auf die Fehler-, Zugriffs- und Seitenprotokolle.

Reicht dieser Befehl aus:

sudo apt-get remove --purge cups cups-pdf python-cups
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Februar 2015, 12:33:27
ob sudo apt-get remove... reicht, könnte ich für dich googlen, mach ich aber nicht. ;-)

für die einrichtung von cups, empfehle ich dir das ubuntu wiki
einfach google: ubuntu cups
dann findest du es.
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 12:50:31
Brauchst nicht für mich google, aber ich finde leider nichts brauchbares...

Kannst du denn auf die Fehler-, Zugriffs- und Seitenprotokolle zu greifen?
Titel: Antw:Druckersteuerung
Beitrag von: automatisierer am 12 Februar 2015, 12:55:25
also das habe ich noch nicht versucht.
kommst du denn auf die konfigurationsseite von cups?
cubieIP:631 aus nem browser heraus.
fakt ist, dass du erst mal rechte verteilen musst um cups einzurichten. das steht aber alles sehr schön in dem ubuntu wiki.
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 13:01:24
Ja ich bin auf der konfigurationsseite. Habe gerade exakt das ubuntu wiki abgearbeitet. Also:

sudo apt-get install cups cups-client cups-bsd

sudo cupsctl --share-printers  --remote-admin --remote-printers

Und einen Drucker eingerichtet:

Beschreibung:   Samsung ML-2240 Series
Ort:                   Wohnzimmer
Treiber:           Samsung ML-2240 Series (grayscale, 2-sided printing)
Verbindung:   socket://192.168.178.1:9100
Einstellungen:   job-sheets=none, none media=na_letter_8.5x11in sides=one-sided

Eine Testseite kann ich weiterhin nicht drucken, erhalte die selbe Fehlermeldung wie eben. -.-
Titel: Antw:Druckersteuerung
Beitrag von: Spezialtrick am 12 Februar 2015, 13:11:34
So nun klappt es mit einem Mal. Der Drucker startet wie er soll und ich bekomme entsprechende Ausgaben über lpstat -o.

:D :D :D
Titel: Antw:Druckersteuerung
Beitrag von: daschauher am 22 Februar 2015, 16:52:54
Heute wollte ich diese Funktion bei mir auch einpflegen.
Doch leider musste ich dann feststellen das mein Samsung ML1865-W nach Spannungswiederkehr nicht in den letzten Betriebszustand wechselt, sondern mit einem Taster Eingeschaltet werden muss.
So viel ich gesehen habe kann man das auch nicht konfigurieren.
Schade
Titel: Antw:Druckersteuerung
Beitrag von: Loetkolben am 29 April 2016, 21:32:59
Hallo zusammen,
habe das bei mir (wie hier (https://forum.fhem.de/index.php/topic,10070.msg260475.html#msg260475) beschrieben) auch eingebaut. Jedoch habe ich in der 99_myUtils.pm eine kleine Änderung eingebaut, da Cups auf meinem Linux-Server und nicht auf dem Pi (FHEM) läuft.
my $cupsws.=`lpstat -h 192.168.100.101 -o $printer` ;

Funktioniert tadellos.

Schön wäre, wenn man in der Definition eine IP-Adresse mitgeben könnte, die dann im Perl-Script ausgewertet wird.
Probiert habe ich das so:

99_myUtils:

my ($printer,$dummy,$ontime,$cupsServerIP) = @_;
my $cupsws.=`lpstat -h $cupsServerIP -o $printer` ;

Definition:

define CupsAbfrage at +*00:00:59 {myCupsAbf("HL5350DN", "DG_OF_Laserdrucker", "240", "192.168.100.101");;}


Das funktioniert leider nicht.  Vermutlich stören die Punkte in der IP, aber auch maskieren (mittels \ ) hat nicht geholfen.



   Andreas
Titel: Antw:Druckersteuerung
Beitrag von: marvin78 am 29 April 2016, 22:12:04
Probiere mal dieses Modul:

https://forum.fhem.de/index.php/topic,41956.msg341891.html#msg341891