Ich habe einige Kurzbefehle, die mir den Status meiner Geräte im Netz anzeigen, wie zum Beispiel die aktuellen Daten meiner PV-Anlage. Leider sind die grafischen Möglichkeiten dafür in den Kurzbefehlen sehr begrenzt. Die Idee, die Ergebnisse als Widget anzuzeigen, ließ sich damit nicht umsetzen – sodass am Ende nur so etwas möglich war:

Simon B. Støvring, der Entwickler von Scriptable und Runestone, hat nun eine Beta-Version seiner neuen App Canvases veröffentlicht. Sie bietet genau die Lösung für dieses Problem und ermöglicht es, die Daten nun als Widget anzuzeigen. Das Ergebnis ist dann optisch sehr viel ansprechender und übersichtlicher.

Wie es funktioniert
Alles, was ich hier beschreibe, bezieht sich auf den Beta-Build 2018. Da Simon B. Støvring in der TestFlight-App fast täglich neue Updates veröffentlicht, kann sich die Build-Nummer schnell ändern. Änderungen in späteren Betas oder im finalen Release sind daher nicht ausgeschlossen.
Die Canvas-Definition
In der App Canvases wird das Widget definiert. Das umfasst das visuelle Design mit seinen Layout-Elementen sowie Platzhalter, die später über einen verknüpften Kurzbefehl mit dessen Ergebnissen gefüllt werden. Für mein Beispiel sieht das so aus:

Im linken Side-Panel wird die aktuelle Struktur des Widgets angezeigt, in der Mitte ein Preview und im rechten Panel die unterschiedlichen Elemente, die man in einem Widget nutzen kann. Ein Klick auf ein Element platziert es am Ende des Baumes im linken Panel. Danach lässt es sich an die gewünschte Position verschieben.
Jedes Element hat eigene Eigenschaften wie Vorder- und Hintergrundfarbe oder Abstände. So kann der Ablauf im Kurzbefehl bestimmen, wie zum Beispiel ein Text gerendert wird, etwa indem die Schriftfarbe von schwarz auf rot wechselt, sobald ein bestimmter Wert unterschritten wird.
Der Kurzbefehl
Um die aktuellen Daten meiner PV-Anlage zu erhalten, rufe ich einen internen Service auf. Das Ergebnis des Aufrufs wird in einem Wörterbuch gespeichert, aus dem ich die jeweiligen Rohdaten abrufen und weiterverarbeiten kann. So gehe ich Eintrag für Eintrag durch, wie hier beispielhaft am Rohdatum mit dem Schlüssel pv_feed_in_w zu sehen ist. Der Wert liegt in Watt vor und wird, bevor er in die Variable togrid geschrieben wird, noch in Kilowatt umgerechnet, indem er durch 1000 geteilt und auf drei Nachkommastellen begrenzt wird.

Damit der Inhalt der Variablen auch im Widget angezeigt werden kann, muss der Wert an den Canvas übergeben werden. Dafür wird im Kurzbefehl die Canvas-Aktion Update View verwendet.

Mit dieser Aktion wird die Eigenschaft „Text“ des Platzhalters „grid“ in der Canvas-Definition mit dem Namen „PV“ auf den Inhalt der Kurzbefehl-Variablen „togrid“ gesetzt.
So werden nacheinander alle Einträge des Wörterbuchs in Variablen geschrieben, die dann als Text im Widget angezeigt werden. Eine Ausnahme ist der Füllstand der Batterie in Prozent, der im Widget durch das Element Progress dargestellt wird. Hier wird die Farbe des Rings unter 11 % auf Rot und über 11 % auf Grün gesetzt.

Nicht alle Inhalte des Widgets stammen aus Variablen. Icons und Einheiten sind zum Beispiel fest im Canvas hinterlegt und werden nicht über den Kurzbefehl gesetzt. Wenn nun alle variablen Werte an den Canvas übergeben wurden, muss das Widget nur noch auf dem Homescreen oder dem Desktop installiert werden. Danach wird das Widget bei jedem Start des Kurzbefehls mit den neuen Daten aus der PV-Anlage versehen.
Da ich die App auf allen meinen Apple-Geräten installiert habe, war ich zunächst erstaunt, dass das Starten des Kurzbefehls auf einem Gerät auch die Widgets auf den anderen Geräten aktualisiert. Das liegt daran, dass die Daten in die Canvas-Definition gespeichert werden und diese Datei dann über iCloud synchronisiert wird. Dadurch werden auch die Widgets auf den anderen Geräten mit den frischen Daten versorgt, allerdings nicht sofort, sondern erst dann, wenn iCloud die Datei im Hintergrund synchronisiert hat.
Layout-Elemente
Das Layout eines Widgets besteht hauptsächlich aus dem Layout-Element Stack. Im Stack können die Inhalte horizontal, vertikal oder übereinander (Depth) angeordnet werden. In diesem Beispiel ist das Layout dann so aufgebaut:

