Freitag, 26. August 2011

[Tutorial] Automatisieren mit Tasker - Teil 3: Variablen

Im dritten Teil meine Tutorial Serie "Automatisieren mit Tasker" möchte ich mich mit Variablen und deren Einsatz beschäftigen.

Fangen wir mit einer ganz grundlegenden Frage an:
Was sind Variablen?
Auf Wikipedia finden wir zwei Definitionen für Variablen. Die erste Definition beschreibt eine Variable in der Mathematik:
Eine Variable bezeichnet in der Mathematik einen Platzhalter für eine Rechengröße, beispielsweise eine Zahl. Der Name leitet sich vom lateinischen Adjektiv variabilis (veränderbar) ab. - Wikipedia -
Während der Schulzeit sollte jeder schon mal mit Variablen gerechnet haben. Einfachstes Beispiel ist die Formel für die Geschwindigkeit aus dem Physikunterricht:
v = s/t
v, s und t stehen hier für veränderliche Größen. Je nach Aufgabe müssen andere Werte für diese Variablen eingesetzt werden. 
In der Informatik funktionieren Variablen nicht anders. Wenn wir eine Größe noch nicht kennen oder wissen, dass diese verschiedene  Werte annehmen kann, setzen wir Variablen ein. Im Gegensatz zur Mathematik können sich hinter den Variablen nicht nur Zahlenwerte, sondern zum Beispiel auch Schriftzeichen oder Wortketten befinden. 
So kommen wir zur zweiten Definition auf Wikipedia, diese bezieht sich auf Variablen in der Programmierung:
In der Programmierung ist eine Variable im allgemeinsten Sinne einfach ein Behälter für Rechnungsgrößen („Werte“), die im Verlauf eines Rechenprozesses auftreten. Im Normalfall wird eine Variable durch einen Namen bezeichnet und hat eine bestimmte Adresse im Speicher des Rechners. - Wikipedia -
Bei Variablen handelt es sich also um Platzhalter, welche beim späteren Ausführen des Programmes mit verschiedenen Werten gefüllt werden.
In Tasker funktionieren Variablen auch nach diesem Prinzip. Damit Tasker zwischen verschiedenen Variablen unterscheiden kann, bekommen diese einen Namen. Dieser Name kann vom Nutzer relativ frei gewählt werden. Ein paar Richtlinien sind dabei jedoch zu beachten:
  • Variablen werden immer mit "%" eingeleitet
  • Variablen dürfen nur Buchstaben oder Zahlen beinhalten, keine Sonderzeichen
  • Der gewählte Name darf noch nicht vergeben sein 
Ein Beispiel für eine korrekt bezeichnete Variable wäre %VAR. 
Neben den vom Benutzer anlegbaren Variablen, besitzt Tasker schon einige eingebaute Variablen, welche verschiedene Systemgrößen beinhalten. Ein Auflistung dieser Variablen inklusive deren Inhalt findet sich hier:
http://tasker.dinglisch.net/userguide_summary.html#variables.html
Kommen wir jetzt dazu, wie wir in Tasker mit Variablen umgehen können.
Tasker stellt verschieden Aktionen zum Umgang mit Variablen bereit. Diese finden sich im Auswahlpunkt "Variables".
  • Variable Add
    • erhöht den Wert einer Variable um eine angegebene Größe
  • Variable Clear
    • löscht den Wert einer Variable
  • Variable Convert
    • Kovertiert den Wert einer Variable. Zum Beispiel Kilogramm in Pfund.
  • Variable Join
    • Vereint alle Variablen des Types %VAR1, %VAR2, %VAR3 usw. zu einer Variable %VAR
  • Variable List
    • Gibt die Werte aller verwendeten Benutzervariablen aus
  • Variable Query
    • Öffnet ein Eingabefenster, der vom Nutzer eingegebene Wert, wird in einer angegebenen Variable gespeichert
  • Variable Randomize
    • Speichert einen zufälligen Wert in einer angegebenen Variablen ab
  • Variable Set
    • Speichert einen angegebenen Wert in einer Variable ab
  • Variable Split
    • Teilt den Inhalt einer Variable an angegebenen Stellen.
  • Variable Subtract
    • Vermindert den Wert einer Variable um eine angegebene Größe
Die wahrscheinlich wichtigste Aktion stellt hierbei "Variable Set" dar. Denn diese Aktion ermöglicht es eine Variable anzulegen und mit einem Wert zu füllen.

Als kleines Beispiel soll nun ein Task gebaut werden der den Nutzer auffordert eine Eingabe zu machen und diese dann über ein Popup wieder ausgibt. Dazu legen wir einen neuen Task an und nennen ihne zum Beispiel "Variablentest".
  • Task: "Variablentest"
    • Variable -> Variable Query
      • Name: %EINGABE
      • Label: Gib was ein
      • Default: genau hier
    • Alert -> Popup
      • Text: Du hast "%EINGABE" eingegeben.

Wenn wir den Task nun mit dem Play-Button starten, erscheint als erstes eine Eingabeaufforderung, wir können nun den Text "genau hier" entfernen und irgendwas anderes hinschreiben. Nach dem Bestätigen des Fensters erscheint ein Popup mit unserer Eingabe. 
An dem Popup sieht man gleich gut, das man Variablen ohne Probleme mit normalem Text vermischen kann. Da eine Variable immer mit % eingeleitet wird und keine Sonderzeichen beinhalten darf, weiß Tasker wo unsere Variable %EINGABE anfängt und wo sie endet.

