Acceder

Ver la Versión Completa : [ TUTORIAL ] Procesar los XML de AEMET (versión Código>JavaScript)


WillyWeb
06/11/17, 19:14:52
- - ADVERTENCIA - -
Este tutorial está basado en otro en el que explicaba cómo procesar los XML de la predicción meteorológica de AEMET usando código JavaScript metido en una acción JavaScriptlet. No es imprescindible, pero te recomiendo que leas el otro tutorial antes para que tengas una visión más completa del tema.

[Tutorial] Procesar los XML de AEMET (versión Código>JavaScriptlet) (http://www.htcmania.com/showthread.php?t=1360293)
- - - -

Dando respuesta a una propuesta de Mitrhandir [mensaje #22 (http://www.htcmania.com/showpost.php?p=27385586&postcount=22) de este tema (http://www.htcmania.com/showthread.php?t=1360293)] he juntado el código JS de mi solución inicial [mensaje #1 (http://www.htcmania.com/showpost.php?p=27334002&postcount=1) de este tema (http://www.htcmania.com/showthread.php?t=1360293)] en un único script que procesa los dos XML de AEMET. La verdad es que he ido un poco más lejos y esta "nueva solución" que propongo casi permite olvidarse del código JS porque no se ve/toca para nada. :rolleyes:

En pocas palabras, en vez meter todo el código necesario en una acción JavaScriptlet lo vamos a meter en un archivo que ejecutaremos desde una acción JavaScript. Y para no tener que tocar el contenido de ese archivo usaremos variables de Tasker para hacer los pocos ajustes necesarios.

Esta "nueva solución" de la que hablo en realidad son dos diferentes [mensaje #23 (http://www.htcmania.com/showpost.php?p=27391783&postcount=23) de este tema (http://www.htcmania.com/showthread.php?t=1360293)]. La primera, bastante simple y que ya tenía medio hecha, que devuelve la predicción de un único día/periodo en variables locales de Tasker. Y la segunda, mucho más potente, que devuelve la predicción de varios días/periodos en arrays locales de Tasker.

¿Por qué dos soluciones diferentes? ... Pues la verdad es que sobra la primera ya que la segunda puede hacer lo mismo y mucho más. Pero la primera ya la tenía hecha y si sólo requieres la predicción para un día/hora concretos te puede valer perfectamente. Por contra, si la tarea que tienes en mente requiere algo más que la predicción de un día/hora concretos no lo dudes y usa la segunda solución.

Como he dicho al principio, todo el código necesario está metido en un archivo. Para la solución que devuelve variables (la primera) el archivo se llama aemet_var.js. Para la solución que devuelve arrays (la segunda) el archivo se llama aemet_arr.js. Y ambos se "ajustan" igual, por medio de unas pocas variables (%aemet_xxx) que modifican los valores que tienen por defecto.

Variables %aemet_xxx

%aemet_xml ... pmhoras | pm7dias

Si la estableces en la tarea el código JS comprobará si el tipo de XML contenido en %HTTPD coincide con su valor. Es una forma simple de comprobar que has descargado el XML que pretendías.

%aemet_dedias ... número

Establece el número máximo de fechas que se procesarán. Para aemet_var.js el valor por defecto es 1 y no puede ser otro. Para aemet_arr.js el valor por defecto se ajustará al máximo posible para cada tipo de XML.

Para que aemet_arr.js se comporte como aemet_var.js y sólo devuelva los datos de un día se asigna %aemet_dedias=1 y tema resuelto.

%aemet_dehoras ... hora-hora | hora,hora | lista de horas/rangos

Establece de qué horas se extraerán datos. Para aemet_var.js el valor por defecto es 1 y no puede ser otro. Para aemet_arr.js el valor por defecto dependerá de si %aemet_dedias=1, en cuyo caso será la hora actual, o %aemet_dedias>1, en cuyo caso será 00-23. Es posible especificar valores concretos o rangos separándolos con comas.

Si quieres datos de la seis primeras horas del día, las 12, las 15 y las dos horas previas a la media noche, lo puedes hacer así: %aemet_dehoras=00-05,12,15,22-23

%aemet_endias ... número

Establece el número de días que se sumarán al momento actual para calcular la primera fecha a procesar. El valor por defecto es 0.

Si quieres los datos de mañana asigna %aemet_endias=1 ... para pasado mañana %aemet_endias=2 ... y así sucesivamente.

%aemet_enhoras ... número

Establece el número de horas que se sumarán al momento actual para calcular la primera fecha a procesar. El valor por defecto es 0.

Si quieres la previsión para dentro de 6 horas asigna %aemet_enhoras=6.

%aemet_perhora ... h0 | h6 | lista de horas* [ver la función periodo() en el mensaje #1 (http://www.htcmania.com/showpost.php?p=27334002&postcount=1) de este tema (http://www.htcmania.com/showthread.php?t=1360293)]

Establece las horas de las que se extraerán datos en el formato correspondiente al tipo de XML. Si %aemet_dedias=1 su valor se ajustará para extraer los datos correspondientes al momento actual. Si %aemet_dedias>1 (sólo en aemet_arr.js) su valor se ajustará para extraer todos los datos disponibles.

*Para aemet_arr.js es posible establecer una lista de horas (valores de hora válidos separados por comas). Ejemplo: 01,06,12,18.

%aemet_perrango ... r6 | r6- | r12- | r24- | lista de rangos* [ver la función periodo() en el mensaje #1 (http://www.htcmania.com/showpost.php?p=27334002&postcount=1) de este tema (http://www.htcmania.com/showthread.php?t=1360293)]

Establece los rangos de los que se extraerán datos en el formato correspondiente al tipos de XML. Si %aemet_dedias=1 su valor se ajustará para extraer los datos correspondientes al momento actual. Si %aemet_dedias>1 (sólo en aemet_arr.js) su valor se ajustará para extraer todos los datos disponibles.

*Para aemet_arr.js es posible establecer una lista de rangos (valores de rango válidos separados por comas). Ejemplo: 00-06,12-24.

...

Como ya he comentado todas las variables %aemet_xxx son opcionales. Si no se definen en la tarea el código JS las creará y calculará los valores adecuados para cada caso de forma que serán consultables/utilizables una vez ejecutada la acción JavaScript.

Casos prácticos

Veamos cómo ajustar las variables %aemet_xxx para extraer datos de predicción concretos.

Datos de ahora mismo con aemet_var.js

- XML de AEMET indiferente
- Variables %aemet_xxx sin establecer

Datos de ahora mismo con aemet_arr.js

- XML de AEMET indiferente
- %aemet_dedias=1

Datos para dentro de 12 horas con aemet_var.js

- XML de AEMET indiferente
- %aemet_enhoras=12

Datos para dentro de 12 ahoras con aemet_arr.js

- XML de AEMET indiferente.
- %aemet_dedias=1
- %aemet_enhoras=12

De la previsión para 7 días, los datos de 2 días desde mañana con aemet_arr.js

- %aemet_xml=pm7dias
- %aemet_dedias=2
- %aemet_endias=1

De la previsión por horas, las tres horas centrales de mañana con aemet_arr.js

- %aemet_xml=pmhoras
- %aemet_dedias=1
- %aemet_dehoras=11-13
- %aemet_endias=1

Valores devueltos

Los datos generales del XML son siempre devueltos en las variables locales ... %enlace / %elaborado / %nombre / %provincia ... indistintamente del tipo de XML o del archivo *.js con el que sea procesado.

En cuanto a los datos de la predicción ambos archivos *.js devuelven todos los valores relevantes de cada tipo de XML con los mismos nombres base para las variables y los arrays.

¿Los mismos nombres base? :pensando:

Para la dirección del viento he usado como nombre base dirviento. Si usas aemet_var.js el dato estará en la variable local %dirviento y si usas aemet_arr.js los datos estarán en el array local %dirviento() ... ¿aclarado?

En la predicción por horas los nombres base son: diapred / perpred* / orto / ocaso / descielo / estcielo / lluvia / nieve / temp / senter / humrel / dirviento / velviento / rachamax / problluvia / probtorm / probnieve / icocielo / icoviento / vientodel.

En la predicción para 7 días los nombres base son: diapred / perpred* / problluvia / cotanieve / descielo / estcielo / dirviento / velviento / rachamax / tempmax / tempmin / sentermax / sentermin / hummax / hummin / uvmax / dtem / dste / dhre / icocielo / icoviento / icouvmax / vientodel.

*Este dato sólo se define, como array, en el archivo aemet_arr.js

Máximos y mínimos

Estos datos sólo están disponibles si se usa el archivo aemet_arr.js, por razones evidentes. En un primer momento me limité a extraer el valor máximo o mínimo de cada dato numérico [mensaje #10 (http://www.htcmania.com/showpost.php?p=27361428&postcount=10) de este tema (http://www.htcmania.com/showthread.php?t=1360293)], pero después de pensarlo un poco me ha parecido mucho más interesante extraer el valor máximo y el mínimo de forma que para cada dato numérico tenemos su valor más alto y más bajo. Todos estos datos están disponibles en una serie de arrays con los mismos nombres base que los datos correspondientes más el sufijo _ab ...

Predicción de 7 días: problluvia_ab / cotanieve_ab / velviento_ab / rachamax_ab / tempmax_ab / tempmin_ab / sentermax_ab / sentermin_ab / hummax_ab / hummin_ab / uvmax_ab.

Predicción por horas: lluvia_ab / nieve_ab / temp_ab / senter_ab / humrel_ab / velviento_ab / rachamax_ab / problluvia_ab / probtorm_ab / probnieve_ab.

En esos arrays, el índice 1 apunta al valor más alto y el índice 2 al más bajo del array del dato correspondiente a su nombre base.

Supongamos que queremos saber qué día está prevista la temperatura máxima más alta y la mínima más baja ...

máxima más alta ... %tempmax_ab1=4 ... %tempmax4=20 ... %diapred4=2017-11-04 ... %perpred4=12-18
mínima más baja ... %tempmin_ab2=9 ... %tempmin9=-2 ... %diapred9=2017-11-06 ... %perpred9=00-06

... así que el día 04, de 12 a 18, tendremos la máxima más alta con 20º y el día 06, de 00 a 06, la mínima más baja con -2º ... fácil. :rolleyes:

Los datos de problluvia/probtorm/probnieve son listas de valores numéricos emparejados con los rangos horarios de %perpred(). Para que no tengáis que procesar eso he añadido un par de valores más a sus arrays _ab. En los índices 3/5 están el valor máximo y su periodo. Y en los índices 4/6 el valor mínimo y su periodo.

Como recordatorio ... %tempmax_ab(1) es lo mismo que %tempmax_ab1 y si eso vale 4 entonces %tempmax(%tempmax_ab1) es lo mismo que %tempmax4 ... lo digo por si acaso. :silbando:

Archivos aemet_xxx.js y tareas de ejemplo

He dejado todos los archivos en el [Repositorio de tareas Tasker (http://www.htcmania.com/showthread.php?t=1164924)] de ATaskREADOS ...

https://tinyurl.com/ATaskREADOS ***

... concretamente en la carpeta "Procesar los XML de AEMET - WillyWeb".

*** El software del foro impide que el enlace funcione adecuadamente. Copia y pega la URL en la barra de direcciones.

Las tareas (archivos *.tsk.xml) simplemente son pequeñas "demos" que extraen y muestran todos los datos disponibles en cada XML. Insisto, no procesan o interpretan los datos, simplemente los muestran. Están listas para importar en Tasker y no creo que requieran muchas explicaciones. De todas formas su estructura es muy simple ...

A1 asigna el INE en %par1
A2 y A3 descargan cada uno de los XML de AEMET (por horas o 7-días)
A4 a A8 asignan valor a las variables %aemet_xxx más significativas
A9 ejecuta el script aemet_xxx.js
A10 en adelante generan un archivo plain/text con los resultados
Axx la última acción abre ese archivo con cualquier aplicación disponible

Los archivos aemet_var.js y aemet_arr.js se deben copiar en la raíz de la memoria interna de vuestro dispositivo. Si los ponéis en otro sitio deberéis seleccionar la nueva ubicación en la acción #9 de cada tarea. Y ojo con seleccionar el archivo aemet_xxx.js que corresponde a cada tarea.

Preguntas del millón

Las tareas no me avisan de si mañana va a llover, ¿por qué?

Porque ese no es su propósito. Simplemente son "demos" para que veas todos los datos disponibles y la forma de sacar los máximos y mínimos.

Las tares procesan ambos XML pero no al mismo tiempo, ¿es que no se puede?

Pues se debería poder haciendo algo así ...

- Descargar uno de los XML
- Ejecutar el archivo aemet_var.js
- Descargar el otro XML
- Ejecutar el archivo aemet_var.js

... pero haz la prueba y nos cuentas.

Lo de procesar ambos XML al mismo tiempo está muy bien, pero ¿se puede hacer también con aemet_arr.js?

:pensando: ... pues no sabría decirte ... haz la prueba y nos cuentas.

Las tareas de prueba son algo lentas, sobre todo la que devuelve arrays ... ¿qué pasa?

Pues veamos lo que pasa ...

Cuando el script aemet_arr.js procesa el XML de la previsión por horas saca 26 datos de cada una de sus 48 horas. Eso son 1248 datos leídos del XML. A continuación se procesan 19 datos de las 48 horas para localizar los valores más altos y más bajos. Eso reduce 912 datos a 32. Después la tarea genera un archivo de texto con todos esos datos y unos pocos más. El proceso del XML de la previsión de 7 días es similar. No digo que el código JS sea una maravilla. Y tampoco es que ayude mucho el interprete JS de Tasker. Pero dos/tres segundos me parece un tiempo razonable para lo que hacen esas tareas ... ¿no te parece?



Ufff, eso es todo. :estrellas:

Caravantes
07/11/17, 09:22:27
Impresionante. Muchísimas gracias.

Mitrhandir
07/11/17, 13:32:22
Yo creo que WillyWeb se merece una copa virtual pero de largo!

Yo aún estoy trasteando y no he logrado aún que en los 7 días me diga lo que quiero saber. Y me fastidia porque aquí se han desplomado las temperaturas sin aviso.

Muchas gracias WillyWeb! :campeon:

WillyWeb
07/11/17, 14:13:01
Yo aún estoy trasteando y no he logrado aún que en los 7 días me diga lo que quiero saber...

Me arrepentiré ... seguro que me arrepentiré ... :facepalm:

:animo:

Supongo que ya tienes los datos. Vamos, estoy seguro porque las tareas "demo" que he dejado en el repositorio los sacan directamente. Así que ese no debería ser el problema. :rolleyes:

Te voy a repetir lo que te he dicho anteriormente...

Define claramente el problema y la solución que quieres conseguir. No se trata de escribir código o liarte a meter acciones en una tarea. Simplemente planea mentalmente la forma de llegar a lo que quieres partiendo de lo que tienes.

Mitrhandir
07/11/17, 17:10:22
Lo único que quiero es que "rastree" una o dos veces al día y que cuando se den valores "anormales", salte una escena y me diga cuándo y qué valores serán "anormales". No estoy pidiendo peras al olmo. Pero aquí por lo visto el único "anormal" soy de lo torpe que soy! :risitas:

WillyWeb
07/11/17, 18:17:32
Lo único que quiero es que "rastree" una o dos veces al día y que cuando se den valores "anormales", salte una escena y me diga cuándo y qué valores serán "anormales"...

Ya. La carta a los Reyes Magos. :silbando:

La única palabra que he entendido es "escena". Mientras que Tasker no permita programar con lógica difusa (https://es.wikipedia.org/wiki/Lógica_difusa) será necesario que concretes un poco más...

rastrear = eso suena a un bucle exactamente igual que el de las demos

una o dos veces al día = eso suena a un perfil que lance la tarea

valores = ¿qué valores? ¿variables de las que genera al JS?

anormales = ¿más alto o más bajo de qué? ... números concretos

Sigues sin pensar como un programador, y así vamos mal. :rolleyes:

Mitrhandir
07/11/17, 19:36:49
Ya doy por hecho que nunca pensaré como tal. Nunca tendré ese don de pensar como un programador.

Tengo que tranquilizarme y respirar hondo. Máxime cuando encima estoy de vacaciones. Esta noche trataré de sacar los valores que me interesan y establecerlos en una variable %texto y que salga en un escena.

Estoy confuso, pero trataré de poner orden.

Mitrhandir
08/11/17, 14:31:25
Buenas!

A ver, con esta tarea tengo todos los datos, pero no soy/no me veo capaz de sacar esos valores anormales que ando buscando. En la zona en la que yo vivo, considero que hace frío si la temperatura baja de 10 grados y hace calor si sube de 35.

¿Cómo le digo eso a Tasker? Yo busco que Tasker "lance" un pop-up, escena, notificación,etc... de que mañana (por ejemplo) habrá cualquier temperatura superior a 36 o inferior a 10. Lo mismo con la lluvia, etc... Es más que nada, para no estar mirando cada 2 por 3 el tlf.

Te pido disculpas por adelantado por mi ignorancia!

Un saludo!

WillyWeb
08/11/17, 17:10:48
A ver, con esta tarea tengo todos los datos...

¿Con qué tarea? :oh:

Anda majo, que pareces nuevo. Pon la descripción para que la veamos todos. :silbando:

http://www.htcmania.com/showthread.php?t=615896

Y no te olvides de las etiquetas [CODE].

... considero que hace frío si la temperatura baja de 10 grados y hace calor si sube de 35 ... ¿Cómo le digo eso a Tasker?

Con una condición IF. Cuando publiques la descripción de "esa" tarea te digo el sitio exacto en el que ponerla.

Yo busco que Tasker "lance" un pop-up, escena, notificación, etc...

No, si lo que quieres lo tengo claro. Pero no pienso decirte cómo lo tienes que hacer. A estas alturas ya no. ;-)

Te pido disculpas por adelantado por mi ignorancia!

Estás disculpado. Y no es malo no saber. Lo malo es no querer saber. :loco:

danko9696
08/11/17, 18:16:45
Buena currada, yo creo que te has recorrido los siete mares y has traido cien toneladas de los peces más grandes XDD

Las tareas de prueba son algo lentas, sobre todo la que devuelve arrays ... ¿qué pasa?

Ante este comentario, y dado que estuve un buen tiempo optimizando varios de mis scriptlets y dándole vueltas al asunto me ha dado por probar a ver qué mejora se podría sacar de comprimir el código. Como dices, en este caso no creo que sea muy importante el rendimiento, porque no es algo que vayas a hacer de forma repetida sino aisladamente muy de cuando en cuando pero tenía curiosidad por ver el comportamiento comprimiendo el código y me he llevado una sorpresa.

Ni el compresor que uso habitualmente ni varios otros que he probado funcionan con el código. Pero sí he encontrado uno que sí (y ahí viene la mayor sorpresa) la diferencia de rendimiento entre ambas versiones es nula. Pero no solo es nula, es que realmente es casi totalmente nula, tanto de una ejecución a otra (la diferencia ronda los 5 ms en un tiempo de 1024ms de media) con la misma acción (solo el scriptlet, no la tarea entera) y también sin suponer diferencia alguna entre el comprimido y el original, lo que más me choca. Como referencia uno de mis scriptlets mejora espectacularmente el tiempo de ejecución e incluso la misma tarea repetidas veces puede oscilar unos 100ms (50 arriba / 50 abajo) de una ejecución a otra para una duración media de 600ms, con resultados equivalentes según longitud del código para otros scripts.

La verdad, no me lo explico.

Mitrhandir
08/11/17, 18:21:25
0ValoresAnormalesDeAEMET (70)
<código INE de Burriana>
A1: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Casa ]
<código INE de Moncófar>
A2: Establecer variable [ Nombre:%par1 A:12077 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Kerabén ]
<código INE de Vilareal>
A3: Establecer variable [ Nombre:%par1 A:12135 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Vilareal ]
<código INE de Alcublas>
A4: Establecer variable [ Nombre:%par1 A:46018 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Alcublas ]
<xml 7 días>
A5: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida:/sdcard/aemet.xml Confiar en cualquier Certificado:Apagado ]
<xml aemet arrays tasker>
A6: JavaScript [ Ruta:/sdcard/aemet_arr.js Librerías: Salida Automática:Encendido Cuenta atrás (segundos):5 ]
<aemet_xxx y datos generales>
A7: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:___
_ PARÁMETROS

aemet_xml = %aemet_xml
aemet_dedias = %aemet_dedias
aemet_dehoras = %aemet_dehoras
aemet_endias = %aemet_endias
aemet_enhoras = %aemet_enhoras
aemet_perhora = %aemet_perhora
aemet_perrango = %aemet_perrango
___
_ DATOS GENERALES

Enlace:
%enlace

Elaborado:
%elaborado

Municipio:
%nombre

Provincia:
%provincia Añadir:Apagado Añadir Nueva Línea:Encendido ]
<máximos/mínimos 7 días>
A8: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:___
_ 7 DÍAS / MÁXIMOS Y MÍNIMOS (%diapred(#))

Probabilidad de lluvia:
A: %problluvia_ab1 = %problluvia(%problluvia_ab1) el %diapred(%problluvia_ab1) de %perpred(%problluvia_ab1)
B: %problluvia_ab2 = %problluvia(%problluvia_ab2) el %diapred(%problluvia_ab2) de %perpred(%problluvia_ab2)

Cota de nieve:
A: %cotanieve_ab1 = %cotanieve(%cotanieve_ab1) el %diapred(%cotanieve_ab1) de %perpred(%cotanieve_ab1)
B: %cotanieve_ab2 = %cotanieve(%cotanieve_ab2) el %diapred(%cotanieve_ab2) de %perpred(%cotanieve_ab2)

Velocidad del viento:
A: %velviento_ab1 = %velviento(%velviento_ab1) el %diapred(%velviento_ab1) de %perpred(%velviento_ab1)
B: %velviento_ab2 = %velviento(%velviento_ab2) el %diapred(%velviento_ab2) de %perpred(%velviento_ab2)

Racha máxima:
A: %rachamax_ab1 = %rachamax(%rachamax_ab1) el %diapred(%rachamax_ab1) de %perpred(%rachamax_ab1)
B: %rachamax_ab2 = %rachamax(%rachamax_ab2) el %diapred(%rachamax_ab2) de %perpred(%rachamax_ab2)

Temperatura máxima:
A: %tempmax_ab1 = %tempmax(%tempmax_ab1) el %diapred(%tempmax_ab1) de %perpred(%tempmax_ab1)
B: %tempmax_ab2 = %tempmax(%tempmax_ab2) el %diapred(%tempmax_ab2) de %perpred(%tempmax_ab2)

Temperatura mínima:
A: %tempmin_ab1 = %tempmin(%tempmin_ab1) el %diapred(%tempmin_ab1) de %perpred(%tempmin_ab1)
B: %tempmin_ab2 = %tempmin(%tempmin_ab2) el %diapred(%tempmin_ab2) de %perpred(%tempmin_ab2)

Sensación térmica máxima:
A: %sentermax_ab1 = %sentermax(%sentermax_ab1) el %diapred(%sentermax_ab1) de %perpred(%sentermax_ab1)
B: %sentermax_ab2 = %sentermax(%sentermax_ab2) el %diapred(%sentermax_ab2) de %perpred(%sentermax_ab2)

Sensación térmica mínima:
A: %sentermin_ab1 = %sentermin(%sentermin_ab1) el %diapred(%sentermin_ab1) de %perpred(%sentermin_ab1)
B: %sentermin_ab2 = %sentermin(%sentermin_ab2) el %diapred(%sentermin_ab2) de %perpred(%sentermin_ab2)

Humedad relativa máxima:
A: %hummax_ab1 = %hummax(%hummax_ab1) el %diapred(%hummax_ab1) de %perpred(%hummax_ab1)
B: %hummax_ab2 = %hummax(%hummax_ab2) el %diapred(%hummax_ab2) de %perpred(%hummax_ab2)

Humedad relativa mínima:
A: %hummin_ab1 = %hummin(%hummin_ab1) el %diapred(%hummin_ab1) de %perpred(%hummin_ab1)
B: %hummin_ab2 = %hummin(%hummin_ab2) el %diapred(%hummin_ab2) de %perpred(%hummin_ab2)

Índice UV máximo:
A: %uvmax_ab1 = %uvmax(%uvmax_ab1) el %diapred(%uvmax_ab1) de %perpred(%uvmax_ab1)
B: %uvmax_ab2 = %uv

Mi tarea. Creo que lo he hecho bien, pero me falta sacar los valores que antes he comentado.

Ésa es mi carta a los Reyes Magos :risitas:

WillyWeb
08/11/17, 18:47:41
Buena currada, yo creo que te has recorrido los siete mares y has traido cien toneladas de los peces más grandes XDD

:risitas: tampoco es para tanto ... cinco tardes mientras no hacía ni caso a la tele.

... tenía curiosidad por ver el comportamiento comprimiendo el código y me he llevado una sorpresa ... la diferencia de rendimiento entre ambas versiones es nula.

Naturalmente. :silbando:

La verdad, no me lo explico.

Pues ya te lo había dicho. He programado mucho en JS y lo escribo/optimizo al vuelo. ;-)

Te agradezco el tiempo de comprobar el rendimiento del script. La verdad es que no me he preocupado mucho de ese aspecto, aunque me consta que uno de los procesos es mejorable (un bucle al que podría arañar unos pocos ms), pero lo he dejado así porque es más fácil de leer/entender.

WillyWeb
08/11/17, 19:01:59
Ésa es mi carta a los Reyes Magos :risitas:

Pues ya queda menos para enero. Estoy deseando ver qué te traen. :palomitas:

Mitrhandir
08/11/17, 21:24:19
:oh:

0Valores anormales de AEMET (7d) (72)
<código INE del municipio>
A1: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<xml 7 días>
A2: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida:/sdcard/aemet.xml Confiar en cualquier Certificado:Apagado ]
<xml-aemet >> arrays-tasker>
A3: JavaScript [ Ruta:/sdcard/aemet_arr.js Librerías: Salida Automática:Encendido Cuenta atrás (segundos):5 ]
<aemet_xxx y datos generales>
A4: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:___
_ PARÁMETROS

aemet_dedias = %aemet_dedias
aemet_dehoras = %aemet_dehoras
___
_ DATOS GENERALES

Elaborado:
%elaborado

Municipio:
%nombre

Provincia:
%provincia Añadir:Apagado Añadir Nueva Línea:Encendido ]
<máximos/mínimos 7 días>
A5: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:___
_ 7 DÍAS / MÁXIMOS Y MÍNIMOS (%diapred(#))

Temperatura máxima:
A: %tempmax_ab1 = %tempmax(%tempmax_ab1) el %diapred(%tempmax_ab1) de %perpred(%tempmax_ab1)
B: %tempmax_ab2 = %tempmax(%tempmax_ab2) el %diapred(%tempmax_ab2) de %perpred(%tempmax_ab2)

Temperatura mínima:
A: %tempmin_ab1 = %tempmin(%tempmin_ab1) el %diapred(%tempmin_ab1) de %perpred(%tempmin_ab1)
B: %tempmin_ab2 = %tempmin(%tempmin_ab2) el %diapred(%tempmin_ab2) de %perpred(%tempmin_ab2) Añadir:Encendido Añadir Nueva Línea:Encendido ]
A6: For [ Variable:%ind Ítems:1:%diapred(#) ]
<datos predicción 7 días>
A7: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:___
_ 7 DÍAS / PREDICCIÓN %ind de %diapred(#)

Fecha/Periodo:
%diapred(%ind) / %perpred(%ind)

Temperatura máxima:
%tempmax(%ind)

Temperatura mínima:
%tempmin(%ind) Añadir:Encendido Añadir Nueva Línea:Encendido ]
A8: End For
<ver txt>
A9: Abrir archivo [ Archivo:/sdcard/aemet.txt Tipo Mime:text/plain ]

No sé si ahora lo he hecho bien. Si no lo he hecho bien, decídmelo.

Un saludo

WillyWeb
08/11/17, 22:47:56
No sé si ahora lo he hecho bien. Si no lo he hecho bien, decídmelo.

:facepalm: ... me estoy ganando el cielo.

Por lo que veo esa tarea es una versión "aligerada" de la "demo" que devuelve los datos en arrays. Es un buen punto de partida para lo que pretendes porque tiene el esqueleto de lo que necesitas hacer para "rastrear" esos valores "anormales" que tanto te obsesionan. ;-)

El secreto está en ese bucle que recorre el array %diapred desde el primer elemento (1) hasta el último (#) asignando en cada vuelta el número del elemento por el que pasa a la variable %ind ... esto es una perogrullada, pero lo aclaro por si las moscas.

Con ese mismo número de elemento (%ind) del array que contiene las fechas (%diapred) se pueden sacar todos los datos de esa predicción en concreto. Es decir, suponiendo que %ind=3 entonces %diapred(%ind) tendrá la fecha de la tercera predicción y %tempmax(%ind) su temperatura máxima.

Simplemente tienes que meter dentro de ese bucle las comprobaciones que quieras hacer con algo así...

SI %tempmax(ind)>35 ENTONCES ...
SI %tempmin(ind)<10 ENTONCES ...

... y cuando el bucle finalice ya tendrás "rastreados" esos valores "anormales" ... la cosa es realmente sencilla, creo yo. :rolleyes:

Siguiendo ese principio tan sencillo he "rastreado" UNO de los valores que te interesan. Estudia detenidamente esta tarea...

RastreaValoresAEMET(7d) (999)
A1: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A2: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Archivo de salida:/sdcard/aemet.xml ]
A3: JavaScript [ Ruta:/sdcard/aemet_arr.js Cuenta atrás (segundos):5 ]
A4: For [ Variable:%ind Ítems:1:%diapred(#) ]
A5: Array Push [ Matriz de Variables (array):%diasc Posición:99 Valor:%diapred(%ind) de %perpred(%ind) ] Si (if) [ %sentermax(%ind) > 35 ]
A6: Array Push [ Matriz de Variables (array):%diasf Posición:99 Valor:%diapred(%ind) de %perpred(%ind) ] Si (if) [ %sentermin(%ind) < 10 ]
A7: End For
A8: Establecer variable [ Nombre:%diasc A:pasarás calor el/los día/s: %diasc() ] Si (if) [ %diasc(#) > 0 ]
A9: Establecer variable [ Nombre:%diasc A:no pasarás calor ningún día. ] Si (if) [ %diasc(#) = 0 ]
A10: Establecer variable [ Nombre:%diasf A:pasarás frío el/los día/s: %diasf() ] Si (if) [ %diasf(#) > 0 ]
A11: Establecer variable [ Nombre:%diasf A:no pasarás frío ningún día. ] Si (if) [ %diasf(#) = 0 ]
A12: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:
De la previsión para %nombre elaborada el %elaborado sacamos que de entre las %diapred(#) predicciones ...

La temperatura más alta será de %tempmax(%tempmax_ab1) grados el %diapred(%tempmax_ab1) de %perpred(%tempmax_ab1).

Pero %diasc.

La temperatura más baja será de %tempmin(%tempmin_ab2) grados el %diapred(%tempmin_ab2) de %perpred(%tempmin_ab2).

Pero %diasf.
Añadir:Apagado Añadir Nueva Línea:Encendido ]
A13: Abrir archivo [ Archivo:/sdcard/aemet.txt Tipo Mime:text/plain ]

No pretende ser una tarea bonita. No hace nada de lo que tú quieres. Simplemente "rastrea" un dato y le saca casi todo el jugo posible. Con el resto es lo mismo. :silbando:

danko9696
09/11/17, 00:39:47
Pues ya te lo había dicho. He programado mucho en JS y lo escribo/optimizo al vuelo.
Pero eso no lo aclara nada. Aunque mi código sea bastante mejorable, si exactamente el mismo código, solo que sin saltos de linea ni retornos de carro, produce distintos resultados al original, ¿por qué no en tu caso?. Porque la idea que tenía era que se debía al interprete de Tasker, ya que en lo que hice con DS los tiempos de ejecución tampoco variaban con o sin comprimir (o muy muy poco, no recuerdo bien).

WillyWeb
09/11/17, 08:36:52
... si exactamente el mismo código, solo que sin saltos de linea ni retornos de carro, produce distintos resultados al original, ¿por qué no en tu caso? ...

:pensando: ... el pacto que tengo con el diablo era para otra cosa, así que no puede ser eso.

:risitas:

Algo que siempre me ha llamado la atención es que el tiempo de ejecución de una misma tarea de Tasker es variable. Supongo que como consecuencia del sistema de prioridades entre perfiles/tareas/acciones.

En mi código sólo uso un par de sentencias/funciones propias del JS de Tasker. Un "global()" justo al principio y un "exit()" en un par de ocasiones. ¿Cuántas funciones JS de Tasker tienes en tu código?

Mitrhandir
09/11/17, 10:28:01
Buenos días!

WillyWeb, no me ha quedado muy clara tu explicación. "Entonces" es "Else" no?

Pero sí, yo creo que cuando la palmes(que sea dentro de mucho), habrá un lugar privilegiado para ti.

Yo como estoy sordo, me pondrán en la ventanilla de reclamaciones, pero del infierno! :risitas:

Ahora en serio. Voy a ver si puedo hacer lo que me has explicado.

Un saludo!

WillyWeb
09/11/17, 11:03:42
... no me ha quedado muy clara tu explicación. "Entonces" es "Else" no?

No. En términos de programación ese tipo de estructuras condicionales tienen la forma...

If ... Then ... Else

Si (IF) se cumple cierta condición (THEN=ENTONCES) haz esto y si no se cumple (ELSE=SI NO) haz esto otro.

Mitrhandir
09/11/17, 11:53:22
0Anormales (73)
<código INE del municipio>
A1: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<xml 7 días>
A2: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida:/sdcard/aemet.xml Confiar en cualquier Certificado:Apagado ]
<xml-aemet >> arrays-tasker>
A3: JavaScript [ Ruta:/sdcard/aemet_arr.js Librerías: Salida Automática:Encendido Cuenta atrás (segundos):5 ]
A4: For [ Variable:%ind Ítems:1:%diapred(#) ]
A5: Array Push [ Matriz de Variables (array):%diasc Posición:99 Valor:%diapred Rellenar Espacios:Apagado ] Si (if) [ %sentermax > 35 ]
A6: Array Push [ Matriz de Variables (array):%diasf Posición:99 Valor:%diapred Rellenar Espacios:Apagado ] Si (if) [ %sentermain > 10 ]
A7: End For
A8: Establecer variable [ Nombre:%diasc A:pasarás calor el/los días: %diasc() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasc(#) > 0 ]
A9: Establecer variable [ Nombre:%diasc A:no pasarás calor ningún día Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasc(#) = 0 ]
A10: Establecer variable [ Nombre:%diasf A:pasarás frío el/los días: %diasf() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasf(#) > 0 ]
A11: Establecer variable [ Nombre:%diasf A:no pasarás frío ningún día Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasf(#) = 0 ]
A12: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:De la previsión para %nombre elaborada el %elaborado sacamos que de entre las %diapred(#) predicciones ...

La temperatura más alta será de %tempmax(%sentermax_ab1) grados el %diapred(%tempmax_ab1) de %perpred(%tempmax_ab1).

Pero %diasc.

La temperatura más baja será de %tempmin(%tempmin_ab2) grados el %diapred(%tempmin_ab2) de %perpred(%tempmin_ab2).

Pero %diasf.
Añadir:Apagado Añadir Nueva Línea:Encendido ]
A13: Abrir archivo [ Archivo:/sdcard/aemet.txt Tipo Mime:text/plain ] Añadir:Apagado Añadir Nueva Línea:Encendido ]
A13: [X] Mostrar Escena [ Nombre:Meteo Mostrar como:Diálogo con fondo oscurecido Posición Horizontal:100 Posición Vertical:100 Animación:Sistema Mostrar Botón Salida:Encendido Mostrar sobre bloqueo pantalla:Encendido Continuar tarea inmediatamente:Encendido ]
<ver txt>
A14: [X] Abrir archivo [ Archivo:/sdcard/aemet.txt Tipo Mime:text/plain ]

Buenas! A3 me está dando error. He hecho la tarea tal y como me has dicho.

WillyWeb
09/11/17, 12:13:54
Buenas! A3 me está dando error...

Supongo que el archivo aemet_arr.js está en esa ruta (/sdcard/aemet_arr.js) ¿...? :silbando:

En A6 has usado una variable que no existe ... %sentermain ... la correcta es ... %sentermin.

Y en A12 has puesto mal lo mismo que yo ... %tempmax(%sentermax_ab1) ... cuando lo correcto es ... %tempmax(%tempmax_ab1).

Mitrhandir
09/11/17, 13:40:30
13.37.36/E start proxy ProxyTransparent, wait, time limit 5s
13.37.36/E add wait type Proxy Group time 5
13.37.36/E add wait type Proxy Group done
13.37.36/E set proxy: true (startProxy)
13.37.36/E add wait task
13.37.37/E Error: 1

Éste es el error que me da. He probado en la memoria interna y externa. Todo lo demás lo he corregido.

Pero estoy muy mosca porque me pasa con todos los JS.

NO LO ENTIENDO! :loco:

WillyWeb
09/11/17, 13:45:44
Pero estoy muy mosca porque me pasa con todos los JS.

Podría ser un fallo del motor JS de Tasker. Lo más rápido es reiniciar el móvil.

Mitrhandir
09/11/17, 14:04:26
No, he reiniciado 2 veces y no hay manera! Qué puedo hacer?

WillyWeb
09/11/17, 14:19:15
No, he reiniciado 2 veces y no hay manera! Qué puedo hacer?

Tasker se apoya en varios servicios de Android. Muy relacionado con JS está WebView que en ciertos casos puede ser sustituido por el WebView integrado en el navegador Chrome, si es que lo tienes instalado.

¿Has estado desactivando aplicaciones?
¿Has comprobado que tienes todo actualizado?

Mitrhandir
09/11/17, 14:35:24
Tengo el web wiew por actualizar. Ahora estoy fuera de casa, pero cuando pille wifi, lo actualizo. Anoche hice un reflasheo de ROM, porque siempre que reinicio, se tira 5/6 minutos reiniciando. Ya me veo que voy a tener que reflashear todo otra vez. 😖

Mitrhandir
09/11/17, 16:44:55
Vale. Ya está. Un reflasheo después, todo ok.

Edito: estoy teniendo unos problemas. Esta noche me toca hacer un proceso largo y arduo que limpiará el tlf completamente. Mañana seguimos.

Mitrhandir
10/11/17, 07:19:37
Buenas! Después de tirarme un buen rato volviendo a la stock, luego rooteando y luego reflasheando una ROM nueva, ya estoy listo. Ya sé qué era lo que fallaba: cambié la fuente y no era muy compatible por lo visto.

La tarea ahora perfecta. Voy a meter la de lluvia a ver si puedo!

Un saludo!

Mitrhandir
10/11/17, 11:20:50
0Anormales (73)
<código INE de Burriana>
A1: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Casa ]
<código INE de Moncófar>
A2: Establecer variable [ Nombre:%par1 A:12077 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Kerabén ]
<código INE de Vilareal>
A3: Establecer variable [ Nombre:%par1 A:12135 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Vilareal ]
<código INE de Alcublas>
A4: Establecer variable [ Nombre:%par1 A:46018 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %EstoyEn ~ Alcublas ]
<xml 7 días>
A5: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida:/sdcard/aemet.xml Confiar en cualquier Certificado:Apagado ]
<xml-aemet >> arrays-tasker>
A6: JavaScript [ Ruta:/sdcard/aemet_arr.js Librerías: Salida Automática:Encendido Cuenta atrás (segundos):5 ]
A7: For [ Variable:%ind Ítems:1:%diapred(#) ]
A8: Array Push [ Matriz de Variables (array):%diasc Posición:99 Valor:%diapred Rellenar Espacios:Apagado ] Si (if) [ %sentermax > 35 ]
A9: Array Push [ Matriz de Variables (array):%diasf Posición:99 Valor:%diapred Rellenar Espacios:Apagado ] Si (if) [ %sentermin > 15 ]
A10: Array Push [ Matriz de Variables (array):%diasll Posición:99 Valor:%diapred Rellenar Espacios:Apagado ] Si (if) [ %lluvia > 10 ]
A11: End For
A12: Establecer variable [ Nombre:%diasc A:pasarás calor el/los días: %diasc() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasc(#) > 0 ]
A13: Establecer variable [ Nombre:%diasc A:no pasarás calor ningún día Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasc(#) = 0 ]
A14: Establecer variable [ Nombre:%diasf A:pasarás frío el/los días: %diasf() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasf(#) > 0 ]
A15: Establecer variable [ Nombre:%diasf A:no pasarás frío ningún día Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasf(#) = 0 ]
A16: Establecer variable [ Nombre:%diasll A:lloverá el/los días: %diasll() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasll(#) > 0 ]
A17: Establecer variable [ Nombre:%diasll A:no te mojarás ningún día Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasll(#) = 0 ]
A18: Escribir archivo [ Archivo:/sdcard/aemet.txt Texto:De la previsión para %nombre elaborada el %elaborado sacamos que de entre las %diapred(#) predicciones...

La temperatura más alta será de %tempmax(%sentermax_ab1) grados el %diapred(%tempmax_ab1) de %perpred(%tempmax_ab1).

Pero %diasc.

La temperatura más baja será de %tempmin(%tempmin_ab2) grados el %diapred(%tempmin_ab2) de %perpred(%tempmin_ab2).

Pero %diasf Añadir:Apagado Añadir Nueva Línea:Encendido ]
A19: Establecer variable [ Nombre:%texto A:%diasc
%diasf
%diasll Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A20: Mostrar Escena [ Nombre:Meteo Mostrar como:Diálogo con fondo oscurecido Posición Horizontal:100 Posición Vertical:100 Animación:Sistema Mostrar Botón Salida:Encendido Mostrar sobre bloqueo pantalla:Encendido Continuar tarea inmediatamente:Encendido ]

Bueno, aquí os dejo la tarea. Qué tal lo veis?

WillyWeb
10/11/17, 18:24:14
Bueno, aquí os dejo la tarea. Qué tal lo veis?

La pregunta no es esa ... es ¿qué ves tú? :rolleyes:

La condición de A9 es un poco rara ... ¿no?

Muy bonito el bucle A7-A11 ... ¿para qué lo has hecho? Porque no parece que recorra el valor de ningún array.

Tampoco parece que A18 haga nada.

Y supongo que en esa escena "Meteo" pretendes mostrar el resultado (%texto) ... ¿qué sale? :silbando:

Mitrhandir
10/11/17, 23:02:39
Buenas! La condición de A9 la he rectificado al rato de haber colgado la tarea.

A7-A11 no hacen nada? :oh: explícame eso plis

A18? Es que he añadido mas acciones.

Pero vamos por partes. Qué pasa con el bucle.

WillyWeb
11/11/17, 10:05:03
A7-A11 no hacen nada? :oh: explícame eso plis

Está explicado en el post #15.

A18? Es que he añadido mas acciones.

En mi tarea de ejemplo A12 compone el resultado y A13 lo muestra. En tu tarea parece que el resultado se compone/muestra con A19/A20 ... ¿qué hace A18?

Mitrhandir
14/11/17, 11:35:59
Valores Anormales de AEMET (25)
<código INE de Burriana>
A1: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<xml 7 días>
A2: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida:/sdcard/aemet.xml Confiar en cualquier Certificado:Apagado ]
<xml-aemet >> arrays-tasker>
A3: JavaScript [ Ruta:/sdcard/aemet_arr.js Librerías: Salida Automática:Encendido Cuenta atrás (segundos):5 ]
A4: For [ Variable:%ind Ítems:1:%diapred(#) ]
A5: Array Push [ Matriz de Variables (array):%diascalor Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %sentermax(%ind) > 35 ]
A6: Array Push [ Matriz de Variables (array):%diasfrio Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %sentermin(%ind) < 15 ]
A7: End For
A8: Establecer variable [ Nombre:%diascalor A:Pasarás calor los días %diascalor() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diascalor(#) > 0 ]
A9: Establecer variable [ Nombre:%diascalor A:no pasarás calor ningún día. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diascalor(#) = 0 ]
A10: Establecer variable [ Nombre:%diasfrio A:Pasarás frío los días %diasfrio() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasfrio(#) > 0 ]
A11: Establecer variable [ Nombre:%diasfrio A:no pasarás frío ningún día. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasfrio(#) = 0 ]
A12: Establecer variable [ Nombre:%texto A:La previsión para %nombre es:

La temperatura más alta será de:
%tempmax(%tempmax_ab1) grados el %diapred(%tempmax_ab1) de %perpred(%tempmax_ab1).
Pero %diascalor.
La temperatura más baja será de:
%tempmin(%tempmin_ab2) grados el %diapred(%tempmin_ab2) de %perpred(%tempmin_ab2).
Pero %diasfrio. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A13: Mostrar Escena [ Nombre:Meteo Mostrar como:Diálogo Posición Horizontal:100 Posición Vertical:100 Animación:Sistema Mostrar Botón Salida:Encendido Mostrar sobre bloqueo pantalla:Apagado Continuar tarea inmediatamente:Encendido ]

Hola! Perdón por la tardanza, pero he estado unos días muy ocupado.

Lo que hice fue empezar de 0 y rehacer toda la tarea.

Funciona bien, pero la única pega es que salen muchas fechas y me llenan la escena. La solución que veo es reducir de 7 a 2 días por ejemplo. Salvo que sepáis otra manera.

Soy todo ojos!

Un saludo!

WillyWeb
14/11/17, 18:21:26
... la única pega es que salen muchas fechas y me llenan la escena.

Cuando el script procesa el XML de 7 días extrae los datos en rangos de 6 horas (00-06/06-12/12-18/18-24), de esa forma por cada día se obtienen cuatro predicciones. Ese es el motivo de que tengas fechas repetidas, aunque si compruebas los rangos de horas verás que realmente no se ha repetido nada.

La solución que veo es reducir de 7 a 2 días por ejemplo. Salvo que sepáis otra manera.

:idea:

Se me ocurre que puedes ...


Reducir los días (tu propuesta) definiendo %aemet_dedias=2 justo antes de ejecutar el script. Pero con esto renuncias a la predicción a largo plazo.

Reducir los periodos definiendo %aemet_perrango=00-12,12-24 (o directamente 00-24) justo antes de ejecutar el script. Pero con esto renuncias a datos más precisos y mejor acotados.

Reducir el número de resultados poniendo una condición más a las acciones que "rastrean" los valores (A5/A6 de tu tarea). Por ejemplo, en A5 tendrías que añadir "Y %diascalor(#)<3" para limitar los resultados a 3. Ajusta el límite y el nombre del array según necesites.

Creo que la opción número 3 es la mejor. :rolleyes:

Mitrhandir
16/11/17, 22:47:00
Mañana Burriana (125)
A1: Realizar tarea [ Nombre:3g Prioridad:%priority Parámetro 1 (%par1): Parámetro 2 (%par2): Devolver Valor de Variable: Detener:Apagado ] Si (if) [ %Dosgé ~ on & %WIFII !~ *CONNECT* ]
<código INE de Burriana>
A2: Establecer variable [ Nombre:%par1 A:12032 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<xml 7 días>
A3: HTTP Get [ Servidor:Puerto:http://www.aemet.es Ruta:xml/municipios/localidad_%par1.xml Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime:text/xml Archivo de salida:2 Confiar en cualquier Certificado:Apagado ]
A4: Establecer variable [ Nombre:%aemet_dedias A:3 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ] Si (if) [ %TIME < 20.45 ]
A5: Establecer variable [ Nombre:%aemet_dedias A:2 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %TIME > 20.45 ]
<xml-aemet >> arrays-tasker>
A6: JavaScript [ Ruta:/sdcard/aemet_arr.js Librerías: Salida Automática:Encendido Cuenta atrás (segundos):5 ]
A7: For [ Variable:%ind Ítems:1:%diapred(#) ]
A8: Array Push [ Matriz de Variables (array):%diascalor Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %tempmax(%ind) > 35 ]
A9: Array Push [ Matriz de Variables (array):%diasfrio Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %tempmin(%ind) < 20 ]
A10: Array Push [ Matriz de Variables (array):%diashumedad Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %sentermax(%ind) > 90 ]
A11: Array Push [ Matriz de Variables (array):%diashumedad Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %sentermin(%ind) < 40 ]
A12: Array Push [ Matriz de Variables (array):%diaslluvia Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %lluvia(%ind) > 0 ]
A13: Array Push [ Matriz de Variables (array):%diasviento Posición:99 Valor:%diapred(%ind) de %perpred(%ind) Rellenar Espacios:Apagado ] Si (if) [ %rachamax(%ind) > 0 ]
A14: End For
A15: Establecer variable [ Nombre:%diascalor A:Pasarás calor los días

%diascalor() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diascalor(#) > 0 ]
A16: Establecer variable [ Nombre:%diasfrio A:Pasarás frío los días

%diasfrio() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasfrio(#) > 0 ]
A17: Establecer variable [ Nombre:%diashumedad A:Pasarás humedad los días

%diashumedad() Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diashumedad(#) > 0 ]
A18: Establecer variable [ Nombre:%diaslluvia A:Mañana hay problema de %diaslluvia() % de que llueva. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diaslluvia(#) > 0 ]
A19: Establecer variable [ Nombre:%diaslluvia A:Mañana no lloverá. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diaslluvia(#) = 0 ]
A20: Establecer variable [ Nombre:%diasviento A:Mañana soplará un viento de %diasviento Km/h Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasviento(#) > 0 ]
A21: Establecer variable [ Nombre:%diasviento A:Mañana no soplará aire. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasviento(#) = 0 ]
A22: Establecer variable [ Nombre:%diasviento A:Mañana soplará un viento de %diasviento Km/h Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasviento(#) > 0 ]
A23: Establecer variable [ Nombre:%diasviento A:Mañana no soplará aire. Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %diasviento(#) = 0 ]
A24: Separar variable [ Nombre:%tempmax(%tempmax_ab1) Separador:: Eliminar base:Apagado ]
A25: Separar variable [ Nombre:%tempmin(%tempmin_ab2) Separador:: Eliminar base:Apagado ]
A26: Establecer variable [ Nombre:%texto A: Mañana en %nombre

La temperatura máxima será de %tempmax(%tempmax_ab1) grados
La temperatura mínima será de %tempmin(%tempmin_ab2) grados
%diaslluvia
%diasviento

Buenas! Quiero comentar unas cosas que me tienen mosca.

Posiblemente os preguntéis qué pintan A4 y A5. Lo explico: resulta que hasta las 20:45 el primer día de la predicción ha sido 2017-11-15 (ayer) y claro si tengo %aemetdedias A 1, la predicción que me dará será la de ayer, hasta las 20:45 que es cuando la página se actualiza. Hay alguna otra manera de enfocar esto? Porque si pongo %aemetendias A 0, me da error.

Un saludo y gracias!

WillyWeb
17/11/17, 07:53:39
... resulta que hasta las 20:45 el primer día de la predicción ha sido 2017-11-15 (ayer) y claro si tengo %aemetdedias A 1, la predicción que me dará será la de ayer, hasta las 20:45 que es cuando la página se actualiza. Hay alguna otra manera de enfocar esto?

No necesitas hacer nada. Por defecto el script devuelve los datos desde "hoy" indistintamente de cuál sea el primer día que contenga el XML de AEMET. Si quieres los datos desde el primero día del XML tienes que poner %aemet_endias=-1

Porque si pongo %aemetendias A 0, me da error.

El script no da error al poner %aemet_dedias=0, y de darte algo debería ser una colleja por pedir 0 días de datos. :risitas:

WillyWeb
17/11/17, 20:01:00
Ahora que me fijo mejor, veo cosas que posiblemente son errores ... :rolleyes:

En A10 y A11 las variables de las condiciones no tienen nada que ver con la "humedad".

En A15/A16/A17 tienes un retorno de carro un poco raro en el texto.

La pareja A20/A21 parece igual que A22/A23.

No tienes una acción para controlar que %diashumedad(#)=0.

¿Qué pretendes con A24/A25?

:palomitas:

Mitrhandir
18/11/17, 10:10:36
Era una tarea de "prueba y ensayo", así que no hagas mucho caso. Porque en mi caso, tengo que probar para comprender, puesto que no tengo estudios previos de programación. Pero te agradezco mucho tu interés y por mi parte, no tengo más preguntas.

Un saludo!

00Papete00
26/04/20, 16:52:32
Hola WillyWeb

Rescato el hilo para hacer una pregunta. Me podrías indicar cómo debo modificar la primera línea de tu script para que use una variable local:
httpd = global("HTTPD"); usa la variable global %HTTPD, yo quisiera modificarlo de modo que use %variablelocal

Gracias!

WillyWeb
26/04/20, 18:40:20
La variables locales de una tarea son "visibles" en un JavaScriptlet sin necesidad de hacer nada especial. En el caso que comentas la %variablelocal se usaría tal que así...

httpd = variablelocal;

Pero antes de que te lances a modificar nada deberías saber qué hace esa línea. :rolleyes:

Cuando escribí el script (hace casi tres años) la única acción que tenía Tasker para recuperar contenido web era "HTTP Get". Esa acción guarda los datos recibidos en la variable global del sistema %HTTPD. Y las variables globales no son "visibles" en un JavaScriptlet si no se usa la función JS global("nombrevariable"). Así que la línea que pretendes modificar pasa al JavaScriptlet los datos que luego tiene que procesar... hacer ese cambio es muy mala idea.

Podrías copiar el contenido de %HTTPD en una %variablelocal y luego usarla como te he propuesto antes, pero estarías malgastando una buena cantidad de memoria al duplicar los datos recibidos.

Ahora Tasker dispone de la acción "Solicitud HTTP" (mucho más potente que "HTTP Get") que guarda los datos recibidos en la variable local %http_data. Si quieres hacer un cambio que mejore ligeramente la tarea sustituye la acción "HTTP Get" por "Solicitud HTTP" y pon esa línea que comentas así...

httpd = http_data;

Suerte :ok:

00Papete00
26/04/20, 18:45:07
Es precisamente por usar la nueva "solicitud HTTP" que te lo preguntaba. Muchas gracias por la explicación!

00Papete00
27/07/20, 20:51:18
Hola WillyWeb,

Te está funcionando el script? Creo que aemet ha cambiado algo pq parece que no se está bajando la xml

WillyWeb
28/07/20, 12:09:28
Te está funcionando el script? Creo que aemet ha cambiado algo pq parece que no se está bajando la xml

He probado ahora mismo el de "horas" y el de "7 días" y ambos se descargan sin problema. :pensando:

00Papete00
28/07/20, 12:11:49
He probado ahora mismo el de "horas" y el de "7 días" y ambos se descargan sin problema. :pensando:

Cierto, ahora me funciona. Supongo que hubo un par de días con el sistema en mantenimiento o a saber...

Mitrhandir
03/10/22, 00:21:59
Hola a todos! Cuánto tiempo!

Os comento: esta tarea lleva como una semana sin poder ejecutarse (sale el msj "se esperaba un XML")by de ahí no sale.

Entiendo que la web de Aemet ha sufrido cambios y es por eso que no me deja ejecutar la tarea.

Saludos a todos y en especial a WillyWeb

WillyWeb
04/10/22, 10:09:04
Hola compañero. Me alegro de leerte de nuevo. :D

Acabo de comprobar las URL de los XML y siguen siendo válidas. Yo diría que el problema está en que el acceso no seguro (http) no siempre salta correctamente al seguro (https). Si haces ese pequeño cambio en la acción "HTTP Get" (cambiar http por https) debería volver a funcionar.

Y ya que te pones, tampoco estaría mal dejar de usar la obsoleta "HTTP Get" y sustituirla por "Solicitud HTTP". Revisa el post #40 (https://www.htcmania.com/showpost.php?p=31848782&postcount=40) de esta misma conversación.

Suerte :cucu:

Mitrhandir
04/10/22, 11:38:05
Oh! Pero cómo eres tan crack? Y yo rompiéndome la cabeza buscando el porqué y tú como siempre, dando en la tecla.

Por cierto, ya puestos en harina, porqué no puedo descargarme las tareas del repositorio?

Muchas gracias WillyWeb , te he echado de menos y me alegro de que la pandemia haya sido benévola contigo (porque si te das cuenta, desde antes de la pandemia que no aparecía por aquí)

Un abrazo muy grande!

WillyWeb
04/10/22, 14:40:35
... porqué no puedo descargarme las tareas del repositorio?

Lo comprobaré esta tarde desde casa. :ohjos:

... me alegro de que la pandemia haya sido benévola contigo ...

Pues sí, he tenido suerte. Lamentablemente no ha sido así para todo el mundo. :(

En fin, no nos pongamos tristes. Mientras pueda aquí seguiré ayudando a todo el que se quiera entretener con Tasker. :cucu:

WillyWeb
04/10/22, 14:54:12
... porqué no puedo descargarme las tareas del repositorio?

:pensando:

Si te refieres a este repositorio...

https://www.htcmania.com/showthread.php?t=1164924

No hagas clic en el enlace. En vez de eso copia/pega la dirección en tu navegador. El código de HTCMania rompe algunos enlaces y me temo que pueda ser eso lo que está pasando. De todas formas lo comprobaré más tarde.

Mitrhandir
04/10/22, 15:14:09
Sí, lo de copiar el enlace lo he hecho y me abre el buscador de Google. No sé si es cosa de Tinyurl o mía.

WillyWeb
04/10/22, 21:36:49
Pues era lo que me temía; el código del foro rompe el link de tinyurl. Si lo copias y pegas en la barra de direcciones del navegador funciona perfectamente.

http://tinyurl.com/ATaskREADOS

Mitrhandir
05/10/22, 12:16:48
Pues no sé... Me dice que os tengo que pedir permiso para bajarme archivos. ¿Seré persona non grata? :)

WillyWeb
05/10/22, 13:05:34
No entiendo qué está pasando. Con una cuenta se abre bien y con la otra me sale ese aviso de que necesito permiso. Luego lo miro con calma. :rolleyes:

WillyWeb
05/10/22, 19:51:32
Nada. Por más que miro no entiendo lo que pasa. La carpeta está configurada para que la pueda ver cualquiera pero se empeña en pedir permiso. Y si pido ese permiso (que no hace falta) el correo de solicitud no llega a ninguna parte.

:loco:

Mitrhandir
05/10/22, 20:04:58
Pues nada, que soy persona non grata. :risitas: Es que he hecho tantas modificaciones, que he perdido un poco la esencia de la primera tarea. Por ejemplo, la variable local %lluvia me da el mismo resultado (%lluvia) y cuando miro la carpeta aemet.txt, veo que %lluvia arroja un resultado de 0. Así que he probado a poner un coincide con 0, pero nada. Igual a tampoco. Me pasa lo mismo con %nieve %probnieve y %cotanieve

Y como siempre, será una chorrada. Volvemos por nuestros fueros y hacemos una revisión de arriba a abajo? Como en los viejos tiempos! :platano:

WillyWeb
05/10/22, 20:34:15
¿Eres consciente de que hicimos todo esto hace cinco años? :oh:

No me veo capaz de retomar el proyecto sin revisar todo el código de nuevo y lamentablemente no voy sobrado de tiempo para poder hacerlo. Lo que sí te puedo decir es que cuando una variable tiene como valor su propio nombre lo que realmente pasa es que no tiene valor (indefinido).

Aquí tienes los archivos del proyecto...

1441665

Suerte. :ok:

Mitrhandir
05/10/22, 20:48:30
Entonces, sí quiero que me diga que no hay lluvia tendrá que ser %lluvia ~ undefined? Null? No sé qué valor poner. Porque %lluvia~0 me devuelve %lluvia

Y sí, soy consciente de que hace tiempo de esto.

Gracias por el zip! ;-)

WillyWeb
05/10/22, 21:09:38
Sí te refieres a cómo poner eso en una acción de tasker, selecciona "No Está Definido" (la última opción del desplegable).

Mitrhandir
09/10/22, 00:45:51
Holaaa

Sigo sin poder entrar en el enlace de Tinyurl, pero bueno, lo he dejado por imposible ya.

Por otra parte, estoy buscando la manera de que si de entre todos los valores que arroje la variable %descielo contiene la palabra "lluvia", que salte. Cómo lo podría hacer?

Saludos!

WillyWeb
09/10/22, 01:00:55
En Tasker ese tipo de comparaciones tienen esta forma..

%variable ~ *texto*

Y antes de que preguntes, ese ~ es la condición "Coincide".

Mitrhandir
09/10/22, 02:20:42
Sí, hasta ahí llego. Pero %descielo arroja diferentes resultados como "Intervalos nubosos con lluvia escasa;Intervalos nubosos con lluvia;Muy nuboso con lluvia escasa;Muy nuboso con lluvia;Cubierto con lluvia escasa;Cubierto con lluvia;Nuboso con lluvia escasa;Nuboso con lluvia;Muy nuboso con tormenta".

Entonces, para simplificar el Si if he pensado que "coincide" no es lo mismo que "contiene".

Pero no pasa nada, pondré todos los resultados que contengan la palabra "lluvia" y arreglado.

Gracias WillyWeb!

WillyWeb
09/10/22, 08:35:27
El asteriscos es un comodín. Al ponerlo en esa comparación antes y después de "lluvia" se consigue exactamente lo que pretendes, que "coincide" se comporte como "contiene". Haz la prueba.

WillyWeb
09/10/22, 08:44:39
Sigo sin poder entrar en el enlace de Tinyurl, pero bueno, lo he dejado por imposible ya.!

Esto se me había pasado.

La carpeta de Google Drive te seguirá pidiendo ese permiso "fantasma" pero la redirección de tinyurl sí que funcionan ¿Puede ser que estés copiando el enlace en vez del texto?

Copia "como texto" y pega en la barra de direcciones de tu navegador...

http://tinyurl.com/ATaskREADOS

Mitrhandir
09/10/22, 13:16:50
Oh! Gracias WillyWeb! No tenía ni idea sobre los arteriscos! Voy a probar! :aplausos:

Luego pruebo lo del enlace!