Viele meiner Projekte basieren auf Raspberry Pi, Arduino, ESP und seit neustem auch Pi Pico. Dafür nutze MicroPython und den bekannten C/C++ Mix der Arduino IDE.
Server
Ich experimentiere gerne mit meinem Dell Poweredge R720 auf dem Proxmox installiert ist. Dort läuft unter anderem eine Nextcloud, ein Grafana-Server und ein paar andere Dienste.
Privat entwickele ich ebenfalls gerne Software. Ich habe bereits ein paar Apps für das Apple Universum entwickelt. Einen Großteil meiner Entwicklungen stelle ich auf GitHub zur Verfügung.
Mit dieser MacOS-App kann man über Keynote eine OLA Präsentation steuern.
Vorgeschichte
Dieses Projekt stammt aus meiner Zeit am Gymnasium St. Mauritz.
Dort habe ich viel mit Bühnentechnik gemacht.
Das Gymnasium St. Mauritz ist eine bischöfliche Schule, was bedeutet, dass es Gottesdienste zu bestimmten Anlässen gibt und religiöse Aktivitäten und Events durchgeführt werden.
Das ist wichtig zu wissen, da ich mit einem guten Freund von unserem Schulseelsorger, der gerne technische Neuerungen ausprobiert und auch sonst interessante Ideen hat, gefragt wurden zu der Planung des Aschermittwochgottesdienstes beizutragen.
Dort konnten wir dann seit Langem mal wieder die Grenzen unserer Bühnentechnik und unseres neuen Lichtmischpultes ausreizen.
In den Planungen haben wir dann einen Gottesdienst mit einigen technischen Raffinessen ausgearbeitet, die wir natürlich unterschätzt haben 😩.
Technische Situation
Auf dieser Grafik kann man die Verkablung für diesen Aschermittwochgottesdienst sehen.
Vorne im Chorraum kann man eine Leinwand mit Beamer (in grün) erkennen.
Auf dieser Leinwand wird die Keynote abgespielt, die der Schulseelsorger für diesen Gottesdienst vorbereitet hat.
Das Gymnasium St. Mauritz hat ein Farbkonzept, das in der Keynote verwendet und auch animiert wird.
Diese Farben sollen im Hintergrund und auf der Orgelbühne von den DMX-Scheinwerfern (in Blau) möglichst synchron zu den Farben der Keynote angezeigt werden.
Natürlich sollen diese Farben nicht nur statisch da sein, sondern auch Übergänge beherrschen, etc..
Damals haben wir das Problem mit dem Starten einer Szene auf dem Lichtmischpult gelöst, was aber ein möglichst gleichzeitiges Drücken der Taste auf dem Macbook (in hellgrau) vorne und hinten auf dem Lichtmischpult erfordert.
Das ist so natürlich ideal.
Außerdem ist es sehr aufwendig so eine Animation in das Lichtmischpult einzugeben.
Wenn dann noch Filme in der Keynote abgespielt werden, ist dieses Timing noch wichtiger.
Nun kann man aber nicht für jede Veranstaltung die Technik auf- und abbauen und betreuen.
Daher musste eine Lösung her, die sich möglichst einfach bedienen lässt und keine intensive Betreuung bedarf.
Olá OLA
Ich habe mich da für die mittlerweile nicht mehr gewartete Software Open Lighting Architecture (OLA) entschieden.
Hauptgrund dafür war, dass man es sehr einfach auf einem Raspberry Pi mit einem USB zu DMX Adapter zum Laufen bekommt und eine halbwegs verständliche Weboberfläche besitzt.
Außerdem gibt es eine HTTP-API (warum ich nicht REST-API sage, dazu komme ich später).
Ich habe dann erstmal einen Artnet-Eingang aktiviert, damit der Schulseelsorger die Lampen für jede Veranstaltung individuell mit einer App für sein iPhone einstellen kann.
Dann habe ich begonnen mir ein paar Gedanken über eine Anbindung an Keynote oder Powerpoint zu machen.
App-Entwicklung
Eine Powerpoint-Erweiterung schied relativ schnell aus, da mir die Programmiersprache wirklich nicht zugesagt hat und ich generell kein Fan von Microsoft Produkten bin.
Daher habe ich zunächst nach einer Methode gegoogelt, wie man die Foliennummer aus Keynote ausliest.
Dies hat auf Anhieb sehr einfach funktioniert, aber leider nur mit AppleScript.
Das kann man aber doch bestimmt auch mit Swift nutzen, oder?
Ja, es ist aber nicht schön (siehe GitHub) und energiehungrig.
Es funktioniert aber trotzdem.
Darum habe ich mich im nächsten Schritt daran gesetzt zu lernen, wie man Apps im Apple Universum entwickelt.
Da hat es sich angeboten direkt mit dem neuen SwiftUI, das 2019 auf der WWDC vorgestellt wurde, anzufangen.
Die ersten Versuche sind kläglich gescheitert und das Projekt geriet in Vergessenheit.
Im November 2021 ist mir dann eingefallen, dass da noch was auf meiner Projekteliste steht.
Also habe ich das AppleScript zum Auslesen der Folien wieder ausgekramt und erstmal überlegt, was die App können soll.
Dann habe ich das UI designed und mich in Document Based Apps in Swift UI eingearbeitet.
Dabei habe ich festgestellt, das es sehr einfach ist mit SwiftUI Apps zu entwickeln, solange man nichts macht, was von Apple nicht vorgesehen ist.
Die Verwendung von Apple Script um die aktuelle Foliennummer der aktuellen Keynote-Präsentation zu ermitteln gehört scheinbar nicht dazu.
Es war nicht gerade leicht Informationen dazu zu finden, wie man AppleScript in Swift effizient nutzt.
Die Antwort, für diejenigen, die ein ähnliches Problem haben sollten, lautet: am besten gar nicht!
Dann war da auch noch die unschöne API von OLA.
Einfach gesagt, geht man einfach nur hin und schreibt die Werte für die DMX Kanäle im jeweiligen Universum kommasepariert in den Body einer GET Request.
Das wäre ja noch akzeptabel, wenn man diese Request einfach mit Swift auslösen könnte.
Das geht nicht.
Stattdessen gehe ich nun hin und rufe curl -d u=\(universe) -d d=\(data) \(serverUrl) mithilfe eines AppleScripts auf.
Das ist zwar hässlich, aber funktioniert!
Nachdem die App grundlegend funktionsfähig war, habe ich dann Übergänge, Shortcuts und andere nette Sachen implementiert auf die ich nun nicht genauer eingehen möchte.
Fertig?
Falls ich irgendwann noch mal Zeit haben sollte, könnte ich mir vorstellen Delays zu implementieren, sodass auch zeitbasierte Übergänge zwischen zwei Folien oder sogar unabhängig von Keynote ermöglicht werden.
Eine andere Idee wäre eine Anbindung an eine Signage-Display-Lösung zu entwickeln, sodass Präsentationen mit Lichteffekten vollautonom abgespielt werden können.
Falls es Ideen, Anregungen oder Probleme gibt, würde ich mich über einen Issue freuen.
Ansonsten wünsche ich viel Spaß beim Nutzen der App und bedanke mich für das Lesen des Artikels.