NzF

t2l

Jonathan Frech
Abstract.
Gast­bei­trag von ⁠ ⁠Jonathan 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 meiner Sonette.

t2l, ein Akronym für den Datenfluss Twitter -> Leuchtdioden, belauscht den laufenden Twitter-Feed nach Tweets in welchen Wörter vorkommen, 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 mittels 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 Installation tech­nisch umgesetzt habe; der volle Quelltext 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)

Hardware-Installation. Das im Herbst 2019 geschriebene So­nett passte thematisch zum Aus­stel­lungs­the­ma sowie zum Schwarzbuch 2020c und wurde folglich auserwählt, auf Kappa-Platten auf­ge­bracht und mit 320 Einheiten des LED-Bands ›YUNBO WS2812B‹ un­ter­stri­chen. Die hardwarenahe GPIO-Pin-Ansteuerung des LED-Bands wird von der Python-3-Bibiliothek ›rpi_ws281x‹ übernommen, womit nur noch der Soft­ware-Teil zu schreiben 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 Installation anzubringen, welcher wie ein Monitor für das Cloud-Backend agiert. Somit ist die Aus­fall­wahr­schein­lich­keit der Komponenten in der Aus­stel­lung überschaubar gering ge­hal­ten und Ver­hal­tens­än­de­rung­en jeglicher Art sind in der Cloud umsetzbar ohne sich am Aus­stel­lungs­ort be­fin­den zu müs­sen. Animationen am LED-Band sind mittels der postmodernen In­ter­net­ge­schwin­dig­keit ohne viel Protokoll-Genialitä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-Controller kommandiert wird. Die­ser Go-Controller kommuniziert über einen WebSocket mit dem eben­falls in Go ge­schrie­be­nen Cloud-Backend.

Pi-Setup. Nach dem Erdenken kommt die Ver­wirk­lich­ung. Es folgt ein Zeitbericht welcher Zugleich als Setup-An­lei­tung dient falls man selbst einen t2l-Client aufsetzen möchte. ⁠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 anscheinend 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 (englisches 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 finden, nutze ich % nmap -sn 192.168.2.0/24 | grep raspberrypi. Mittels % ssh pi@192.168.2.108 und Passwort raspberry bekomme ich eine Shell auf dem Pi. Das Erste was zu tun ist ist na­tür­lich das Abändern des Passworts ($ 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 bereits mit Strom versorgt und an den richtigen 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-Quelltext 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 entnommen wer­den; wenn die Himbeere aufrecht 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 beliebigen 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 Installation ist der Tweet-Datenfluss welcher über die Twitter-API ⁠4 seinen Weg zum LED-Band findet. Die API-Do­ku­men­ta­ti­on ist voll­stän­dig und mit curl-Beispielen erläutert. 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ändert hat und jetzt nur noch De­zi­mal­zei­chen­ket­ten schickt (andernfalls kann ich mir einen in der Aus­stel­lungs­dau­er plötzlich auf­ge­tre­te­nen Fehler nicht er­klä­ren). Wenn auch etwas ver­wun­der­lich, bewies sich der JSON-Unmarshaller ⁠5 der Go-Stan­dard­bib­lio­thek wel­chem die Än­de­rung schnell beigebracht 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 Einrichtung 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 Installation, so sieht man eher eine Hand voll Tweets in der Sekunde. Es gilt also, das Back-End intelligent ab­zu­schal­ten und nicht zu unachtsam Twitter an­zu­fra­gen.

Zwitschern in der Büchse. Vor Abbau der Installation haben wir ein kleines Video gedreht, um die dynamische Na­tur ihrer einzufangen:

Nach dem Einschalten durchläuft der t2l-Client (links im Video) eine Ini­ti­a­li­sie­rungs­se­quenz welche zu­erst aufzeigt ob das LED-Band angesteuert wer­den kann gefolgt von ob das Cloud-Backend antwortet. Danach unterwirft sich der Client gänzlich dem Server. Die­ser hat nun voll­stän­di­ge Kontrolle über das LED-Band und be­ginnt Twitter zu lauschen. Die erlauschten 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 Installation auf von mir verfasste Tweets (rechts in der Mitte, ein­ge­blen­det) reagiert.

Lyrisches Herzstück der Installation ist fol­gen­des von mir geschriebene 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