Software > Tu Web meteorológica

Script condiciones nubosas en páginas Saratoga con Cumulus MX

<< < (13/17) > >>

jmviper:
Hola de nuevo Carlos y feliz año a ti también

Estaba viendo que estabas bastante tiempo callado y me decía que este está tramando algo  *+* *+*
Me gusta que tengas el interés por mejorar el script y te las hayas ingeniado para meter la info del METAR supliendo las carencias del sensor/ubicación del sensor.

A ver, como decía Jack el destripador, vayamos por partes:


--- Citar ---¿por cierto para cuando una sección php?
--- Fin de la cita ---

Pronto pronto... a ver si para este mes y para cosas básicas en principio. Tengo que desliarme un poco con los proyectos. Por lo que veo vamos a comentar primero cosas de javascript.


--- Citar ---
Ahora quiero preguntarte una duda del script  sobre la var teomaxrad = realtime[56];
Cuando la declaras la llamas teomaxrad, pero luego en mas partes del código la llamas teoradmax

--- Código: ---else if (teoradmax === "0") con1 = "Noche";
--- Fin del código ---
Es cosa mía o es un error¿?
--- Fin de la cita ---

Le llamé de dos maneras diferentes en dos funciones distintas pero no altera el funcionamiento, quizás ni me di cuenta. teomaxrad es como le puse a la variable dentro de la función principal ajaxLoader que es la que se encarga de actualizar los valores con su setInterval (ahora te comentaré más adelante esto). Sin embargo teoradmax es como se llama dentro de la función condic

Así tenemos que dentro de la función ajaxLoader creamos la variable teomaxrad a la que le asignamos el valor de radiación máxima teórica del realtime.php y después la metemos en la función condic

var condiciones = condic(porcen10m, porcen1h, solar, porcen, rad1min, rad2min, teomaxrad, humidity, wind, rainratehr, diaonoche, ajaxtimeformat.split(':')[0]);

Dentro de esa función se llama teoradmax:

