Microprinting
| Microprinting | |
|---|---|
| Quittungsdrucker zum Drucken der Twitter-Timeline | |
| Status | Abgeschlossen |
| OrganisatorIn | Basti, MyJP |
| InteressentInnen | |
In diesem Projekt geht es darum, mit einem gewöhnlichen Supermarkt-Quittungsdrucker Dinge auszudrucken. Neben der Twitter-Timeline, die sich für ein solches Projekt fast schon aufzwingt, wollen weitere Ideen folgen. Im Oktober 2012 waren wir mit dem Quittungsdrucker auf dem Hackover (Weiteres dort).
Inhaltsverzeichnis |
Epson TM-T88P (Erste Tests am 14.01.2011)
Drucken direkt per Shell
echo "Test" > /dev/lp0
und demnach auch in Python mit dem Workaround
import os output = "Test per Python!" os.system("echo " + output + " > /dev/lp0")
funktionierte.
Als Zeichensatz kommt bei diesem Drucker CP437 zum Einsatz. Das heißt: Er kann Umlaute usw. drucken, erwartet sie aber an den gezeigten Positionen in der Zeichentabelle.
Einoutput.encode('cp437','replace')
- pyParallel läuft bisher noch nicht.
- MyJPs Parallel2USB-Adapter funktionierte leider auch nicht. Daher ist nach aktuellem Kenntnisstand also ein Parallelport vonnöten.
- PDF-Manual
- Epson Bit Image printing
TEC TRST-53
Diesen Quittungsdrucker konnten wir über einen Digitus DA-70146 Seriell2USB Konverter via pySerial ansprechen.
Minimales Printing-Script
import serial printer = serial.Serial("/dev/ttyUSB0", 19200) printer.write("string")
Wenn kein \n am Ende des Strings steht, wartet der Drucker, bis die Zeile voll ist und druckt sie erst dann.
Twitter-Script
Mit folgendem Python-Script konnten wir die Twitter-Timelines periodisch abfragen und Statusupdates direkt ausdrucken:
import serial import time import tweepy # Twitter credentials auth = tweepy.OAuthHandler("<InsertConsumerKeyHere>", "<InsertConsumerSecretHere>") auth.set_access_token("<InsertAccessTokenHere>", "<InsertAccessTokenSecretHere>") api = tweepy.API(auth) # receipt printer is connected via serial-to-usb converter printer = serial.Serial("/dev/ttyUSB0", 19200) while True: # read savepoint file = open("id", "r") savepoint = file.read() file.close() timeline = api.friends_timeline() timeline.reverse() for status in timeline: # assuming that Twitter assigns IDs in ascending order if status.id > long(savepoint): message = "(%(created)s) %(screenname)s: %(statusmessage)s\n\n" % \ {"created" : status.created_at, "screenname" : status.user.screen_name, "statusmessage" : status.text.encode('cp437', 'replace')} printer.write(message) # write savepoint file = open("id", "w") file.write(str(status.id)) file.close() # Twitter API allows 350 requests per hour (every ~11 sec should be ok ;) time.sleep(11)
Damit Statusupdates nicht doppelt gedruckt werden, sichern wir die zuletzt gedruckte Status-ID jeweils in der Textdatei "id". Um zu Beginn die aktuellsten 20 Updates zu bekommen, kann die Datei z.B. die ID 0 (oder eine andere ID, die kleiner als die 20.-aktuellste ID ist) enthalten.
Font-Demo
Folgendes Script druckt die 6 zur Verfügung stehenden Schriftarten aus. Die mit "\x1b" beginnenden Strings sind Steuerzeichen und teilen den Drucker mit, in welcher Schriftart er die folgenden Zeichen drucken soll. Ein Reset auf Standardwerte ist nach dem Drucken einer solchen Zeile sinnvoll, um Verwirrungen zu vermeiden ;-)
Sonstiges
Weitere Features sind z.B. Abschneiden des Bons oder Drucken von Barcodes in verschiedenen Formaten.
# cut & go printer.write("\x1b\x4A\x9C\x1b\x69") # barcode (JAN13 (EAN) with character code "4029764001807"; see manual page 50 for details) printer.write("\x1d\x6b\x024029764001807\00")
Weiteres
- Der Drucker benutzt aktuell die ISO-646-DE Kodierung in den unteren 128 Positionen seines CP437 Zeichensatzes, daher werden die Zeichen @[\]{|}~ als §ÄÖÜäöüß dargestellt.
- Update Umgestellt: @[\]{|} funktioniert, dafür §ÄÖÜäöüß nicht mehr ...
- Der TEC TRST-53 ist zumindest soweit baugleich mit einem Citizen CBM 231, sodass dessen Handbuch genutzt werden kann. Darin ist auf Seite 56 visualisiert, worin das aktuelle Problem besteht, und auf den Seiten 21/22 stehen die DIP-Schalter-Stellungen, mit denen Abhilfe geschaffen werden kann.
- Wollte man doch in Python eine Konvertierung vornehmen, bietet sich an.
string.maketrans
- In der Standardeinstellung druckt der Drucker 48 Zeichen pro Zeile (Monospace). Andere Fonts können mit dem oben gezeigten Fonttest-Script ausprobiert werden.
Weiterführendes
- Documentation for Printing Tweets von Max Dovey (mit Erwähnung unseres obigen Python-Codes)