NzF

t2l

Jonathan Frech
Abstract.
Gast­bei­trag von ⁠ ⁠Jo­na­than Frecha ge­schrieben.

Mein Bei­trag zur Aus­stel­lung ⁠ ⁠Der Reflex des Wie­der­er­ken­nens #1b: eine Twitter-ge­speist­e LED-Un­ter­strei­chung eines mei­ner Sonette.

t2l, ein Akronym für den Da­ten­fluss Twitter -> Leuchtdioden, belauscht den lau­fen­den Twitter-Feed nach Tweets in welchen Wörter vor­kom­men, die ich auch in mei­nem So­nett »Ich schau auf den Boden – lauter Ritzen« ver­wen­det habe. Kom­men solche Wörter vor, wer­den sie mit­tels unter den So­nett-Zei­len an­ge­brach­ter LED-Bänder un­ter­stri­chen; wird der Hashtag #schael­pic ver­wen­det, ist die Farbe der Un­ter­strei­chung das schael­pic-Orange.
Die Aus­stel­lung befand sich in der ⁠ ⁠schael­pic pho­to­kunst­barb und lief vom 6. August 2021 bis zum 1. Oktober 2021. In diesem Bei­trag schrei­be ich da­rü­ber, wie ich die In­s­tal­la­ti­on tech­nisch um­ge­setzt habe; der volle Quell­text ist ver­öf­fent­licht, womit Sie selbst die Mög­lich­keit haben, ein eigenes t2l ein­zu­rich­ten.

fotografiert von Martin Frech: Funkelnde 𝔽₂-Fragmente (Schrägansicht)
Fun­keln­de 𝔽2-Frag­men­te (Schräg­an­sicht)
fotografiert von Martin Frech: Funkelnde 𝔽₂-Fragmente (Schrägansicht)

Hard­ware-In­s­tal­la­ti­on. Das im Herbst 2019 ge­schrie­be­ne So­nett passte the­ma­tisch zum Aus­stel­lungs­the­ma sowie zum Schwarzbuch 2020c und wurde folglich aus­er­wählt, auf Kappa-Platten auf­ge­bracht und mit 320 Einheiten des LED-Bands ›YUNBO WS2812B‹ un­ter­stri­chen. Die hard­ware­na­he GPIO-Pin-An­steuer­ung des LED-Bands wird von der Python-3-Bib­lio­thek ›rpi_ws281x‹ über­nom­men, womit nur noch der Soft­ware-Teil zu schrei­ben ist: ⁠1

Sonett-
Lichterband
   ^
   |
   +------ Python-3-Controller <- Go-Controller
                                        ^
                                        |
   +------------------------------------+
   |
   v                                    Twitter-API-
 Cloud-Backend <----------------------> Endpoint

Die Grund­idee ist, einen soliden zu wenig fähigem Client in der In­s­tal­la­ti­on an­zu­brin­gen, welcher wie ein Moni­tor für das Cloud-Back­end agiert. Somit ist die Aus­fall­wahr­schein­lich­keit der Kom­po­nen­ten in der Aus­stel­lung über­schau­bar gering ge­hal­ten und Ver­hal­tens­än­de­rung­en jeglicher Art sind in der Cloud um­setz­bar ohne sich am Aus­stel­lungs­ort be­fin­den zu müs­sen. Ani­ma­tio­nen am LED-Band sind mit­tels der post­mo­der­nen In­ter­net­ge­schwin­dig­keit ohne viel Pro­to­koll-Ge­ni­a­li­tät mög­lich: die 963 Bytes an Farb­in­for­ma­tion wer­den schlicht zehn Mal die Sekunde durch Deutsch­land gebeamt – und scheinen alle an­zu­kom­men.
Die­ser Client ist in zwei Sub-Clients auf­ge­teilt: Das LED-Band wird von einer Python-3-Bib­lio­thek ge­steu­ert, welche mit ein wenig Glue-Code von ei­nem Go-Con­trol­ler kom­man­diert wird. Die­ser Go-Con­trol­ler kom­mu­ni­ziert über einen WebSocket mit dem eben­falls in Go ge­schrie­be­nen Cloud-Back­end.

Pi-Setup. Nach dem Erdenken kommt die Ver­wirk­lich­ung. Es folgt ein Zeit­be­richt welcher Zugleich als Setup-An­lei­tung dient falls man selbst einen t2l-Client aufsetzen möch­te. ⁠2

