Software > Tu Web meteorológica
Script condiciones nubosas en páginas Saratoga con Cumulus MX
jmviper:
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: ---<?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 ? 1 : 0;
$CAVOK = strpos($Metar , 'CAVOK') !== false ? 1 : 0;
$NSC = strpos($Metar , 'NSC') !== false ? 1 : 0;
$NCD = strpos($Metar , 'NCD') !== false ? 1 : 0;
$FEW = strpos($Metar , 'FEW') !== false ? 1 : 0;
$BKN = strpos($Metar , 'BKN') !== false ? 1 : 0;
$OVC = strpos($Metar , 'OVC') !== false ? 1 : 0;
$FG = strpos($Metar , 'FG') !== false ? 1 : 0;
$BR = strpos($Metar , 'BR') !== false ? 1 : 0;
$VV = strpos($Metar , 'VV') !== false ? 1 : 0;
$DZ = strpos($Metar , 'DZ') !== false ? 1 : 0;
$SH = strpos($Metar , 'SH') !== false ? 1 : 0;
$RA = strpos($Metar , 'RA') !== false ? 1 : 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);
?>
--- Fin del código ---
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.
CarlosLSev:
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: ---<?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);
$fechaactual= date("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 ? 1 : 0;
$CAVOK = strpos($Metar , 'CAVOK') !== false ? 1 : 0;
$NSC = strpos($Metar , 'NSC') !== false ? 1 : 0;
$NCD = strpos($Metar , 'NCD') !== false ? 1 : 0;
$FEW = strpos($Metar , 'FEW') !== false ? 1 : 0;
$SCT = strpos($Metar , 'SCT') !== false ? 1 : 0;
$BKN = strpos($Metar , 'BKN') !== false ? 1 : 0;
$OVC = strpos($Metar , 'OVC') !== false ? 1 : 0;
$FG = strpos($Metar , 'FG') !== false ? 1 : 0;
$BR = strpos($Metar , 'BR') !== false ? 1 : 0;
$VV = strpos($Metar , 'VV') !== false ? 1 : 0;
$DZ = strpos($Metar , 'DZ') !== false ? 1 : 0;
$SH = strpos($Metar , 'SH') !== false ? 1 : 0;
$RA = strpos($Metar , 'RA') !== false ? 1 : 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);
?>
--- Fin del código ---
jmviper:
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: ---<?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...
?>
--- Fin del código ---
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: ---echo date_default_timezone_get();
--- Fin del código ---
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.
jmviper:
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.
CarlosLSev:
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?
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa