|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Tasker te avise del tiempo que le queda al bus
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. |
|
|
|
#2
|
||||
|
||||
|
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.
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#3
|
||||
|
||||
|
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/i...?codParada=201 Última edición por guglegap Día 09/07/13 a las 18:21:47. |
|
#4
|
||||
|
||||
|
en mi caso, es para los autobuses de Málaga por ejemplo esta línea: http://www.emtmalaga.es/emt-mobile/i...?codParada=201
![]() 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
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#5
|
||||
|
||||
|
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.
![]() 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 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 ] |
| Los siguientes 3 usuarios han agradecido a maid450 su comentario: | ||
|
#6
|
||||
|
||||
|
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:
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. |
| Gracias de parte de: | ||
|
#8
|
||||
|
||||
|
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 ![]() Fdo: Mlesir
__________________
ATaskREADOS somos el equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
Para cualquier asunto relacionado con el foro, puedes escribirnos a [email protected] Última edición por ATaskREADOS Día 18/07/13 a las 08:37:27. |
|
#9
|
||||
|
||||
|
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%3 Aayuda-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&l ang=es"> | WIDGET</a><a class="ayudaTiempo" href="/ciudadano/index.php?option=com_content&view=article&id=273%3 Aotras-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 |
|
#10
|
||||
|
||||
|
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:
Código:
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 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"> ).*?(\d*|Pró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 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 |
| Gracias de parte de: | ||
|
#11
|
||||
|
||||
|
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.
__________________
|
|
#12
|
||||
|
||||
|
|
|
#13
|
||||
|
||||
|
Bueno, pues al final conseguí hacerlo funcionar
Este 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:
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:
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. Última edición por maid450 Día 19/11/13 a las 12:45:05. |
| Los siguientes 2 usuarios han agradecido a maid450 su comentario: | ||
|
#14
|
||||
|
||||
|
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 Última edición por darkopro Día 17/11/13 a las 13:25:58. |
|
#15
|
||||
|
||||
|
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á. |
| Los siguientes 2 usuarios han agradecido a maid450 su comentario: | ||
|
#16
|
||||
|
||||
|
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? Última edición por darkopro Día 18/11/13 a las 17:35:01. |
|
#17
|
||||
|
||||
|
Respecto a como saber cuantos buses hay, una vez divides %buses por ";" puedes utilizar un bucle for para iterar por los distintos resultados (aquí 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: Código:
64|Nou Hospital La Fe|8;2|La Malva-rosa|17;2|La Malva-rosa|25;64|Nou Hospital La Fe|25 Código:
For %bus items %buses() flash %bus End For 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:
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... |
| Gracias de parte de: | ||
|
#18
|
||||
|
||||
|
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...
![]()
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Última edición por Caravantes Día 19/11/13 a las 11:33:23. |
|
#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
![]() 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 |
| Gracias de parte de: | ||
|
|
|
#20
|
||||
|
||||
|
Saludos, me he descargado el XML,pero da un error, el siguiente, Error: No encuentro perfil ¿a que puede ser debido?, gracias.
|
![]() |
Estás aquí
|
||||||
|
||||||