Für das t2l-Pro­jekt re­in­stal­lie­re ich das Him­beeren­be­triebs­sys­tem: ⁠ ⁠2021-05-07-raspios-buster-armhf-lite.zipd [abgerufen 2021-07-23] mit dem ⁠ ⁠Rasp­berry Pi Imagere. Leider ist ssh an­schei­nend stan­dard­mä­ßig aus­ge­schal­tet. Also krame ich mein HDMI-Kabel heraus, ziehe dem Pi den Stecker, finde eine Tastatur und schalte ssh ein: Login-Name pi, Passwort raspberrz (eng­li­sches Layout), sudo systemctl enable ssh && reboot. Den Rest der Kon­fi­gu­ra­tion erledige ich über die sichere Shell.
Um den Pi im lokalen Netz zu fin­den, nutze ich % nmap -sn 192.168.2.0/24 | grep raspberrypi. Mit­tels % ssh pi@192.168.2.108 und Passwort raspberry be­komme ich eine Shell auf dem Pi. Das Erste was zu tun ist ist na­tür­lich das Ab­än­dern des Pass­worts ($ sudo passwd pi) und danach den Schlüs­sel­aus­tausch % ssh-copy-id pi@... zu vollführen.
Auf dem Pi kann man nun $ sudo apt install --assume-yes curl && cd && curl -f#SL https://www.medienfrech.de/foto/NzF/2021-10-14/t2l.tar -o t2l.tar && tar -xf t2l.tar && cd t2l && sudo make setup -C t2l-pi ausführen. Dies kann einige Zeit in Anspruch nehmen und sollte den Pi voll­stän­dig ini­ti­a­li­sie­ren.
Falls das LED-Band be­reits mit Strom ver­sorgt und an den rich­ti­gen Pin (stan­dard­mä­ßig Pin 18) an­ge­schlos­sen ist, sollte $ sudo systemctl stop t2l-pi && sudo make -C t2l-pi test-led-strip-controller das Band mit zufälligen Farben füllen.

Der voll­stän­di­ge t2l-Quell­text ist unter der ⁠ ⁠Expat-Lizenzf lizensiert und als GNU-tar-Ball he­run­ter­lad­bar: t2l.targ

Pinout. Der numerische Wert der Pins (nicht der GPIO-Index) kann der Do­ku­men­ta­ti­on ⁠3 ent­nom­men wer­den; wenn die Him­bee­re auf­recht steht, ist das Pin-Layout wie folgt:

    GPIO-18 ---+   +--- Ground
               v   v
 2  4  6  8 10 12 14 16 18 20 22 ... 40

 1  3  5  7  9 11 13 15 17 19 21 ... 39

Der Wert GPIOPIN in led-strip-controller.py ist stan­dard­mä­ßig 18, also muss das grüne Kabel des LED-Bands mit dem oberen sechsten Pin von links des Pis ver­bun­den wer­den. Das weiße Kabel des LED-Bands kann mit ei­nem be­lie­bi­gen Ground-Pin ver­bun­den wer­den, ich habe mich für den eins rechts daneben ent­schie­den. Das rote Kabel des LED-Bands wird nicht mit dem Pi ver­bun­den, da das LED-Band über ein externes Netz­teil eine eigene Strom­ver­sor­gung von +5 Volt erhält.

Twitter-API. Das Herzstück der In­s­tal­la­ti­on ist der Tweet-Da­ten­fluss welcher über die Twitter-API ⁠4 sein­en Weg zum LED-Band fin­det. Die API-Do­ku­men­ta­ti­on ist voll­stän­dig und mit curl-Bei­spie­len er­läut­ert. Einzig die Wahl zwi­schen JSON-Zahl und -De­zi­mal­zei­chen­ket­te schien zwi­schen den ver­schie­de­nen Antworten der API un­ein­heit­lich; ich bin der Über­zeu­gung, dass die API sich im Zeit­raum der Aus­stel­lung ge­än­dert hat und jetzt nur noch De­zi­mal­zei­chen­ket­ten schickt (an­dern­falls kann ich mir einen in der Aus­stel­lungs­dau­er plötz­lich auf­ge­tre­te­nen Fehler nicht er­klä­ren). Wenn auch etwas ver­wun­der­lich, be­wies sich der JSON-Un­mar­shaller ⁠5 der Go-Stan­dard­bib­lio­thek wel­chem die Än­de­rung schnell bei­ge­bracht war.
Einzig die API-Be­schrän­kung von 500.000 Tweets pro Monat (wobei die Mo­nats­pe­ri­o­de am Tag der Ein­rich­tung des API-Zugangs be­ginnt) ist nicht auf die leich­te Schulter zu nehmen: rechnet man mit ein­und­drei­ßig Tagen im Monat, so sind das 500000/31/24/60/60 = 0,1867 Tweets in der Sekunde; be­trach­tet man die laufende In­s­tal­la­ti­on, so sieht man eher eine Hand voll Tweets in der Sekunde. Es gilt also, das Back-End in­tel­li­gent ab­zu­schal­ten und nicht zu un­acht­sam Twitter an­zu­fra­gen.

