# Der Skriptbaukasten

KDE-Anwendungen können extern von einem anderen Programm von der Kommandozeile aus kontrolliert werden oder von einem Shell-Skript, das das Desktop COmmunication-Protokoll (DCOP) benutzt. KStars benutzt diese Funktionen, um wirklich komplexe Verhaltensweisen in Skripte zu integrieren und zu jeder Zeit aufrufen zu können. Das kann dafür genutzt werden, um zum Beispiel eine Demonstration für ein astronomisches Konzept in der Schule zu erstellen.

Das Problem mit DCOP-Skripten ist, dass das Erstellen ein bisschen wie Programmieren ist und dass es ein entmutigende Aufgabe für Menschen sein kann, die damit keine Erfahrung haben. Das Hilfsmittel Skriptbaukasten bietet eine Oberfläche zum klicken und ziehen, um KStars-DCOP-Skripte zu erstellen und macht es dadurch sehr einfach, komplexe Skripte zu erstellen.

## Einführung in den Skriptbaukasten

Bevor erklärt wird, wie Sie den Skriptbaukasten benutzen, gebe ich hier eine sehr einfache Einführung in alle Oberflächenkomponenten. Für weitere Informationen benutzen Sie die Funktion "Was ist das?".

Das Hilfsmittel "Skriptbaukasten"
Hilfsmittel "Skriptbaukasten"

Der Skriptbaukasten wird im obigen Bildschirmfoto gezeigt. Auf der linken Seite sehen Sie das Feld Aktuelles Skript; mit der Liste der Befehle, die das aktuelle Skript umfasst. Das Feld auf der rechten Seite ist die Funktionsauswahl, sie zeigt eine Liste aller verfügbaren Skriptfunktionen an. Unter der Funktionsauswahl ist ein kleines Feld, das eine kurze Dokumentation über die Skriptfunktion anzeigt, die in der Funktionsauswahl ausgewählt ist. Das Feld unter dem aktuellen Skript ist das Feld für Funktionsargumente, wenn eine Funktion im Feld "Aktuelles Skript" ausgewählt ist, enthält dieses Feld Einträge, um die Argumente der hervorgehobenen Funktion zu bearbeiten.

Oben im Fenster ist eine Reihe von Knöpfen, um ein Skript insgesamt zu bearbeiten. Von links nach rechts gibt es: Neues Skript, Skript öffnen, Skript speichern, Skript speichern unter ... und Skript testen, was das aktuelle Skript im KStars-Fenster ausführt. Sie sollten das Skriptbaukasten-Fenster zur Seite schieben, bevor Sie diesen Knopf drücken, damit Sie die Ergebnisse sehen können.

In der Mitte des Fenster finden Sie eine Spalte mit Knöpfen, die die einzelnen Skriptfunktionen steuern. Von oben nach unten sind es: Funktion hinzufügen, Funktion entfernen, Funktion kopieren, Nach oben verschieben und Nach unten verschieben. Funktion hinzufügen fügt die aktuell ausgewählte Funktion in der Funktionsauswahl zu dem aktuellen Skript hinzu (Sie können die Funktion auch durch einen Doppelklick hinzufügen). Die übrigen Knöpfe bearbeiten die Funktion, die im aktuellen Skript ausgewählt ist. Sie entfernen sie, duplizieren sie oder ändern ihre Position im Skript.

## Den Skriptbaukasten benutzen

Um die Benutzung des Skriptbaukastens vorzustellen, präsentieren wir ein kleines Beispiel, in dem wir ein Skript erstellen, das den Mond verfolgt, während die Zeit beschleunigt abläuft.

Wenn wir den Mond verfolgen wollen, wir müssen die Anzeige darauf zentrieren. Die Funktion lookToward wird dazu benutzt. Wählen Sie diese Funktion in der Funktionsauswahl und beachten Sie die Beschreibung im Feld unter der Auswahl. Drücken Sie den Knopf Funktion hinzufügen, um diese Funktion in das Feld "aktuelles Skript" einzufügen. Das Feld für die Funktionsargumente wird nun ein Auswahlfeld namens Richtung haben. Das ist die Richtung, in die die Anzeige zeigen soll. Das Auswahlfeld enthält nur kardinale Kompasspunkte, nicht den Mond oder andere Objekte. Sie können entweder Moon (engl. für Mond) in das Feld manuell eingeben oder den Knopf Objekt drücken und das Fenster Objekt suchen benutzen, um den Mond aus der Liste der bekannten Objekte auszuwählen. Beachten Sie, dass als Standard bei der Zentrierung automatisch die Objektverfolgung angeschaltet wird, also muss die Funktion setTracking nicht nochmal benutzt werden.

