PDA

Ver la Versión Completa : [ CONSULTA ] Tasker te avise del tiempo que le queda al bus


guglegap
09/07/13, 16:34:06
Hola, ví hace tiempo, un ejemplo de tasker que te decía el tiempo que hacía en tu ciudad mi pregunta es si es posible con tasker hacer que me avise de cuánto le queda al autobús, viendo en la pagina web los minutos que faltan (se guardarán en una variable) y luego me diga esos minutos.
Saludos.

mlesir
09/07/13, 17:54:19
Pues supongo que si lo que ponga la Web lo puedes meter en una variable se puede. Este tema no lo dominó mucho pero yo probaría a cambiar la url en el mismo perfil q del tiempo que mencionas y ver q pasa. Que Web te dice ese dato y para que ciudad vale?
La idea q has tenido es muy buena por cierto.

guglegap
09/07/13, 18:17:11
Se me ocurrió por ese ejemplo del tiempo y por las aplicaciones de bus que te avisan de cuánto tiempo le queda, que dicen los desarrolladores que puede fallar ya que dependen del estado de la página web (supongo que sacarán alguna variable o algo y lo pondrán en su app) en mi caso, es para los autobuses de Málaga por ejemplo esta línea:
http://www.emtmalaga.es/emt-mobile/informacionParada.html?codParada=201

Caravantes
10/07/13, 00:02:51
en mi caso, es para los autobuses de Málaga por ejemplo esta línea: http://www.emtmalaga.es/emt-mobile/i...?codParada=201

Gugle, esa misma página ya te dice cuánto tiempo falta para que el autobús llegue a la pardada. Acabo de ponerla en mi smartphone y se ve bastante bien. Creo que lo más lógico es que metas esa página en los favoritos de tu smartphone para poder consultarla fácilmente cuando quieras saber el tiempo que falta para la llegada del bus. Unos minutos después de que hayas abierto la página, en la parte superior derecha verás un icono con una flecha circular que sirve para actualizar la información de la página, y así obtienes un nuevo cálculo del tiempo que tardará el autobús.

Creo que en este caso, utilizar Tasker es como matar moscas a cañonazos, algo desproporcionado por ser más complicado, lo cual siempre conlleva más riesgo de errores y problemas. Tasker puede consultar esa página y obtener el dato de los minutos que faltan, pero nunca va a mejorar la calidad o la precisión de esa información: si la información de partida es incorrecta o imprecisa, Tasker reproducirá esos errores porque no tiene otros medios para conocer el dato verdadero.

Ante una situación así, creo que el uso de Tasker solo estaría justificado por circunstancias excepcionales. Por ejemplo, el caso de un ciego que quiera escuchar cada cinco minutos cuánto falta para la llegada del bus... evitando escuchar el resto de datos que hay en la página y que siempre son los mismos. Pero en un caso normal creo que usar Tasker en esta situación es complicarse la vida sin sentido.

Otra cosa es que quieras hacerlo por pura diversión (como un reto) o como ejercicio para aprender a manejar Tasker. En ese caso, adelante con ello, contarías con mi aplauso. Y te recomiendo que comiences leyendo la lección 4 que está dedicada precisamente a este tema.

Tasker para principiantes. Lección 4. El procesamiento de datos en variables. Obtención de datos externos y su tratamiento para extraer la información que necesitamos.
http://www.htcmania.com/showthread.php?p=9099161

maid450
10/07/13, 14:48:28
Creo que en este caso, utilizar Tasker es como matar moscas a cañonazos, algo desproporcionado por ser más complicado, lo cual siempre conlleva más riesgo de errores y problemas. Tasker puede consultar esa página y obtener el dato de los minutos que faltan, pero nunca va a mejorar la calidad o la precisión de esa información: si la información de partida es incorrecta o imprecisa, Tasker reproducirá esos errores porque no tiene otros medios para conocer el dato verdadero.

