Tasker para principiantes. Lección 4: El procesamiento de datos en variables.
[Esto es continuación de otro mensaje previo, en http://www.htcmania.com/showthread.php?p=9099161 ]
Ejemplo 1: Previsión del tiempo
Preparación
Esta es la versión “how-to” (cómo hacerlo) de la tarea que publiqué en este otro artículo ( http://www.pocketables.com/2012/07/tasker-task-that-speaks-the-weather-forecast-download.html ) y que dice el pronóstico del tiempo. Originalmente fue publicado como una tarea lista para ser descargada por cualquiera sin entender cómo trabaja, pero ahora voy a usar este ejemplo para explicar cómo funciona en todo detalle.
Descargue la tarea con el enlace que hay más abajo. Hay dos versiones disponibles, una descarga directa .XML y una versión comprimida ZIP. En algunos dispositivos, puede ir a esa página con el navegador, hacer una pulsación larga en la descarga .XML, seleccionar "guardar enlace", abrirlo una vez descargado y, a continuación, seleccione abrirlo con Tasker. Si eso no funciona, descargue el .zip y descomprímalo de forma manual en la carpeta Tasker/tasks. Los resultantes son idénticos utilizando ambos métodos.
Luego, en Tasker, una pulsación larga en la pestaña de Tareas, y elija Importar. Seleccione la tarea Weather.
Abra la tarea y busque la acción HTTP Get. En el campo Ruta, sustituya el dato YYYYYYY por su ubicación. Esto puede ser un código postal de EE.UU., Estado/Ciudad o País/Ciudad. Ejemplos de ello son 90210, CA/San_Francisco y Norway/Hamar - incluyendo las barras. A continuación, cambie XXXXXXXXX por una clave de API Wunderground. Usted puede obtener una clave de forma gratuita mediante la firma de Wunderground: http://www.wunderground.com/weather/api
Esto no va a funcionar sin la obtención de su propia clave API. Números aleatorios o cualquiera de los ejemplos utilizados aquí no van a servir en la vida real.
Asegúrese de que no hay espacios u otras "irregularidades" al insertar el API. El campo Ruta resultante debe ser algo así:
api123a123b123c/conditions/forecast/qNorway/Hamar.xml
El texto en negrita indica las partes que debe reemplazar.
Por último, entra en la acción Decir, haga clic en la lupa al lado del motor de voz y seleccione un motor de texto a voz que tenga instalado.
Tarea de descarga
b01-weatherxml-175x175.png
Descarga:Weather.tsk.xml
b02-weatherzip-175x175.png
Descarga:Weather.tsk.xml.zip
Explicación
Acciones 1-2:
Los datos del tiempo están disponibles en línea en formato XML, que podemos tener en nuestras manos utilizando http-Get. Como he explicado antes, prefiero hacer HTTP-Get en un archivo local y luego leer en una variable con la acción Leer-archivo en lugar de utilizar la variable %HTTPD generada por HTTP-Get. Tras la acción 2, el resultado es que usted tiene una variable %Weather que contiene todo en el archivo XML.
Acción 3:
Esta es la primera acción Separar-variable. Para entender este punto, usted debe tener el archivo XML abierto en un navegador completo (o editor de texto) con el fin de ser capaz de ver lo que hay en ese archivo. Si al abrir en el navegador aparece un mensaje RSS, pruebe a pulsar CTRL+U (mostrar fuente) en la página.
El separador usado por primera vez aquí es <fcttext><![CDATA[ . Este separador es elegido para llegar lo más cerca posible de la descripción del tiempo, lo que verás si buscamos en el texto de origen. Tenga en cuenta que algunos navegadores "organizan" las etiquetas de tal modo que no será capaz de encontrar este separador específico mediante la búsqueda. Si eso ocurre, busque sólo la primera parte del separador (hasta >), o simplemente vea la siguiente captura de pantalla (haga clic para ampliar la imagen):
Como se puede ver, el primer pronóstico sigue inmediatamente después de este separador. Esto significa que la variable %Weather2 contendrá la previsión y añadirá un montón de texto-basura, mientras que %Weather1 es todo el texto basura previo a la división.
Pero eso no es todo. Puesto que todas las previsiones se "etiquetan" de la misma manera, también se crearán %Weather3, %Weather4 y así sucesivamente. Estos contienen datos del tiempo para períodos futuros, de forma similar a como %Weather2 contiene la previsión del próximo período. Una vez más, %Weather1 es sólo texto basura.
Nota: Si no desea la previsión con el sistema imperial sino con el sistema métrico, utilice el separador <fcttext_metric><![CDATA[ . Esto hará que se usen unidades como kmh en lugar de mph. Usted puede ver la lógica de esto estudiando la captura de pantalla anterior.
Acciones 4-5:
Se trata de dos acciones Separar-variable usando ]]> como separador, una para %Weather2 y otra para %Weather3. Simplemente cortan el texto basura que hay al final de estas variables, dejando en ellas el pronóstico del tiempo y nada más. Esta versión particular de la tarea utiliza la información de pronóstico para los dos próximos períodos, y por eso estamos limpiando %Weather2 y %Weather3, pero no necesitamos limpiar %Weather4 ni otras variables siguientes. Si desea más períodos, sólo tiene que añadir más acciones Separar-variables como éstas para obtener más variables %WeatherX, y utilizar sus primogénitos %WeatherX1 en acciones Decir, al final de la tarea.
Acciones 6-10:
Técnicamente, ya está recibiendo la información del tiempo después de las acciones 4-5. A continuación, tiene %Weather21 y %Weather31 que puede usar como quieras, ya sea en una acción Decir para dar un pronóstico hablado o tal vez para enviar a un widget Minimalistic Text para mostrar en alguna parte. Sin embargo, las acciones 6-10 son para averiguar si la segunda de las dos previsiones futuras es por la noche o por la mañana. Esto es básicamente una característica de lujo que no es estrictamente necesaria, pero la he añadido originalmente para hacer todo más "profesional". Utiliza también Separar-variable, así que voy a explicar cómo funciona.
La acción 6 copia el contenido de %Weather2 en una nueva variable, %Nforecast. Vamos a separar %Weather2 con nuevos separadores, y no queremos sobrescribir las variables hijas ya existentes, por lo que estamos haciendo una copia para evitar este problema.
La acción 7 es Separar-variable para %Nforecast con <title> como el separador. Recuerde que %Weather2% (del que es copia %Nforecast) es ya un hijo, por lo que hay que buscar el separador en una parte ya limitada del documento original. Por lo tanto, sólo hay un <title> en %Nforecast, a pesar de que hay muchos en el texto fuente original. A continuación, para mostrarlo, he marcado de rojo las partes que no están en %Nforecast.
b03-action7.jpg
Esto se traduce en una división de %Nforecast2 que contiene el título del segundo período de pronóstico, así como un cubo de basura al final, tras </title>.
La acción 8 elimina de %Nforecast2 este </title> por división. Esto crea una %Nforecast21, que contiene el título del segundo período de pronóstico.
La acción 9 crea una variable %Nextforecast y lo establece en "tomorrow" (mañana).
La acción 10 sobrescribe la variable creada en acción 9 con el texto " tonight" (esta noche) Si(IF) %Nforecast21 coincide con *night*/*Night*. Esto significa que si el título del segundo período del pronóstico contiene la palabra "night" (noche), el valor de %Nextforecast será " tonight". Si no contiene esa palabra, permanecerá el valor establecido en la acción 9 ("tomorrow").
Al final de estas cinco acciones, tenemos una variable que puede ser "tomorrow" (mañana) o "tonight" (esta noche), dependiendo de si el segundo período de pronóstico es la noche que viene o la siguiente mañana. Si la tarea se ejecuta a primeras horas del día, el primer período de pronóstico será para ese día, y el segundo será para esa noche. Si se ejecuta al atardecer, el primer período de pronóstico será aquella noche, y el segundo a la mañana siguiente. %Nextforecast nos permite saber cuál de los dos tenemos cada vez.
Acción 11:
Esta es la acción Decir que en realidad nos muestra el pronóstico hablado. El texto es:
Weather forecast for today is %Weather21. Weather forecast for %Nextforecast is %Weather31 (El pronóstico del tiempo para hoy es %Weather21. El pronóstico del tiempo para %Nextforecast es %Weather31).
Esta acción Decir contiene tres variables. Dos son los pronósticos del tiempo que recibimos de la línea de XML, mientras que el último, %Nextforecast, cambia el texto para especificar correctamente cual es el periodo al que se refiere el segundo pronóstico.
Como he dicho, sin embargo, usted puede fácilmente saltar las acciones de 6-10. Sólo se pierde la capacidad para especificar correctamente a qué se refiere el segundo pronóstico, lo cual no será importante para algunos - y probablemente no lo será si usted está usando esta información en un widget. Sin embargo, es un buen ejemplo, ya que utiliza los datos de la fuente XML original como una condición Si(If), y no sólo como una fuente de información. Usted también podría usar algo así en un contexto de tipo Valor-de-variable, que tiene un montón de usos en situaciones en las que la variable en cuestión no es sólo de día/noche.
Por supuesto, en este ejemplo también se extrajo la información a usar, el propio pronóstico del tiempo. El método es básicamente el mismo, no importa lo que hagas, sólo tienes que saber dónde cortar un texto de origen para conseguir lo que quieres.
Ejemplo 2: Obtención de noticias locales
Este ejemplo se origina a partir de una solicitud de ayuda en nuestros foros, donde un miembro del foro quería crear una tarea que obtendría sus noticias locales y las leería. La receta es la misma que ya he mostrado, pero ya que esta es una tarea que tenía que crear desde cero, activé el software de captura de pantalla tanto en mi teléfono como en el PC para grabar lo que estaba haciendo mientras narraba al mismo tiempo. Debe ayudar a visualizar este artículo en su totalidad, así como mostrar un truco con el uso de una acción de Flash como una "herramienta de depuración" al crear este tipo de tareas. El vídeo está a continuación.
El sitio web utilizado como una fuente de este tiempo es éste . Echar un vistazo a la fuente reveló que el mejor separador para empezar es <h2>, que no precederá inmediatamente a los titulares buscados, pero tiene la ventaja de no ser poco utilizado en el texto.
Tras la primera división obtenemos la variables %lbnews1, %lbnews2, %lbnews3 y así sucesivamente; %lbnews2 y siguientes contienen los titulares –y también algo de basura. Dividiendo % lbnews2 con el separador "> queda el título al principio de la variable %lbnews22, pero todavía lleva un poco de basura al final. Otra división sobre %lbnews22 usando el separador </a> nos deja con una variable %lbnews221 conteniendo sólo el titular buscado, que puede ser utilizado directamente en acciones dentro de la misma tarea, o transferidos a una variable global para utilizarlo en otros lugares.
Dado que la división inicial creado varios hijos que compartan el mismo formato que %lbnews2, sólo con un artículo diferente, podemos copiar las acciones de división de %lbnews2 y %lbnews22%, y simplemente reemplazar las variables con %lbnews3 y %lbnews32, respectivamente. Tras eso tendremos %lbnews321, que contiene el segundo titular -y nada más. Copiar de nuevo y hacer lo mismo con el número 4 nos daría el titular tercero en %lbnews421, y así sucesivamente para todos los titulares que se deseen. Cada titular estará en su propia variable puede ser utilizado en una acción Decir u otra.
Como he dicho antes, hay maneras de automatizar esto más allá de copiar manualmente las acciones para cada hijo, pero en aras de la simplicidad no voy a entrar en eso.
Tarea de descarga:
Las descargas a continuación contienen la tarea final con 5 variables-titulares completos. Se puede editar para cambiar el número de titulares si fuera necesario. Siga las mismas instrucciones del ejemplo 1 para descargar e importar esto en Tasker. La acción final, que es un decir, tiene que modificarse para especificar un motor de voz diferente si el motor Amy UK Inglés Ivona que estoy usando para mi texto a voz no está instalado.
b04-lpnews-xml-qr-175x175.png
Descarga:Lpnews.tsk.xml
b05-lpnews-zip-qr-175x175.png
Descarga:Lpnews.tsk.xml.zip
Ejemplo 3: Locutor de eventos del calendario de Google
Esta es otra tarea similar. Esta vez obtiene datos de Google Calendar aprovechando la capacidad de Google Calendar para acceder a la agenda con un enlace web, en formato XML. Al igual que con el ejemplo 1, te voy a dar una tarea que se puede descargar e importar y, a continuación, voy a explicar cómo funciona.
Preparación
Descargar la tarea de la parte inferior del artículo. Hay cuatro versiones disponibles: descargas directas XML y versión comprimida para cada una de las dos versiones de tareas básicas, DDMM y MMDD. La versión básica que se necesita depende del formato de fecha que se tenga establecido. Esta tarea sólo funciona con los formatos de fecha DD/MM/AAAA y MM/DD/AAAA. Esto está establecido en la configuración del sistema del dispositivo, en la sección de fecha y hora. Se tiene que utilizar uno de los dos indicados, o no funcionará. Si usted lee 12/07/2012 como 12 de julio, necesita establecer MM/DD/AAAA. Si lo lee como 07 de diciembre, utilice DD/MM/AAAA.
Siga las instrucciones que aparecen en el ejemplo 1 sobre cómo descargar e importar la tarea.
Una vez importado, abra la tarea, vaya a la acción HTTP Get. En el campo Ruta, verá XXXX y YYYY como parte de la ruta:
calendar/feeds/XXXX%40gmail.com/private-YYYY/full?singleevents=true&futureevents=true&orderby=s tarttime&sortorder=ascending&max-results=1
Hay dos cosas que tiene que cambiar. XXXX necesita ser reemplazado con su nombre de usuario de Google, por ejemplo, "fulano" si su correo electrónico de acceso para Google es [email protected]. Si su dirección de correo electrónico de Google no termina en @gmail.com, también hay que cambiar lo que sigue al %40 con lo que sea el dominio de su correo electrónico. Ejemplos:
calendar/feedsfulano%40gmail.com/private-YYYY/full?singleevents=true&futureevents=true&orderby=s tarttime&sortorder=ascending&max-results=1
calendar/feedsfulano%40googlemail.com/private-YYYY/full?singleevents=true&futureevents=true&orderby=s tarttime&sortorder=ascending&max-results=1
YYYY necesita ser reemplazado con una clave de acceso privado para el calendario de Google. Para conseguir esta clave hay que empezar por ir a la página web de Google Calendar. Entre en la configuración, haga clic en la ficha Calendarios y elija el calendario que desea utilizar. En la parte inferior de la pantalla de calendario, haga clic en el botón naranja XML que está junto al rótulo Dirección Privada. Debe obtener un cuadro emergente con una dirección URL similar a la siguiente:
https://www.google.com/calendar/feeds/fulano%40gmail.com/private- 1234567812345678/basic
La clave de acceso es la parte que se destaca en negrita. Debe copiar esto en lugar de YYYY, en el campo Ruta de Tasker. Un ejemplo de una ruta acabada sería:
calendar/feedsfulano%40gmail.com/private-1234567812345678/full?singleevents=true&futureevents=true&orderby=s tarttime&sortorder=ascending&max-results=1
Guardar los cambios realizados en la acción HTTP Get y luego buscar la acción Decir del final. Seleccione un motor de voz que tenga instalado en su dispositivo.
Nota: Calendarios (de Google Calendar) creados recientemente utilizan un formato diferente, con una dirección de correo electrónico [email protected] en la URL. Esta tarea ha sido probada para funcionar con el nuevo formato, pero es necesario especificar tanto a la dirección de correo electrónico como la clave del botón XML mencionado anteriormente.
Tarea de descarga
b06-ddmm-xml-175x175.png
Descargar (DDMM, xml.):CalendarDDMM.tsk.xml
b07-ddmm-zip-175x175.png
Descargar (DDMM, zip.):CalendarDDMM.tsk.xml.zip
b08-mmdd-xml-175x175.png
Descargar (MMDD, xml.):CalendarMMDD.tsk.xml
b09-mmdd-zip-175x175.png
Descargar (MMDD, zip.):CalendarMMDD.tsk.xml.zip
Explicación
Esta tarea se hizo a demanda para un propósito muy específico: Leer el próximo evento del calendario, si es del mismo día. Esto significa que no voy a enumerar varios eventos, aunque se podría utilizar un método similar cambiando la URL de origen.
Acciones 1-2:
Lee los datos en una variable, como antes.
Acción 3:
Copia la variable en otra variable, ya que va a ser su división en múltiples ocasiones. Lo hicimos antes también, con otra variable.
Acción 4:
Hace una división de la variable %Ceventdate, que es la copia de los datos de la agenda de origen, utilizando como separador startTime='. Esto delimita la fecha y hora de inicio del evento. Por tanto, esa información queda a la derecha de la primera división, en %Ceventdate2.
Acción 5:
Copia el valor de %Ceventdate2 en una nueva variable, %Eventdate. Al igual que antes, esto se debe a que vamos a utilizar múltiples fragmentos de variables, y no quiero perder el contenido original.
Acción 6:
Divide la recién creada copia de %Ceventdate2, %Eventdate utilizando el separador – (guión). %Eventdate contiene datos en el formato 2012-09-12T21:30:00.000+02:00, lo que significa que la división con un guión pone el año en su propia variable, el mes en su propia variable, y en otra variable pone el día del mes añadiendo un poco de texto basura al final.
Acción 7:
Esto divide %Eventdate3, que es el tercer hijo de la acción 6 (el que tenía el día del mes, más basura), utilizando la T como separador. Esto es puramente para limpiar esa última variable de la acción 6, eliminando la basura.
Acción 8:
Crea una variable %Samedayevent y establece su valor a "no." Esto es para asegurarse de que el valor predeterminado de esta variable es "no", en caso de que la condición Si(If) en acción 9 no se cumpla. Previene que esta variable arrastre valores resultantes de ocasiones anteriores en que se haya ejecutado la tarea.
Acción 9:
Sobrescribe el valor de la variable creada en la acción 8 en "yes" si la fecha coincide con %Eventdate31-%Eventdate2-%Eventdate1. Esto requiere un poco de explicación para dejar claro lo que se pretende.
%DATE es una variable insoportada de Tasker que contiene la fecha. Está en un formato específico, lo mismo que la configuración del sistema del dispositivo - por lo tanto ¿por qué hay varias versiones de la tarea según el formato de fecha utilizado? %Eventdate31-%Eventdate2-%Eventdate1 contienen el día, mes y año que se obtuvieron en las acciones 6-7 y reorganiza esa información para que coincida con el formato que tiene %DATE. De esta manera, estamos en condiciones de comparar la fecha actual (%DATE), con la fecha del próximo evento, a pesar de que originalmente están en formatos diferentes!
Después de la acción 9, tenemos una variable %Samedayevent que es o "no" (si la condición Si(If) en el 9 no se cumplió) o "yes" (si es que se cumplió). Esta variable es una configuración que usaremos más adelante para controlar si la acción Decir debe mencionar el siguiente evento. Tenga en cuenta que, como he dicho, esta tarea se creó originalmente para alguien que quería esta característica específica. Muchas personas preferirán que se muestre el evento siguiente, sin importarles que sea de otro día. Sin embargo, es un gran ejemplo de cómo se puede procesar un lío de datos para adaptarlos al mismo formato que utiliza Tasker.
Acción 10:
Ya hemos terminado con las acciones que servían para comprobar si el evento es en el mismo día. Hemos estado trabajando con otra variable para obtener la fecha del evento, y ahora volvemos a la variable %Calendar original, que habíamos reservado desde el principio. No creo que hubiera importado si no la hubiéramos copiado desde el principio, pero siempre es una buena práctica hacerlo para estar seguro.
La acción 10 hace Separar-variable sobre %Calendario con el separador <title type='text'> . Este es el texto que precede inmediatamente el título del evento, y aunque no es único (se usa una vez antes en el texto original), está bien para aprovechar este tiempo porque siempre tendremos sólo una aparición de ese texto antes de la que queremos. Eso sólo significa que en lugar de utilizar el hijo %Calendar2, usamos %Calendar3.
Acción 11:
De nuevo hacemos Separar-variable %Calendar3 con el separador </title>. Esto es sólo para la limpieza de la basura en el texto final de %Calendar3, un procedimiento que hemos usado muchas veces a estas alturas.
Acción 12:
Divide la variable %Ceventdate2 con el separador T . No hemos utilizado la "familia" %Ceventdate aún, pero todavía está ahí para lo que necesitemos. Esta vez estamos después de la hora, no la fecha, por lo que estamos empezando de nuevo. La razón por la que copió %Ceventdate2 a una nueva variable en la acción 5 iba a ser capaz de hacerlo ahora.
%Ceventdate2 es idéntica a la %Eventdate original, por lo que su valor empieza con datos en el formato 2012-09-12T21:30:00.000+02:00. Creo que podríamos haber utilizado %Eventdate32 directamente en lugar de empezar de nuevo desde este momento con %Ceventdate2, pero la tarea original fue hecha con un poco de prisa, y no quiero cambiar la tarea en este ejemplo para mantenerla igual a la que se descargaba antes. Es difícil hacer un seguimiento de todas estas variables hijo, y a veces se las confunde. Por eso es mejor prevenir que curar.
Acción 13:
Un ejemplo real de Sección-de-variable aplicado a %Ceventdate22, que ahora contiene datos en el formato 21:30:00.000+02:00*basura*, donde sólo nos interesan 5 caracteres. Eso significa que obtenemos las horas, los dos puntos, y los minutos - el tiempo, en otras palabras. Esta es una buena aplicación de la acción Sección-de-variable mencionada arriba, y nos evita tener que volver a montar el tiempo como se hubiera tenido que hacer si antes hubiéramos dividido con los dos puntos.
Acción 14-15:
Estas dos acciones establecen la variable %nextEvent a cualquiera "Su primera cita es hoy %Calendar31 a las %Ceventdate22" o "No tiene citas programadas para hoy", dependiendo del valor de %Samedayevent, lo que puede ser "Yes" o "no" . Todo esto es un poco redundante, ya que podíamos haber puesto las acciones 8-9 aquí para que lo hicieran directamente, pero de nuevo la culpa es de las prisas con que se hizo la tarea.
Acción 16:
La acción final que culmina las 15 anteriores. Simplemente nos Dice el valor de nextEvent%, que se establece en las dos acciones anteriores. El resultado es que tiene un mensaje para un día sin citas, y por supuesto, para los otros días dice el mensaje dinámico con el título del evento y el momento.
Esta tarea es larga y complicada, debido al uso de diferentes mensajes para diferentes situaciones (evento / ningún caso). Sin esta característica, habría sido un asunto de dividir el título del evento, el cual es bastante simple (acciones 10-12, básicamente). A menudo los pequeños detalles son los que llevan tiempo, como este ejemplo demuestra, y a veces eso es una molestia adicional que no vale la pena para algunas personas.
En conclusión
Ser capaz de procesar datos variables en Tasker abre un montón de posibilidades, pero también hay que trabajar mucho en el seguimiento de las variables cuando se está dividiendo a diestra y siniestra. Hay que mantener la cabeza fría, tener abierto el código del texto como referencia, y usar la depuración mediante una acción de Flash (ver ejemplo 2) son cosas esenciales para alcanzar el objetivo sin volverse loco en el proceso.
En la siguiente parte de la guía voy a cubrir algunos consejos y trucos en la utilización de Tasker, cosas que en realidad no se parecen naturales, y que no fueron incluidos en ninguna de las partes anteriores, pero que merecen ser mencionados. Más adelante en la serie que voy a hacer otras partes dedicadas a ejemplos de todo tipo, así que si tiene un perfil o una tarea que no es capaz de resolver, hágamelo saber y quizá podría convertirlo en ejemplo de otro artículo, al igual que ocurrió con el ejemplo 2 de este artículo.
-----------------------------Con autorización expresa del autor, este artículo es una traducción del original ubicado en
http://www.pocketables.com/2012/09/b...rocessing.html
Beguinners guide to Tasker, by Andreas Ødegård
Original Copyright @ 2006-2012 CrowdGather. All rights reserved ------------------------
Firmado: Caravantes
Última edición por ATaskREADOS Día 30/06/13 a las 23:28:29
|