Da jetzt die Verfolgung auf den Mond eingestellt ist, soll als nächstes der Zeitablauf beschleunigt werden. Benutzen Sie die Funktion setClockScale dafür. Fügen Sie sie dem Skript durch ein Doppelklick darauf in der Funktionsauswahl hinzu. Das Funktionsargumentefeld enthält ein Einstellfeld für den gewünschten Zeitschritt. Ändern Sie den Zeitschritt in 3 Stunden.

Nun haben wir die Anzeige auf den Mond gerichtet und die Uhr beschleunigt. Nun möchten wir, dass das Skript einfach eine Weile wartet, während die Anzeige die Spur des Mondes verfolgt. Fügen Sie die Funktion waitFor zum Skript hinzu und benutzen Sie das Feld "Funktionsargumente" um anzugeben, dass es 20 Sekunden warten soll, ehe der nächste Schritt ausgeführt wird.

Um das Ganze abzuschließen, lassen Sie uns den Zeitschritt auf den normalen Wert von einer Sekunde zurücksetzen. Fügen Sie eine weitere Funktion "setClockScale" hinzu und setzen Sie den Wert auf eine Sekunde.

Wir sind noch nicht ganz fertig. Wir sollten vielleicht sicherstellen, das die Ansicht auf äquatoriale Koordinaten geschaltet ist, bevor das Skript dem Mond Folgt. Wenn die Ansicht auf horizontale Koordinaten geschaltet ist, wird sich die Anzeige sehr schnell um große Winkel drehen, wenn der Mond auf- und untergeht. Das kann sehr verwirrend sein und wird vermieden, indem die Ansichtsoption UseAltAz auf false gesetzt wird. Um die Ansichtseinstellungen zu verändern, benutzen Sie die Funktion changeViewOption. Fügen Sie diese Funktion Ihrem Skript hinzu und schauen Sie in das Argumentefeld. Hier ist ein Auswahlfeld, das alle Anzeigeeinstellungen enthält, die von "changeViewOption" verändert werden können. Da wir wissen, dass wir die Einstellung "UseAltAz" benutzen, können wir sie einfach auswählen. Jedoch ist die Liste sehr lang und es gibt keine Erklärung für jeden Eintrag. Deshalb ist es vielleicht einfacher, mit dem Knopf Baum durchforsten ein Fenster mit einer Baumliste aller Anzeigeeinstellungen, geordnet nach Themen, zu öffnen. Zusätzlich hat jeder Eintrag eine kurze Erklärung über die Einstellung und den Datentyp des Einstellungswertes. Wir finden UseAltAz in der Kategorie Himmelskarteneinstellungen. Wählen Sie einfach den Eintrag und drücken Sie Ok und er wird im Feld "Funktionsargumente" ausgewählt. Zum Schluss setzen Sie den Wert auf false (falsch) oder 0.

Ein weiterer Schritt: Das Ändern von UseAltAz am Ende des Skriptes hat keine Auswirkungen, da UseAltAz geändert werden muss, bevor andere Funktionen aufgerufen werden. Also wählen Sie diese Funktion in der Feld "Aktuelles Skript" und drücken solange den Knopf Nach oben verschieben, bis die Funktion an erster Stelle steht.

Nun da wir das erste Skript erstellt haben, sollten wir es speichern. Drücken Sie den Knopf Skript speichern. Das öffnet zuerst ein Fenster, in das Sie den Namen für das Skript und Ihren Namen als Autor eintragen können. Geben Sie Verfolgung des Mondes als Namen und Ihren Namen als Autor ein und drücken OK. Als Nächstes sehen Sie einen &kde;-Speichern-Dialog. Geben Sie einen Dateinamen für das Skript an und drücken Ok, um es zu speichern. Wenn Ihr Dateiname nicht mit .stars endet, wird diese Erweiterung wird automatisch angefügt. Wenn Sie neugierig sind, können Sie die Skriptdatei mit jedem Texteditor ansehen.

Nun haben wir ein komplettes Skript, wir können es auf verschieden Wegen starten. Von einer Kommandozeile können Sie einfach das Skript ausführen, während KStars läuft. Alternativ können Sie das Skript aus KStars mit dem Eintrag Skript ausführen aus dem Menü Datei starten.

## Geräte-Kontrolle mit INDI

