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 So­nette.

t2l, ein Akro­nym für den Da­ten­fluss Twitter -> Leuchtdioden, be­lauscht den lau­fen­den Twit­ter-Feed nach Tweets in wel­chen Wör­ter vor­kom­men, die ich auch in mei­nem So­nett »Ich schau auf den Bo­den – lau­ter Rit­zen« ver­wen­det habe. Kom­men sol­che 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 be­fand sich in der ⁠ ⁠schael­pic pho­to­kunst­barb und lief vom 6. Au­gust 2021 bis zum 1. Ok­to­ber 2021. In die­sem Bei­trag schrei­be ich da­rü­ber, wie ich die In­s­tal­la­ti­on tech­nisch um­ge­setzt habe; der vol­le Quell­text ist ver­öf­fent­licht, wo­mit Sie selbst die Mög­lich­keit ha­ben, 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 pas­ste 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 so­li­den zu we­nig fä­hi­gem Cli­ent in der In­s­tal­la­ti­on an­zu­brin­gen, wel­cher 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, wel­che 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-Set­up. Nach dem Er­den­ken kommt die Ver­wirk­lich­ung. Es folgt ein Zeit­be­richt wel­cher Zu­gleich als Set­up-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 kra­me ich mein HDMI-Ka­bel he­raus, zie­he dem Pi den Ste­cker, fin­de ei­ne Tas­ta­tur und schal­te ssh ein: Log­in-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 si­che­re 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 soll­te 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, soll­te $ sudo systemctl stop t2l-pi && sudo make -C t2l-pi test-led-strip-controller das Band mit zu­fäl­lig­en Far­ben fül­len.

Der voll­stän­di­ge t2l-Quell­text ist un­ter der ⁠ ⁠Ex­pat-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 Ka­bel des LED-Bands mit dem obe­ren sechs­ten Pin von links des Pis ver­bun­den wer­den. Das wei­ße Ka­bel 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 Ka­bel des LED-Bands wird nicht mit dem Pi ver­bun­den, da das LED-Band über ein ex­te­rnes Netz­teil ei­ne ei­ge­ne Strom­ver­sor­gung von +5 Volt er­hält.

Twit­ter-API. Das Herz­stück der In­s­tal­la­ti­on ist der Tweet-Da­ten­fluss wel­cher ü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. Ein­zig 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.
Ein­zig 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: rech­net 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 ha­ben 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 wel­che 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