Als nächstes wollen wir uns der Funktion "Variable Split" widmen. Diese Funktion ist nötig wenn wir aus einer großen Variable nur einen kleinen Teil benötigen. Als Beispiel wollen wir die Systemvariable %TIME verwenden. Diese beinhaltet die aktuelle Uhrzeit in dem Format "HH.MM". Wir wollen nun einen Task bauen der uns die Uhrzeit ansagt. Damit die Sprachausgabe aber nicht "9punkt50" sondern "9 Uhr 50" sagt, müssen wir den Punkt durch ein "Uhr" ersetzen. Dazu teilen wie die Variable %TIME mit "." als Teiler.

Durch das Aufteilen werden zwei neue Variablen erstellt:
  • %TIME1 = 09
  • %TIME2 = 50
Eine Variable kann in maximal 9 Teile geteilt werden. Eine Variable %VAR12 kann trotzdem existieren. Diese entsteht wenn %VAR1 nochmals geteilt wird.

Der Sprachausgabe muss einfach nur der anzusagende Text übergeben werden. Damit die Sprachausgabe funktioniert muss eine entsprechende TTS (Text-to-Speech) Engine installiert sein. Ich verwende dabei die kostenlose Pico-TTS.



Kommen wir nun zum Task:
  • Task: "Zeitansage"
    • Variable -> Variable Split
      • Name: %TIME
      • Splitter: .
    • Misc -> Say
      • Test: Es ist %TIME1 Uhr %TIME2
      • Engine: mit klick auf Lupe auswählen
Wenn wir nun den Task starten sollte uns die Zeit halbwegs verständlich angesagt werden, evtl muss die Medienlautstärke vorher noch erhöht werden.

Variablen können nicht nur in Aktionen eingesetzt werden, auch als Kontext kann man Variablen verwenden. Dazu existiert zum Beispiel der Kontext "State -> Variable -> Variable Value". Ein entsprechendes Profil wird also dann aktiv, wenn eine bestimmte Variable einen vorgegebenen Wert beinhaltet. Als Beispiel nehmen wir die Variable %EINGABE von vorhin, da wir sie leicht mit unserem vorherigen Task verändern können. Unser Beispielprofil soll nun den Zeitansage Task starten wenn der Inhalt von %EINGABE "Zeit" ist.
  • Profil "Zeit"
    • Kontext:
      • State -> Variable -> Variable Value
        • Name: %EINGABE
        • Op: Matches
        • Value: Zeit
    • Task: "Zeitansage"
Wenn wir nun unseren Task "Variablentest" starten und "Zeit" in das Eingabefeld eintragen, sollte uns eine nette Stimme die aktuelle Uhrzeit ansagen :)

Das war mein Crash-Kurs in Sachen Variablen in Tasker. Ich hoffe ich konnte euch einen guten Einblick geben.

Kommentare:

  1. Guten Tag,

    habe noch eine Frage zu den Variablen:
    kann man einen Wert einer bereits erstellten Variable mit einem Task in eine andere Variable kopieren?

    Gruss, Stef

    AntwortenLöschen
  2. Natürlich:

    Variable -> Variable Set:
    Name: %neueVar
    To: %altVar

    du kannst generell absolute Werte oder Variablen in allen Tasker Aktionen übergeben, d.h. überall wo eine Aktion eine Eingabe von dir will kannst du eine Variable eintragen welche beim Aufruf der Aktion den richtigen Inhalt hat. SO auch bei Variable Set.

    Alles klar?

    AntwortenLöschen
  3. Bei mir kommt leider immer nur das Popup "Du hast .... eingegeben". Wenn ich den Task Zeitansage teste, höre ich die Zeit.
    Wenn ich dann im Profil Zeitansage den Begriff "Zeit" eingebe, kommt aber wieder das Popup und ich höre keine Ansage.

    AntwortenLöschen
  4. Hallo, ich habe eine Frage über den Inhalt der Teiler. Ich habe für mein Projekt (TV-Programm downloaden und vorlesen lassen) den Kalendertext in Variablen aufgesplittet. Ein Teiler davon sind Zeitangaben, die mit z.B. startTime='2012-12-15T13:30:00.000+01:00' angegeben sind. Das Problem liegt in der Sommer und Winterzeit das sich durch :00.000+01:00' im Winter oder :00.000+02:00' im Sommer unterscheidet. Kann ich den Wert 1 bzw 2 mit irgendeinem Sonderzeichen überspringen bzw. ignorieren lassen? Ansonsten müsste ich bei jeder Zeitumstellung die Tasks neu umschreiben. Sind zwar nur insgesamt 4 Werte, nur vergisst man so was leicht im laufe der Monate.

    Danke für die Hilfe speziell und der Seite insgesamt

    AntwortenLöschen
    Antworten
    1. du könntest eine zusätzliche If-then-else abfrage einfügen. Dafür zum Beispiel bei "+" spliten, dann beim feld hinter plus abfragen ob es "01:00" ist oder "02:00" und jenachdem den if oder else zweig durchlaufen. Damit wird dein task zwar länger aber sollte mit beiden zeiten zurecht kommen

      Löschen
    2. oh, die Lösung liegt wie so oft so nah. An die If-then-else-Abfrage hab ich in dem Zusammenhang nicht mehr gedacht. Werde es umsetzen. Danke für den Tip

      Löschen