Ablaufplanung und Automation wird für alle INDI-kompatiblen Gräte unterstützt. Sie können eine beliebige Zahl von Geräten koordinieren, um komplizierte Abläufe mit &kstars; Skriptbaukasten auszuführen. Dies erreichen Sie mit &kstars; INDI-DCOP- Schnittstelle, die verschiedene Arten von Funktionen für die Aufgaben zu Verfügung stellt. Es gibt fünf verschiedene Arten von INDI-DCOP-Funktionen. Im Folgenden finden Sie eine Übersicht der in &kstars; unterstützen Funktionen und deren Argumente. Lesen Sie unbedingt den Abschnitt INDI-Konzepte, da sie in dieser Einführung angewendet werden.

1. Allgemeine Grätefunktionen: Funktionen, um Geräte zu verbinden und zu trennen &etc;.

   - `startINDI (QString deviceName, bool useLocal)` : Richtet einen INDI-Dienst entweder lokal oder als Server ein.

   - `shutdownINDI (QString deviceName)` : Beendet den INDI-Dienst.

   - `switchINDI(QString deviceName, bool turnOn)` : Verbindet zu einem INDI-Gerät oder entfernt diese Verbindung.

   - `setINDIPort(QString deviceName, QString port)`: Stellt den Verbindungsport des Geräts ein.

   - `setINDIAction(QString deviceName, QString action)` : Startet eine INDI Aktion. Die Aktion kann jedes beliebige Element einer Schaltereigenschaft sein.

   - `waitForINDIAction(QString deviceName, QString action)` : Hält die Ausführung des Skripts an, bis die angegebene Aktion Eigenschaft mit erfolgreich beendet ist.

2. Teleskop Funktionen: Funktionen, um die Bewegung und den Zustand von Teleskopen zu kontrollieren.

   - `setINDIScopeAction(QString deviceName, QString action)` : Stellt den Modus oder eine Aktion für das Teleskop. Mögliche Optionen sind SLEW, TRACK, SYNC, PARK, und ABORT.

   - `setINDITargetCoord(QString deviceName, double RA, double DEC)` : Stellt die Zielkoordinaten des Teleskops auf RA und DEC.

   - `setINDITargetName(QString deviceName, QString objectName)` : Stellt die Zielkoordinaten des Teleskops auf die Koordinaten von objectName. KStars sucht den Namen des Objekts in der Datenbank und gibt Rekt und Dekl zurück, wenn das Objekt gefunden wurde.

   - `setINDIGeoLocation(QString deviceName, double longitude, double latitude)` : Stellt den Standort des Teleskops auf den angegebenen Längen- und Breitengrad. Der Längengrad wird von Greenwich in Großbritannien in östlicher Richtung gemessen. Während es jedoch üblich ist, negative Längengrade für die westliche Halbkugel zu verwenden, müssen die Längengrade für INDI zwischen 0 und 360 Grad eingegeben werden. Bei negativen Längengraden addieren Sie 360 Grad hinzu, um dien Eingabewert für INDI anzupassen. Zum Beispiel Calgary in Kanada hat in KStars die Koordinaten Längengrad : -114 04 58; Breitengrad : 51 02 58. Für INDI geben Sie als Längengrad 360 - 114.083 = 245,917 Grad an.

   - `setINDIUTC(QString ddeviceName, QString UTCDateTime)` : Stellt das Teleskop auf UTC - Datum und Zeit im Format ISO 8601. Das Format ist YYYY-MM-DDTHH:MM:SS (z. B.. 2004-07-12T22:05:32).

3. Kamera/CCD Funktionen: Funktionen zur Kontrolle der Eigenschaften von Kamera/CCD und deren Zustand.

   - `setINDICCDTemp(QString deviceName, int temp)` : Stellt die CCD-Chip Zieltemperatur in Grad Celsius.

   - `setINDIFrameType(QString deviceName, QString type)` : Stellt den CCD-Rahmentyp. Mögliche Optionen sind FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, und FRAME_FLAT.

   - `startINDIExposure(QString deviceName, int timeout)` : Startet die Belichtung von CCD/Camera mit der durch timeout in Sekunden angegebenen Zeitdauer.