Pues a mi me parece una gran idea, y con tasker por medio se pueden conseguir cosas bastante interesantes.
Está claro que la información de partida puede no ser del todo precisa, pero siendo que es la web oficial de la empresa de transportes es lo más fiable que tienes...

La idea general es esta: lanzas un HTTP GET a la URL de la linea que quieres, guardas el resultado en una variable y con una expresión regular sacas el dato que te interesa.

He estado trasteando un poquito y la mayor dificultad inicial que he visto es en las paradas con múltiples lineas, pero con una expresión regular algo compleja e indicando la linea que interesa en la propia expresión he conseguido resolverlo.
El siguiente problema que he visto y aún no veo claro como resolver es en los casos en que consultas el tiempo que falta en una linea que no pone los minutos (esto creo que pasa cuando falta mucho tiempo, por ejemplo los nocturnos).

Así pues, la tarea no es perfecta ni a prueba de errores pero funciona y es un comienzo, pego la descripción.
%numparada y %linea son 2 variables que habría que establecer al numero de parada y linea a consultar, el resultado (los minutos que faltan) se quedan almacenados en la variable %html

EMT MALAGA (112)
A1: HTTP Get [ Server:Port:emtmalaga.es (http://emtmalaga.es) Path:emt-mobile/informacionParada.html Attributes:codParada=%numparada Cookies: Timeout:10 Mime Type: Output File: ]
A2: Variable Set [ Name:%html To:%HTTPD Do Maths:Off Append:Off ]
A3: Variable Search Replace [ Variable:%html Search: (?s).*?<span class="linea">.*?>%linea<.*?<span class="minutos\d?">\s+.*?(\d+).*?\s+</span>.* Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With:$1 ]

guglegap
10/07/13, 16:18:01
Yo he conseguido hacerlo pero de una forma chapuza (leyendo el código fuente y quedándome con la parte que me interesa) y sólo para una parada determinada, con la función separar variable y con la ayuda de un ejemplo similar para leer las noticias que venía en pocketablet: http://www.youtube.com/watch?v=0Gl3ANAk-Ls&feature=youtube_gdata_player

Así es como lo hice yo, es una chapuza, pero me sirve para la parada interesada:

A1: HTTP Get [ Servidor:Puerto:http://www.emtmalaga.es/ Ruta:emt-mobile/informacionParada.html?codParada=1367 Atributos: Cookies: Cuenta atrás:30 Tipo Mime: Archivo de salida:bus.txt ]
A2: Leer Archivo [ Archivo:bus.txt A la variable:%bus ]
A3: Separar variable [ Nombre:%bus Separador:<li> Eliminar base:Apagado ]
A4: Separar variable [ Nombre:%bus2 Separador:/span> Eliminar base:Apagado ]
A5: Separar variable [ Nombre:%bus23 Separador:"> Eliminar base:Apagado ]
A6: Separar variable [ Nombre:%bus232 Separador:. Eliminar base:Apagado ]
A7: Separar variable [ Nombre:%bus2321 Separador:min Eliminar base:Apagado ]
A8: Establecer variable [ Nombre:%Bus A:%bus23211 Calcular:Apagado Añadir:Apagado ]
A9: Decir [ Texto:Faltan %bus23211 minutos Motor: Voz:com.svox.pico:spa-ESP Stream:3 Tono:5 Velocidad:5 Continuar tarea inmediatamente:Apagado ]

Voy a intentarlo hacer como tú dices maid450, que lo veo de una forma más general y ordenada.

guglegap
10/07/13, 16:53:21
Funciona de maravilla maid450 para cualquier parada y línea sólo falla para eso que dices de si no sale el tiempo pero vaya que está perfecto muchas gracias!!

ATaskREADOS
18/07/13, 01:39:23
Subido al recopilatorio.
Maid y Guglegap muchas gracias y enhorabuena, habeis sido recompensado con el máximo galardón de este subforo: la copa virtual
:campeon:

Fdo: Mlesir

darkopro
14/11/13, 21:47:05
Estoy intentando portar esta tarea para Valencia, he logrado sintetizar el código hasta la parte realmente importante pero no tengo conocimientos suficientes para saber como instar el número de autobús y de parada, posteo el código por si alguien me puede echar un cable:

src="/ciudadano/images/portada/conoce_title.png" alt="Conoce cuándo llega tu autobús"><div class="subtitle"><p>Elige parada</p></div><div id="nombre_paradaTiempo" name="nombre_parada"><label for="parada_nombre"><input type="text" name="parada_nombre" value="Número o nombre" onclick="this.value=''" id="parada_nombre" onkeyup="searchSuggest(event);" autocomplete="off"/></label><div id="search_suggest"></div></div><div id="linea"><p for="linea">Línea</p></div><div id="num_linea" name="num_linea"><label for="linea_numero"><input type="text" id="linea_numero" name="linea_numero" value=""></label></div><div id="blancoTiempo"><p for="todas">En blanco, TODAS</p></div><div id="adaptados"><label for="solo_adaptados"><input type="checkbox" id="solo_adaptados" name="solo_adaptados" ></label></div><div id="textoAdaptados"><p for="adaptados">Sólo adaptados</p></div><div id="botonera"><div id="btnLeft"></div><div id="btnCenter" onclick="valida('es' , 'Anonimo');"><span><p for="resultados"> Ver Resultados</p></span></div><div id="btnRight"></div></div><div id="resultadoTiempo"></div> </div></div><div id="contenedorAyudaTiempo"><a href="/ciudadano/index.php?option=com_content&view=article&id=276%3Aayuda-ggestiona-tu-tiempo&catid=80&lang=es"><img alt="Ayuda" src="/ciudadano/images/stories/ayuda.png"/></a><a class="ayudaTiempo" href="/ciudadano/index.php?option=com_content&view=article&id=280&lang=es"> | WIDGET</a><a class="ayudaTiempo" href="/ciudadano/index.php?option=com_content&view=article&id=273%3Aotras-formas-ggestiona-tu-tiempo&catid=80&lang=es">Otras formas SMS 217712 </a></div></div>

La dirección web de autobuses de Valencia es:
http://www.emtvalencia.es/ciudadano/index.php

maid450
15/11/13, 11:18:33
Pues yo también soy de Valencia, así que despues de ayudar a guglegap se me ocurrió intentar sacarlo para los buses de aquí, y conseguí una tarea que funciona aunque no está terminada ni pulida, esta es la descripción:

EMT_Valencia (86)
A1: Variable Set [ Name:%par1 To:1272 Do Maths:Off Append:Off ] If [ %par1 ! Set ]
A2: Variable Set [ Name:%par2 To:2 Do Maths:Off Append:Off ] If [ %par2 ! Set ]
A3: HTTP Post [ Server:Port:movil.emtvalencia.es (http://movil.emtvalencia.es) Path:mod_tiempo/busca_parada.php Data / File:parada=%par1
linea=%par2
adaptados=0
idioma=es
usuario=movilemt Cookies: Timeout:10 Content Type:application/x-www-form-urlencoded Output File:emt.txt ]
A4: Read File [ File:emt.txt To Var:%html ]
A5: Variable Search Replace [ Variable:%html Search:(?<=<span class="llegadaHome">&nbsp;&nbsp;).*?(\d*|Pr&oacute;ximo).*?(?=</span>) Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%result Replace Matches:Off Replace With: ]
A6: JavaScriptlet [ Code:for(var i=0;i<result.length;i++) {
flash(result[i]);
} Libraries: Auto Exit:On Timeout (Seconds):45 ]
A7: Delete File [ File:emt.txt Shred Level:0 Use Root:Off ]

Las 2 primeras acciones ponen en las variables %par1 y %par2 el numero de parada y de linea respectivamente si las variables no están definidas (esto es porque la idea es llamar a esta tarea como una subtarea), puedes poner aqui las que te interesen o llamar como subtarea pasándole los valores que quieras.
Las acciones 3 y 4 hacen la petición HTTP de la página, guardan el resultado en un fichero y de ahí a la variable %html.
La acción 5 hace el trabajo sucio de extraer los datos y guardarlos en la variable %result
La acción 6 es un pequeño javascript que simplement recorre %result y muestra en un flash los valores, esto se puede hacer con una acción for de tasker...
La acción 7 finalmente borra el archivo con el resultado de la petición HTTP, para no dejar basurilla.
Faltaría hacer algo util con los resultados, pero empecé entonces a trabajar en una versión mejorada que no necesita guardar un fichero temporal y hace una petición que devuelve una página más pequeña (consume menos datos de nuestra tarifa) pero no conseguí hacerlo funcionar del todo y lo dejé abandonado, este post me ha reabierto la curiosidad por el tema así que igual consigo acabarlo y publico aquí la versión mejorada si consigo hacerla funcionar ;-)

sowed
15/11/13, 12:32:36
Muy interesante... También soyde Valencia.
si tengo tiempo miraré a ver como se hace, no tenía ni idea de estas posibilidades. A ver si puedo mirarlo también para el metro.
Tengo un smartwatch y molaria que me mandase una notificacion con el tiempo restante al reloj.

darkopro
15/11/13, 17:55:47
A5: Matches:Off Replace With: ]


Mil gracias maid, esto es un poco raro?
De todas formas no me funciona, ni poniendo replace maches on, replace with:]
Me esperaré a ver si el pique te llega para sacar la nueva tarea :) jejeje

maid450
17/11/13, 12:36:22
Bueno, pues al final conseguí hacerlo funcionar X-D
Este (http://pastebin.com/MTJ2Y0zZ) es el XML de la tarea.

Hay que usarlo como una subtarea para poder lanzarlo desde varias tareas sin tener que duplicar todo el código cada vez.

Habría entonces que crear una tarea aparte en la que recopilemos el numero de parada y de linea (este ultimo es opcional) como queramos (con un popup, por voz, ponerla a piñón, etc...) y pongamos la acción "Tarea -> Ejecutar tarea" llamando a la tarea esta, pasando como parámetro 1 el número de parada, parámetro 2 el número de linea (opcional), le ponemos la máxima prioridad y guardemos el resultado en una variable.
Luego en esa variable resultado tendremos los datos y en el resto de la tarea hay que extraer los datos usando las acciones de separar variable y hacer lo que queramos con ellos.

El resultado devuelto tiene este formato:


Para cada bus del resultado los detalles van separados por "|" y en este orden: num.linea|Destino|minutos

Si está a punto de llegar los minutos es 0


Si el resultado contiene varios buses van separados por ";"

Para una parada y una linea suele devolver la info de los 2 próximos buses que van a pasar
Si no se especifica la linea devuelve los 2 próximos buses de todas las lineas que pasan por esa parada



Por ejemplo podría devolver algo así:


64|Nou Hospital La Fe|8;2|La Malva-rosa|17;2|La Malva-rosa|25;64|Nou Hospital La Fe|25


Que es la info de 4 buses:


Linea 64 a Nou Hospital La Fe: 8 minutos
Linea 2 a La Malva-rosa: 17 minutos
Linea 2 a La Malva-rosa: 25 minutos
Linea 64 a Nou Hospital La Fe: 25 minutos

Me falta todavía manejar bien algunos casos en que la linea devuelve un error como que la han desviado o que no está operativa por algo, pero bueno, en general funciona bastante bien con los casos "normales".
Lo de hacerlo como subtarea y tener que interpretar el resultado es un poco complejo, pero es la forma que permite mayor flexibilidad para usarlo de varias maneras.

darkopro
17/11/13, 12:51:29
Mil gracias maid, veo que tus piques los acabas rápido XD. Creo que haré una escena para poner los datos que salte con el gesture, eres un auténtico crack ;)
Se puede importar de alguna manera desde ahí la tarea en xml?
Se me descarga como .txt

maid450
17/11/13, 13:51:39
Mil gracias maid, veo que tus piques los acabas rápido XD. Creo que haré una escena para poner los datos que salte con el gesture, eres un auténtico crack ;)
Se puede importar de alguna manera desde ahí la tarea en xml?
Se me descarga como .txt
Jeje, la verdad es que ya lo tenía casi, solo era una cosilla que no acababa de funcionar y lo acabé dejando sin encontrar el porqué, pero ya pude arreglarlo.