function condic(solar10, solar60, solar, solarpct, solar1, solar2, teoradmax, humedad, viento, intensidad, diaonoche, hora) {...

Como ves una cosa son los nombres de las variables que se meten como argumentos de la función y otra cómo son tomados dentro de la función (según la posición del argumento). Todo esto son cosas básicas de las funciones.

Viendo tu código para crear lo del metar has puesto más código de la cuenta, basado seguramente en prueba/error. Te lo comento un poco:


--- Citar ---//Asignamos valor 0 a todas las var
var SKC = "0";
...

--- Fin de la cita ---

No hace falta ponerle el 0 como string (encerrado en las comillas), lo puedes poner como número, de hecho "0" == 0 es verdadero.


--- Citar ---var SKC = Metar.search("SKC");
if (SKC > 0) SKC = "1";
if (SKC < 0) SKC = "0";
...
--- Fin de la cita ---

Aquí estás sobrescribiendo lo que has declarado antes, puedes prescindir por lo tanto del bloque anterior. Por ejemplo le estás dando otro valor a la variable SKC que será su posición en el string (-1 si no existe), pero no uses eso para ver si existe una palabra en un texto, por ejemplo si la palabra está al principio te devolvería posición 0 que sería false. Usa match() o test() de la siguiente manera:


--- Citar ---var SKC = Metar.match("SKC");
...
--- Fin de la cita ---

o


--- Citar ---var SKC = /SKC/.test(Metar);
...
--- Fin de la cita ---

Esta última es más rápida en ejecución ya que match devuelve un objeto que se evalúa a true si existe la cadena y undefined que se evalúa a false si no existe, mientras que test devuelve los boleanos true o false. O sea que no hace falta ponerle los ifs siguientes ni declararlos anteriormente.

Así la línea del if puede quedar así:


--- Código: ---if (con1 != "Despejado" && teoradmax >= 30 && (SKC || CAVOK || NSC || NCD ))  con1 = " Despejado";
--- Fin del código ---

Esos valores ya contendrán el valor true o false

Esas declaraciones las has hecho fuera de una función, por lo que son solo cargadas al llamar a la página y no van a ser actualizadas a menos que recargues la página. Tendrías que ponerlas dentro de la función condic en su inicio para que lo evalúe en cada petición ajax, aunque la actualización de los metars es cada hora más o menos y no haría falta actualizarlo en tiempo real.

También cuando llamas a la URL con ajax no hace falta ponerle el dominio completo en la URL sino solamente la ruta relativa:


--- Citar ---req.open('GET', 'cache/metarcache-LEZL.txt', false); // Direccion url del fichero cache, sustituir XXXX por el codigo de estacion Metar
--- Fin de la cita ---

Las peticiones ajax son de política del mismo dominio (Same Origin Policy), eso quiere decir que solamente se pueden hacer a archivos de tu dominio y no a ningún otro dominio. No puedes ponerle otra URL a un dominio diferente por que no lo permite el (Cross Domain).

En cuanto al html adjunto que has puesto mejor que me pongas el enlace a su página ya que se puede ver su código fuente en el navegador y verlo en funcionamiento. Yo en local poco puedo probarlo.

Y ahora ya para finalizar no tienes que poner el script en la página principal sin más. En javascript si metes un setInterval dentro de otro setInterval sucede que se vuelve loca la página como a ti te pasa porque se están llamando ya alterando los intervalos. Cuidado con eso porque puede generar muchísimas peticiones al servidor hasta colapsarlo tipo ataque DOS ó DDOS aunque probablemente sea el navegador el que colapse antes.
La página llama al setInterval que hay en el ajaxCUwx.js y si le pones ese después ya viene el lío. Ese código lo deberías de combinar en el ajaxCUwx.js poniendo las funciones condic y condicicon (en las declaraciones de funciones al principio del script) y después en el interior de la función ajaxLoader donde se manejan los datos del realtime poner las líneas que llaman a las condiciones nubosas:


--- Código: ---//Condiciones actuales

var ajaxtimeformat = realtime[1];
var porcen = realtime[59];
var rad1min = realtime[60];
var rad2min = realtime[61];
var porcen10m = realtime[62];
var porcen1h = realtime[63];
var diaonoche = realtime[49];
var teomaxrad = realtime[56];

var condiciones = condic(porcen10m, porcen1h, solar, porcen, rad1min, rad2min, teomaxrad, humidity, wind, rainratehr, diaonoche, ajaxtimeformat.split(':')[0]);

set_ajax_obs("ajaxconditionicon2", condicicon(teomaxrad, condiciones, temp));
set_ajax_obs("ajaxcurrentcond", condiciones);

--- Fin del código ---

Con eso no haría falta incluir el condicionesmxmetar.html en un iframe

Ahhhh los METARS.... qué buenos recuerdos....hará unos 8 años con ayuda de Breitling que era amante de los vuelos en avioneta y por lo tanto de METARS me puse en marcha para hacer uno de mis primeros scripts en javascript para elaborar un METAR a partir de los datos de WD:

https://www.meteoarchena.es/wx8.html

Su código fuente en view-source:https://www.meteoarchena.es/wx8.html

Lo único que le falta es la visibilidad ya que no la pueden dar nuestras estaciones, pero bueno, aparte de eso para ser automático cumple su cometido y aprendí cómo están hechos.

Vaya tocho que me ha salido.... últimamente los domingos por la mañana me explayo mucho  *+*

Ya me vas diciendo cómo vas los cambios si quieres ir probando lo que te he dicho.

Saludos

CarlosLSev:

--- Cita de: jmviper en 09 de Enero de 2022, 11:41:27 ---
Buenas, te voy respondiendo:

Pronto pronto... a ver si para este mes y para cosas básicas en principio. Tengo que desliarme un poco con los proyectos. Por lo que veo vamos a comentar primero cosas de javascript.

Mas vale tarde que nunca



Le llamé de dos maneras diferentes en dos funciones distintas pero no altera el funcionamiento, quizás ni me di cuenta. teomaxrad es como le puse a la variable dentro de la función principal ajaxLoader que es la que se encarga de actualizar los valores con su setInterval (ahora te comentaré más adelante esto). Sin embargo teoradmax es como se llama dentro de la función condic

Así tenemos que dentro de la función ajaxLoader creamos la variable teomaxrad a la que le asignamos el valor de radiación máxima teórica del realtime.php y después la metemos en la función condic

var condiciones = condic(porcen10m, porcen1h, solar, porcen, rad1min, rad2min, teomaxrad, humidity, wind, rainratehr, diaonoche, ajaxtimeformat.split(':')[0]);

Dentro de esa función se llama teoradmax:

function condic(solar10, solar60, solar, solarpct, solar1, solar2, teoradmax, humedad, viento, intensidad, diaonoche, hora) {...

Como ves una cosa son los nombres de las variables que se meten como argumentos de la función y otra cómo son tomados dentro de la función (según la posición del argumento). Todo esto son cosas básicas de las funciones.

Entiendo mas o menos lo que me explicas, una cosa es la variable y otra función



Viendo tu código para crear lo del metar has puesto más código de la cuenta, basado seguramente en prueba/error. Te lo comento un poco:

Jeje, por supuesto google, leer y probar es lo mío.

No hace falta ponerle el 0 como string (encerrado en las comillas), lo puedes poner como número, de hecho "0" == 0 es verdadero.
Aquí estás sobrescribiendo lo que has declarado antes, puedes prescindir por lo tanto del bloque anterior. Por ejemplo le estás dando otro valor a la variable SKC que será su posición en el string (-1 si no existe), pero no uses eso para ver si existe una palabra en un texto, por ejemplo si la palabra está al principio te devolvería posición 0 que sería false. Usa match() o test() de la siguiente manera:

var SKC = Metar.match("SKC");
ó

var SKC = /SKC/.test(Metar);

Esta última es más rápida en ejecución ya que match devuelve un objeto que se evalúa a true si existe la cadena y undefined que se evalúa a false si no existe, mientras que test devuelve los boleanos true o false. O sea que no hace falta ponerle los ifs siguientes ni declararlos anteriormente.

Si realmente si el código esta al principio no funciona, lo puse con match y perfecto, corregido

Así la línea del if puede quedar así:


--- Código: ---if (con1 != "Despejado" && teoradmax >= 30 && (SKC || CAVOK || NSC || NCD ))  con1 = " Despejado";
--- Fin del código ---

A veces me complico solo, mas fácil y limpio imposible



También cuando llamas a la URL con ajax no hace falta ponerle el dominio completo en la URL sino solamente la ruta relativa:

req.open('GET', 'cache/metarcache-LEZL.txt', false); // Direccion url del fichero cache, sustituir XXXX por el codigo de estacion Metar


No había caído



En cuanto al html adjunto que has puesto mejor que me pongas el enlace a su página ya que se puede ver su código fuente en el navegador y verlo en funcionamiento. Yo en local poco puedo probarlo.

Mmmm no te entiendo, lo adjunte y también puse el enlace al final del todo, entiendo que no lo viste
Condicionesmx con metar


Y ahora ya para finalizar no tienes que poner el script en la página principal sin más. En javascript si metes un setInterval dentro de otro setInterval sucede que se vuelve loca la página como a ti te pasa porque se están llamando ya alterando los intervalos. Cuidado con eso porque puede generar muchísimas peticiones al servidor hasta colapsarlo tipo ataque DOS ó DDOS aunque probablemente sea el navegador el que colapse antes.
La página llama al setInterval que hay en el ajaxCUwx.js y si le pones ese después ya viene el lío. Ese código lo deberías de combinar en el ajaxCUwx.js poniendo las funciones condic y condicicon (en las declaraciones de funciones al principio del script) y después en el interior de la función ajaxLoader donde se manejan los datos del realtime poner las líneas que llaman a las condiciones nubosas:


--- Código: ---//Condiciones actuales

var ajaxtimeformat = realtime[1];
var porcen = realtime[59];
var rad1min = realtime[60];
var rad2min = realtime[61];
var porcen10m = realtime[62];
var porcen1h = realtime[63];
var diaonoche = realtime[49];
var teomaxrad = realtime[56];

var condiciones = condic(porcen10m, porcen1h, solar, porcen, rad1min, rad2min, teomaxrad, humidity, wind, rainratehr, diaonoche, ajaxtimeformat.split(':')[0]);

set_ajax_obs("ajaxconditionicon2", condicicon(teomaxrad, condiciones, temp));
set_ajax_obs("ajaxcurrentcond", condiciones);

--- Fin del código ---

Con eso no haría falta incluir el condicionesmxmetar.html en un iframe


Voy a ver si soy capaz....


Ya me vas diciendo cómo vas los cambios si quieres ir probando lo que te he dicho.

Claro que lo iré probando, ya todo corregido, salvo lo de incluirlo en la web sin iframe, creo que seré capaz, mil gracias

Edito no soy capaz, he puesto las líneas en el mismo lugar en el ajaxCUwx.js y aparentemente no da error, pero si declaro una variable para probarlo junto antes de los if , var intensidad = 10; no hace nada.... Creo que falta algo mas

Saludos

--- Fin de la cita ---

jmviper:


--- Citar ---Mmmm no te entiendo, lo adjunte y también puse el enlace al final del todo, entiendo que no lo viste
--- Fin de la cita ---

Sí sí he visto el enlace...no me expresé bien...quería decir que no hace falta el script en adjunto porque no puedo probarlo, que es mejor en el enlace.


--- Citar ---Edito no soy capaz, he puesto las líneas en el mismo lugar en el ajaxCUwx.js y aparentemente no da error, pero si declaro una variable para probarlo junto antes de los if , var intensidad = 10; no hace nada.... Creo que falta algo mas
--- Fin de la cita ---

Ponme enlace al script que no te funciona en tu servidor, por ejemplo lo renombras a ajaxCUwxtest.js y me pones su enlace, así veo su código y veo qué puede ocurrir.

CarlosLSev:
Hola es https://www.meteoviso.es/ajaxCUwx.js , ahora mismo está sobre el fichero final.

jmviper:
No veo esa línea de var intensidad = 10, en la función condic ??

Puedes dejar las variables del Metar así:


--- Código: ---var SKC = Metar.match("SKC");
var FEW = Metar.match("FEW");
var SCT = Metar.match("SCT");
var BKN = Metar.match("BKN");
var OVC = Metar.match("OVC");
var FG = Metar.match("FG");
var BR = Metar.match("BR");
var CAVOK = Metar.match("CAVOK");
var NSC = Metar.match("NSC");
var NCD = Metar.match("NCD");
var VV = Metar.match("VV");

--- Fin del código ---

No hace falta ponerles los ifs

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa