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
  5. Wenn es 11:02Uhr ist, wird "elf Uhr und nullzwei Minuten" angesagt.
    Ich habe die führende Null wegbekommen, indem ich zuerst zu %Time2 den Wert 1 addiert und danach wieder abgezogen habe. Dann ist die Ansage korrekt "elf Uhr und zwei Minuten".
    Frage: Kann man die führende Nullen auch anders entfernen?

    AntwortenLöschen
    Antworten
    1. @Anonym
      wo hast du den Wert 1 addiert und dann wieder abgezogen?
      Und weiter möchte ich die Ansage per Klick bekommen ohne das ein Fenster aufgeht wie geht das? Möchte es dann in uccw ausführen.
      Danke für Tips

      Löschen
  6. Hatte ich heute Mittag ausführlich beantwortet, aber mein Post ist gelöscht. Warum?

    AntwortenLöschen
    Antworten
    1. ich habe keinen post gelöscht...

      Löschen
    2. Aber hier ist er nochmal:
      Habe ich bei %Time2 gemacht. Alternativ kann man auch %Time2 mit 1 multiplizieren.
      Für die Ansage ohne Fenster einfach Say verwenden.
      SAY %Time1 Uhr %Time2 sagt dann um 11:04 - "elf Uhr vier"

      Ich habe nun das Problem, dass ich zu verschiedenen Uhrzeiten aufstehe. Ich möchte nun immer 15 Minuten nach dem Aufstehen eine Erinnerungsansage hören. Mit WAIT ist mir das schon gelungen. WAIT hat aber den großen Nachteil, dass in der Wartezeit, also den 15 Minuten, alle Tasks stehenbleiben. Das will ich aber nicht.
      Wie kann ich nun realisieren, dass 15 Minuten nach dem Aufstehen die Ansage kommt? Eine einfache Addition der Minuten auf die Zeit geht nicht, da der Übertrag zu den Stunden nicht funktioniert. Aus 11:50 + 15 wird also nicht 12:05, sondern 11:05. Man könnte nun durch Berechnungen etwas machen, aber gibt es denn nicht einen einfacheren Weg? Inzwischen steuere ich meine ganze Wohnung mit Sprachbefehlen über Tasker und FHEM. Soll nun diese kleine Hürde einen Stein in den Weg legen? Vielleicht hat ja jemand eine Idee?

      Schonmal Danke im Voraus.

      Löschen
    3. Ich glaube um eine abfrage wirst du nicht drum herum kommen, ist aber so aufwendig nicht. guck einfach ob deine neue zeit kleiner ist als die alte, wenn ja dann plus 1 stunde...

      Löschen
    4. FHEM habe ich auch bei mir laufen. Wie sendest du deine Befehle? direkt oder über andFHEM Plugin?
      Ich hab das Plugin im Tasker, nur lassen sich Variablen nicht wirklich beobachten da ein regelmäßiges aktualisieren über andfhem akku zieht ohne ende. Cool wäre es wenn Tasker das aktualisieren anstoßen könnte.

      Löschen
  7. Hallo,
    habe eine Frage: wie kann ich dem Tasker bei der Aktion "Vorlesen" sagen, daß er auf ein Lesezeichen im Reader (z.B. Moonreader) zugreifen und das ebook von da an vorlesen soll?
    Habe bisher nichts dazu gefunden.

    AntwortenLöschen