El txt simplemente renombralo a .xml, lo dejas en la carpeta Tasker/tasks y luego en tasker, en la pestaña de tareas clicas y pones "importar" y ya está.

darkopro
18/11/13, 16:50:19
Maid perdona mi ignorancia de novato, en tu tarea:
-En %par1 tenemos que establecer el número de parada
-En %par2 el número de línea
Y el resultado del tiempo que falta debería aparecer en la variable %buses, no?

PD: perdona en la tarea devolver %buses tenía «parar: activado» y no me devolvía el valor :(
Ahora ya está todo solucionado ;)

Ahora me queda una duda, doy a separar variable %buses A: ;
Y claro lo mismo se me convierte en 2 variables (%buses1 %buses2) que en 4 o en mas.
Como hago para que tasker sepa cuantas son para luego separa esas variables usando | y luego que diga:
-La línea %buses11 con destino a %buses12 taradará %buses13 minutos.
-La línea %buses21 con destino a %buses22 tardará %buses23 minutos
Y así sucesivamente.

La otra gran cuestión sería, como como hacer para si por ejemplo %buses31 y %buses41 son iguales diga:
-La línea %buses31 con destino a %buses32 tardará %buses33 minutos y el siguiente parará dentro de %buses43

Sólo se me ocurre poniendo poniendo Si (if) %busesXX = %busesYX
Pero claro, si lo tengo que hacer con cada variable %buses en cada combinación diferente, puedo estar escribiendo código media vida, hay alguna manera de simplificar este proceso?

