Autor Tema: Script condiciones nubosas en páginas Saratoga con Cumulus MX  (Leído 20780 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #60 en: 09 de Enero del 2022, 11:41:27 am »
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?

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: [Seleccionar]
else if (teoradmax === "0") con1 = "Noche";Es cosa mía o es un error¿?

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";
...

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";
...

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");
...

o

Citar
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.

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

Código: [Seleccionar]
if (con1 != "Despejado" && teoradmax >= 30 && (SKC || CAVOK || NSC || NCD ))  con1 = " Despejado";
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

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: [Seleccionar]
//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);

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


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #61 en: 09 de Enero del 2022, 15:40:17 pm »

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: [Seleccionar]
if (con1 != "Despejado" && teoradmax >= 30 && (SKC || CAVOK || NSC || NCD ))  con1 = " Despejado";
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: [Seleccionar]
//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);

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
« Última modificación: 09 de Enero del 2022, 16:30:24 pm por CarlosLSev »
El Viso del Alcor

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #62 en: 09 de Enero del 2022, 20:13:26 pm »

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

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

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.


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #63 en: 09 de Enero del 2022, 20:22:43 pm »
Hola es https://www.meteoviso.es/ajaxCUwx.js , ahora mismo está sobre el fichero final.
El Viso del Alcor

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #64 en: 09 de Enero del 2022, 20:41:34 pm »
No veo esa línea de var intensidad = 10, en la función condic ??

Puedes dejar las variables del Metar así:

Código: [Seleccionar]
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");

No hace falta ponerles los ifs


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #65 en: 09 de Enero del 2022, 20:44:11 pm »
Perdón ahora...
El Viso del Alcor

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #66 en: 09 de Enero del 2022, 20:48:06 pm »
Claro que sale lluvia. Recarga con CTRL + F5


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #67 en: 09 de Enero del 2022, 20:59:31 pm »
Upsss, juraría que lo hice :( , gracias!!!
El Viso del Alcor

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #68 en: 22 de Enero del 2022, 23:54:39 pm »
Buenas, como no puedo estarme quieto tras muchos intentos he conseguido hacerlo todo con ajax. Básicamente, ahora se actualiza con ajax todos los códigos metar (lo añadí a realtime.php) y ahora obtengo la linea metar remota, no se por que la que suele haber en cache de saratoga a veces tardaba mucho en actualizar.
Ademas he añadido dos estaciones metar mas cercanas en vez solo una.
También si en alguna de ellas esta lloviendo debajo de las condiciones actuales aparecerá el aviso "Lluvia cercana", salvo que empiece a llover y se quitara. Luego alguna chorrada mas, si llueve sale un Pato con un paraguas, que lo tenia de antes con un if con php pero solo salia al refrescar la pagina ahora con ajax sale solo.

Para actualizar los metar ejecuto un script en php cada minuto por cron.


Código: [Seleccionar]
<?php
$filegetmetar 
"/var/www/html/script/condicionesmx/getmetar.txt";
$metar file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEZL.TXT");
$metar1 file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEMO.TXT");

file_put_contents($filegetmetar$metar."<br>".$metar1);
$Metar $metar.$metar1;

$CAVOK 0;
$NSC 0;
$NCD 0;
$SKC 0;
$FEW 0;
$SCT 0;
$BKN 0;
$OVC 0;
$FG 0;
$BR 0;
$VV 0;
$DZ   0;
$SH   0;
$RA   0;
 
//Codigos
$SSKC   'SKC';
$extraer strpos($Metar$SSKC);
 
//echo "<br>";
if($extraer !== FALSE){
    
$SKC   1;
}
$SCAVOK   'CAVOK';
$extraer strpos($Metar$SCAVOK);
 
//echo "<br>";
if($extraer !== FALSE){
$CAVOK   1;
}
$SNSC   'NSC';
$extraer strpos($Metar$SNSC);
 
//echo "<br>";
if($extraer !== FALSE){
$NSC   1;
}
$SNCD   'NCD';
$extraer strpos($Metar$SNCD);
 
//echo "<br>";
if($extraer !== FALSE){
$NCD   1;
}
$SFEW   'FEW';
$extraer strpos($Metar$SFEW);
 
//echo "<br>";
if($extraer !== FALSE){
    
$FEW   1;
}
$SSCT   'SCT';
$extraer strpos($Metar$SSCT);
// echo "<br>";
if($extraer !== FALSE){
$SCT   1;
}
$SBKN   'BKN';
$extraer strpos($Metar$SBKN);
 
//echo "<br>";
if($extraer !== FALSE){
$BKN   1;
}
$SOVC   'OVC';
$extraer strpos($Metar$SOVC);
 
//echo "<br>";
if($extraer !== FALSE){
$OVC   1;
}
$SFG   'FG';
$extraer strpos($Metar$SFG);
 
//echo "<br>";
if($extraer !== FALSE){
$FG   1;
}
$SBR   'BR';
$extraer strpos($Metar$SBR);
 
//echo "<br>";
if($extraer !== FALSE){
$BR   1;
}
$SVV   'VV';
$extraer strpos($Metar$SVV);
 
//echo "<br>";
if($extraer !== FALSE){
$VV   1;
}
$SDZ   'DZ';
$extraer strpos($Metar$SDZ);
 
//echo "<br>";
if($extraer !== FALSE){
    
$DZ   1;
}
$SSH   'SH';
$extraer strpos($Metar$SSH);
 
//echo "<br>";
if($extraer !== FALSE){
    
$SH   1;
}
$SRA   'RA';
$extraer strpos($Metar$SRA);
 
//echo "<br>";
if($extraer !== FALSE){
    
$RA   1;
}
//echo $Metar;

$filemetar "/var/www/html/script/condicionesmx/metar.txt";
file_put_contents($filemetar$CAVOK." ".$NSC." ".$NCD." ".$SKC." ".$FEW." ".$SCT." ".$BKN." ".$OVC." ".$FG." ".$BR." ".$VV." ".$DZ." ".$SH." ".$RA);
?>


Y para monitorizar, probar uso esto y por eso declare las var a 0, solo por cuestiones visuales.


« Última modificación: 22 de Enero del 2022, 23:59:06 pm por CarlosLSev »
El Viso del Alcor

Desconectado B.Santiago

  • Moderador Global
  • Hero Member
  • ******
  • Mensajes: 2.087
    • Ver Perfil
  • Estación: Ávila- La Colilla AV39. Anteriormente ESCYL0500000005192A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #69 en: 23 de Enero del 2022, 09:05:23 am »
Por si fuera de vuestro interés, pongo enlace a la última edición (agosto 2021) de la Guía de Información Meteorológica Aeronáutica publicada por AEMET.

Todas las novedades y actualizaciones sobre los informes (no estaciones) METAR de la p. 13 a la 22.

http://www.aemet.es/documentos/es/conocermas/aeronautica/AU-GUI-0102.pdf

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #70 en: 23 de Enero del 2022, 12:23:22 pm »
jejeje lo que más me ha gustado del script es lo de "Lluvia cercana"  *+* *+*
En serio, está muy bien, no se habría ocurrido sacar la info de un METAR para eso, te felicito  ;)

No compruebas hora de elaboración del METAR ?? Puede estar más de una hora sin actualizar y no ser fiable su información, aunque bueno, es raro que los de esos aeropuertos estén desactualizados. Sólo compruébalo en el caso de que alguna vez estén desactualizados.

Código muy largo. Te lo acorto con el operador ternario en PHP y te lo explico:

Código: [Seleccionar]
<?php
$filegetmetar 
"/var/www/html/script/condicionesmx/getmetar.txt";
$metar file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEZL.TXT");
$metar1 file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEMO.TXT");

file_put_contents($filegetmetar$metar."<br>".$metar1);
$Metar $metar.$metar1;

//Codigos
$SKC strpos($Metar 'SKC') !== false 0;
$CAVOK strpos($Metar 'CAVOK') !== false 0;
$NSC strpos($Metar 'NSC') !== false 0;
$NCD strpos($Metar 'NCD') !== false 0;
$FEW strpos($Metar 'FEW') !== false 0;
$BKN strpos($Metar 'BKN') !== false 0;
$OVC strpos($Metar 'OVC') !== false 0;
$FG strpos($Metar 'FG') !== false 0;
$BR strpos($Metar 'BR') !== false 0;
$VV strpos($Metar 'VV') !== false 0;
$DZ strpos($Metar 'DZ') !== false 0;
$SH strpos($Metar 'SH') !== false 0;
$RA strpos($Metar 'RA') !== false 0;

//echo $Metar;

$filemetar "/var/www/html/script/condicionesmx/metar.txt";
file_put_contents($filemetar$CAVOK." ".$NSC." ".$NCD." ".$SKC." ".$FEW." ".$SCT." ".$BKN." ".$OVC." ".$FG." ".$BR." ".$VV." ".$DZ." ".$SH." ".$RA);
?>

Por ejemplo $SKC = strpos($Metar , 'SKC') !== false ? 1 : 0; significa que si está la palabra "SKC" (SKy Clear, Cielo Despejado) tomará la variable $SKC el valor 1 y de lo contrario el valor 0
El operador ternario es condición ? verdadero : falso así que lo que vaya entre ? y : será el valor que tome si la expresión es verdadera y a la derecha de : si es falso. Con eso se pueden declarar e inicializar variables directamente.



Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #71 en: 28 de Enero del 2022, 23:33:10 pm »
Muchas gracias jmviper, cosas que se me van ocurriendo.

Como siempre tienes una buena forma de hacer las cosas mas sencillas  apla3
Pues es algo que se me paso por la cabeza y ya que lo dices, pues no esta de mas...
Pero cada vez que incluyes algo para mejorar al mismo tiempo salen otros problemas.
Veamos
Al añadir dicha comprobación, lo he dejado en 65 minutos se puede dar el caso aunque es improbable pero no imposible que las 2 lineas metar no se actualicen, entonces sobre todo de noche se mostraban los iconos de día.
Tras unas modificaciones en ese caso mostrara "Noche" al igual que solo mostrara Amanecer o Anochecer, si no están disponible ninguno de los 2 metar.
Luego tengo el desface de UTC a hora local, que también creo que lo solucione.

También añadí mas restricciones en la linea que muestra Despejado si en las estaciones Metar existen códigos "Despejados" para intentar que sea lo mas preciso posible dada las circunstancias.


Código: [Seleccionar]
<?php
$filegetmetar 
= ("/var/www/html/script/condicionesmx/getmetar.txt");
$filemetar = ("/var/www/html/script/condicionesmx/metar.txt");
$metar0 file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEZL.TXT");
$metar1 file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEMO.TXT");
$nometarfile file_get_contents($filemetar);
$nometarfileok substr($nometarfile,0,27);
$fecha0utc substr($metar0,0,16);
$fecha1utc substr($metar1,0,16);
$fechaactualdate("Y/m/d H:i"); 
echo 
$fecha0utc."<br>";
echo 
$fecha1utc."<br>";

$utc_date0 DateTime::createFromFormat(
    
'Y/m/d H:i',
    
$fecha0utc,
    new 
DateTimeZone('UTC'));
$acst_date0 = clone $utc_date0
$acst_date0->setTimeZone(new DateTimeZone('Europe/Madrid'));
echo 
$acst_date0->format('Y/m/d H:i'); 
echo 
"<br>";
$fecha0$acst_date0->format('Y/m/d H:i'); 
$utc_date1 DateTime::createFromFormat(
    
'Y/m/d H:i',
    
$fecha1utc,
    new 
DateTimeZone('UTC'));
$acst_date1 = clone $utc_date1
$acst_date1->setTimeZone(new DateTimeZone('Europe/Madrid'));
echo 
$acst_date1->format('Y/m/d H:i'); 
echo 
"<br>";
$fecha1$acst_date1->format('Y/m/d H:i'); 





function 
diferencia($fecha_1,$fecha_2)
{
$minutos = (strtotime($fecha_1)-strtotime($fecha_2))/60;
$minutos abs($minutos); $minutos floor($minutos);
return 
$minutos;
}
$metarti0 diferencia($fecha0,$fechaactual);
$metarti1 diferencia($fecha1,$fechaactual);

echo 
$metarti0;
echo 
"<br>";
echo 
$metarti1;

if (
$metarti0 >= 65) {
$NOMETAR0 "0.5";
$metar0 $fecha0." \nMetar no actualizado\n";}
    

if (
$metarti1 >= 65) {
$NOMETAR1 "0.5";
$metar1 $fecha1." \nMetar no actualizado\n";}

$NOMETAR $NOMETAR0+$NOMETAR1;
$Metar $metar0."\n".$metar1;

//Codigos
$SKC strpos($Metar 'SKC') !== false 0;
$CAVOK strpos($Metar 'CAVOK') !== false 0;
$NSC strpos($Metar 'NSC') !== false 0;
$NCD strpos($Metar 'NCD') !== false 0;
$FEW strpos($Metar 'FEW') !== false 0;
$SCT strpos($Metar 'SCT') !== false 0;
$BKN strpos($Metar 'BKN') !== false 0;
$OVC strpos($Metar 'OVC') !== false 0;
$FG strpos($Metar 'FG') !== false 0;
$BR strpos($Metar 'BR') !== false 0;
$VV strpos($Metar 'VV') !== false 0;
$DZ strpos($Metar 'DZ') !== false 0;
$SH strpos($Metar 'SH') !== false 0;
$RA strpos($Metar 'RA') !== false 0;




file_put_contents($filemetar$CAVOK." ".$NSC." ".$NCD." ".$SKC." ".$FEW." ".$SCT." ".$BKN." ".$OVC." ".$FG." ".$BR." ".$VV." ".$DZ." ".$SH." ".$RA." ".$NOMETAR);
file_put_contents($filegetmetar$Metar);


?>









El Viso del Alcor

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #72 en: 29 de Enero del 2022, 11:51:53 am »
Veo que has metido lo de comprobar hora de los metars para comprobar que no estén muy "pasados".

Te explico cosas básicas de PHP en cuanto a las fechas, es muy fácil tratar con ellas en PHP.

time()

devuelve la fecha Unix. El beneficio de esta sencilla función es que el valor retornado será siempre en UTC independientemente de la zona horaria que tenga establecida PHP.

Ahora vamos con date()

La fecha pasada a date() tiene básicamente dos formatos (son más pero vamos a tratar los dos más importantes) el americano, con barras (/) como separadores y el europeo con guiones (-). El formato en cada uno es date('Y/m/d H:i') y date('d-m-Y H:i'). Como se en el americano va al revés la fecha, pero lo importante es que los dos dan el mismo resultado.

Después tenemos otra variante de date() que es gmdate() que retorna la fecha en UTC independientemente de la zona horaria de PHP. Así gmdate('d-m-Y H:i') siempre retornará la fecha en UTC.

En el caso de tu script en que queremos comparar horas de zonas horarias diferentes lo mejor es que el script funcione en UTC. Eso se consigue poniendo al inicio del mismo date_default_timezone_set('UTC')
Con eso conseguimos que date() sea en UTC, por ejemplo date('d-m-Y H:i') pondrá la hora en UTC y todas las horas que pasemos a strtotime también serán en UTC así que no habrá que convertir de una zona horaria a otra.

Aplicación en el script:

Código: [Seleccionar]
<?php
date_default_timezone_set
('UTC');

$filegetmetar = ("/var/www/html/script/condicionesmx/getmetar.txt");
$filemetar = ("/var/www/html/script/condicionesmx/metar.txt");
$metar0 file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEZL.TXT");
$metar1 file_get_contents("https://tgftp.nws.noaa.gov/data/observations/metar/stations/LEMO.TXT");
$nometarfile file_get_contents($filemetar);
$nometarfileok substr($nometarfile,0,27);
$fecha0utc substr($metar0,0,16);
$fecha1utc substr($metar1,0,16);
$fechaactualutc=  time(); // hora unix, mismo resultado que strtotime(gmdate('d-m-Y H:i'))
echo $fecha0utc."<br>";
echo 
$fecha1utc."<br>";

//nos ahorramos este bloque

function diferencia($fecha_1,$fecha_2)
{
$minutos = (strtotime($fecha_1)-strtotime($fecha_2))/60;
$minutos floor(abs($minutos));
return 
$minutos;
}
$metarti0 diferencia($fecha0utc,$fechaactualutc);
$metarti1 diferencia($fecha1utc,$fechaactualutc);

echo 
$metarti0;
echo 
"<br>";
echo 
$metarti1;

//continúa...


?>

 

Como ves pasarle strtotime a la fecha UTC del metar crea ya la hora correcta en unix en UTC.

Para ver en qué zona horaria tenemos PHP usamos date_default_timezone_get()

Código: [Seleccionar]
echo date_default_timezone_get();
Con eso vemos si necesitamos o no ponerle el date_default_timezone_set('UTC')

Decir que eso solo modifica la zona horaria del script a partir de cuando la ponemos, no la configuración de zona de horaria de PHP. Si queremos volver a la zona horaria si tenemos la local de España ponemos date_default_timezone_set('Europe/Madrid') desde donde queramos en el script.




Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.576
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #73 en: 29 de Enero del 2022, 15:31:13 pm »
Esto también funciona sin el date_default_timezone_set('UTC') si tenemos hora local:

php > echo date('d-m-Y H:i', strtotime('29-1-2022 15:00 UTC'));
29-01-2022 16:00


php > echo gmdate('d-m-Y H:i', strtotime('29-1-2022 15:00 UTC'));
29-01-2022 15:00


Añadiendo UTC en la cadena final pasada a strtotime se pasa a UTC. Se puede jugar con gmdate() de esa manera para pasar todo a UTC.

Así que estas dos líneas que sacan la fecha del metar las ponemos así:


$fecha0utc = substr($metar0,0,16).' UTC';
$fecha1utc = substr($metar1,0,16).' UTC';


y cuando le pasemos strtotime en la función ya saldrá el tiempo Unix de esas fechas UTC.


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 299
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor ESAND4100000041520A
Re:Script condiciones nubosas en páginas Saratoga con Cumulus MX
« Respuesta #74 en: 29 de Enero del 2022, 16:31:06 pm »
Interesante pero si aplico eso obtengo la diferencia en Unix y no me funcionaria el script. Tendría que volver a convertir $metarti0 y $metarti1 de unix a local ¿no?
El Viso del Alcor