4. Focussierer Funktionen: Funktionen, um die Bewegung und den Zustand von Focussierern zu kontrollieren.

   - `setINDIFocusSpeed(QString deviceName, QString action)` : Stellt die Geschwindigkeit des Focussierers. Mögliche Optionen sind FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, und FOCUS_FAST.

   - `setINDIFocusTimeout(QString deviceName, int timeout)` : Stellt die Dauer in Sekunden für alle nachfolgenden startINDIFocus-Operationen.

   - `startINDIFocus(QString deviceName, int focusDir)` : Bewegt den Focussierer entweder einwärts (focusDir = 0) oder auswärts (focusDir = 1). Die Geschwindigkeit und Dauer dieser Operation wird mit den Funktionen `setINDIFocusSpeed()` und `setINDIFocusTimeout()` eingestellt.

5. Filter-Funktionen: Funktionen, um die Position von Filtern einzustellen.

   - `setINDIFilterNum(QString deviceName, int filter_num)` : Ändert die Filterposition auf `filter_num`. Symbolische Namen (Alias) für Filternummern können Sie im Dialog INDI einrichten aus dem Menü Geräte (z. B. Filter 1 = Rot, Filter 2 = Grün &etc;).

Beachten Sie, dass der Name des Gerätes das erste Argument in allen INDI-Funktionen ist. Dadurch können Sie verschiedene Befehle für unterschiedliche INDI-Geräte im gleichen Skript in beliebiger Reihenfolge benutzen. Im "Skriptbaukasten" finden Sie zwei Optionen für die Erstellung und Bearbeitung von INDI-Skripten:

- `Fügen Sie "WaitForINDIAction" nach jeder INDI-Aktion hinzu` : Wenn diese Option ausgewählt ist, wird im Skriptbaukasten automatisch `waitForINDIAction()` nach jeder erkannten Funktion hinzugefügt. Wenn Sie zum Beispiel die Funktion `switchINDI()` einfügen und diese Option ausgewählt ist, wird direkt anschließend "waitForINDIAction CONNECTION" in der Skriptdatei angefügt. Damit wartet das Skript nach `switchINDI()`, bis diese Funktion den Status OK zurückgibt (d. h. die Verbindung ist hergestellt). Es ist sehr wichtig zu wissen, dass im Skriptbaukasten nicht automatisch für allgemeine Aktionen, die mit der Funktion `setINDIAction()` eingegeben wurden, `waitForINDIAction()` hinzugefügt werden kann. Die Ursache liegt darin, dass KStars nicht automatisch die übergeordneten Eigenschaften allgemeiner Funktionen erkennen kann. Daher müssen Sie nach allgemeinen Aktionen manuell `waitForINDIAction()` eingeben, wenn das beabsichtigt ist.

- `INDI-Gerätenamen wiederbenutzen` : Ist diese Option angekreuzt, dann wird als Gerätename aller folgenden Funktionen automatisch der letzte Gerätename eingesetzt. Der letzte Gerätename wird immer dann neu gesetzt, wenn Sie die Funktion `startINDI()` zum aktuellen Skript hinzufügen. Wenn Sie ein Skript für mehreren Geräte schreiben, sollten Sie diese Option abschalten.

Jetzt können Sie ein Demo-Skript schreiben, dass ein LX200 GPS Teleskop und zusätzlich eine Finger Lakes CCD-Kamera steuert. Diese Aufgabe ist einfach. Das Teleskop soll auf den Mars schwenken und ihn verfolgen, dann soll die Kamera drei Photos von 10 Sekunden Dauer im Abstand von 20 Sekunden aufnehmen.

Da es über die INDI-DCOP Schnittstelle keine direkte Rückmeldung über Fortschritt, Wert oder Status einer Geräteoperation und über Parameter (außer für `waitForINDIAction()`) gibt, ist Geräteautomation in KStars etwa ein Steuerungssystem mit offener Schleife. In so einem System gibt es normalerweise keine direkte Rückkopplung, um den Fortschritt des Systems zu messen und Fehler zu korrigieren. Daher müssen Sie Ihre Skripte zur Geräteansteuerung sorgfältig entwerfen. Vor der Anwendung sollten Sie alle Skripte gründlich überprüfen.

Das Hilfsmittel "Skriptbaukasten"
Hilfsmittel "Skriptbaukasten"