maid450
19/11/13, 08:37:36
Respecto a como saber cuantos buses hay, una vez divides %buses por ";" puedes utilizar un bucle for para iterar por los distintos resultados (aquí (http://www.htcmania.com/showthread.php?p=9409867) tienes un tutorial en HTCMania sobre los arrays (o matrices) en tasker y se trata también los bucles for).

Como resumen, en la acción For (Tarea -> For) pones un nombre de variable (por ejemplo %bus en este caso es lo más lógico) y en items pones %buses() (con los paréntesis) y entonces todas las acciones que pongas entre este For y el End For (que debes poner, como con el If y el End if) se ejecutarán para cada bus, hayan 2 o 15, y lo tendrás accesible como %bus.

Por ejemplo, con este resultado:
64|Nou Hospital La Fe|8;2|La Malva-rosa|17;2|La Malva-rosa|25;64|Nou Hospital La Fe|25
Despues de dividir por ; en %buses puedes hacer:


For %bus items %buses()
flash %bus
End For


Y el flash mostrará "64|Nou Hospital La Fe|8", luego otro flash mostrará "2|La Malva-rosa|17", etc...
Así, dentro del for tendrás que hacer todas las acciones que quieras para cada bus.

Sobre la segunda cuestión, la recien salida versión de Tasker incorpora una nueva acción en Variables que es "Array Process" que te permite realizar acciones sonbre arrays, por ejemplo ordenar, con lo que si despues de dividir por ; (antes de entrar al for) teniendo una array con estas entradas por ejemplo:


64|Nou Hospital La Fe|8
2|La Malva-rosa|17
2|La Malva-rosa|25
64|Nou Hospital La Fe|25

Si lo ordenas alfabeticamente (Array Process -> Sort Alpha) quedará así:


2|La Malva-rosa|17
2|La Malva-rosa|25
64|Nou Hospital La Fe|25
64|Nou Hospital La Fe|8

Y ya en el For procesará los elementos en este orden.



Nota que para la linea 64 se pone primero el de 25 minutos que el de 8, porque alfabéticamente el 2 va antes que el 8, igual que si en una parada pasan las lineas 15 y 6 pondrá primero los de la 15 porque el 1 va antes que el 6, no se me ocurre ahora mismo como corregir esto...

Caravantes
19/11/13, 11:23:26
Respecto a como saber cuantos buses hay, una vez divides %buses por ";" puedes utilizar un bucle for para iterar por los distintos resultados

Hay un método más directo. Una vez has dividido %buses (usando el ";" como separador), la expresión %buses(#) contendrá el número de elementos de la matriz y se puede consultar directamente como si fuera una variable cualquiera. En la página que has apuntado (http://www.htcmania.com/showthread.php?p=9409867) viene ese y otros datos interesantes para manejar matrices.

Nota que para la linea 64 se pone primero el de 25 minutos que el de 8, porque alfabéticamente el 2 va antes que el 8, igual que si en una parada pasan las lineas 15 y 6 pondrá primero los de la 15 porque el 1 va antes que el 6, no se me ocurre ahora mismo como corregir esto...

Sugiero añadir un bucle FOR para procesar todos esos datos de minutos. Dentro del bucle, si el dato de los minutos es inferior a 10, le añadimos un cero (por delante); de esa forma, un 8 se convierte en 08. Fin del bucle For. Tras eso ya podemos ordenar alfabéticamente (acción Array Process -> Sort Alpha) y el resultado será perfecto:

64|Nou Hospital La Fe|08
64|Nou Hospital La Fe|25

maid450
19/11/13, 12:44:19
Sugiero añadir un bucle FOR para procesar todos esos datos de minutos. Dentro del bucle, si el dato de los minutos es inferior a 10, le añadimos un cero (por delante); de esa forma, un 8 se convierte en 08. Fin del bucle For. Tras eso ya podemos ordenar alfabéticamente (acción Array Process -> Sort Alpha) y el resultado será perfecto

Es una buena posibilidad, pero pensándolo un poco he visto que era facil tratar esto directamente en el javascript que realiza el procesado de los datos para que devuelva los datos de los buses ya ordenados adecuadamente (por linea y por minutos faltantes).
De esa forma no hace falta añadir procesamiento extra a cada tarea que llame a esta subtarea

He actualizado el XML de la tarea principal (tambien le he cambiado el nombre), habría que borrarla y volverla a importar

sergiotas
17/12/13, 10:24:13
Saludos, me he descargado el XML,pero da un error, el siguiente, Error: No encuentro perfil ¿a que puede ser debido?, gracias.

darkopro
17/12/13, 12:22:58
Saludos, me he descargado el XML,pero da un error, el siguiente, Error: No encuentro perfil ¿a que puede ser debido?, gracias.

Lo estás exportando como tarea?

sergiotas
17/12/13, 13:36:51
Lo he importado cómo tarea pero me indica el error de "No encuentro perfil", hasta ahora no había tenido ningún problema en la importación.

darkopro
17/12/13, 17:02:03
Lo he importado cómo tarea pero me indica el error de "No encuentro perfil", hasta ahora no había tenido ningún problema en la importación.

He leído en otro hilo que has tenido otro problema al importar otro XML, en problema igual está en tu tasker, yo haría un backup de tasker, lo guardaría en una carpeta segura y probaría a borrar datos y caché de la aplicación y sino borrar y reinstalar la misma.