Zwitschern in der Büchse. Vor Abbau der In­s­tal­la­ti­on haben wir ein klei­nes Video gedreht, um die dy­na­mi­sche Na­tur ihrer ein­zu­fan­gen:

Nach dem Ein­schal­ten durch­läuft der t2l-Client (links im Video) eine Ini­ti­a­li­sie­rungs­se­quenz welche zu­erst auf­zeigt ob das LED-Band an­ge­steu­ert wer­den kann gefolgt von ob das Cloud-Back­end antwortet. Danach unterwirft sich der Client gänz­lich dem Ser­ver. Die­ser hat nun voll­stän­di­ge Kon­t­rol­le über das LED-Band und be­ginnt Twitter zu lauschen. Die er­lausch­ten Tweets wer­den auf der Aus­stel­lungs­web­site (rechts im Video) angezeigt, dort orange her­vor­ge­ho­be­ne Tweets be­in­hal­ten den Hashtag #schael­pic. Im Video ist weiter zu sehen, wie die In­s­tal­la­ti­on auf von mir ver­fas­ste Tweets (rechts in der Mitte, ein­ge­blen­det) reagiert.

Ly­ri­sches Herzstück der In­s­tal­la­ti­on ist fol­gen­des von mir ge­schrie­be­ne So­nett.

Ich schau auf den Boden – lauter Ritzen.
Zu meiner Linken sitzt’n Bettler – traurig.
Mir ist heute wirklich nicht nach Witzen.
Ich denk oft an meine Zukunft – schaurig.

Am Job angekomm’ stell ich mich an.
Sowie auch sie, er, der Hund und Schrank: stopf
Ein jeder wird mal sterben – doch nur wann?
Alle ins Büro – ich drück ’nen and’ren Knopf.

Die Türe öffnet sich, ich schau runter.
Der Schacht ist tief, so tief, eng und dunkel.
Es nächtigt bald, der Himmel wird bunter.
In meinen Augen ein letztes Funkeln.

Ich hör das sanfte Rascheln der Linden.
Unten werd ich meinen Frieden finden.

Jonathan Frech

Fußnoten.
1Ein frühes Kon­zept:
2Ent­wick­lungs­no­ti­zen:
3⁠ ⁠raspberrypi.org/documentation/usage/gpio/ [abgerufen 2021-07-24]
4 ⁠ ⁠https://developer.twitter.com/ [abgerufen 2021-10-05]
5⁠ ⁠https://pkg.go.dev/encoding/json#Unmarshal [abgerufen 2021-10-06]
ahttps://www.jfrech.com/
bhttps://schaelpic.de/#ausstellung-49
chttps://www.medienfrech.de/foto/projekte/schwarzbuch-2020.html
dhttps://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip
ehttps://www.raspberrypi.org/software/
fhttps://www.gnu.org/licenses/license-list#Expat
ghttps://www.medienfrech.de/foto/NzF/2021-10-14/t2l.tar
Zitierempfehlung (.BibTeX, .txt):
Frech, Jonathan: »t2l«. In: Notizen zur Fotografie, 2021-10-14. Online: https://www.medienfrech.de/foto/NzF/2021-10-14_Jonathan-Frech_t2l.html
Zitierempfehlung:
@article{NzF.2021-10-14,
	author  = {Frech, Jonathan},
	date    = {2021-10-14},
	title   = {t2l},
	journal = {Notizen zur Fotografie},
	url     = {https://www.medienfrech.de/foto/NzF/2021-10-14\_Jonathan-Frech\_t2l.html},
	urldate = {$0},
}
Zitierempfehlung:
Frech, Jonathan: »t2l«. In: Notizen zur Fotografie, 2021-10-14. Online: https://www.medienfrech.de/foto/NzF/2021-10-14_Jonathan-Frech_t2l.html$1