Autor Tema: Problemas raros con script  (Leído 2291 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Problemas raros con script
« en: 08 de Mayo del 2021, 00:10:27 am »
Hola aunque ya te comente algo por privado  jmviper, lo pongo por aquí ya que aletoriamente me sigue pasando lo mismo.
Tengo 2 script que leen el fichero realtime, uno obtiene el valor de lluvia caida, y el otro script revisa si hay cambios en el fichero realtime
Me centro en el de la lluvia por que creo que cuando fallan todos es por el mismo motivo.
He estado investigando y creo haber encontrado el motivo pero no la causa y no es el script. Ya que este ha estado muchos días funcionado correctamente. El fichero cache  guarda fecha, hora y litros.

Pero cuando llueve ejemplo 0.2 y ya no llueve mas durante el día, aleatoriamente recibo email de primera lluvia, he observado si abro el fichero cache me encuentro esto:
--20 ,0.0 en vez de esto que es lo que suele haber 28-04-2021 22:45:51,0.2
Es como si no guardase bien dicho fichero cache o se corrompiera, cuando se vuelve a ejecuta el script este no puede leerlo y piensa que esta a 0 y por eso me vuelve a enviar el email con el mensaje correspondiente.
Creí solucionarlo con un fsck
Añadí un sleep como me indicaste y tampoco.
Posiblemente sea como dijiste que CumulusMX escribe el realtime.txt y el script al mismo tiempo intenta leerlo.

Doy mas datos
En la raspberry tengo en el crontab
15 23 * * 7 sudo shutdown -r
He probado a ejecutar el script de lluvia desde la raspberry y pasa lo mismo.

Ahora en vps donde alojo la web
El crontab
Código: [Seleccionar]
*/12 * * * * php /var/www/html/script/alertarealtime.php
*/3 * * * *   php /var/www/html/script/alertameteoclimatic.php
*/10 * * * * php /var/www/html/script/alertalluvia.php
*/15 * * * * sh /var/www/html/webtest/script/raspionline.sh miipxxx.ddns.net 22>/dev/null 2>&1
Resumiendo
1.- Script que notifica que el fichero realtime esta actualizado o no
2.- Script que me notifica si se envían datos a meteoclimatic o no
3.- Script que indica si empezó a llover
4,. Script que me notifica si la raspberry esta offline
El 1 y 3 leen el realtime.txt
En los 2 script suelo recibir un correo de crontab con errores cuando fallan y luego en el caso del script de lluvia el email de Primera luvia
En el caso del script de lluvia
Código: [Seleccionar]
PHP Notice:  Undefined offset: 1 in /var/www/html/script/alertalluvia.php on line 26
PHP Notice:  Undefined offset: 2 in /var/www/html/script/alertalluvia.php on line 26
PHP Notice:  Undefined offset: 1 in /var/www/html/script/alertalluvia.php on line 26
PHP Notice:  Undefined offset: 9 in /var/www/html/script/alertalluvia.php on line 27

Siendo esas lineas
26  $fechar = $fecha[0].'-'.$fecha[1].'-20'.$fecha[2].' '.$realtime[1];
27  $lluvia = $realtime[9];
Creo que indica que no ha podido leerlo
Con el script de realtime me pasa algo parecido, pero solo me llegan los email de error de cron y nada mas, se que puedo desactivarlos.
Otra curiosidad, si cron ejecuta el script cada 10 minutos me llega el email y telegram  y a los 10 minutos otro.
Una solución podría ser subir el realtime.txt en vez de a los 15 seg ponerlo mas tiempo.
O ejecutar los script una vez se ha guardado el realtime.txt tal y como leí, pero creo que es marear mas la perdiz,,,
https://www.lineadecodigo.es/ejecutar-un-script-al-modificar-un-fichero-con-inotify

Lo raro es que me ha estado funcionando bien, me di cuenta 2 días que llovía algo por la noche y luego no mas...
Siento darte la paliza :((
« Última modificación: 08 de Mayo del 2021, 04:22:20 am por CarlosLSev »

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Problemas raros con script
« Respuesta #1 en: 08 de Mayo del 2021, 11:43:07 am »
Ya probaré el de la lluvia yo y veré si también me falla de la misma manera y te digo algo. Puede que tengamos que comprobar previamente si el valor de la lluvia leído del realtime es correcto.



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

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Problemas raros con script
« Respuesta #2 en: 08 de Mayo del 2021, 11:58:15 am »
Ya probaré el de la lluvia yo y veré si también me falla de la misma manera y te digo algo. Puede que tengamos que comprobar previamente si el valor de la lluvia leído del realtime es correcto.

Gracias y de nuevo perdona la paliza que te estoy dando.

El script actual es
Código: [Seleccionar]
<?php



///////////Configuracion/////////////////////
$realtimefile '/var/www/html/realtime.txt';
$realtimecachefile '/var/www/html/script/alertalluvia.txt'
$umbraltormenta 4//umbral en mm sobre el cual se considera tormenta
$tiempocomprobacion 10//minutos para la comprobación de la tormenta
$tiemporeanudacion 120//minutos comprobacion de reanudacion de lluvia
$direccionaenviar 'xxxxxx@gmail.com';
//$direccionaenviar = "xxxxxxx@gmail.com,xxxxxxx@gmail.com";
$test false//true, probar correo. false, no probar
$now date('H:i:s');
$contenido ''//Añadir si queremos enviar contenido en el email
////////////////////////////////////////////

if ($test) {mail($direccionaenviar"Prueba"''); exit;}

$mensaje "";

//sleep(3);

$realtime explode(' 'file_get_contents($realtimefile));
$fecha explode('/'$realtime[0]);
$fechar $fecha[0].'-'.$fecha[1].'-20'.$fecha[2].' '.$realtime[1];
//$lluvia = $realtime[9];
$lluvia 0.1//Valor para probar manualmente
//El tiempo de reanudacion empieza a contar desde la ultima lluvia o cambio en el valor lluvia.
if (!file_exists($realtimecachefile)) file_put_contents($realtimecachefile$fechar.','.$lluvia);
$realtimecache explode(','file_get_contents($realtimecachefile));
$flaglluviacache 0;
if (
substr($realtimecache[0],0,2) != $fecha[0]) {file_put_contents($realtimecachefile$fechar.',0.0'); $flaglluviacache 1;}

$fecha strtotime($fechar);

$fechacache strtotime($realtimecache[0]);
$lluviacache $realtimecache[1];
if (
$flaglluviacache$lluviacache "0.0";
$diff $fecha $fechacache;

$difflluvia $lluvia $lluviacache;

if (
$lluvia == or $difflluvia == 0) exit;
if (
$lluviacache == and $lluvia 0$mensaje "Primera lluvia del día ".$lluvia." l  ".$now;
if (
$difflluvia and $lluviacache and $diff >= $tiemporeanudacion 60$mensaje "Vuelve a llover ".$lluvia." l  ".$now;
if (
$difflluvia >= $umbraltormenta and $diff >= $tiempocomprobacion 60$mensaje "Chaparron ".$lluvia." l  ".$now;

file_put_contents($realtimecachefile$fechar.','.$lluvia);

if (
$mensajemail($direccionaenviar$mensaje$contenido); //enviamos email
file_get_contents('https://api.telegram.org/botbbbbbbbbbbb:xxxxxxxxxxxxxxxxxxxxxxxxxxxx/sendMessage?chat_id=yyyyyyyyy&text='.$mensaje);//enviamos telegram


?>


Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Problemas raros con script
« Respuesta #3 en: 11 de Agosto del 2021, 12:59:36 pm »
Buenas, me seguía pasando lo mismo con los script. Ya sea con el de realtime como como el de lluvia.
Me he animado a intentarlo y el de realtime lo he solucione de dos maneras o así:
Código: [Seleccionar]
if ( isset($offset1,$offset2,$offset3,$offset4,$offset5) ){
 // echo "La variables están definidas.";
} else {
//echo "La variables no están definidas.";
exit;
}

O poniendo @ en todas las variables @$newdata[$offsetx].
También hubiera válido un //error_reporting(E_ALL ^ E_NOTICE);

En el de la lluvia añadí esto

Código: [Seleccionar]
$fechart0 = @$realtime[0]; //Campo fecha
$fechart1 = @$realtime[1]; //Campo hora
$lluvia = 0.2; // NULL para probar manual en falso.
//$fechart0 = ('31/02/21');// Si desmarcamos nos dara falso si el valor manual tiene formato incorrecto
//$fechart1 = ('29:00:00');// Si desmarcamos nos dara falso si el valor manual tiene formato incorrecto
$fechart = ($fechart0.' '.$fechart1);
//El tiempo de reanudacion empieza a contar desde la ultima lluvia o cambio en el valor lluvia.

//Funcion que valida la lectura del formato campo fecha y hora leido de realtime
 function validafechayhora($fechart, $format = 'd/m/y H:i:s')
{
    $d = DateTime::createFromFormat($format, $fechart);
    return $d && $d->format($format) == $fechart;
}

//Script que ejecuta una accion si la fecha y hora esta en formato correcto o no. Igualmente si el valor lluvia es valido o no. Si no lo es en alguna variable detiene el script y evitamos que nos notifique lluvia al creerse que estaba a 0.
if ((validafechayhora($fechart)&& isset($lluvia))   === true) {
/*echo "Hora actual: ".$now."\n";
echo "El valor de \$fechart0,\$fechart1 es: \n (".$fechart0.' '.$fechart1.")\n";//Imprime valor fecha y hora  correcto.
echo "El valor de \$lluvia es:\n (",$lluvia.")\n";
echo "Las variables son validas.\n";
*/
}
if ((validafechayhora($fechart) && isset($lluvia)) === false) {
echo "Hora actual: ".$now."\n";
echo "El valor de \$fechart0,\$fechart1 es: \n (".$fechart0.' '.$fechart1.") "; var_dump(validafechayhora($fechart));echo "";//Imprime valor fecha y hora .
echo "El valor de \$lluvia es: \n (",$lluvia.") ";var_dump(isset($lluvia));//Imprime valor lluvia .
echo "Una de las variables no es valida.\nDeteniendo el script.\n";
exit;
}

No se si está mal, pero por lo que he probado me funciona  plau2, con el éxit consigo que no escriba nada en caché y en la siguiente ejecución no me envíe email pensando que es la primera lluvia.
El fallo está claro que por algún motivo no lee bien el realtime. El reporte que me envía cuando da fallo es claro. El valor de agua es manual.
El valor de $fechart0,$fechart1 es:
 ( ) bool(false)
El valor de $lluvia es:
 (0.2) bool(true)
Una de las variables no es valida.
Deteniendo el script.

Lo que no sabia es de donde salía el --20 del fichero caché
--20, 0.0
Y salía de aquí
Código: [Seleccionar]
$fechar = @$fecha[0].'[b]-[/b]'.@$fecha[1].'[b]-20[/b]'.@$fecha[2].' '.@$realtime[1];
Para qué sirve la resta de -20, ¿si puede saberse?






« Última modificación: 11 de Agosto del 2021, 15:45:31 pm por CarlosLSev »

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Problemas raros con script
« Respuesta #4 en: 12 de Agosto del 2021, 09:02:40 am »
Citar
Lo que no sabia es de donde salía el --20 del fichero caché
--20, 0.0
Y salía de aquí
Código: [Seleccionar]
$fechar = @$fecha[0].'[b]-[/b]'.@$fecha[1].'[b]-20[/b]'.@$fecha[2].' '.@$realtime[1];Para qué sirve la resta de -20, ¿si puede saberse?

Si no encuentra ninguna fecha porque no lee el realtime.txt en esa línea al no haber ni fecha[0] ni fecha[1] ni fecha[2] se queda con los guiones que los separan y el -20 que sirve para poner el año delante de la fecha del realtime.

La fecha en el realtime viene así 12/08/21. La manera fácil de meterle la fecha en formato europeo para que la convierta a unix PHP con strtotime es 12-08-2021 así que adivinarás que ese -20 lo pone el script delante del 21.

Si ponemos echo strtotime("12-08-2021"); nos pone la fecha unix correcta (1628632800) pero si ponemos el año sin milenio delante echo strtotime("12-08-21"); nos saca 1345500000 que corresponde al 21-08-2012 ya que lee en formato americano (y-m-d) de esa fecha.

Lo de las arrobas (@) sirve para que no salgan ni advertencias ni errores de PHP, es como poner parches para que si salen errores no diga nada pero para depurar código y si pones muchos no es algo muy limpio (aunque pueda ser práctico). Yo le pongo error_reporting(0); al inicio del script y si hay problemas lo depuro poniéndole 1.

El script a mí me funciona como se espera, ninguna falsa alarma de lluvia y avisa cuando hay tormenta tanto por email como por Telegram.
La única diferencia es que el realtime lo lee vía http del PC de la estación ($realtimefile = 'http://192.168.1.101/cumulusmx/realtime.txt';) ya que no tengo MX funcionando en la orange pi.

Desconozco si hay más problemas en leerlo localmente que por http.

De todas formas has modificado prácticamente todo el código seguramente googleando  *+* *+* y si te hace la función que quieres pues déjalo así y que vaya bien.

saludos
« Última modificación: 12 de Agosto del 2021, 11:04:33 am por jmviper »


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

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Problemas raros con script
« Respuesta #5 en: 12 de Agosto del 2021, 15:10:30 pm »
Hola, gracias por la explicación, y ahora sí entiendo ese -20. Y si está claro que justo cuando escribe el realtime el script se ejecuta y justo no puede leerlo. Me he dado cuenta que me da ese problema solo  si Cumulus actualiza el realtime (que se actualiza cada 10seg), si se reinicia Cumulus o la Raspberry y la actualizaciones la hace en los segundos terminados en 01. Así coinciden y da el error.
Pero bueno me he entretenido en buscar la solución (gracias a Google  *+*) y aplicarla.
También conseguí torear los problemas de los acentos, me tenían frito.
Todo sea entretenerse y aprender algo.
Saludos...