Damit der Prozentwert innerhalb des Progress-Rings angezeigt wird, wird dafür ein Stack mit der Eigenschaft Depth genutzt.
Alle Elemente bieten außerdem weitere Eigenschaften wie Schriftart (bei Text-Elementen), Farbe und Abstand, die sich an praktisch allen Elementen einstellen lassen, meist auch über den Kurzbefehl. Die Möglichkeiten der Feinabstimmung können dabei recht komplex werden, aber meist reicht der Standard.
Das Grid für wiederholende Views
Ein spezielles Layout-Element ist das Grid. Wie der Name sagt, positioniert es die darin enthaltenen Elemente in einer definierten Anzahl von Spalten. Der Layout-Tree sieht in den folgenden Beispielen so aus:

Der einzige Unterschied in der Darstellung ist die Anzahl der Columns (im ersten Beispiel auch rot hervorgehoben).



Die Besonderheit eines Grids ist, dass es sich mit gleich aufgebauten Inhalten füllen lässt, zum Beispiel über eine Schleife im Kurzbefehl. Ein einfaches Beispiel soll zeigen, wie das funktioniert, indem aus einer Datenquelle, hier einem Kurzbefehl-Wörterbuch, Schlüssel/Wertpaare ausgelesen werden. Im Beispiel sind es einige Molkerei-Produkte als Schlüssel, mit einem Wahrheitswert, der zeigt, ob sie eingekauft werden müssen:

Die Ausgabe in dem Widget soll dann am Ende so aussehen:

Für die Canvas-Definition benötigt das Grid einen Stack, der als Vorlage mit den Platzhaltern für die Checkbox und den Text für das Produkt dient.
Theoretisch könnte man nun für jede Zeile im Kurzbefehl das Wörterbuch abfragen und jeweils einen Stack definieren. Das ist aber nicht unbedingt flexibel, falls ein neues Produkt dazukommt oder eines wegfällt. Außerdem ist es einfacher, die nötigen Wörterbuchabfragen nur einmal zu machen.

Damit in dem Kurzbefehl die Zuordnungen gemacht werden können, bekommt jedes Element einen Namen. Zusätzlich muss in den Eigenschaften des Grids der Schalter „Template Children“ eingeschaltet werden (1):

Mit dem Schalter „Editor Shows“ (2) wird eingestellt, ob im Preview nur die Platzhalter der Vorlage angezeigt werden oder die Daten der letzten Ausführung des Kurzbefehls über die Option „Created Children“. Falls der Kurzbefehl noch nicht ausgeführt wurde, steht diese Option nicht zur Verfügung, und auch die Zeile „Clear Created Children“ (4) wird dann nicht angezeigt.
Durch das Anschalten der Option „Template Children“ werden die Elemente im Grid zur Vorlage. Diese lässt sich dann in einer Schleife mit den Daten aus dem Wörterbuch füllen.

Da das Wörterbuch in einer Schleife abgearbeitet werden soll, werden zunächst alle Schlüssel in eine Liste eingelesen (1), über die dann in einer Schleife iteriert wird (2). In jedem Schleifendurchlauf wird dann aus der im Canvas definierten Vorlage ein neuer View erstellt (3), dessen Platzhalter mit den Daten gefüllt werden.
In (4) wird der Schlüssel des Wörterbuchs aus der aktuellen Wiederholung mit Objekt wiederholen abgerufen. Dieser wird dann als Text in den Platzhalter item der zuvor erzeugten Kopie von row im Grid list geschrieben.

Nun muss noch der Wert des Schlüssel/Wert-Paares ebenfalls in den entsprechenden Platzhalter check geschrieben werden. In der Vorlage ist dafür das Element check definiert, das je nach Wert entweder eine leere Checkbox oder eine Checkbox mit einem Haken anzeigt. Dazu wird zunächst der Wert des aktuellen Schlüssels abgerufen (5) und als Wahrheitswert in die Wenn-Aktion (6) übergeben.
Analog zur Übergabe des aktuellen Schlüssels wird auch hier ein Platzhalter gefüllt, allerdings ist die Eigenschaft hier nicht Text, sondern Symbol. Im „True-Fall“ (7) wird das Symbol checkmark.square verwendet, im „False-Fall“ (8) nur das Symbol square.
Wenn die Schleife mit jedem Eintrag des Wörterbuchs durchlaufen wurde und somit für jeden Eintrag ein View gemäß der Vorlage erstellt wurde, ist die Bedingung beendet. Das Ergebnis dieser Schleife ist dann eine Liste von gefüllten „rows“, die als „Children“ der Vorlage row bezeichnet werden.
Zum Schluss wird das Grid list im Canvas „GridTest“ mit dem Ergebnis der Wiederholung aktualisiert. Anders als innerhalb der Schleife wird hier aber nicht die Aktion Update View created from Template, sondern die normale Update View-Aktion verwendet, um die Eigenschaft children von list mit der Liste der Views aus der Wiederholung zu füllen.