Das Demo-Skript wird im obigen Bildschirmphoto angezeigt. Beachten Sie, dass `Append waitForINDIAction after any INDI action` angekreuzt ist, `Reuse INDI device name` aber nicht. Zuerst müssen Sie die Funktion `startINDI()` einfügen. Das Gerät soll lokal betrieben werden, daher müssen Sie den Dienstemodus im Fenster für die Funktionsargumente nicht ändern. Geben Sie den Gerätenamen ein und beginnen Sie mit dem Teleskop "LX200 GPS". Wiederholen Sie die Eingabe für "FLI CCD". Anschließend folgt die Funktion `waitFor()`. Es ist allgemein erforderlich, die Funktion `waitFor()` direkt nach `startINDI()` anzuwenden, um die Ausführung des Skripts für 1-5 Sekunden anzuhalten. Damit wird sichergestellt, dass alle Eigenschaften aufgebaut und bereit für die Annahme von Befehlen sind. Es ist außerdem sinnvoll für die Steuerung entfernter Geräte, weil das Auffinden und der Aufbau von Eigenschaften einige Zeit beanspruchen kann. Mit der nächsten Funktion `switchINDI()` stellen Sie die Verbindung mit jedem Gerät her.

Da `Fügen Sie "WaitForINDIAction" nach jeder INDI-Aktion hinzu` angekreuzt ist, müssen Sie nach `switchINDI()` nicht noch `waitForINDIAction()` hinzufügen, um sicherzustellen, dass das Skript nur nach erfolgreich aufgebauter Verbindung ausgeführt wird. Der Skriptbaukasten führt dies automatisch aus, wenn Sie das Skript speichern. Stellen Sie jetzt den Modus des Teleskops auf Verfolgung, klicken Sie auf die Funktion `setINDIScopeAction()` und wählen Sie TRACK. Beachten Sie, dass Sie den Teleskopmodus auf Verfolgung stellen müssen, bevor Sie die Koordinaten des Objektes zur Verfolgung eingeben. Die Funktion `setINDIScopeAction()` ist nicht zwingend nötig, da damit in diesem Beispiel nur die allgemeine Funktion `setINDIAction()` mit dem Schlüsselwort TRACK eingefügt wird. Der Vorteil bei der Verwendung von `setINDIScopeAction()` liegt darin, dass KStars automatisch `waitForINDIAction()` anfügen kann, falls erforderlich.Diese Möglichkeit gibt es nicht automatisch für allgemeine Aktionen, wie bereits vorher erklärt.

Dann benutzen Sie die Funktion `setINDITargetName()` mit Mars als Parameter. Schließlich starten Sie die Bildaufnahme mit der Funktion `startINDIExposure()` und stellen die Wartezeit zwischen den Aufnahmen auf 20 Sekunden mit der Funktion `waitFor()` und dem Wert 20.

Sie können jetzt Ihr Skript speichern, damit Sie es jederzeit wieder ausführen können. Das Skript sollte etwa folgendermaßen aussehen:

>     #!/bin/bash
>         #KStars DCOP script: Demo Script
>         #by Jasem Mutlaq
>         #last modified: Thu Jan 6 2005 09:58:26
>         #
>         KSTARS=`dcopfind -a 'kstars*'`
>         MAIN=KStarsInterface
>         CLOCK=clock#1
>         dcop $KSTARS $MAIN  startINDI "LX200 GPS" true
>         dcop $KSTARS $MAIN  startINDI "FLI CCD" true
>         dcop $KSTARS $MAIN  waitFor 3
>         dcop $KSTARS $MAIN  switchINDI "LX200 GPS" true
>         dcop $KSTARS $MAIN  waitForINDIAction "LX200 GPS" CONNECTION
>         dcop $KSTARS $MAIN  switchINDI "FLI CCD" true
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" CONNECTION
>         dcop $KSTARS $MAIN  setINDIScopeAction "LX200 GPS" TRACK
>         dcop $KSTARS $MAIN  waitForINDIAction "LX200 GPS" ON_COORD_SET
>         dcop $KSTARS $MAIN  setINDITargetName "LX200 GPS" Mars
>         dcop $KSTARS $MAIN  waitForINDIAction "LX200 GPS" EQUATORIAL_EOD_COORD
>         dcop $KSTARS $MAIN  startINDIExposure "FLI CCD" 10
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" EXPOSE_DURATION
>         dcop $KSTARS $MAIN  waitFor 20
>         dcop $KSTARS $MAIN  startINDIExposure "FLI CCD" 10
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" EXPOSE_DURATION
>         dcop $KSTARS $MAIN  waitFor 20
>         dcop $KSTARS $MAIN  startINDIExposure "FLI CCD" 10
>         dcop $KSTARS $MAIN  waitForINDIAction "FLI CCD" EXPOSE_DURATION

In der INDI-Bibliothek finden Sie robuste Funktionen, mit denen Entwickler sehr komplexe Skripte erstellen können. Weiter Einzelheiten finden Sie im Entwicklerhandbuch für INDI.