- Um die Gewohnheit zu reduzieren, morgens endlos durch Nachrichten und Social Media auf dem Handy zu scrollen, wird jeden Tag mit einem Nadeldrucker eine personalisierte Titelseite auf Papier ausgedruckt
- Der Aufbau ist mit Star NP-10, Raspberry Pi Zero W, Parallelport-USB-Adapter und Netzteil einfach; auf dem Pi wird der Drucker als Gerät
/dev/usb/lp0 angesprochen
- Der alte Drucker akzeptiert keinen normalen Unicode, sondern einen eingeschränkten Zeichensatz, der eher Code Page 437 entspricht; in PHP werden Hex-Werte daher direkt gesendet, um Linien, Kästen und Temperatursymbole zu drucken
- Die Daten kommen aus Open-Meteo, twelvedata, NYTimes und Reddit JSON; Wetter, Aktien, News-Überschriften und Reddit-Posts werden auf die Papierbreite formatiert
- Per cron läuft das Ganze jeden Tag gegen 8 Uhr automatisch, und eine endliche Nachrichtenseite auf einem Blatt ersetzt das unendliche Scrollen auf Websites und in Apps
Eine Titelseite auf Papier statt eines Bildschirms bauen
- Ziel war es, die Gewohnheit zu verringern, morgens das Handy zu öffnen und durch verschiedene Nachrichten- und Social-Media-Seiten zu scrollen, ohne dabei auf aktuelle Informationen zu verzichten
- Umgesetzt wurde das, indem ein bei eBay gekaufter Nadeldrucker genutzt wird, um jeden Tag eine personalisierte Titelseite auszudrucken
- Der vollständige Quellcode ist im GitHub repo veröffentlicht
Auswahl und Anschluss der Hardware
- Die benötigten Komponenten sind relativ einfach
- Der verwendete Drucker ist ein Star NP-10, offenbar ein Modell aus der Mitte der 1980er-Jahre
- Jeder Nadeldrucker mit Parallelport könnte funktionieren
- Der übliche Preis lag bei etwa 80 bis 120 US-Dollar, aber wegen des Hinweises „Funktionszustand unklar“ wurde er für ungefähr die Hälfte gekauft
- Nach etwas Reinigung und einer Justierung der Farbbandkassette konnte erfolgreich eine Testseite gedruckt werden
- Der Raspberry Pi ist mit dem WLAN verbunden und über den USB-Adapter an den Parallelport des Druckers angeschlossen
- Nach dem Login per
ssh wurde bestätigt, dass der Drucker unter /dev/usb/lp0 erkannt wurde
Daten direkt an den Drucker senden
- Zunächst wurde geprüft, ob überhaupt gedruckt werden kann, indem roher Text direkt aus der Shell gesendet wurde
echo "Hello, world!" > /dev/usb/lp0
- Wegen eines Dateizugriffsfehlers wurde das Berechtigungsproblem mit
chmod umgangen
sudo chmod 666 /dev/usb/lp0
- Danach wurde an
/dev/usb/lp0 gesendeter Text vom Drucker ausgegeben
- In PHP wurde das später erweitert, indem die Druckerdatei mit
fopen() geöffnet und Text hineingeschrieben wurde
- Beim Test mit normalen Sätzen, Leerzeichen und Unicode-Art zeigte sich, dass der unterstützte Zeichenumfang des Druckers begrenzt ist
Der Zeichensatz des Star NP-10
- Mit einem gescannten Star NP-10 Benutzerhandbuch wurde nachvollzogen, wie der Drucker arbeitet
- Dieser Drucker akzeptiert nur einen sehr spezifischen Zeichensatz
- Er basiert lose auf Code Page 437 des IBM PC
- Enthalten sind Standard-Alphanumerik sowie einige Sonderzeichen, Linien- und Box-Zeichen
- In PHP können Hex-Werte als Strings aufgebaut und direkt an den Drucker gesendet werden
$horizontalDouble = "\xCD";
$deg = "\xF8";
echo str_repeat($horizontalDouble, 24);
echo '78' . $deg . 'F' . PHP_EOL;
- Damit lassen sich nicht nur normaler Text, sondern auch dekorative Zeichen wie Linien, Kästen und Temperatursymbole drucken
Abgerufene Daten und APIs
- Auf der persönlichen Titelseite gibt es vier Bereiche
- Wetter
- Aktien
- wichtige News-Überschriften
- Top-Reddit-Posts
- Da es sich um ein experimentelles Projekt handelt, sollten die Datenkosten niedrig bleiben und möglichst kostenlose APIs verwendet werden; die benötigten APIs wurden im Repository public-apis mit frei verfügbaren APIs gefunden
- Verwendet wurden folgende Datenquellen
- Open-Meteo: Wetterdaten, kein API-Key erforderlich
- twelvedata: Aktiendaten, großzügige Free-Tier
- NYTimes: News-Überschriften, für das Projekt ausreichende Free-Tier
- Reddit JSON: Reddit-Posts, kostenlos, erfordert aber User-Agent-Spoofing
- Das PHP-Skript holt die Payloads von jedem API-Endpunkt und fasst nur die benötigten Daten in einem großen Array zusammen
- Verwendet werden nur bestimmte Aktien, bestimmte Nachrichtentypen und Posts aus bestimmten Subreddits
- Wenn in einem der Bereiche keine anzeigbaren Daten vorhanden sind, beendet sich das Skript frühzeitig und wird später erneut ausgeführt
So werden die News-Daten gefiltert
- NYTimes-Daten werden als fehlgeschlagen behandelt, wenn in der API-Antwort
results nicht vorhanden ist
- Von den Artikeln werden nur Einträge zum Drucken gesammelt, die folgende Bedingungen erfüllen
type ist Article
section ist einer von U.S., World, Weather, Arts
- Es werden nur Einträge hinzugefügt, solange die Höchstzahl
MAXNEWS nicht erreicht ist
NEWS, NEWSKEY und MAXNEWS sind am Anfang des Skripts als Konstanten definiert, damit sie leicht geändert werden können
Ausgabeformat passend für Papier
- Statt nur Abschnittsüberschriften zu drucken, wird oben eine umrahmte Box mit aktuellem Datum, Wochentag und dem Namen der Titelseite erstellt
- Das Layout wird auf Basis der Seitenbreite des Druckers von 80 Zeichen berechnet
- Hex-Zeichen
str_repeat
- fester Wert für die Seitenbreite
- Abschnittsüberschriften werden durch die Kombination aus Linienzeichen und Text ausgegeben
str_repeat($horizontalSingle, 3) . " WEATHER " . str_repeat($horizontalSingle, (PAGEWIDTH - 9)) . "\n";
- Wetter und Aktien sind kurz genug, um in einer Zeile ausgegeben zu werden, ohne den Papierrand zu erreichen
- News-Überschriften und Reddit-Posts enthalten oft längere Texte und brauchen deshalb eine eigene Zeilenumbruch-Logik
Zeilenumbruch für lange Texte
- Der Drucker kann lange Zeilen automatisch in der nächsten Zeile fortsetzen
- Um aber zu vermeiden, dass Wörter mitten im Wort getrennt werden, wurde eine Funktion implementiert, die Strings anhand einer maximalen Zeilenlänge aufteilt
- Die Funktion
splitString() teilt Wörter anhand von Leerzeichen und gibt ein Array zurück, bei dem jede Zeile PAGEWIDTH nicht überschreitet
- Wenn ein einzelnes Wort länger als die maximale Länge ist, wird dieses Wort abgeschnitten und so verarbeitet
- Für Reddit-Posts wird das zurückgegebene Zeilen-Array durchlaufen und an den Drucker geschrieben
foreach (splitString($redditPost) as $line) {
fwrite($printer, $line) . "\n";
}
Automatisierung und Nutzungserfahrung
- Manuell lässt sich das Ganze mit
php print.php ausführen
- Im Alltag wird es über einen cron-Job automatisiert
- Jeden Tag gegen 8 Uhr morgens wird die personalisierte Titelseite gedruckt
- Das ausgedruckte Blatt wird abgerissen und beim Kaffee gelesen
- Die endliche Nachrichtenmenge auf einem einzelnen Blatt fühlt sich besser an, als endlos durch Websites und Social Apps zu scrollen
- Ein wichtiger Reiz des Projekts war auch der Prozess selbst, alte physische Hardware mit neuer Technologie zu verbinden
1 Kommentare
Kommentare auf Hacker News
Ich habe etwas Ähnliches mit einem Bondrucker ausprobiert: Ein USB-Thermo-Bondrucker kostet etwa 75 Dollar und lässt sich mit Python leicht steuern.
Bilder und QR-Codes auszugeben ist unkompliziert, und dank der automatischen Schneidefunktion lassen sich Nachrichten gut voneinander trennen.
Man kann auch die interne Klingel auslösen und ihn so wie eine zusätzliche Benachrichtigung nutzen; außerdem gibt es einen Ausgang zur Steuerung einer Kassenschublade, den ich vielleicht mit etwas wie einer Beleuchtung verbinden will.
Ich habe ihn für E-Mails eingerichtet und lasse mir jeden Morgen meinen Tagesplan ausdrucken.
Zusammen mit physischen Bedienelementen wie Buttons oder einem NFC-Reader passt die Schnittstelle ziemlich gut. Zum Beispiel eine NFC-Karte zum Ausdrucken des Tagesplans, eine NFC-Karte zum Ausdrucken ungelesener E-Mails – man gibt sozusagen „Befehle“ und bekommt einen Ausdruck zurück.
Es ist eine unterhaltsame Methode, Bildschirmzeit zu reduzieren, aber ironischerweise habe ich wohl mehr Zeit vor dem Bildschirm verbracht, um das zu programmieren und einzurichten, als ich dadurch eingespart habe.
https://www.consumerreports.org/cro/news/2014/03/the-health-...
Heute habe ich mich plötzlich etwas gefragt.
Eines der Dinge, die diese Person macht, ist im Grunde nur ein Echo nach
/dev/lp0, und früher hat man das tatsächlich so gemacht. Man schob Text in die Schnittstelle, und der Drucker druckte ihn aus.Heutige Drucker sind viel schicker, aber sie sind immer noch Drucker mit einem langen Erbe. Auch frühe HP-Laserdrucker druckten, wenn man Daten über die Leitung schickte, in Courier 10 mit 66 Zeilen pro Seite. Der Apple LaserWriter war wohl die Ausnahme, weil er ein dedizierter PostScript-Drucker war; bei ihm hätte man stattdessen PostScript hineingeschoben.
Mit der Weiterentwicklung der Drucker wurden die Sprachen, die man ihnen schickte, komplexer, aber trotzdem blieb eine lange Abwärtskompatibilität erhalten.
Wenn man also heute einen USB-Drucker an den Computer anschließt und
ls > /dev/usbXXXausführt: Wird das dann noch gedruckt? Funktioniert das immer noch einfach so?Wenn man einem EPSON EPSON-MX-80-Escape-Codes schickt, geht das weiterhin? Keine der Antworten würde mich überraschen, aber moderne Drucker sind für mich ziemlich Blackboxes, daher frage ich mich, ob das jemand weiß.
Manche erinnern sich vielleicht auch noch an die Freude, Berichte so hinzufummeln, dass sie auf vorgedruckte mehrlagige NCR-Formulare passten.
/dev/exponiert. Stattdessen gibt es auch unter OS Xlp, sodass man etwas wieecho "Hello printer" | lp -dverwenden kann; den Namen findet man mitlpstat -p.Mit einem neuen Drucker getestet: Es funktioniert tatsächlich.
printf 'hello\f' > /dev/usb/lp0printf 'hello\f' | nc -N $printer_ip 9100Das war mit einem Brother-Laserdrucker; neben dem Online-Handbuch ist ein Programmierhandbuch verlinkt. Die Sprache ist PCL, aber für einfache Ausgaben muss man nicht viel darüber wissen.
Die beiden obigen Beispiele verwenden kein CUPS. Wie in einem anderen Kommentar erwähnt, muss der Drucker zuerst in CUPS registriert sein, wenn man die Programme
lp/lprverwenden will.Bei
ls >erwartet der Drucker DOS-Zeilenumbrüche.\nbewegt nur in die nächste Zeile und macht keinen „Carriage Return“, daher muss man es durchsed 's/$/\r/'pipen odernc -Cverwenden.Bei einer USB-Verbindung kann man mehrmals ausgeben und daraus eine Seite machen; das Papier kommt erst heraus, wenn man einen Form Feed sendet. Bei einer TCP-Verbindung wird die Seite gedruckt, wenn die Verbindung geschlossen wird.
/dev/usblp0auf, und es funktionierte, einfach mitcatdorthin zu schreiben.Kunden, die so ein Produkt neu kaufen, wollen vermutlich Kompatibilität mit Prozessen, die sie seit 30 bis 50 Jahren verwenden; erwartungsgemäß unterstützt er ESC/P 2 und auch IBM-Escape-Codes. Ich fand das überraschend, weil die alten Nadeldrucker, die ich in den 90ern benutzt habe, meiner Erinnerung nach keine IBM-Codes unterstützten.
Noch erstaunlicher war, dass mein MacBook einen eingebauten Treiber für generische Epson-Drucker hatte und dieser funktionierte. Die Qualität war nicht besonders und er druckte als Grafik, aber immerhin gab es ihn.
Zu aktuellen Tintenstrahl- und Laserdruckern weiß ich es nicht. Ein Epson-Tintenstrahldrucker, den ich vor etwa 20 Jahren benutzt habe, unterstützte rohe ESC/P-Codes.
https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
Ein häufiger Benutzerfehler war: Jemand wollte ein Word-Dokument drucken, daraufhin wurde PostScript an den Nadeldrucker geschickt, und der Drucker druckte es brav als PostScript-Quelltext aus und verschwendete Papier und Farbband, bis jemand ihn stoppte.
Matrixdrucker können je nach Modell ziemlich viel. Schriftarten wechseln, fett, unterstrichen, manchmal kursiv, Zeichen in doppelter Breite/Höhe und sogar Grafik. Allerdings haben Grafiken meist eine vergleichsweise niedrige Auflösung, etwa 90 oder 180 DPI.
Früher habe ich einmal für etwas Ähnliches wie ein Escape-Room-Spiel eine Box gebaut, die nur einen parallelen Druckeranschluss hatte. Wenn man sie an den Drucker anschloss, bezog ein winziger PIC-Mikrocontroller über eine Steuerleitung des Parallelports parasitäre Versorgung und schickte mit nur ein paar Hundert µA Hinweise an den Drucker.
Anfangs nutzte es den hochauflösenden Grafikmodus von Epson-Matrixdruckern. Diese Drucker konnten die Walze in Schritten von nur einem Drittel des Abstands zwischen den Pins des Druckkopfs feinjustieren und erreichten so die dreifache vertikale Auflösung dessen, was mit dem Kopf allein möglich war.
Fancy Font renderte den Text auf dem Computer und schickte ihn dann als Grafik in diesem speziellen Hochauflösungsmodus, sodass man mit Heimausrüstung der frühen 1980er einem Schriftsatz-Ergebnis so nahe wie möglich kam.
Spätere Versionen hatten auch Treiber für frühe Laserdrucker wie den ursprünglichen HP LaserJet, aber mit dem Erscheinen des Mac war die Zukunft solcher Systeme ziemlich absehbar.
Allerdings war das Papier nach dem Druck stark gewellt. Den Drucker habe ich noch, aber ich weiß nicht, wo man noch ein 4-Farb-Farbband bekommen könnte.
figletim Terminal erzeugen. Vielleicht unterstützt es sogar noch Druckerausgabe.Vielleicht probiere ich das in Version 2.0 aus.
Ich hatte diese Maschine einige Jahre lang an einen Newsfeed angeschlossen.[1] Es ist der Mechanismus eines Model 14 Teletype Tape Printer, steht immer noch in meinem Wohnzimmer, und das Band läuft in einen Drahtkorb.
Gesteuert wird er von einem Python-Programm auf einem alten EeePC-Subnotebook.
[1] https://aetherltd.com/refurbishing14.html
Den Namen EeePC habe ich auch wirklich lange nicht mehr gehört; das weckte Erinnerungen.
Das wirkt wie eine wirklich hervorragende Produktidee. Die Vorstellung, jeden Morgen einen personalisierten, und zwar nicht von MSN oder Ähnlichem, sondern wirklich von mir ausgewählten Offline-Newsfeed zu bekommen, ist klasse.
Wenn man damit dann auch noch den Wecker durch einen Matrixdrucker ersetzen könnte, wäre es noch besser.
Das PHP an meine Nachrichtenquellen anzupassen, würde ich leicht hinbekommen, aber ich weiß nicht, wie ich allein mit der Hardwareseite anfangen sollte. So dürfte es ziemlich vielen gehen.
Wenn es auf den Markt käme, würde ich es wohl kaufen, selbst wenn es deutlich teurer wäre als ein alter Drucker.
Der schwierigste Teil ist der Anschluss des Druckers; dafür braucht man eventuell ein Adapterkabel.
Hübsch. Das erinnert mich an die kurze Zeit, in der ich einmal bei einem Radiosender gearbeitet habe. Die Details habe ich fast vergessen, aber ich glaube, das System wählte automatisch eine bestimmte Associated-Press-Nummer an, holte die neuesten Schlagzeilen und schickte sie dann an einen Matrixdrucker.
Das war Ende der 90er und lief unter MS-DOS.
Damals konnte man bei den meisten Druckern die Schriftart per Steuercode einstellen, und viele Drucker hatten auch proportionale Schriftarten.
Gefällt mir. Ich überlege gerade, mir eine Wochenend-Papierzeitung wie die FT Weekend zu abonnieren, weil ich auf dem Handy viel zu oft Nachrichten lese.
Nachrichten sind oft nicht besonders nützlich und erzeugen nur negative Gefühle. Auf Papier, und dann nur einmal pro Woche, würden sich Nachrichten vermutlich entspannter anfühlen.
Diese Methode, täglich Nachrichten auf Papier auszudrucken, scheint eine gute Zwischenlösung zu sein.
Außerdem gefällt mir der Matrixdrucker wirklich. Gibt es vielleicht einen Open-Source-Drucker, der sich gut für solche Hacks eignet?
Ich wollte die Papierzeitung abonnieren, habe aber nie eine Ausgabe bekommen, und erst nach etwa drei Telefonaten und zehn E-Mails, als ich Kündigung und Rückerstattung verlangte, hieß es, man werde mein Ticket eskalieren. Da waren bereits drei Wochen vergangen und ich hatte viel Zeit investiert.
Deshalb interessiert es mich auch sehr, mir Internetnachrichten selbst auszudrucken, um nicht ständig auf einen Bildschirm zu schauen.
Ich drucke seit einiger Zeit „Dreiseiten-Karten“. Auf einer Seite ist ein Bild, auf der anderen ein QR-Code, der zu einem Dokument führt.
https://mastodon.social/@UP8/111013706271196029
Die „dritte“ Seite ist die Website, auf die der QR-Code verweist.
Fotos wurden mir langweilig, also habe ich mir eine Figur ausgedacht, die mit einem billigen Objektiv herumläuft, die Blende immer mindestens auf f/18 schließt, stark nachbearbeitet und farbkorrigiert und in einem Seitenverhältnis fotografiert, das zwar üblich ist, sich aber unüblich anfühlt. Die Idee ist, es so wirken zu lassen, als würde sie eine seltsame Kamera aus einer alternativen Zeitlinie benutzen.
Als ich anfing, diese Serie auszudrucken, kam ich zu dem Schluss, dass man aus 4x6 durch Zuschneiden leicht 4x5 machen kann; statt zu schneiden, könnte man aber auch einen Zoll Platz lassen, um auf der Vorderseite QR-Code und Dokument unterzubringen. Ebenso entsteht Platz für ein Dokument, wenn man 5x7 zu einem 5x5-Quadrat zuschneidet.
Ich habe ein paar Kisten Glanzpapier, auf dessen Rückseite man nicht drucken kann, und will es auf diese Weise verwenden. Später habe ich auch erfahren, dass es bei Instagram einen 4x5-Standard gibt und dass Sportfotos, die mit guten Objektiven aufgenommen wurden, in diesem Format wirklich gut aussehen.
Ich bin mir nur unsicher, wie das Dokument aussehen soll. Ich schwanke zwischen einer Variante, die an der aktuellen Gestaltung nur das Nötigste ändert, einem falschen Matrixdrucker-Effekt, der wie ein alter Drucker wirkt, der in diese Fantasiekamera eingebaut sein könnte, oder einer Umsetzung, die die Stärken eines Tintenstrahldruckers möglichst gut ausnutzt.
Wenn man sagt: „Das ist ein Experimentierprojekt, daher wollte ich die Kosten für diese Daten sehr niedrig, möglichst kostenlos halten“, gibt es auch NewsCatcher. Für Open-Source-Side-Projects ist es kostenlos.
https://docs.google.com/forms/d/e/1FAIpQLSejrsj4a1ZQkIasiKCt...
Etwas verwandt: Ich nutze ein kleines Skript, das jeden Morgen auf dem MacBook die Titelseite der NYTimes öffnet.
d=$(date +%d)m=$(date +%m)y=$(date +%Y)wget -q [https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.p...](<https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.pdf>) && open ./scan.pdfhttps://nytonline.net/rss
rm todays_nyt.pdf; wget -q "[https://static01.nyt.com/images/$(date](<https://static01.nyt.com/images/$(date>) +%Y/%m/%d)/nytfrontpage/scan.pdf" -O todays_nyt.pdf && open todays_nyt.pdfdmy=$(date +%d/%m/%Y)