NzF

t2l

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

Mein Bei­trag zur Aus­stel­lung ⁠ ⁠Der Re­flex des Wie­der­er­ken­nens #1b: ei­ne Twit­ter-ge­speist­e LED-Un­ter­strei­chung ei­nes mei­ner Sonette.

t2l, ein Akro­nym für den Da­ten­fluss Twitter -> Leuchtdioden, be­lauscht den lau­fen­den Twit­ter-Feed nach Tweets in welchen Wör­ter vor­kom­men, die ich auch in mei­nem So­nett »Ich schau auf den Bo­den – lauter Rit­zen« ver­wen­det habe. Kom­men solche Wör­ter vor, wer­den sie mit­tels un­ter den So­nett-Zei­len an­ge­brach­ter LED-Bän­der un­ter­stri­chen; wird der Hash­tag #schael­pic ver­wen­det, ist die Far­be 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. Ok­to­ber 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, wo­mit Sie selbst die Mög­lich­keit haben, ein ei­ge­nes 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 so­wie zum Schwarzbuch 2020c und wur­de folg­lich aus­er­wählt, auf Kap­pa-Plat­ten auf­ge­bracht und mit 320 Ein­hei­ten 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 Py­thon-3-Bib­lio­thek ›rpi_ws281x‹ über­nom­men, wo­mit 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, ei­nen soliden zu we­nig fä­hi­gem Cli­ent in der In­s­tal­la­ti­on an­zu­brin­gen, welcher wie ein Moni­tor für das Cloud-Back­end agiert. So­mit ist die Aus­fall­wahr­schein­lich­keit der Kom­po­nen­ten in der Aus­stel­lung über­schau­bar ge­ring ge­hal­ten und Ver­hal­tens­än­de­rung­en jeg­li­cher 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 Se­kun­de durch Deutsch­land ge­beamt – und schei­nen alle an­zu­kom­men.
Die­ser Cli­ent ist in zwei Sub-Cli­ents auf­ge­teilt: Das LED-Band wird von ei­ner Py­thon-3-Bib­lio­thek ge­steu­ert, welche mit ein we­nig Glue-Code von ei­nem Go-Con­trol­ler kom­man­diert wird. Die­ser Go-Con­trol­ler kom­mu­ni­ziert über ei­nen Web­Socket mit dem eben­falls in Go ge­schrie­be­nen Cloud-Back­end.

Pi-Setup. Nach dem Er­den­ken kommt die Ver­wirk­lich­ung. Es folgt ein Zeit­be­richt welcher Zu­gleich als Setup-An­lei­tung dient falls man selbst ei­nen t2l-Cli­ent auf­set­zen möch­te. ⁠ [2]

Für das t2l-Pro­jekt re­in­stal­lie­re ich das Him­beeren­be­triebs­sys­tem: ⁠ ⁠downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip [2021-07-23] mit dem ⁠ ⁠Rasp­ber­ry Pi Im­ag­erd. Lei­der ist ssh an­schei­nend stan­dard­mä­ßig aus­ge­schal­tet. Also krame ich mein HDMI-Kabel he­raus, zie­he dem Pi den Ste­cker, finde ei­ne Tas­ta­tur und schalte ssh ein: Login-Name pi, Pass­wort raspberrz (eng­li­sches Lay­out), sudo systemctl enable ssh && reboot. Den Rest der Kon­fi­gu­ra­tion er­le­di­ge ich über die sichere Shell.
Um den Pi im lo­ka­len Netz zu fin­den, nut­ze ich % nmap -sn 192.168.2.0/24 | grep raspberrypi. Mit­tels % ssh pi@192.168.2.108 und Pass­wort raspberry be­komme ich ei­ne Shell auf dem Pi. Das Ers­te was zu tun ist ist na­tür­lich das Ab­än­dern des Pass­worts ($ sudo passwd pi) und da­nach den Schlüs­sel­aus­tausch % ssh-copy-id pi@... zu voll­füh­ren.
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 aus­füh­ren. Dies kann ei­ni­ge Zeit in An­spruch neh­men 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 zu­fäl­lig­en Farben fül­len.

Der voll­stän­di­ge t2l-Quell­text ist un­ter der ⁠ ⁠Expat-Li­zenze li­zen­siert und als GNU-Tar-Ball he­run­ter­lad­bar: t2l.tarf

Pin­out. Der nu­me­ri­sche Wert der Pins (nicht der GPIO-In­dex) 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-Lay­out 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 sechs­ten 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 da­ne­ben ent­schie­den. Das rote Kabel des LED-Bands wird nicht mit dem Pi ver­bun­den, da das LED-Band über ein ex­te­rnes Netz­teil ei­ne eigene Strom­ver­sor­gung von +5 Volt erhält.

Twit­ter-API. Das Herz­stück der In­s­tal­la­ti­on ist der Tweet-Da­ten­fluss welcher über die Twit­ter-API ⁠ [4] sei­nen 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 Ant­wor­ten 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 ei­nen in der Aus­stel­lungs­dau­er plötz­lich auf­ge­tre­te­nen Feh­ler nicht er­klä­ren). Wenn auch et­was 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 Mo­nat (wo­bei die Mo­nats­pe­ri­o­de am Tag der Ein­rich­tung des API-Zu­gangs be­ginnt) ist nicht auf die leich­te Schul­ter zu neh­men: rechnet man mit ein­und­drei­ßig Ta­gen im Mo­nat, so sind das 500000/31/24/60/60 = 0,1867 Tweets in der Se­kun­de; be­trach­tet man die lau­fen­de In­s­tal­la­ti­on, so sieht man eher ei­ne Hand voll Tweets in der Se­kun­de. Es gilt also, das Back-End in­tel­li­gent ab­zu­schal­ten und nicht zu un­acht­sam Twit­ter an­zu­fra­gen.

Zwit­schern in der Büch­se. Vor Ab­bau der In­s­tal­la­ti­on haben wir ein klei­nes Vi­deo ge­dreht, um die dy­na­mi­sche Na­tur ih­rer ein­zu­fan­gen:

Nach dem Ein­schal­ten durch­läuft der t2l-Cli­ent (links im Vi­deo) ei­ne Ini­ti­a­li­sie­rungs­se­quenz welche zu­erst auf­zeigt ob das LED-Band an­ge­steu­ert wer­den kann ge­folgt von ob das Cloud-Back­end ant­wor­tet. Da­nach un­ter­wirft sich der Cli­ent 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 Twit­ter zu lau­schen. Die er­lausch­ten Tweets wer­den auf der Aus­stel­lungs­web­site (rechts im Vi­deo) an­ge­zeigt, dort orange her­vor­ge­ho­be­ne Tweets be­in­hal­ten den Hash­tag #schael­pic. Im Vi­deo ist wei­ter zu se­hen, wie die In­s­tal­la­ti­on auf von mir ver­fas­ste Tweets (rechts in der Mit­te, ein­ge­blen­det) rea­giert.

Ly­ri­sches Herz­stü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/ [2021-07-24]
4 ⁠ ⁠developer.twitter.com/ [2021-10-05]
5⁠ ⁠pkg.go.dev/encoding/json#Unmarshal [2021-10-06]
ahttps://www.jfrech.com/
bhttps://schaelpic.de/#ausstellung-49
chttps://www.medienfrech.de/foto/projekte/schwarzbuch-2020.html
dhttps://www.raspberrypi.org/software/
ehttps://www.gnu.org/licenses/license-list#Expat
fhttps://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