Damit lassen sich auch komplexere, mit mehreren Grids gefüllte Widgets erstellen, wie zum Beispiel Simons Widget „Month Calendar“, das er auf seiner Webseite als Beispiel anbietet.
Zu beachten ist, dass ein Widget eine feste Größe hat und so nicht beliebig viele Zeilen anzeigen kann. Falls potenziell mehr Daten vorhanden sind, muss der Kurzbefehl darauf reagieren und die Anzahl der Schleifendurchläufe begrenzen. Insgesamt bietet das Zusammenspiel aus Grids, Vorlagen und Schleifen noch viel Raum, um weitere Lösungsansätze zu entdecken.
Einsatzmöglichkeiten
Die Canvases-App bietet eine neue Möglichkeit, Ergebnisse aus Kurzbefehlen grafisch aufbereitet als Widget zu präsentieren. Dabei können alle Datenquellen genutzt werden, die ein Kurzbefehl verarbeiten kann. Das reicht von Schnittstellen zu Geräten im Netz, wie meiner PV-Anlage, über Services aus dem Internet für Wetter- oder Umfragedaten, bis hin zu Daten, die direkt auf dem Gerät erfasst werden, etwa die Schritte der letzten Tage aus der Health-App als Balkendiagramm. Mein Überblick über die PV-Anlage ist dabei nur ein Beispiel: Anstatt mehrmals am Tag die App oder die Webseite zu öffnen, kann ich die aktuellen Werte direkt auf dem Desktop sehen.
Allerdings gibt es einen limitierenden Faktor beim Einsatz von Widgets: Die Datenaktualisierungsrate ist begrenzt, man spricht von 40 bis 50 Aktualisierungen am Tag. Meine erste Idee, dafür mit launchd auf dem Mac eine Lösung zu bauen, die den Kurzbefehl alle 5 Minuten ausführt, musste ich verwerfen, auch weil diese Möglichkeit auf dem iPhone oder iPad ohnehin nicht besteht. Die Automatisierungsfunktion in den Kurzbefehlen ermöglicht immerhin die Ausführung eines Kurzbefehls zu einem bestimmten Zeitpunkt, zum Beispiel um Aktivitätsdaten täglich um 23:00 Uhr zu aktualisieren, um vor dem Schlafengehen noch einmal zu sehen, wie aktiv der Tag war.
Statt das Widget automatisch zu aktualisieren, kann auch ein Button auf dem Widget platziert werden, der bei einem Klick den Kurzbefehl startet, der dann die neuesten Daten einspielt. Die App bietet dazu die Möglichkeit, dem Button-Element in der Canvas-Definition eine URL hinzuzufügen, die unter iOS, iPadOS und macOS vor Version 27 den Kurzbefehl über folgende URL aufruft:
shortcuts://run-shortcut?name=Kurzbefehl%20Name
Ab den Systemen mit Version 27 gibt es zudem die Aktion Run Shortcut, die ich noch nicht testen konnte.
Bei einem Aufruf des Kurzbefehls über den Button wird aber auch die Kurzbefehle-App gestartet und bleibt im Vordergrund. Als Workaround kann man als erste Aktion im Kurzbefehl die Kurzbefehle-App verstecken:

Mein PV-Anlagenbeispiel habe ich um einen Button und einen Zeitstempel erweitert:

Als Alternative zur Canvases-App bietet Simon auch die App Scriptable an, mit der sich ebenfalls Widgets erstellen lassen, die dann aber in JavaScript geschrieben werden. Für diese App existiert auch eine Community, die fertige Skripts anbietet, wie zum Beispiel hier: A curated list of awesome Scriptable scripts and widgets. · GitHub. Mit der Canvases-App hat Simon aber einen für viele zugänglicheren Weg über die Kurzbefehle-App geschaffen.
Anmerkung
Während iOS und iPadOS schon sehr rund laufen, benötigt die Mac-Version noch etwas Zeit. So konnte ich zumindest bis zur Version 2021 die Elemente im Tree nicht umordnen, weshalb ich das Beispiel-Canvas auf meinem iPad gebaut habe. Es wird automatisch synchronisiert, was manchmal etwas dauert, läuft dann aber mit dem entsprechenden Kurzbefehl auch auf dem Mac.
Ich habe auch bisher nur recht einfache Beispiele gebaut, ohne komplexes Layout. In die Thematik muss ich auch noch tiefer einsteigen, da es einige Parameter gibt, an denen man schrauben kann.
Was ich noch nicht ausprobiert habe, ist die KI-Funktion zum Erstellen eines Canvas. Laut der Dokumentation soll eine einfache Beschreibung dessen, was angezeigt werden soll, ausreichen, um automatisch ein passendes Canvas zu erstellen.
Die Canvases-App bietet außerdem die Möglichkeit, einen Canvas zusammen mit dem dazugehörigen Kurzbefehl zu teilen. Dabei wird ein Link generiert, der bei einem Klick sowohl den Canvas als auch den Kurzbefehl über einen iCloud-Link installiert.
Alles in allem finde ich, dass die Canvases-App ganz neue Einsatzmöglichkeiten für die Kurzbefehle bietet, um eigene Daten und Auswertungen visuell ansprechend als Widget zu präsentieren.


Schreibe einen Kommentar